|
@@ -36,9 +36,17 @@ import org.apache.hadoop.hdfs.DFSUtil;
|
|
import org.apache.hadoop.ipc.Client;
|
|
import org.apache.hadoop.ipc.Client;
|
|
import org.apache.hadoop.ipc.ProtobufRpcEngine;
|
|
import org.apache.hadoop.ipc.ProtobufRpcEngine;
|
|
import org.apache.hadoop.ipc.RPC;
|
|
import org.apache.hadoop.ipc.RPC;
|
|
|
|
+import org.apache.hadoop.ipc.Server;
|
|
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
|
|
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
|
|
import org.apache.hadoop.metrics2.util.MBeans;
|
|
import org.apache.hadoop.metrics2.util.MBeans;
|
|
import org.apache.hadoop.net.NetUtils;
|
|
import org.apache.hadoop.net.NetUtils;
|
|
|
|
+import org.apache.hadoop.ozone.OzoneConsts;
|
|
|
|
+import org.apache.hadoop.ozone.audit.AuditAction;
|
|
|
|
+import org.apache.hadoop.ozone.audit.AuditEventStatus;
|
|
|
|
+import org.apache.hadoop.ozone.audit.AuditLogger;
|
|
|
|
+import org.apache.hadoop.ozone.audit.AuditLoggerType;
|
|
|
|
+import org.apache.hadoop.ozone.audit.AuditMessage;
|
|
|
|
+import org.apache.hadoop.ozone.audit.OMAction;
|
|
import org.apache.hadoop.ozone.common.Storage.StorageState;
|
|
import org.apache.hadoop.ozone.common.Storage.StorageState;
|
|
import org.apache.hadoop.ozone.om.exceptions.OMException;
|
|
import org.apache.hadoop.ozone.om.exceptions.OMException;
|
|
import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes;
|
|
import org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes;
|
|
@@ -58,6 +66,7 @@ import org.apache.hadoop.ozone.protocolPB.OzoneManagerProtocolServerSideTranslat
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
import org.apache.hadoop.security.UserGroupInformation;
|
|
import org.apache.hadoop.util.GenericOptionsParser;
|
|
import org.apache.hadoop.util.GenericOptionsParser;
|
|
import org.apache.hadoop.util.StringUtils;
|
|
import org.apache.hadoop.util.StringUtils;
|
|
|
|
+import org.apache.logging.log4j.Level;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
@@ -67,6 +76,7 @@ import java.io.PrintStream;
|
|
import java.net.InetSocketAddress;
|
|
import java.net.InetSocketAddress;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
|
|
+import java.util.LinkedHashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
@@ -92,6 +102,9 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
private static final Logger LOG =
|
|
private static final Logger LOG =
|
|
LoggerFactory.getLogger(OzoneManager.class);
|
|
LoggerFactory.getLogger(OzoneManager.class);
|
|
|
|
|
|
|
|
+ private static final AuditLogger AUDIT =
|
|
|
|
+ new AuditLogger(AuditLoggerType.OMLOGGER);
|
|
|
|
+
|
|
private static final String USAGE =
|
|
private static final String USAGE =
|
|
"Usage: \n ozone om [genericOptions] " + "[ "
|
|
"Usage: \n ozone om [genericOptions] " + "[ "
|
|
+ StartupOption.CREATEOBJECTSTORE.getName() + " ]\n " + "ozone om [ "
|
|
+ StartupOption.CREATEOBJECTSTORE.getName() + " ]\n " + "ozone om [ "
|
|
@@ -454,8 +467,13 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeCreates();
|
|
metrics.incNumVolumeCreates();
|
|
volumeManager.createVolume(args);
|
|
volumeManager.createVolume(args);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.CREATE_VOLUME,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeCreateFails();
|
|
metrics.incNumVolumeCreateFails();
|
|
|
|
+ AUDIT.logWriteFailure(Level.ERROR,
|
|
|
|
+ buildAuditMessageForFailure(OMAction.CREATE_VOLUME,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -469,11 +487,17 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void setOwner(String volume, String owner) throws IOException {
|
|
public void setOwner(String volume, String owner) throws IOException {
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volume);
|
|
|
|
+ auditMap.put(OzoneConsts.OWNER, owner);
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeUpdates();
|
|
metrics.incNumVolumeUpdates();
|
|
volumeManager.setOwner(volume, owner);
|
|
volumeManager.setOwner(volume, owner);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.SET_OWNER,
|
|
|
|
+ auditMap));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeUpdateFails();
|
|
metrics.incNumVolumeUpdateFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.SET_OWNER,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -487,11 +511,17 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public void setQuota(String volume, long quota) throws IOException {
|
|
public void setQuota(String volume, long quota) throws IOException {
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volume);
|
|
|
|
+ auditMap.put(OzoneConsts.QUOTA, String.valueOf(quota));
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeUpdates();
|
|
metrics.incNumVolumeUpdates();
|
|
volumeManager.setQuota(volume, quota);
|
|
volumeManager.setQuota(volume, quota);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.SET_QUOTA,
|
|
|
|
+ auditMap));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeUpdateFails();
|
|
metrics.incNumVolumeUpdateFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.SET_QUOTA,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -508,12 +538,24 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
@Override
|
|
@Override
|
|
public boolean checkVolumeAccess(String volume, OzoneAclInfo userAcl)
|
|
public boolean checkVolumeAccess(String volume, OzoneAclInfo userAcl)
|
|
throws IOException {
|
|
throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volume);
|
|
|
|
+ auditMap.put(OzoneConsts.USER_ACL,
|
|
|
|
+ (userAcl == null) ? null : userAcl.getName());
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeCheckAccesses();
|
|
metrics.incNumVolumeCheckAccesses();
|
|
return volumeManager.checkVolumeAccess(volume, userAcl);
|
|
return volumeManager.checkVolumeAccess(volume, userAcl);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeCheckAccessFails();
|
|
metrics.incNumVolumeCheckAccessFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(
|
|
|
|
+ OMAction.CHECK_VOLUME_ACCESS, auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(
|
|
|
|
+ OMAction.CHECK_VOLUME_ACCESS, auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -526,12 +568,22 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public OmVolumeArgs getVolumeInfo(String volume) throws IOException {
|
|
public OmVolumeArgs getVolumeInfo(String volume) throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volume);
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeInfos();
|
|
metrics.incNumVolumeInfos();
|
|
return volumeManager.getVolumeInfo(volume);
|
|
return volumeManager.getVolumeInfo(volume);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeInfoFails();
|
|
metrics.incNumVolumeInfoFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.READ_VOLUME,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(OMAction.READ_VOLUME,
|
|
|
|
+ auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -546,8 +598,12 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeDeletes();
|
|
metrics.incNumVolumeDeletes();
|
|
volumeManager.deleteVolume(volume);
|
|
volumeManager.deleteVolume(volume);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.DELETE_VOLUME,
|
|
|
|
+ buildAuditMap(volume)));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeDeleteFails();
|
|
metrics.incNumVolumeDeleteFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.DELETE_VOLUME,
|
|
|
|
+ buildAuditMap(volume)), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -566,12 +622,26 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
@Override
|
|
@Override
|
|
public List<OmVolumeArgs> listVolumeByUser(String userName, String prefix,
|
|
public List<OmVolumeArgs> listVolumeByUser(String userName, String prefix,
|
|
String prevKey, int maxKeys) throws IOException {
|
|
String prevKey, int maxKeys) throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = new LinkedHashMap<>();
|
|
|
|
+ auditMap.put(OzoneConsts.PREV_KEY, prevKey);
|
|
|
|
+ auditMap.put(OzoneConsts.PREFIX, prefix);
|
|
|
|
+ auditMap.put(OzoneConsts.MAX_KEYS, String.valueOf(maxKeys));
|
|
|
|
+ auditMap.put(OzoneConsts.USERNAME, userName);
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeLists();
|
|
metrics.incNumVolumeLists();
|
|
return volumeManager.listVolumes(userName, prefix, prevKey, maxKeys);
|
|
return volumeManager.listVolumes(userName, prefix, prevKey, maxKeys);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeListFails();
|
|
metrics.incNumVolumeListFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.LIST_VOLUMES,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(OMAction.LIST_VOLUMES,
|
|
|
|
+ auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -588,12 +658,26 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
@Override
|
|
@Override
|
|
public List<OmVolumeArgs> listAllVolumes(String prefix, String prevKey, int
|
|
public List<OmVolumeArgs> listAllVolumes(String prefix, String prevKey, int
|
|
maxKeys) throws IOException {
|
|
maxKeys) throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = new LinkedHashMap<>();
|
|
|
|
+ auditMap.put(OzoneConsts.PREV_KEY, prevKey);
|
|
|
|
+ auditMap.put(OzoneConsts.PREFIX, prefix);
|
|
|
|
+ auditMap.put(OzoneConsts.MAX_KEYS, String.valueOf(maxKeys));
|
|
|
|
+ auditMap.put(OzoneConsts.USERNAME, null);
|
|
try {
|
|
try {
|
|
metrics.incNumVolumeLists();
|
|
metrics.incNumVolumeLists();
|
|
return volumeManager.listVolumes(null, prefix, prevKey, maxKeys);
|
|
return volumeManager.listVolumes(null, prefix, prevKey, maxKeys);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumVolumeListFails();
|
|
metrics.incNumVolumeListFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.LIST_VOLUMES,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(OMAction.LIST_VOLUMES,
|
|
|
|
+ auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -608,8 +692,12 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
try {
|
|
try {
|
|
metrics.incNumBucketCreates();
|
|
metrics.incNumBucketCreates();
|
|
bucketManager.createBucket(bucketInfo);
|
|
bucketManager.createBucket(bucketInfo);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.CREATE_BUCKET,
|
|
|
|
+ (bucketInfo == null) ? null : bucketInfo.toAuditMap()));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumBucketCreateFails();
|
|
metrics.incNumBucketCreateFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.CREATE_BUCKET,
|
|
|
|
+ (bucketInfo == null) ? null : bucketInfo.toAuditMap()), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -621,13 +709,27 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
public List<OmBucketInfo> listBuckets(String volumeName,
|
|
public List<OmBucketInfo> listBuckets(String volumeName,
|
|
String startKey, String prefix, int maxNumOfBuckets)
|
|
String startKey, String prefix, int maxNumOfBuckets)
|
|
throws IOException {
|
|
throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volumeName);
|
|
|
|
+ auditMap.put(OzoneConsts.START_KEY, startKey);
|
|
|
|
+ auditMap.put(OzoneConsts.PREFIX, prefix);
|
|
|
|
+ auditMap.put(OzoneConsts.MAX_NUM_OF_BUCKETS,
|
|
|
|
+ String.valueOf(maxNumOfBuckets));
|
|
try {
|
|
try {
|
|
metrics.incNumBucketLists();
|
|
metrics.incNumBucketLists();
|
|
return bucketManager.listBuckets(volumeName,
|
|
return bucketManager.listBuckets(volumeName,
|
|
startKey, prefix, maxNumOfBuckets);
|
|
startKey, prefix, maxNumOfBuckets);
|
|
} catch (IOException ex) {
|
|
} catch (IOException ex) {
|
|
metrics.incNumBucketListFails();
|
|
metrics.incNumBucketListFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.LIST_BUCKETS,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(OMAction.LIST_BUCKETS,
|
|
|
|
+ auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -642,12 +744,23 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
@Override
|
|
@Override
|
|
public OmBucketInfo getBucketInfo(String volume, String bucket)
|
|
public OmBucketInfo getBucketInfo(String volume, String bucket)
|
|
throws IOException {
|
|
throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volume);
|
|
|
|
+ auditMap.put(OzoneConsts.BUCKET, bucket);
|
|
try {
|
|
try {
|
|
metrics.incNumBucketInfos();
|
|
metrics.incNumBucketInfos();
|
|
return bucketManager.getBucketInfo(volume, bucket);
|
|
return bucketManager.getBucketInfo(volume, bucket);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumBucketInfoFails();
|
|
metrics.incNumBucketInfoFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.READ_BUCKET,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(OMAction.READ_BUCKET,
|
|
|
|
+ auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -660,23 +773,39 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public OpenKeySession openKey(OmKeyArgs args) throws IOException {
|
|
public OpenKeySession openKey(OmKeyArgs args) throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
try {
|
|
try {
|
|
metrics.incNumKeyAllocates();
|
|
metrics.incNumKeyAllocates();
|
|
return keyManager.openKey(args);
|
|
return keyManager.openKey(args);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumKeyAllocateFails();
|
|
metrics.incNumKeyAllocateFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.ALLOCATE_KEY,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(
|
|
|
|
+ OMAction.ALLOCATE_KEY, (args == null) ? null : args.toAuditMap()));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void commitKey(OmKeyArgs args, long clientID)
|
|
public void commitKey(OmKeyArgs args, long clientID)
|
|
throws IOException {
|
|
throws IOException {
|
|
|
|
+ Map<String, String> auditMap = (args == null) ? new LinkedHashMap<>() :
|
|
|
|
+ args.toAuditMap();
|
|
|
|
+ auditMap.put(OzoneConsts.CLIENT_ID, String.valueOf(clientID));
|
|
try {
|
|
try {
|
|
metrics.incNumKeyCommits();
|
|
metrics.incNumKeyCommits();
|
|
keyManager.commitKey(args, clientID);
|
|
keyManager.commitKey(args, clientID);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.COMMIT_KEY,
|
|
|
|
+ auditMap));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumKeyCommitFails();
|
|
metrics.incNumKeyCommitFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.COMMIT_KEY,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -684,12 +813,24 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
@Override
|
|
@Override
|
|
public OmKeyLocationInfo allocateBlock(OmKeyArgs args, long clientID)
|
|
public OmKeyLocationInfo allocateBlock(OmKeyArgs args, long clientID)
|
|
throws IOException {
|
|
throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = (args == null) ? new LinkedHashMap<>() :
|
|
|
|
+ args.toAuditMap();
|
|
|
|
+ auditMap.put(OzoneConsts.CLIENT_ID, String.valueOf(clientID));
|
|
try {
|
|
try {
|
|
metrics.incNumBlockAllocateCalls();
|
|
metrics.incNumBlockAllocateCalls();
|
|
return keyManager.allocateBlock(args, clientID);
|
|
return keyManager.allocateBlock(args, clientID);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumBlockAllocateCallFails();
|
|
metrics.incNumBlockAllocateCallFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.ALLOCATE_BLOCK,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(
|
|
|
|
+ OMAction.ALLOCATE_BLOCK, auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -702,22 +843,38 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public OmKeyInfo lookupKey(OmKeyArgs args) throws IOException {
|
|
public OmKeyInfo lookupKey(OmKeyArgs args) throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
try {
|
|
try {
|
|
metrics.incNumKeyLookups();
|
|
metrics.incNumKeyLookups();
|
|
return keyManager.lookupKey(args);
|
|
return keyManager.lookupKey(args);
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumKeyLookupFails();
|
|
metrics.incNumKeyLookupFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.READ_KEY,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(OMAction.READ_KEY,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void renameKey(OmKeyArgs args, String toKeyName) throws IOException {
|
|
public void renameKey(OmKeyArgs args, String toKeyName) throws IOException {
|
|
|
|
+ Map<String, String> auditMap = (args == null) ? new LinkedHashMap<>() :
|
|
|
|
+ args.toAuditMap();
|
|
|
|
+ auditMap.put(OzoneConsts.TO_KEY_NAME, toKeyName);
|
|
try {
|
|
try {
|
|
metrics.incNumKeyRenames();
|
|
metrics.incNumKeyRenames();
|
|
keyManager.renameKey(args, toKeyName);
|
|
keyManager.renameKey(args, toKeyName);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.RENAME_KEY,
|
|
|
|
+ auditMap));
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
metrics.incNumKeyRenameFails();
|
|
metrics.incNumKeyRenameFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.RENAME_KEY,
|
|
|
|
+ auditMap), e);
|
|
throw e;
|
|
throw e;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -733,8 +890,12 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
try {
|
|
try {
|
|
metrics.incNumKeyDeletes();
|
|
metrics.incNumKeyDeletes();
|
|
keyManager.deleteKey(args);
|
|
keyManager.deleteKey(args);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.DELETE_KEY,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumKeyDeleteFails();
|
|
metrics.incNumKeyDeleteFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.DELETE_KEY,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -742,13 +903,27 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
@Override
|
|
@Override
|
|
public List<OmKeyInfo> listKeys(String volumeName, String bucketName,
|
|
public List<OmKeyInfo> listKeys(String volumeName, String bucketName,
|
|
String startKey, String keyPrefix, int maxKeys) throws IOException {
|
|
String startKey, String keyPrefix, int maxKeys) throws IOException {
|
|
|
|
+ boolean auditSuccess = true;
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volumeName);
|
|
|
|
+ auditMap.put(OzoneConsts.BUCKET, bucketName);
|
|
|
|
+ auditMap.put(OzoneConsts.START_KEY, startKey);
|
|
|
|
+ auditMap.put(OzoneConsts.MAX_KEYS, String.valueOf(maxKeys));
|
|
|
|
+ auditMap.put(OzoneConsts.KEY_PREFIX, keyPrefix);
|
|
try {
|
|
try {
|
|
metrics.incNumKeyLists();
|
|
metrics.incNumKeyLists();
|
|
return keyManager.listKeys(volumeName, bucketName,
|
|
return keyManager.listKeys(volumeName, bucketName,
|
|
startKey, keyPrefix, maxKeys);
|
|
startKey, keyPrefix, maxKeys);
|
|
} catch (IOException ex) {
|
|
} catch (IOException ex) {
|
|
metrics.incNumKeyListFails();
|
|
metrics.incNumKeyListFails();
|
|
|
|
+ auditSuccess = false;
|
|
|
|
+ AUDIT.logReadFailure(buildAuditMessageForFailure(OMAction.LIST_KEYS,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
|
|
+ } finally {
|
|
|
|
+ if(auditSuccess){
|
|
|
|
+ AUDIT.logReadSuccess(buildAuditMessageForSuccess(OMAction.LIST_KEYS,
|
|
|
|
+ auditMap));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -764,8 +939,12 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
try {
|
|
try {
|
|
metrics.incNumBucketUpdates();
|
|
metrics.incNumBucketUpdates();
|
|
bucketManager.setBucketProperty(args);
|
|
bucketManager.setBucketProperty(args);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.UPDATE_BUCKET,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumBucketUpdateFails();
|
|
metrics.incNumBucketUpdateFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.UPDATE_BUCKET,
|
|
|
|
+ (args == null) ? null : args.toAuditMap()), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -778,15 +957,49 @@ public final class OzoneManager extends ServiceRuntimeInfoImpl
|
|
* @throws IOException
|
|
* @throws IOException
|
|
*/
|
|
*/
|
|
public void deleteBucket(String volume, String bucket) throws IOException {
|
|
public void deleteBucket(String volume, String bucket) throws IOException {
|
|
|
|
+ Map<String, String> auditMap = buildAuditMap(volume);
|
|
|
|
+ auditMap.put(OzoneConsts.BUCKET, bucket);
|
|
try {
|
|
try {
|
|
metrics.incNumBucketDeletes();
|
|
metrics.incNumBucketDeletes();
|
|
bucketManager.deleteBucket(volume, bucket);
|
|
bucketManager.deleteBucket(volume, bucket);
|
|
|
|
+ AUDIT.logWriteSuccess(buildAuditMessageForSuccess(OMAction.DELETE_BUCKET,
|
|
|
|
+ auditMap));
|
|
} catch (Exception ex) {
|
|
} catch (Exception ex) {
|
|
metrics.incNumBucketDeleteFails();
|
|
metrics.incNumBucketDeleteFails();
|
|
|
|
+ AUDIT.logWriteFailure(buildAuditMessageForFailure(OMAction.DELETE_BUCKET,
|
|
|
|
+ auditMap), ex);
|
|
throw ex;
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private Map<String, String> buildAuditMap(String volume){
|
|
|
|
+ Map<String, String> auditMap = new LinkedHashMap<>();
|
|
|
|
+ auditMap.put(OzoneConsts.VOLUME, volume);
|
|
|
|
+ return auditMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // TODO: Temporary method until AuditMessage is simplified
|
|
|
|
+ private AuditMessage buildAuditMessageForSuccess(AuditAction op,
|
|
|
|
+ Map<String, String> auditMap) {
|
|
|
|
+ return new AuditMessage(
|
|
|
|
+ (Server.getRemoteUser() == null) ? null :
|
|
|
|
+ Server.getRemoteUser().getUserName(),
|
|
|
|
+ (Server.getRemoteIp() == null) ? null :
|
|
|
|
+ Server.getRemoteIp().getHostAddress(), op.toString(), auditMap,
|
|
|
|
+ AuditEventStatus.SUCCESS.toString());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // TODO: Temporary method until AuditMessage is simplified
|
|
|
|
+ private AuditMessage buildAuditMessageForFailure(AuditAction op,
|
|
|
|
+ Map<String, String> auditMap) {
|
|
|
|
+ return new AuditMessage(
|
|
|
|
+ (Server.getRemoteUser() == null) ? null :
|
|
|
|
+ Server.getRemoteUser().getUserName(),
|
|
|
|
+ (Server.getRemoteIp() == null) ? null :
|
|
|
|
+ Server.getRemoteIp().getHostAddress(), op.toString(), auditMap,
|
|
|
|
+ AuditEventStatus.FAILURE.toString());
|
|
|
|
+ }
|
|
|
|
+
|
|
private void registerMXBean() {
|
|
private void registerMXBean() {
|
|
Map<String, String> jmxProperties = new HashMap<String, String>();
|
|
Map<String, String> jmxProperties = new HashMap<String, String>();
|
|
jmxProperties.put("component", "ServerRuntime");
|
|
jmxProperties.put("component", "ServerRuntime");
|