This is an automated email from the ASF dual-hosted git repository.
adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 79b59457479 HDDS-13941. Introduce builder for list of ACLs (#9430)
79b59457479 is described below
commit 79b594574795cf42c6f52c4ce1468e8ad89280db
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Tue Dec 9 07:46:39 2025 +0100
HDDS-13941. Introduce builder for list of ACLs (#9430)
---
.../apache/hadoop/ozone/client/rpc/RpcClient.java | 9 +-
.../hadoop/ozone/om/helpers/AclListBuilder.java | 94 ++++++++++++++
.../hadoop/ozone/om/helpers/OmVolumeArgs.java | 92 ++++++-------
.../hadoop/ozone/om/helpers/OzoneAclUtil.java | 9 ++
.../ozone/om/helpers/TestAclListBuilder.java | 143 +++++++++++++++++++++
.../hadoop/ozone/om/helpers/TestOmVolumeArgs.java | 98 ++++++++------
.../freon/containergenerator/GeneratorOm.java | 4 +-
.../om/TestOzoneManagerListVolumesSecure.java | 4 +-
.../org/apache/hadoop/ozone/om/OzoneManager.java | 2 +-
.../request/s3/tenant/OMTenantCreateRequest.java | 17 +--
.../om/request/volume/OMVolumeCreateRequest.java | 23 ++--
.../om/request/volume/acl/OMVolumeAclRequest.java | 23 ++--
.../request/volume/acl/OMVolumeAddAclRequest.java | 10 +-
.../volume/acl/OMVolumeRemoveAclRequest.java | 10 +-
.../request/volume/acl/OMVolumeSetAclRequest.java | 12 +-
.../ozone/security/acl/OzoneNativeAclTestUtil.java | 14 +-
.../hadoop/ozone/recon/api/TestEndpoints.java | 4 +-
17 files changed, 415 insertions(+), 153 deletions(-)
diff --git
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
index 2cd7f11b3df..254f686eb24 100644
---
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
+++
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -454,14 +454,7 @@ public void createVolume(String volumeName, VolumeArgs
volArgs)
builder.setUsedNamespace(0L);
builder.addAllMetadata(volArgs.getMetadata());
//ACLs from VolumeArgs
- List<OzoneAcl> volumeAcls = volArgs.getAcls();
- if (volumeAcls != null) {
- //Remove duplicates and add ACLs
- for (OzoneAcl ozoneAcl :
- volumeAcls.stream().distinct().collect(Collectors.toList())) {
- builder.addOzoneAcls(ozoneAcl);
- }
- }
+ builder.acls().addAll(volArgs.getAcls());
if (volArgs.getQuotaInBytes() == 0) {
LOG.info("Creating Volume: {}, with {} as owner.", volumeName, owner);
diff --git
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/AclListBuilder.java
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/AclListBuilder.java
new file mode 100644
index 00000000000..436885a83a7
--- /dev/null
+++
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/AclListBuilder.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.om.helpers;
+
+import com.google.common.collect.ImmutableList;
+import jakarta.annotation.Nonnull;
+import jakarta.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import org.apache.hadoop.ozone.OzoneAcl;
+
+/** Helps incrementally build a list of ACLs. */
+public final class AclListBuilder {
+
+ /** The original list being built from, used if no changes are made, to
reduce copying. */
+ private final ImmutableList<OzoneAcl> originalList;
+ /** The updated list being built, created lazily on the first modification.
*/
+ private List<OzoneAcl> updatedList;
+ /** Whether any changes were made. */
+ private boolean changed;
+
+ public static AclListBuilder empty() {
+ return new AclListBuilder(ImmutableList.of());
+ }
+
+ public static AclListBuilder of(ImmutableList<OzoneAcl> list) {
+ return new AclListBuilder(list);
+ }
+
+ public static AclListBuilder copyOf(List<OzoneAcl> list) {
+ return new AclListBuilder(list == null ? ImmutableList.of() :
ImmutableList.copyOf(list));
+ }
+
+ private AclListBuilder(ImmutableList<OzoneAcl> list) {
+ originalList = list;
+ }
+
+ public boolean isChanged() {
+ return changed;
+ }
+
+ public ImmutableList<OzoneAcl> build() {
+ return changed ? ImmutableList.copyOf(updatedList) : originalList;
+ }
+
+ public void add(@Nonnull OzoneAcl acl) {
+ Objects.requireNonNull(acl, "acl == null");
+ ensureInitialized();
+ changed |= OzoneAclUtil.addAcl(updatedList, acl);
+ }
+
+ public void addAll(@Nullable List<OzoneAcl> newAcls) {
+ if (newAcls == null || newAcls.isEmpty()) {
+ return;
+ }
+ ensureInitialized();
+ changed |= OzoneAclUtil.addAllAcl(updatedList, newAcls);
+ }
+
+ /** Set the list being built to {@code acls}. For further mutations to
work, it must be modifiable. */
+ public void set(@Nonnull List<OzoneAcl> acls) {
+ Objects.requireNonNull(acls, "acls == null");
+ changed |= !acls.equals(updatedList != null ? updatedList : originalList);
+ updatedList = acls;
+ }
+
+ public void remove(@Nonnull OzoneAcl acl) {
+ Objects.requireNonNull(acl, "acl == null");
+ ensureInitialized();
+ changed |= OzoneAclUtil.removeAcl(updatedList, acl);
+ }
+
+ private void ensureInitialized() {
+ if (updatedList == null) {
+ updatedList = new ArrayList<>(originalList);
+ }
+ }
+}
diff --git
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
index 3b028d616e8..26a7fe63bd3 100644
---
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
+++
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmVolumeArgs.java
@@ -24,7 +24,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import java.util.concurrent.CopyOnWriteArrayList;
+import net.jcip.annotations.Immutable;
import org.apache.hadoop.hdds.utils.db.Codec;
import org.apache.hadoop.hdds.utils.db.CopyObject;
import org.apache.hadoop.hdds.utils.db.DelegatedCodec;
@@ -38,9 +38,9 @@
/**
* A class that encapsulates the OmVolumeArgs Args.
*/
-// not yet @Immutable, needs HDDS-13941
+@Immutable
public final class OmVolumeArgs extends WithObjectID
- implements CopyObject<OmVolumeArgs>, Auditable {
+ implements CopyObject<OmVolumeArgs> {
private static final Codec<OmVolumeArgs> CODEC = new DelegatedCodec<>(
Proto2Codec.get(VolumeInfo.getDefaultInstance()),
OmVolumeArgs::getFromProtobuf,
@@ -55,7 +55,7 @@ public final class OmVolumeArgs extends WithObjectID
private final long quotaInBytes;
private final long quotaInNamespace;
private final long usedNamespace;
- private final CopyOnWriteArrayList<OzoneAcl> acls;
+ private final ImmutableList<OzoneAcl> acls;
/**
* Reference count on this Ozone volume.
*
@@ -78,7 +78,7 @@ private OmVolumeArgs(Builder b) {
this.quotaInBytes = b.quotaInBytes;
this.quotaInNamespace = b.quotaInNamespace;
this.usedNamespace = b.usedNamespace;
- this.acls = new CopyOnWriteArrayList<>(b.acls);
+ this.acls = b.acls.build();
this.creationTime = b.creationTime;
this.modificationTime = b.modificationTime;
this.refCount = b.refCount;
@@ -93,18 +93,6 @@ public long getRefCount() {
return refCount;
}
- public boolean addAcl(OzoneAcl ozoneAcl) {
- return OzoneAclUtil.addAcl(acls, ozoneAcl);
- }
-
- public boolean setAcls(List<OzoneAcl> ozoneAcls) {
- return OzoneAclUtil.setAcl(acls, ozoneAcls);
- }
-
- public boolean removeAcl(OzoneAcl ozoneAcl) {
- return OzoneAclUtil.removeAcl(acls, ozoneAcl);
- }
-
/**
* Returns the Admin Name.
* @return String.
@@ -196,25 +184,6 @@ public static Builder newBuilder() {
return new Builder();
}
- @Override
- public Map<String, String> toAuditMap() {
- Map<String, String> auditMap = new LinkedHashMap<>();
- auditMap.put(OzoneConsts.ADMIN, this.adminName);
- auditMap.put(OzoneConsts.OWNER, this.ownerName);
- auditMap.put(OzoneConsts.VOLUME, this.volume);
- auditMap.put(OzoneConsts.CREATION_TIME, String.valueOf(this.creationTime));
- auditMap.put(OzoneConsts.MODIFICATION_TIME,
- String.valueOf(this.modificationTime));
- auditMap.put(OzoneConsts.QUOTA_IN_BYTES,
String.valueOf(this.quotaInBytes));
- auditMap.put(OzoneConsts.QUOTA_IN_NAMESPACE,
- String.valueOf(this.quotaInNamespace));
- auditMap.put(OzoneConsts.USED_NAMESPACE,
- String.valueOf(this.usedNamespace));
- auditMap.put(OzoneConsts.OBJECT_ID, String.valueOf(this.getObjectID()));
- auditMap.put(OzoneConsts.UPDATE_ID, String.valueOf(this.getUpdateID()));
- return auditMap;
- }
-
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -235,7 +204,7 @@ public int hashCode() {
/**
* Builder for OmVolumeArgs.
*/
- public static class Builder extends WithObjectID.Builder<OmVolumeArgs> {
+ public static class Builder extends WithObjectID.Builder<OmVolumeArgs>
implements Auditable {
private String adminName;
private String ownerName;
private String volume;
@@ -244,7 +213,7 @@ public static class Builder extends
WithObjectID.Builder<OmVolumeArgs> {
private long quotaInBytes;
private long quotaInNamespace;
private long usedNamespace;
- private final List<OzoneAcl> acls;
+ private final AclListBuilder acls;
private long refCount;
@Override
@@ -263,10 +232,14 @@ public Builder setUpdateID(long id) {
* Constructs a builder.
*/
public Builder() {
- this(new ArrayList<>());
+ this(AclListBuilder.empty());
}
private Builder(List<OzoneAcl> acls) {
+ this(AclListBuilder.copyOf(acls));
+ }
+
+ private Builder(AclListBuilder acls) {
this.acls = acls;
quotaInBytes = OzoneConsts.QUOTA_RESET;
quotaInNamespace = OzoneConsts.QUOTA_RESET;
@@ -274,7 +247,7 @@ private Builder(List<OzoneAcl> acls) {
private Builder(OmVolumeArgs omVolumeArgs) {
super(omVolumeArgs);
- this.acls = omVolumeArgs.acls;
+ this.acls = AclListBuilder.of(omVolumeArgs.acls);
this.adminName = omVolumeArgs.adminName;
this.ownerName = omVolumeArgs.ownerName;
this.volume = omVolumeArgs.volume;
@@ -346,8 +319,22 @@ public Builder addAllMetadata(Map<String, String>
additionalMetaData) {
return this;
}
- public Builder addOzoneAcls(OzoneAcl acl) {
- OzoneAclUtil.addAcl(acls, acl);
+ public AclListBuilder acls() {
+ return acls;
+ }
+
+ public Builder addAcl(OzoneAcl acl) {
+ acls.add(acl);
+ return this;
+ }
+
+ public Builder setAcls(List<OzoneAcl> newList) {
+ acls.set(newList);
+ return this;
+ }
+
+ public Builder removeAcl(OzoneAcl acl) {
+ acls.remove(acl);
return this;
}
@@ -385,6 +372,25 @@ protected void validate() {
protected OmVolumeArgs buildObject() {
return new OmVolumeArgs(this);
}
+
+ @Override
+ public Map<String, String> toAuditMap() {
+ Map<String, String> auditMap = new LinkedHashMap<>();
+ auditMap.put(OzoneConsts.ADMIN, this.adminName);
+ auditMap.put(OzoneConsts.OWNER, this.ownerName);
+ auditMap.put(OzoneConsts.VOLUME, this.volume);
+ auditMap.put(OzoneConsts.CREATION_TIME,
String.valueOf(this.creationTime));
+ auditMap.put(OzoneConsts.MODIFICATION_TIME,
+ String.valueOf(this.modificationTime));
+ auditMap.put(OzoneConsts.QUOTA_IN_BYTES,
String.valueOf(this.quotaInBytes));
+ auditMap.put(OzoneConsts.QUOTA_IN_NAMESPACE,
+ String.valueOf(this.quotaInNamespace));
+ auditMap.put(OzoneConsts.USED_NAMESPACE,
+ String.valueOf(this.usedNamespace));
+ auditMap.put(OzoneConsts.OBJECT_ID, String.valueOf(this.getObjectID()));
+ auditMap.put(OzoneConsts.UPDATE_ID, String.valueOf(this.getUpdateID()));
+ return auditMap;
+ }
}
public VolumeInfo getProtobuf() {
@@ -442,6 +448,6 @@ public String getObjectInfo() {
@Override
public OmVolumeArgs copyObject() {
- return toBuilder().build();
+ return this;
}
}
diff --git
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
index d89f9282b7f..e2b3cd04db2 100644
---
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
+++
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneAclUtil.java
@@ -230,6 +230,15 @@ public static boolean addAcl(List<OzoneAcl> existingAcls,
OzoneAcl acl) {
return true;
}
+ public static boolean addAllAcl(List<OzoneAcl> existingAcls, List<OzoneAcl>
acls) {
+ // TOOD optimize
+ boolean changed = false;
+ for (OzoneAcl acl : acls) {
+ changed |= addAcl(existingAcls, acl);
+ }
+ return changed;
+ }
+
/**
* remove OzoneAcl from existing list of OzoneAcls.
* @return true if current OzoneAcls are changed, false otherwise.
diff --git
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestAclListBuilder.java
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestAclListBuilder.java
new file mode 100644
index 00000000000..d8f6cf41345
--- /dev/null
+++
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestAclListBuilder.java
@@ -0,0 +1,143 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.om.helpers;
+
+import static java.util.Arrays.asList;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+import static org.apache.hadoop.ozone.OzoneAcl.AclScope.ACCESS;
+import static
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.USER;
+import static
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.READ;
+import static
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.WRITE;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Stream;
+import org.apache.hadoop.ozone.OzoneAcl;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+class TestAclListBuilder {
+
+ private static final OzoneAcl ALICE_READ = OzoneAcl.of(USER, "alice",
ACCESS, READ);
+ private static final OzoneAcl ALICE_WRITE = OzoneAcl.of(USER, "alice",
ACCESS, WRITE);
+ private static final OzoneAcl ALICE_READ_WRITE = ALICE_READ.add(ALICE_WRITE);
+ private static final OzoneAcl BOB_READ = OzoneAcl.of(USER, "bob", ACCESS,
READ);
+
+ public static Stream<List<OzoneAcl>> initialLists() {
+ return Stream.of(
+ emptyList(),
+ singletonList(ALICE_READ),
+ asList(ALICE_READ, ALICE_WRITE)
+ );
+ }
+
+ @Test
+ void returnsInitialListIfUnchanged() {
+ ImmutableList<OzoneAcl> list = ImmutableList.copyOf(asList(ALICE_READ,
ALICE_WRITE));
+ AclListBuilder subject = AclListBuilder.of(list);
+
+ assertThat(subject.build())
+ .isSameAs(list);
+ }
+
+ @Test
+ void testAdd() {
+ testAdd(subject -> {
+ subject.add(ALICE_WRITE);
+ subject.add(BOB_READ);
+ });
+ }
+
+ @Test
+ void testAddAll() {
+ testAdd(subject -> subject.addAll(asList(ALICE_WRITE, BOB_READ)));
+ }
+
+ // op should be adding ALICE_WRITE and BOB_READ
+ private void testAdd(Consumer<AclListBuilder> op) {
+ AclListBuilder subject = AclListBuilder.copyOf(singletonList(ALICE_READ));
+
+ op.accept(subject);
+
+ assertThat(subject.isChanged())
+ .isTrue();
+ assertThat(subject.build())
+ .contains(ALICE_READ_WRITE)
+ .contains(BOB_READ)
+ .hasSize(2);
+ }
+
+ @ParameterizedTest
+ @MethodSource("initialLists")
+ void testSetSame(List<OzoneAcl> initialList) {
+ AclListBuilder subject = AclListBuilder.copyOf(initialList);
+
+ subject.set(initialList);
+
+ assertThat(subject.isChanged())
+ .isFalse();
+ assertThat(subject.build())
+ .isEqualTo(initialList);
+ }
+
+ @ParameterizedTest
+ @MethodSource("initialLists")
+ void testSetEqual(List<OzoneAcl> initialList) {
+ AclListBuilder subject = AclListBuilder.copyOf(initialList);
+
+ subject.set(new ArrayList<>(initialList));
+
+ assertThat(subject.isChanged())
+ .isFalse();
+ assertThat(subject.build())
+ .isEqualTo(initialList);
+ }
+
+ @ParameterizedTest
+ @MethodSource("initialLists")
+ void testSetDifferent(List<OzoneAcl> initialList) {
+ AclListBuilder subject = AclListBuilder.copyOf(initialList);
+ List<OzoneAcl> differentList = new ArrayList<>(initialList);
+ differentList.add(BOB_READ);
+
+ subject.set(differentList);
+
+ assertThat(subject.isChanged())
+ .isTrue();
+ assertThat(subject.build())
+ .isEqualTo(differentList);
+ }
+
+ @Test
+ void testRemove() {
+ AclListBuilder subject = AclListBuilder.copyOf(asList(ALICE_READ_WRITE,
BOB_READ));
+
+ subject.remove(ALICE_WRITE);
+ subject.remove(BOB_READ);
+
+ assertThat(subject.isChanged())
+ .isTrue();
+ assertThat(subject.build())
+ .isEqualTo(singletonList(ALICE_READ));
+ }
+}
diff --git
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
index de6df303b58..869d153b429 100644
---
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
+++
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmVolumeArgs.java
@@ -17,15 +17,21 @@
package org.apache.hadoop.ozone.om.helpers;
+import static java.util.Collections.emptyList;
import static org.apache.hadoop.ozone.OzoneAcl.AclScope.ACCESS;
+import static
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.USER;
+import static
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.READ;
+import static
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLType.WRITE;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import java.io.IOException;
import java.util.Collections;
import org.apache.hadoop.ozone.OzoneAcl;
-import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.util.Time;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
/**
@@ -33,54 +39,68 @@
*/
public class TestOmVolumeArgs {
+ private static final OzoneAcl USER1_READ = OzoneAcl.of(USER, "user1",
ACCESS, READ);
+ private static final OzoneAcl USER1_WRITE = OzoneAcl.of(USER, "user1",
ACCESS, WRITE);
+ private static String user;
+
+ @BeforeAll
+ static void setup() throws IOException {
+ user = UserGroupInformation.getCurrentUser().getUserName();
+ }
+
@Test
- public void testClone() throws Exception {
- String volumeName = "vol1";
- String admin = "admin";
- String owner = UserGroupInformation.getCurrentUser().getUserName();
- OmVolumeArgs omVolumeArgs = new
OmVolumeArgs.Builder().setVolume(volumeName)
- .setAdminName(admin).setCreationTime(Time.now()).setOwnerName(owner)
- .setObjectID(1L).setUpdateID(1L).setQuotaInBytes(Long.MAX_VALUE)
- .addMetadata("key1", "value1").addMetadata("key2", "value2")
- .addOzoneAcls(
- OzoneAcl.of(IAccessAuthorizer.ACLIdentityType.USER, "user1",
- ACCESS, IAccessAuthorizer.ACLType.READ)).build();
-
- OmVolumeArgs cloneVolumeArgs = omVolumeArgs.copyObject();
-
- assertEquals(omVolumeArgs, cloneVolumeArgs);
+ public void testClone() {
+ OmVolumeArgs subject = createSubject();
+ assertSame(subject, subject.copyObject());
+ }
+ @Test
+ void addAcl() {
+ OmVolumeArgs omVolumeArgs = createSubject();
// add user acl to write.
- omVolumeArgs.addAcl(OzoneAcl.of(
- IAccessAuthorizer.ACLIdentityType.USER, "user1",
- ACCESS, IAccessAuthorizer.ACLType.WRITE));
+ OmVolumeArgs updated = omVolumeArgs.toBuilder()
+ .addAcl(USER1_WRITE)
+ .build();
+
+ assertNotEquals(omVolumeArgs.getAcls().get(0), updated.getAcls().get(0));
+ }
- // Now check clone acl
- assertNotEquals(cloneVolumeArgs.getAcls().get(0),
- omVolumeArgs.getAcls().get(0));
+ @Test
+ void setAcls() {
+ OmVolumeArgs omVolumeArgs = createSubject();
// Set user acl to Write_ACL.
- omVolumeArgs.setAcls(Collections.singletonList(OzoneAcl.of(
- IAccessAuthorizer.ACLIdentityType.USER, "user1",
- ACCESS, IAccessAuthorizer.ACLType.WRITE_ACL)));
-
- assertNotEquals(cloneVolumeArgs.getAcls().get(0),
- omVolumeArgs.getAcls().get(0));
+ OmVolumeArgs updated = omVolumeArgs.toBuilder()
+ .setAcls(Collections.singletonList(USER1_WRITE))
+ .build();
- // Now clone and check. It should have same as original acl.
- cloneVolumeArgs = (OmVolumeArgs) omVolumeArgs.copyObject();
+ assertEquals(USER1_WRITE, updated.getAcls().get(0));
+ assertNotEquals(omVolumeArgs.getAcls().get(0), updated.getAcls().get(0));
+ }
- assertEquals(omVolumeArgs, cloneVolumeArgs);
- assertEquals(cloneVolumeArgs.getAcls().get(0),
- omVolumeArgs.getAcls().get(0));
+ @Test
+ void removeAcl() {
+ OmVolumeArgs subject = createSubject();
- omVolumeArgs.removeAcl(OzoneAcl.of(
- IAccessAuthorizer.ACLIdentityType.USER, "user1",
- ACCESS, IAccessAuthorizer.ACLType.WRITE_ACL));
+ OmVolumeArgs updated = subject.toBuilder()
+ .removeAcl(USER1_READ)
+ .build();
- // Removing acl, in original omVolumeArgs it should have no acls.
- assertEquals(0, omVolumeArgs.getAcls().size());
- assertEquals(1, cloneVolumeArgs.getAcls().size());
+ assertEquals(emptyList(), updated.getAcls());
+ }
+ private static OmVolumeArgs createSubject() {
+ return new OmVolumeArgs.Builder()
+ .setVolume("vol1")
+ .setAdminName("admin")
+ .setCreationTime(Time.now())
+ .setOwnerName(user)
+ .setObjectID(1L)
+ .setUpdateID(1L)
+ .setQuotaInBytes(Long.MAX_VALUE)
+ .addMetadata("key1", "value1")
+ .addMetadata("key2", "value2")
+ .addAcl(USER1_READ)
+ .build();
}
}
diff --git
a/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
b/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
index fe3752e4edf..05b498abb2f 100644
---
a/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
+++
b/hadoop-ozone/freon/src/main/java/org/apache/hadoop/ozone/freon/containergenerator/GeneratorOm.java
@@ -141,10 +141,10 @@ private void writeOmBucketVolume() throws IOException {
.setObjectID(1L)
.setUpdateID(1L)
.setQuotaInBytes(100L)
- .addOzoneAcls(
+ .addAcl(
OzoneAcl.of(IAccessAuthorizer.ACLIdentityType.WORLD, "",
ACCESS, IAccessAuthorizer.ACLType.ALL))
- .addOzoneAcls(
+ .addAcl(
OzoneAcl.of(IAccessAuthorizer.ACLIdentityType.USER, getUserId(),
ACCESS, IAccessAuthorizer.ACLType.ALL)
).build();
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
index 6bf4a9fed83..906a1934ab0 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumesSecure.java
@@ -220,8 +220,8 @@ private void setupEnvironment(boolean aclEnabled,
String aclUser1All = "user:user1:a";
String aclUser2All = "user:user2:a";
String aclWorldAll = "world::a";
- createVolumeWithOwnerAndAcl(omClient, "volume1", USER_1, aclUser1All);
- createVolumeWithOwnerAndAcl(omClient, "volume2", USER_2, aclUser2All);
+ createVolumeWithOwnerAndAcl(omClient, "volume1", USER_1, null);
+ createVolumeWithOwnerAndAcl(omClient, "volume2", USER_2, null);
createVolumeWithOwnerAndAcl(omClient, "volume3", USER_1, aclUser2All);
createVolumeWithOwnerAndAcl(omClient, "volume4", USER_2, aclUser1All);
createVolumeWithOwnerAndAcl(omClient, "volume5", USER_1, aclWorldAll);
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index 36d05e14074..19823796e70 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -4801,7 +4801,7 @@ private OmVolumeArgs createS3VolumeContext(String
s3Volume,
// Add ACLs
for (OzoneAcl ozoneAcl : listOfAcls) {
- omVolumeArgs.addOzoneAcls(ozoneAcl);
+ omVolumeArgs.addAcl(ozoneAcl);
}
return omVolumeArgs.build();
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
index ab14c68dce2..0a9977ff785 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/tenant/OMTenantCreateRequest.java
@@ -219,7 +219,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager
ozoneManager, Execut
OMClientResponse omClientResponse = null;
final OMResponse.Builder omResponse =
OmResponseUtil.getOMResponseBuilder(getOmRequest());
- OmVolumeArgs omVolumeArgs = null;
+ OmVolumeArgs omVolumeArgs;
boolean acquiredVolumeLock = false;
boolean acquiredUserLock = false;
final String owner = getOmRequest().getUserInfo().getUserName();
@@ -273,16 +273,17 @@ public OMClientResponse
validateAndUpdateCache(OzoneManager ozoneManager, Execut
USER_LOCK, owner));
acquiredUserLock = getOmLockDetails().isLockAcquired();
+ OmVolumeArgs.Builder volumeBuilder;
PersistedUserVolumeInfo volumeList = null;
if (!skipVolumeCreation) {
// Create volume. TODO: dedup OMVolumeCreateRequest
- omVolumeArgs = OmVolumeArgs.builderFromProtobuf(volumeInfo)
+ volumeBuilder = OmVolumeArgs.builderFromProtobuf(volumeInfo)
.setQuotaInBytes(OzoneConsts.QUOTA_RESET)
.setQuotaInNamespace(OzoneConsts.QUOTA_RESET)
.setObjectID(ozoneManager.getObjectIdFromTxId(transactionLogIndex))
.setUpdateID(transactionLogIndex)
- .incRefCount()
- .build();
+ .incRefCount();
+ omVolumeArgs = volumeBuilder.build();
// Remove this check when vol ref count is also used by other features
Preconditions.checkState(omVolumeArgs.getRefCount() == 1L,
@@ -298,10 +299,10 @@ public OMClientResponse
validateAndUpdateCache(OzoneManager ozoneManager, Execut
} else {
LOG.info("Skipped volume '{}' creation. "
+ "Will only increment volume refCount", volumeName);
- omVolumeArgs = getVolumeInfo(omMetadataManager, volumeName)
+ volumeBuilder = getVolumeInfo(omMetadataManager, volumeName)
.toBuilder()
- .incRefCount()
- .build();
+ .incRefCount();
+ omVolumeArgs = volumeBuilder.build();
// Remove this check when vol ref count is also used by other features
Preconditions.checkState(omVolumeArgs.getRefCount() == 1L,
@@ -313,7 +314,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager
ozoneManager, Execut
}
// Audit
- auditMap = omVolumeArgs.toAuditMap();
+ auditMap = volumeBuilder.toAuditMap();
// Check tenant existence in tenantStateTable
if (omMetadataManager.getTenantStateTable().isExist(tenantId)) {
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
index 1c739cb4f99..3348037a62d 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/OMVolumeCreateRequest.java
@@ -26,7 +26,6 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
-import java.util.stream.Collectors;
import org.apache.hadoop.ozone.OmUtils;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.audit.OMAction;
@@ -135,12 +134,11 @@ public OMClientResponse
validateAndUpdateCache(OzoneManager ozoneManager, Execut
// when you create a volume, we set both Object ID and update ID.
// The Object ID will never change, but update
// ID will be set to transactionID each time we update the object.
- omVolumeArgs = OmVolumeArgs.builderFromProtobuf(volumeInfo)
+ OmVolumeArgs.Builder builder =
OmVolumeArgs.builderFromProtobuf(volumeInfo)
.setObjectID(ozoneManager.getObjectIdFromTxId(transactionLogIndex))
- .setUpdateID(transactionLogIndex)
- .build();
+ .setUpdateID(transactionLogIndex);
- auditMap = omVolumeArgs.toAuditMap();
+ auditMap = builder.toAuditMap();
// acquire lock.
mergeOmLockDetails(omMetadataManager.getLock().acquireWriteLock(
VOLUME_LOCK, volume));
@@ -154,7 +152,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager
ozoneManager, Execut
PersistedUserVolumeInfo volumeList = null;
if (omMetadataManager.getVolumeTable().isExist(dbVolumeKey)) {
- LOG.debug("volume:{} already exists", omVolumeArgs.getVolume());
+ LOG.debug("volume:{} already exists", volume);
throw new OMException("Volume already exists",
OMException.ResultCodes.VOLUME_ALREADY_EXISTS);
} else {
@@ -164,15 +162,16 @@ public OMClientResponse
validateAndUpdateCache(OzoneManager ozoneManager, Execut
ozoneManager.getMaxUserVolumeCount(), transactionLogIndex);
// Add default ACL for volume
- List<OzoneAcl> listOfAcls =
getDefaultAclList(UserGroupInformation.createRemoteUser(owner),
+ List<OzoneAcl> defaultAclList =
getDefaultAclList(UserGroupInformation.createRemoteUser(owner),
ozoneManager.getConfig());
// ACLs from VolumeArgs
- if (omVolumeArgs.getAcls() != null &&
!ozoneManager.getConfig().ignoreClientACLs()) {
- listOfAcls.addAll(omVolumeArgs.getAcls());
+ if (ozoneManager.getConfig().ignoreClientACLs()) {
+ builder.acls().set(defaultAclList);
+ } else {
+ builder.acls().addAll(defaultAclList);
}
- // Remove the duplicates
- listOfAcls =
listOfAcls.stream().distinct().collect(Collectors.toList());
- omVolumeArgs.setAcls(listOfAcls);
+
+ omVolumeArgs = builder.build();
createVolume(omMetadataManager, omVolumeArgs, volumeList, dbVolumeKey,
dbUserKey, transactionLogIndex);
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
index 7eb070bbcf5..347fbefacd9 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAclRequest.java
@@ -23,6 +23,7 @@
import java.nio.file.InvalidPathException;
import java.util.List;
import java.util.Map;
+import java.util.function.BiConsumer;
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
import org.apache.hadoop.ozone.OzoneAcl;
@@ -31,8 +32,8 @@
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OMMetrics;
import org.apache.hadoop.ozone.om.OzoneManager;
-import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
+import org.apache.hadoop.ozone.om.helpers.AclListBuilder;
import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
import org.apache.hadoop.ozone.om.request.volume.OMVolumeRequest;
import org.apache.hadoop.ozone.om.response.OMClientResponse;
@@ -40,17 +41,15 @@
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
-import org.apache.ratis.util.function.CheckedBiConsumer;
/**
* Base class for OMVolumeAcl Request.
*/
public abstract class OMVolumeAclRequest extends OMVolumeRequest {
- private final VolumeAclOp omVolumeAclOp;
+ private final AclOp omVolumeAclOp;
- OMVolumeAclRequest(OzoneManagerProtocolProtos.OMRequest omRequest,
- VolumeAclOp aclOp) {
+ OMVolumeAclRequest(OzoneManagerProtocolProtos.OMRequest omRequest, AclOp
aclOp) {
super(omRequest);
omVolumeAclOp = aclOp;
}
@@ -83,18 +82,14 @@ public OMClientResponse validateAndUpdateCache(OzoneManager
ozoneManager, Execut
VOLUME_LOCK, volume));
lockAcquired = getOmLockDetails().isLockAcquired();
OmVolumeArgs omVolumeArgs = getVolumeInfo(omMetadataManager, volume);
+ OmVolumeArgs.Builder builder = omVolumeArgs.toBuilder();
// result is false upon add existing acl or remove non-existing acl
- boolean applyAcl = true;
- try {
- omVolumeAclOp.accept(ozoneAcls, omVolumeArgs);
- } catch (OMException ex) {
- applyAcl = false;
- }
+ omVolumeAclOp.accept(ozoneAcls, builder.acls());
+ boolean applyAcl = builder.acls().isChanged();
// Update only when
if (applyAcl) {
- OmVolumeArgs.Builder builder = omVolumeArgs.toBuilder();
// Update the modification time when updating ACLs of Volume.
if (getOmRequest().getAddAclRequest().hasObj()) {
builder.setModificationTime(getOmRequest().getAddAclRequest().getModificationTime());
@@ -194,8 +189,8 @@ abstract void onComplete(Result result, Exception ex, long
trxnLogIndex,
/**
* Volume ACL operation.
*/
- public interface VolumeAclOp extends
- CheckedBiConsumer<List<OzoneAcl>, OmVolumeArgs, IOException> {
+ public interface AclOp extends
+ BiConsumer<List<OzoneAcl>, AclListBuilder> {
// just a shortcut to avoid having to repeat long list of generic
parameters
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
index b1796c8779c..95f42d8ae39 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeAddAclRequest.java
@@ -17,7 +17,8 @@
package org.apache.hadoop.ozone.om.request.volume.acl;
-import com.google.common.collect.Lists;
+import static java.util.Collections.singletonList;
+
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -47,8 +48,8 @@ public class OMVolumeAddAclRequest extends OMVolumeAclRequest
{
private static final Logger LOG =
LoggerFactory.getLogger(OMVolumeAddAclRequest.class);
- private static final VolumeAclOp VOLUME_ADD_ACL_OP =
- (acls, volArgs) -> volArgs.addAcl(acls.get(0));
+ private static final AclOp VOLUME_ADD_ACL_OP =
+ (acls, builder) -> builder.add(acls.get(0));
private final List<OzoneAcl> ozoneAcls;
private final String volumeName;
@@ -72,8 +73,7 @@ public OMVolumeAddAclRequest(OMRequest omRequest) {
OzoneManagerProtocolProtos.AddAclRequest addAclRequest =
getOmRequest().getAddAclRequest();
Objects.requireNonNull(addAclRequest, "addAclRequest == null");
- ozoneAcls = Lists.newArrayList(
- OzoneAcl.fromProtobuf(addAclRequest.getAcl()));
+ ozoneAcls = singletonList(OzoneAcl.fromProtobuf(addAclRequest.getAcl()));
obj = OzoneObjInfo.fromProtobuf(addAclRequest.getObj());
volumeName = obj.getPath().substring(1);
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
index fee8c09f219..92e5a529b9b 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeRemoveAclRequest.java
@@ -17,7 +17,8 @@
package org.apache.hadoop.ozone.om.request.volume.acl;
-import com.google.common.collect.Lists;
+import static java.util.Collections.singletonList;
+
import java.io.IOException;
import java.util.List;
import java.util.Map;
@@ -47,8 +48,8 @@ public class OMVolumeRemoveAclRequest extends
OMVolumeAclRequest {
private static final Logger LOG =
LoggerFactory.getLogger(OMVolumeRemoveAclRequest.class);
- private static final VolumeAclOp VOLUME_REMOVE_ACL_OP =
- (acls, volArgs) -> volArgs.removeAcl(acls.get(0));
+ private static final AclOp VOLUME_REMOVE_ACL_OP =
+ (acls, builder) -> builder.remove(acls.get(0));
private final List<OzoneAcl> ozoneAcls;
private final String volumeName;
@@ -72,8 +73,7 @@ public OMVolumeRemoveAclRequest(OMRequest omRequest) {
OzoneManagerProtocolProtos.RemoveAclRequest removeAclRequest =
getOmRequest().getRemoveAclRequest();
Objects.requireNonNull(removeAclRequest, "removeAclRequest == null");
- ozoneAcls = Lists.newArrayList(
- OzoneAcl.fromProtobuf(removeAclRequest.getAcl()));
+ ozoneAcls =
singletonList(OzoneAcl.fromProtobuf(removeAclRequest.getAcl()));
obj = OzoneObjInfo.fromProtobuf(removeAclRequest.getObj());
volumeName = obj.getPath().substring(1);
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
index e45d2234e1c..ac4fcfe393d 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/volume/acl/OMVolumeSetAclRequest.java
@@ -18,10 +18,10 @@
package org.apache.hadoop.ozone.om.request.volume.acl;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.stream.Collectors;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.audit.AuditLogger;
import org.apache.hadoop.ozone.audit.OMAction;
@@ -47,8 +47,8 @@ public class OMVolumeSetAclRequest extends OMVolumeAclRequest
{
private static final Logger LOG =
LoggerFactory.getLogger(OMVolumeSetAclRequest.class);
- private static final VolumeAclOp VOLUME_SET_ACL_OP =
- (acls, volArgs) -> volArgs.setAcls(acls);
+ private static final AclOp VOLUME_SET_ACL_OP =
+ (acls, builder) -> builder.set(acls);
private final List<OzoneAcl> ozoneAcls;
private final String volumeName;
@@ -72,9 +72,9 @@ public OMVolumeSetAclRequest(OMRequest omRequest) {
OzoneManagerProtocolProtos.SetAclRequest setAclRequest =
getOmRequest().getSetAclRequest();
Objects.requireNonNull(setAclRequest, "setAclRequest == null");
- ozoneAcls = new ArrayList<>();
- setAclRequest.getAclList().forEach(oai ->
- ozoneAcls.add(OzoneAcl.fromProtobuf(oai)));
+ ozoneAcls = setAclRequest.getAclList().stream()
+ .map(OzoneAcl::fromProtobuf)
+ .collect(Collectors.toList());
obj = OzoneObjInfo.fromProtobuf(setAclRequest.getObj());
volumeName = obj.getPath().substring(1);
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
index 3468787b90c..cf6ea4450c6 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/acl/OzoneNativeAclTestUtil.java
@@ -39,9 +39,10 @@ public static void addVolumeAcl(
) throws IOException {
final String volumeKey = metadataManager.getVolumeKey(volume);
final Table<String, OmVolumeArgs> volumeTable =
metadataManager.getVolumeTable();
- final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey);
-
- omVolumeArgs.addAcl(ozoneAcl);
+ final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey)
+ .toBuilder()
+ .addAcl(ozoneAcl)
+ .build();
volumeTable.addCacheEntry(
new CacheKey<>(volumeKey),
@@ -89,9 +90,10 @@ public static void setVolumeAcl(
List<OzoneAcl> ozoneAcls) throws IOException {
final String volumeKey = metadataManager.getVolumeKey(volume);
final Table<String, OmVolumeArgs> volumeTable =
metadataManager.getVolumeTable();
- final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey);
-
- omVolumeArgs.setAcls(ozoneAcls);
+ final OmVolumeArgs omVolumeArgs = volumeTable.get(volumeKey)
+ .toBuilder()
+ .setAcls(ozoneAcls)
+ .build();
volumeTable.addCacheEntry(
new CacheKey<>(volumeKey),
diff --git
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
index 9bb64f1ec37..280ff4210cd 100644
---
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
+++
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
@@ -483,12 +483,12 @@ public void setUp() throws Exception {
.setQuotaInBytes(OzoneConsts.GB)
.setQuotaInNamespace(1000)
.setUsedNamespace(500)
- .addOzoneAcls(OzoneAcl.of(
+ .addAcl(OzoneAcl.of(
IAccessAuthorizer.ACLIdentityType.USER,
"TestUser2",
OzoneAcl.AclScope.ACCESS, IAccessAuthorizer.ACLType.WRITE
))
- .addOzoneAcls(OzoneAcl.of(
+ .addAcl(OzoneAcl.of(
IAccessAuthorizer.ACLIdentityType.USER,
"TestUser2",
OzoneAcl.AclScope.ACCESS, IAccessAuthorizer.ACLType.READ
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]