Pārlūkot izejas kodu

ZOOKEEPER-4725: Record TTL node creations in audit log

Reviewers: kezhuw
Author: ztzg
Closes #2039 from ztzg/ZOOKEEPER-4725-audit-create-ttl
Damien Diederen 1 mēnesi atpakaļ
vecāks
revīzija
10328b3ab5

+ 13 - 4
zookeeper-server/src/main/java/org/apache/zookeeper/audit/AuditHelper.java

@@ -28,6 +28,7 @@ import org.apache.zookeeper.ZKUtil;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.audit.AuditEvent.Result;
 import org.apache.zookeeper.proto.CreateRequest;
+import org.apache.zookeeper.proto.CreateTTLRequest;
 import org.apache.zookeeper.proto.DeleteRequest;
 import org.apache.zookeeper.proto.SetACLRequest;
 import org.apache.zookeeper.proto.SetDataRequest;
@@ -69,11 +70,19 @@ public final class AuditHelper {
                 case ZooDefs.OpCode.createContainer:
                     op = AuditConstants.OP_CREATE;
                     CreateRequest createRequest = request.readRequestRecord(CreateRequest::new);
-                    createMode = getCreateMode(createRequest);
+                    createMode = getCreateMode(createRequest.getFlags());
                     if (failedTxn) {
                         path = createRequest.getPath();
                     }
                     break;
+                case ZooDefs.OpCode.createTTL:
+                    op = AuditConstants.OP_CREATE;
+                    CreateTTLRequest createTtlRequest = request.readRequestRecord(CreateTTLRequest::new);
+                    createMode = getCreateMode(createTtlRequest.getFlags());
+                    if (failedTxn) {
+                        path = createTtlRequest.getPath();
+                    }
+                    break;
                 case ZooDefs.OpCode.delete:
                 case ZooDefs.OpCode.deleteContainer:
                     op = AuditConstants.OP_DELETE;
@@ -172,8 +181,8 @@ public final class AuditHelper {
         ZKAuditProvider.log(user, operation, znode, acl, createMode, session, ip, result);
     }
 
-    private static String getCreateMode(CreateRequest createRequest) throws KeeperException {
-        return CreateMode.fromFlag(createRequest.getFlags()).toString().toLowerCase();
+    private static String getCreateMode(int createFlags) throws KeeperException {
+        return CreateMode.fromFlag(createFlags).toString().toLowerCase();
     }
 
     private static Map<String, String> getCreateModes(Request request)
@@ -188,7 +197,7 @@ public final class AuditHelper {
                     || op.getType() == ZooDefs.OpCode.createContainer) {
                 CreateRequest requestRecord = (CreateRequest) op.toRequestRecord();
                 createModes.put(requestRecord.getPath(),
-                        getCreateMode(requestRecord));
+                        getCreateMode(requestRecord.getFlags()));
             }
         }
         return createModes;

+ 28 - 0
zookeeper-server/src/test/java/org/apache/zookeeper/audit/Slf4JAuditLoggerTest.java

@@ -63,6 +63,7 @@ public class Slf4JAuditLoggerTest extends QuorumPeerTestBase {
     @BeforeAll
     public static void setUpBeforeClass() throws Exception {
         System.setProperty(ZKAuditProvider.AUDIT_ENABLE, "true");
+        System.setProperty("zookeeper.extendedTypesEnabled", "true");
         // setup the logger to capture all logs
         LoggerTestTool loggerTestTool = new LoggerTestTool(Slf4jAuditLogger.class);
         os = loggerTestTool.getOutputStream();
@@ -103,6 +104,32 @@ public class Slf4JAuditLoggerTest extends QuorumPeerTestBase {
                         null, createMode), readAuditLog(os));
     }
 
+    @Test
+    public void testCreateWithTtlAuditLogs()
+            throws KeeperException, InterruptedException, IOException {
+        final CreateMode createMode = CreateMode.PERSISTENT_WITH_TTL;
+        final String path = "/createTtlPath";
+        zk.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
+                createMode, null, 3600);
+        // success log
+        verifyLog(
+                getAuditLog(AuditConstants.OP_CREATE, path, Result.SUCCESS,
+                        null, createMode.toString().toLowerCase()), readAuditLog(os));
+    }
+
+    @Test
+    public void testCreateSeqWithTtlAuditLogs()
+            throws KeeperException, InterruptedException, IOException {
+        final CreateMode createMode = CreateMode.PERSISTENT_SEQUENTIAL_WITH_TTL;
+        String path = "/createTtlPath";
+        path = zk.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
+                createMode, null, 3600);
+        // success log
+        verifyLog(
+                getAuditLog(AuditConstants.OP_CREATE, path, Result.SUCCESS,
+                        null, createMode.toString().toLowerCase()), readAuditLog(os));
+    }
+
     @Test
     public void testDeleteAuditLogs()
             throws InterruptedException, IOException, KeeperException {
@@ -406,6 +433,7 @@ public class Slf4JAuditLoggerTest extends QuorumPeerTestBase {
 
     @AfterAll
     public static void tearDownAfterClass() {
+        System.clearProperty("zookeeper.extendedTypesEnabled");
         System.clearProperty(ZKAuditProvider.AUDIT_ENABLE);
         for (int i = 0; i < SERVER_COUNT; i++) {
             try {