Skip to content

Commit c7b98f0

Browse files
author
Ajay Kumar
committed
HDDS-1541. Implement addAcl,removeAcl,setAcl,getAcl for Key. Contributed by Ajay Kumar.
1 parent 277e9a8 commit c7b98f0

File tree

23 files changed

+850
-231
lines changed

23 files changed

+850
-231
lines changed

hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/BlockOutputStreamEntryPool.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public BlockOutputStreamEntryPool(OzoneManagerProtocol omClient,
7979
.setBucketName(info.getBucketName()).setKeyName(info.getKeyName())
8080
.setType(type).setFactor(factor).setDataSize(info.getDataSize())
8181
.setIsMultipartKey(isMultipart).setMultipartUploadID(uploadID)
82-
.setMultipartUploadPartNumber(partNumber).build();
82+
.setMultipartUploadPartNumber(partNumber)
83+
.build();
8384
this.xceiverClientManager = xceiverClientManager;
8485
this.chunkSize = chunkSize;
8586
this.requestID = requestId;

hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -405,15 +405,7 @@ public void createBucket(
405405
.setKeyName(bucketArgs.getEncryptionKey()).build();
406406
}
407407

408-
List<OzoneAcl> listOfAcls = new ArrayList<>();
409-
//User ACL
410-
listOfAcls.add(new OzoneAcl(ACLIdentityType.USER,
411-
ugi.getUserName(), userRights));
412-
//Group ACLs of the User
413-
List<String> userGroups = Arrays.asList(UserGroupInformation
414-
.createRemoteUser(ugi.getUserName()).getGroupNames());
415-
userGroups.stream().forEach((group) -> listOfAcls.add(
416-
new OzoneAcl(ACLIdentityType.GROUP, group, groupRights)));
408+
List<OzoneAcl> listOfAcls = getAclList();
417409
//ACLs from BucketArgs
418410
if(bucketArgs.getAcls() != null) {
419411
listOfAcls.addAll(bucketArgs.getAcls());
@@ -437,6 +429,23 @@ public void createBucket(
437429
ozoneManagerClient.createBucket(builder.build());
438430
}
439431

432+
/**
433+
* Helper function to get deafult acl list for current user.
434+
*
435+
* @return listOfAcls
436+
* */
437+
private List<OzoneAcl> getAclList() {
438+
List<OzoneAcl> listOfAcls = new ArrayList<>();
439+
// User ACL
440+
listOfAcls.add(new OzoneAcl(ACLIdentityType.USER,
441+
ugi.getUserName(), userRights));
442+
// Group ACLs of the User
443+
List<String> userGroups = Arrays.asList(ugi.getGroupNames());
444+
userGroups.stream().forEach((group) -> listOfAcls.add(
445+
new OzoneAcl(ACLIdentityType.GROUP, group, groupRights)));
446+
return listOfAcls;
447+
}
448+
440449
@Override
441450
public void addBucketAcls(
442451
String volumeName, String bucketName, List<OzoneAcl> addAcls)
@@ -629,6 +638,7 @@ public OzoneOutputStream createKey(
629638
.setType(HddsProtos.ReplicationType.valueOf(type.toString()))
630639
.setFactor(HddsProtos.ReplicationFactor.valueOf(factor.getValue()))
631640
.addAllMetadata(metadata)
641+
.setAcls(getAclList())
632642
.build();
633643

634644
OpenKeySession openKey = ozoneManagerClient.openKey(keyArgs);
@@ -819,6 +829,7 @@ public OmMultipartInfo initiateMultipartUpload(String volumeName,
819829
.setKeyName(keyName)
820830
.setType(HddsProtos.ReplicationType.valueOf(type.toString()))
821831
.setFactor(HddsProtos.ReplicationFactor.valueOf(factor.getValue()))
832+
.setAcls(getAclList())
822833
.build();
823834
OmMultipartInfo multipartInfo = ozoneManagerClient
824835
.initiateMultipartUpload(keyArgs);
@@ -848,6 +859,7 @@ public OzoneOutputStream createMultipartKey(String volumeName,
848859
.setIsMultipartKey(true)
849860
.setMultipartUploadID(uploadID)
850861
.setMultipartUploadPartNumber(partNumber)
862+
.setAcls(getAclList())
851863
.build();
852864

853865
OpenKeySession openKey = ozoneManagerClient.openKey(keyArgs);
@@ -963,7 +975,10 @@ public OzoneFileStatus getOzoneFileStatus(String volumeName,
963975
public void createDirectory(String volumeName, String bucketName,
964976
String keyName) throws IOException {
965977
OmKeyArgs keyArgs = new OmKeyArgs.Builder().setVolumeName(volumeName)
966-
.setBucketName(bucketName).setKeyName(keyName).build();
978+
.setBucketName(bucketName)
979+
.setKeyName(keyName)
980+
.setAcls(getAclList())
981+
.build();
967982
ozoneManagerClient.createDirectory(keyArgs);
968983
}
969984

@@ -990,6 +1005,7 @@ public OzoneOutputStream createFile(String volumeName, String bucketName,
9901005
.setDataSize(size)
9911006
.setType(HddsProtos.ReplicationType.valueOf(type.name()))
9921007
.setFactor(HddsProtos.ReplicationFactor.valueOf(factor.getValue()))
1008+
.setAcls(getAclList())
9931009
.build();
9941010
OpenKeySession keySession =
9951011
ozoneManagerClient.createFile(keyArgs, overWrite, recursive);

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/OzoneAcl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,10 @@ public class OzoneAcl {
4646
private ACLIdentityType type;
4747
private String name;
4848
private BitSet aclBitSet;
49+
public static final BitSet ZERO_BITSET = new BitSet(0);
4950

5051
/**
51-
* Constructor for OzoneAcl.
52+
* Default constructor.
5253
*/
5354
public OzoneAcl() {
5455
}

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyArgs.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.common.annotations.VisibleForTesting;
2020
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationType;
2121
import org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor;
22+
import org.apache.hadoop.ozone.OzoneAcl;
2223
import org.apache.hadoop.ozone.OzoneConsts;
2324
import org.apache.hadoop.ozone.audit.Auditable;
2425

@@ -45,13 +46,15 @@ public final class OmKeyArgs implements Auditable {
4546
private final int multipartUploadPartNumber;
4647
private Map<String, String> metadata;
4748
private boolean refreshPipeline;
49+
private List<OzoneAcl> acls;
4850

4951
@SuppressWarnings("parameternumber")
5052
private OmKeyArgs(String volumeName, String bucketName, String keyName,
5153
long dataSize, ReplicationType type, ReplicationFactor factor,
5254
List<OmKeyLocationInfo> locationInfoList, boolean isMultipart,
5355
String uploadID, int partNumber,
54-
Map<String, String> metadataMap, boolean refreshPipeline) {
56+
Map<String, String> metadataMap, boolean refreshPipeline,
57+
List<OzoneAcl> acls) {
5558
this.volumeName = volumeName;
5659
this.bucketName = bucketName;
5760
this.keyName = keyName;
@@ -64,6 +67,7 @@ private OmKeyArgs(String volumeName, String bucketName, String keyName,
6467
this.multipartUploadPartNumber = partNumber;
6568
this.metadata = metadataMap;
6669
this.refreshPipeline = refreshPipeline;
70+
this.acls = acls;
6771
}
6872

6973
public boolean getIsMultipartKey() {
@@ -86,6 +90,10 @@ public ReplicationFactor getFactor() {
8690
return factor;
8791
}
8892

93+
public List<OzoneAcl> getAcls() {
94+
return acls;
95+
}
96+
8997
public String getVolumeName() {
9098
return volumeName;
9199
}
@@ -166,6 +174,7 @@ public static class Builder {
166174
private int multipartUploadPartNumber;
167175
private Map<String, String> metadata = new HashMap<>();
168176
private boolean refreshPipeline;
177+
private List<OzoneAcl> acls;
169178

170179
public Builder setVolumeName(String volume) {
171180
this.volumeName = volume;
@@ -202,6 +211,11 @@ public Builder setLocationInfoList(List<OmKeyLocationInfo> locationInfos) {
202211
return this;
203212
}
204213

214+
public Builder setAcls(List<OzoneAcl> listOfAcls) {
215+
this.acls = listOfAcls;
216+
return this;
217+
}
218+
205219
public Builder setIsMultipartKey(boolean isMultipart) {
206220
this.isMultipartKey = isMultipart;
207221
return this;
@@ -235,7 +249,7 @@ public Builder setRefreshPipeline(boolean refresh) {
235249
public OmKeyArgs build() {
236250
return new OmKeyArgs(volumeName, bucketName, keyName, dataSize, type,
237251
factor, locationInfoList, isMultipartKey, multipartUploadID,
238-
multipartUploadPartNumber, metadata, refreshPipeline);
252+
multipartUploadPartNumber, metadata, refreshPipeline, acls);
239253
}
240254

241255
}

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.hadoop.fs.FileEncryptionInfo;
2929
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
3030
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyInfo;
31+
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneAclInfo;
3132
import org.apache.hadoop.ozone.protocolPB.OMPBHelper;
3233
import org.apache.hadoop.util.Time;
3334

@@ -50,6 +51,10 @@ public final class OmKeyInfo extends WithMetadata {
5051
private HddsProtos.ReplicationType type;
5152
private HddsProtos.ReplicationFactor factor;
5253
private FileEncryptionInfo encInfo;
54+
/**
55+
* ACL Information.
56+
*/
57+
private List<OzoneAclInfo> acls;
5358

5459
@SuppressWarnings("parameternumber")
5560
OmKeyInfo(String volumeName, String bucketName, String keyName,
@@ -58,7 +63,7 @@ public final class OmKeyInfo extends WithMetadata {
5863
HddsProtos.ReplicationType type,
5964
HddsProtos.ReplicationFactor factor,
6065
Map<String, String> metadata,
61-
FileEncryptionInfo encInfo) {
66+
FileEncryptionInfo encInfo, List<OzoneAclInfo> acls) {
6267
this.volumeName = volumeName;
6368
this.bucketName = bucketName;
6469
this.keyName = keyName;
@@ -81,6 +86,7 @@ public final class OmKeyInfo extends WithMetadata {
8186
this.type = type;
8287
this.metadata = metadata;
8388
this.encInfo = encInfo;
89+
this.acls = acls;
8490
}
8591

8692
public String getVolumeName() {
@@ -216,6 +222,10 @@ public FileEncryptionInfo getFileEncryptionInfo() {
216222
return encInfo;
217223
}
218224

225+
public List<OzoneAclInfo> getAcls() {
226+
return acls;
227+
}
228+
219229
/**
220230
* Builder of OmKeyInfo.
221231
*/
@@ -232,6 +242,7 @@ public static class Builder {
232242
private HddsProtos.ReplicationFactor factor;
233243
private Map<String, String> metadata;
234244
private FileEncryptionInfo encInfo;
245+
private List<OzoneAclInfo> acls;
235246

236247
public Builder() {
237248
this.metadata = new HashMap<>();
@@ -299,11 +310,16 @@ public Builder setFileEncryptionInfo(FileEncryptionInfo feInfo) {
299310
return this;
300311
}
301312

313+
public Builder setAcls(List<OzoneAclInfo> listOfAcls) {
314+
this.acls = listOfAcls;
315+
return this;
316+
}
317+
302318
public OmKeyInfo build() {
303319
return new OmKeyInfo(
304320
volumeName, bucketName, keyName, omKeyLocationInfoGroups,
305321
dataSize, creationTime, modificationTime, type, factor, metadata,
306-
encInfo);
322+
encInfo, acls);
307323
}
308324
}
309325

@@ -327,6 +343,9 @@ public KeyInfo getProtobuf() {
327343
if (encInfo != null) {
328344
kb.setFileEncryptionInfo(OMPBHelper.convert(encInfo));
329345
}
346+
if(acls != null) {
347+
kb.addAllAcls(acls);
348+
}
330349
return kb.build();
331350
}
332351

@@ -345,7 +364,8 @@ public static OmKeyInfo getFromProtobuf(KeyInfo keyInfo) {
345364
keyInfo.getFactor(),
346365
KeyValueUtil.getFromProtobuf(keyInfo.getMetadataList()),
347366
keyInfo.hasFileEncryptionInfo() ? OMPBHelper.convert(keyInfo
348-
.getFileEncryptionInfo()): null);
367+
.getFileEncryptionInfo()): null,
368+
keyInfo.getAclsList());
349369
}
350370

351371
@Override

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmOzoneAclMap.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.HashMap;
3737
import java.util.Objects;
3838

39+
import static org.apache.hadoop.ozone.OzoneAcl.ZERO_BITSET;
3940
import static org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.INVALID_REQUEST;
4041
import static org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneAclInfo.OzoneAclRights.ALL;
4142

@@ -81,8 +82,17 @@ public void addAcl(OzoneAcl acl) throws OMException {
8182
if (!getMap(aclType).containsKey(acl.getName())) {
8283
getMap(aclType).put(acl.getName(), acl.getAclBitSet());
8384
} else {
84-
// throw exception if acl is already added.
85-
throw new OMException("Acl " + acl + " already exist.", INVALID_REQUEST);
85+
// Check if we are adding new rights to existing acl.
86+
BitSet temp = (BitSet) acl.getAclBitSet().clone();
87+
BitSet curRights = (BitSet) getMap(aclType).get(acl.getName()).clone();
88+
temp.or(curRights);
89+
90+
if (temp.equals(curRights)) {
91+
// throw exception if acl is already added.
92+
throw new OMException("Acl " + acl + " already exist.",
93+
INVALID_REQUEST);
94+
}
95+
getMap(aclType).get(acl.getName()).or(acl.getAclBitSet());
8696
}
8797
}
8898

@@ -105,7 +115,21 @@ public void removeAcl(OzoneAcl acl) throws OMException {
105115
Objects.requireNonNull(acl, "Acl should not be null.");
106116
OzoneAclType aclType = OzoneAclType.valueOf(acl.getType().name());
107117
if (getMap(aclType).containsKey(acl.getName())) {
108-
getMap(aclType).remove(acl.getName());
118+
BitSet aclRights = getMap(aclType).get(acl.getName());
119+
BitSet bits = (BitSet) acl.getAclBitSet().clone();
120+
bits.and(aclRights);
121+
122+
if (bits.equals(ZERO_BITSET)) {
123+
// throw exception if acl is already added.
124+
throw new OMException("Acl [" + acl + "] doesn't exist.",
125+
INVALID_REQUEST);
126+
}
127+
128+
acl.getAclBitSet().and(aclRights);
129+
aclRights.xor(acl.getAclBitSet());
130+
if (aclRights.equals(ZERO_BITSET)) {
131+
getMap(aclType).remove(acl.getName());
132+
}
109133
} else {
110134
// throw exception if acl is already added.
111135
throw new OMException("Acl [" + acl + "] doesn't exist.",

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,11 @@ public OpenKeySession openKey(OmKeyArgs args) throws IOException {
668668
.setBucketName(args.getBucketName())
669669
.setKeyName(args.getKeyName());
670670

671+
if(args.getAcls() != null) {
672+
keyArgs.addAllAcls(args.getAcls().stream().distinct().map(a ->
673+
OzoneAcl.toProtobuf(a)).collect(Collectors.toList()));
674+
}
675+
671676
if (args.getFactor() != null) {
672677
keyArgs.setFactor(args.getFactor());
673678
}
@@ -991,6 +996,8 @@ public OmMultipartInfo initiateMultipartUpload(OmKeyArgs omKeyArgs) throws
991996
.setBucketName(omKeyArgs.getBucketName())
992997
.setKeyName(omKeyArgs.getKeyName())
993998
.setFactor(omKeyArgs.getFactor())
999+
.addAllAcls(omKeyArgs.getAcls().stream().map(a ->
1000+
OzoneAcl.toProtobuf(a)).collect(Collectors.toList()))
9941001
.setType(omKeyArgs.getType());
9951002
multipartInfoInitiateRequest.setKeyArgs(keyArgs.build());
9961003

@@ -1276,6 +1283,8 @@ public void createDirectory(OmKeyArgs args) throws IOException {
12761283
.setVolumeName(args.getVolumeName())
12771284
.setBucketName(args.getBucketName())
12781285
.setKeyName(args.getKeyName())
1286+
.addAllAcls(args.getAcls().stream().map(a ->
1287+
OzoneAcl.toProtobuf(a)).collect(Collectors.toList()))
12791288
.build();
12801289
CreateDirectoryRequest request = CreateDirectoryRequest.newBuilder()
12811290
.setKeyArgs(keyArgs)
@@ -1412,6 +1421,8 @@ public OpenKeySession createFile(OmKeyArgs args,
14121421
.setDataSize(args.getDataSize())
14131422
.setType(args.getType())
14141423
.setFactor(args.getFactor())
1424+
.addAllAcls(args.getAcls().stream().map(a ->
1425+
OzoneAcl.toProtobuf(a)).collect(Collectors.toList()))
14151426
.build();
14161427
CreateFileRequest createFileRequest = CreateFileRequest.newBuilder()
14171428
.setKeyArgs(keyArgs)

0 commit comments

Comments
 (0)