This is an automated email from the ASF dual-hosted git repository.
umamahesh 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 9f43b0efbf HDDS-6873. EC: Add block token support for
ECReconstructionCoordinator (#3539)
9f43b0efbf is described below
commit 9f43b0efbfc355676e30e06dca728600c76fdfe1
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Thu Jun 23 17:01:15 2022 +0200
HDDS-6873. EC: Add block token support for ECReconstructionCoordinator
(#3539)
---
.../ECReconstructionCoordinator.java | 61 +++++-----
.../container/ec/reconstruction/TokenHelper.java | 125 +++++++++++++++++++++
.../token}/OzoneBlockTokenSecretManager.java | 4 +-
.../token}/TestOzoneBlockTokenSecretManager.java | 6 +-
.../hdds/scm/storage/TestContainerCommandsEC.java | 95 +++++++++++++---
.../ozone/client/rpc/TestSecureOzoneRpcClient.java | 2 +-
.../ozoneimpl/TestOzoneContainerWithTLS.java | 2 +-
.../server/TestSecureContainerServer.java | 2 +-
.../org/apache/hadoop/ozone/om/KeyManagerImpl.java | 2 +-
.../org/apache/hadoop/ozone/om/OzoneManager.java | 2 +-
.../hadoop/ozone/om/request/key/OMKeyRequest.java | 2 +-
.../org/apache/hadoop/ozone/om/OmTestManagers.java | 2 +-
.../ozone/om/request/key/TestOMKeyRequest.java | 2 +-
13 files changed, 247 insertions(+), 60 deletions(-)
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ec/reconstruction/ECReconstructionCoordinator.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ec/reconstruction/ECReconstructionCoordinator.java
index 780c520d72..9b00596d58 100644
---
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ec/reconstruction/ECReconstructionCoordinator.java
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ec/reconstruction/ECReconstructionCoordinator.java
@@ -26,11 +26,13 @@ import org.apache.hadoop.hdds.protocol.DatanodeDetails;
import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
import org.apache.hadoop.hdds.scm.ByteStringConversion;
import org.apache.hadoop.hdds.scm.OzoneClientConfig;
+import org.apache.hadoop.hdds.scm.container.ContainerID;
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
import org.apache.hadoop.hdds.scm.storage.BlockLocationInfo;
import org.apache.hadoop.hdds.scm.storage.BufferPool;
import org.apache.hadoop.hdds.scm.storage.ECBlockOutputStream;
+import org.apache.hadoop.hdds.security.token.ContainerTokenIdentifier;
import
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
import org.apache.hadoop.hdds.utils.IOUtils;
import org.apache.hadoop.io.ByteBufferPool;
@@ -41,6 +43,7 @@ import
org.apache.hadoop.ozone.client.io.BlockInputStreamFactoryImpl;
import org.apache.hadoop.ozone.client.io.ECBlockInputStreamProxy;
import org.apache.hadoop.ozone.client.io.ECBlockReconstructedStripeInputStream;
import org.apache.hadoop.ozone.container.common.helpers.BlockData;
+import org.apache.hadoop.security.token.Token;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,6 +65,8 @@ import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
+import static
org.apache.hadoop.ozone.container.ec.reconstruction.TokenHelper.encode;
+
/**
* The Coordinator implements the main flow of reconstructing
* missing container replicas.
@@ -88,38 +93,30 @@ public class ECReconstructionCoordinator implements
Closeable {
private final ECContainerOperationClient containerOperationClient;
- private final ConfigurationSource config;
-
private final ByteBufferPool byteBufferPool;
+ private final CertificateClient certificateClient;
- private ExecutorService ecReconstructExecutor;
+ private final ExecutorService ecReconstructExecutor;
- private BlockInputStreamFactory blockInputStreamFactory;
-
- public ECReconstructionCoordinator(ECContainerOperationClient
containerClient,
- ConfigurationSource conf, ByteBufferPool byteBufferPool,
- ExecutorService reconstructExecutor,
- BlockInputStreamFactory streamFactory) {
- this.containerOperationClient = containerClient;
- this.config = conf;
- this.byteBufferPool = byteBufferPool;
- this.blockInputStreamFactory = streamFactory;
- this.ecReconstructExecutor = reconstructExecutor;
- }
+ private final BlockInputStreamFactory blockInputStreamFactory;
+ private final TokenHelper tokenHelper;
public ECReconstructionCoordinator(ConfigurationSource conf,
CertificateClient certificateClient) throws IOException {
- this(new ECContainerOperationClient(conf, certificateClient), conf,
- new ElasticByteBufferPool(), null, null);
+ this.containerOperationClient = new ECContainerOperationClient(conf,
+ certificateClient);
+ this.byteBufferPool = new ElasticByteBufferPool();
+ this.certificateClient = certificateClient;
this.ecReconstructExecutor =
new ThreadPoolExecutor(EC_RECONSTRUCT_STRIPE_READ_POOL_MIN_SIZE,
- config.getObject(OzoneClientConfig.class)
+ conf.getObject(OzoneClientConfig.class)
.getEcReconstructStripeReadPoolLimit(), 60, TimeUnit.SECONDS,
new SynchronousQueue<>(), new ThreadFactoryBuilder()
.setNameFormat("ec-reconstruct-reader-TID-%d").build(),
new ThreadPoolExecutor.CallerRunsPolicy());
this.blockInputStreamFactory = BlockInputStreamFactoryImpl
.getInstance(byteBufferPool, () -> ecReconstructExecutor);
+ tokenHelper = new TokenHelper(conf, certificateClient);
}
public void reconstructECContainerGroup(long containerID,
@@ -134,13 +131,16 @@ public class ECReconstructionCoordinator implements
Closeable {
SortedMap<Long, BlockLocationInfo> blockLocationInfoMap =
calcBlockLocationInfoMap(containerID, blockDataMap, pipeline);
+ ContainerID cid = ContainerID.valueOf(containerID);
// 1. create target recovering containers.
+ String containerToken = encode(tokenHelper.getContainerToken(cid));
for (Map.Entry<Integer, DatanodeDetails> indexDnPair : targetNodeMap
.entrySet()) {
- this.containerOperationClient
- .createRecoveringContainer(containerID, indexDnPair.getValue(),
- repConfig, null, indexDnPair.getKey());
+ DatanodeDetails dn = indexDnPair.getValue();
+ Integer index = indexDnPair.getKey();
+ containerOperationClient.createRecoveringContainer(containerID, dn,
+ repConfig, containerToken, index);
}
// 2. Reconstruct and transfer to targets
@@ -152,8 +152,8 @@ public class ECReconstructionCoordinator implements
Closeable {
for (Map.Entry<Integer, DatanodeDetails> indexDnPair : targetNodeMap
.entrySet()) {
DatanodeDetails dn = indexDnPair.getValue();
- this.containerOperationClient
- .closeContainer(containerID, dn, repConfig, null);
+ containerOperationClient.closeContainer(containerID, dn, repConfig,
+ containerToken);
}
}
@@ -309,9 +309,13 @@ public class ECReconstructionCoordinator implements
Closeable {
long blockGroupLen = calcEffectiveBlockGroupLen(blockGroup,
pipeline.getReplicationConfig().getRequiredNodes());
if (blockGroupLen > 0) {
+ BlockID blockID = new BlockID(containerID, localID);
BlockLocationInfo blockLocationInfo = new BlockLocationInfo.Builder()
- .setBlockID(new BlockID(containerID, localID))
- .setLength(blockGroupLen).setPipeline(pipeline).build();
+ .setBlockID(blockID)
+ .setLength(blockGroupLen)
+ .setPipeline(pipeline)
+ .setToken(tokenHelper.getBlockToken(blockID, blockGroupLen))
+ .build();
blockInfoMap.put(localID, blockLocationInfo);
}
}
@@ -323,6 +327,7 @@ public class ECReconstructionCoordinator implements
Closeable {
if (containerOperationClient != null) {
containerOperationClient.close();
}
+ tokenHelper.stop();
}
private Pipeline rebuildInputPipeline(ECReplicationConfig repConfig,
@@ -351,6 +356,8 @@ public class ECReconstructionCoordinator implements
Closeable {
Map<Integer, DatanodeDetails> sourceNodeMap) throws IOException {
SortedMap<Long, BlockData[]> resultMap = new TreeMap<>();
+ Token<ContainerTokenIdentifier> containerToken =
+ tokenHelper.getContainerToken(new ContainerID(containerID));
Iterator<Map.Entry<Integer, DatanodeDetails>> iterator =
sourceNodeMap.entrySet().iterator();
@@ -360,8 +367,8 @@ public class ECReconstructionCoordinator implements
Closeable {
Integer index = next.getKey();
DatanodeDetails dn = next.getValue();
- BlockData[] blockDataArr =
- containerOperationClient.listBlock(containerID, dn, repConfig, null);
+ BlockData[] blockDataArr = containerOperationClient.listBlock(
+ containerID, dn, repConfig, containerToken);
for (BlockData blockData : blockDataArr) {
BlockID blockID = blockData.getBlockID();
diff --git
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ec/reconstruction/TokenHelper.java
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ec/reconstruction/TokenHelper.java
new file mode 100644
index 0000000000..72217092b0
--- /dev/null
+++
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/ec/reconstruction/TokenHelper.java
@@ -0,0 +1,125 @@
+/*
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.container.ec.reconstruction;
+
+import org.apache.hadoop.hdds.HddsConfigKeys;
+import org.apache.hadoop.hdds.client.BlockID;
+import org.apache.hadoop.hdds.conf.ConfigurationSource;
+import
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto;
+import org.apache.hadoop.hdds.scm.container.ContainerID;
+import org.apache.hadoop.hdds.security.token.ContainerTokenIdentifier;
+import org.apache.hadoop.hdds.security.token.ContainerTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenIdentifier;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.hadoop.security.token.Token;
+
+import java.io.IOException;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto.DELETE;
+import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto.READ;
+import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto.WRITE;
+
+/**
+ * Wraps block and container token managers for datanode.
+ */
+class TokenHelper {
+
+ private final OzoneBlockTokenSecretManager blockTokenMgr;
+ private final ContainerTokenSecretManager containerTokenMgr;
+ private final String user;
+ private static final Set<AccessModeProto> MODES =
+ EnumSet.of(READ, WRITE, DELETE);
+
+ TokenHelper(ConfigurationSource conf, CertificateClient certClient)
+ throws IOException {
+
+ SecurityConfig securityConfig = new SecurityConfig(conf);
+ boolean blockTokenEnabled = securityConfig.isBlockTokenEnabled();
+ boolean containerTokenEnabled = securityConfig.isContainerTokenEnabled();
+
+ if (blockTokenEnabled || containerTokenEnabled) {
+ user = UserGroupInformation.getCurrentUser().getShortUserName();
+
+ long expiryTime = conf.getTimeDuration(
+ HddsConfigKeys.HDDS_BLOCK_TOKEN_EXPIRY_TIME,
+ HddsConfigKeys.HDDS_BLOCK_TOKEN_EXPIRY_TIME_DEFAULT,
+ TimeUnit.MILLISECONDS);
+ String certId = certClient.getCertificate().getSerialNumber().toString();
+
+ if (blockTokenEnabled) {
+ blockTokenMgr = new OzoneBlockTokenSecretManager(
+ securityConfig, expiryTime, certId);
+ blockTokenMgr.start(certClient);
+ } else {
+ blockTokenMgr = null;
+ }
+
+ if (containerTokenEnabled) {
+ containerTokenMgr = new ContainerTokenSecretManager(
+ securityConfig, expiryTime, certId);
+ containerTokenMgr.start(certClient);
+ } else {
+ containerTokenMgr = null;
+ }
+ } else {
+ user = null;
+ blockTokenMgr = null;
+ containerTokenMgr = null;
+ }
+ }
+
+ void stop() {
+ if (blockTokenMgr != null) {
+ try {
+ blockTokenMgr.stop();
+ } catch (IOException ignored) {
+ // no threads involved, cannot really happen
+ }
+ }
+ if (containerTokenMgr != null) {
+ try {
+ containerTokenMgr.stop();
+ } catch (IOException ignored) {
+ // no threads involved, cannot really happen
+ }
+ }
+ }
+
+ Token<OzoneBlockTokenIdentifier> getBlockToken(BlockID blockID, long length)
{
+ return blockTokenMgr != null
+ ? blockTokenMgr.generateToken(user, blockID, MODES, length)
+ : null;
+ }
+
+ Token<ContainerTokenIdentifier> getContainerToken(ContainerID containerID) {
+ return containerTokenMgr != null
+ ? containerTokenMgr.generateToken(user, containerID)
+ : null;
+ }
+
+ static String encode(Token<?> token) throws IOException {
+ return token != null ? token.encodeToUrlString() : null;
+ }
+
+}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OzoneBlockTokenSecretManager.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/token/OzoneBlockTokenSecretManager.java
similarity index 96%
rename from
hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OzoneBlockTokenSecretManager.java
rename to
hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/token/OzoneBlockTokenSecretManager.java
index 54ba3ffb68..886d6b354a 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/security/OzoneBlockTokenSecretManager.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/token/OzoneBlockTokenSecretManager.java
@@ -15,14 +15,12 @@
* the License.
*/
-package org.apache.hadoop.ozone.security;
+package org.apache.hadoop.hdds.security.token;
import org.apache.hadoop.hdds.annotation.InterfaceAudience;
import org.apache.hadoop.hdds.annotation.InterfaceStability;
import org.apache.hadoop.hdds.client.BlockID;
-import org.apache.hadoop.hdds.security.token.OzoneBlockTokenIdentifier;
import
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto;
-import org.apache.hadoop.hdds.security.token.ShortLivedTokenSecretManager;
import org.apache.hadoop.hdds.security.x509.SecurityConfig;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.security.UserGroupInformation;
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOzoneBlockTokenSecretManager.java
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/token/TestOzoneBlockTokenSecretManager.java
similarity index 98%
rename from
hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOzoneBlockTokenSecretManager.java
rename to
hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/token/TestOzoneBlockTokenSecretManager.java
index 7a3acba22b..4ac33655dc 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/security/TestOzoneBlockTokenSecretManager.java
+++
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/token/TestOzoneBlockTokenSecretManager.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-package org.apache.hadoop.ozone.security;
+package org.apache.hadoop.hdds.security.token;
import static
org.apache.hadoop.ozone.container.ContainerTestHelper.getBlockRequest;
import static
org.apache.hadoop.ozone.container.ContainerTestHelper.getPutBlockRequest;
@@ -34,10 +34,6 @@ import
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.ContainerC
import
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto;
import org.apache.hadoop.hdds.scm.pipeline.MockPipeline;
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
-import org.apache.hadoop.hdds.security.token.BlockTokenException;
-import org.apache.hadoop.hdds.security.token.BlockTokenVerifier;
-import org.apache.hadoop.hdds.security.token.OzoneBlockTokenIdentifier;
-import org.apache.hadoop.hdds.security.token.TokenVerifier;
import org.apache.hadoop.hdds.security.x509.SecurityConfig;
import
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
import
org.apache.hadoop.hdds.security.x509.certificate.client.OMCertificateClient;
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
index 3047d18d7e..e57ec400cc 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/storage/TestContainerCommandsEC.java
@@ -42,8 +42,14 @@ import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
import
org.apache.hadoop.hdds.scm.pipeline.WritableECContainerProvider.WritableECContainerProviderConfig;
import
org.apache.hadoop.hdds.scm.protocolPB.StorageContainerLocationProtocolClientSideTranslatorPB;
import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
+import org.apache.hadoop.hdds.security.token.ContainerTokenIdentifier;
+import org.apache.hadoop.hdds.security.token.ContainerTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.x509.SecurityConfig;
+import
org.apache.hadoop.hdds.security.x509.certificate.client.CertificateClient;
import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.OzoneConfigKeys;
+import org.apache.hadoop.ozone.client.CertificateClientTestImpl;
import org.apache.hadoop.ozone.client.ObjectStore;
import org.apache.hadoop.ozone.client.OzoneBucket;
import org.apache.hadoop.ozone.client.OzoneClient;
@@ -58,6 +64,9 @@ import org.apache.hadoop.ozone.common.utils.BufferUtils;
import org.apache.hadoop.ozone.container.ContainerTestHelper;
import
org.apache.hadoop.ozone.container.ec.reconstruction.ECContainerOperationClient;
import
org.apache.hadoop.ozone.container.ec.reconstruction.ECReconstructionCoordinator;
+import org.apache.hadoop.ozone.om.OzoneManager;
+import org.apache.hadoop.security.token.Token;
+import org.apache.hadoop.security.token.TokenIdentifier;
import org.junit.Assert;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
@@ -73,6 +82,7 @@ import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.EnumSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -80,18 +90,25 @@ import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;
+import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_BLOCK_TOKEN_ENABLED;
+import static
org.apache.hadoop.hdds.HddsConfigKeys.HDDS_CONTAINER_TOKEN_ENABLED;
+import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto.READ;
+import static
org.apache.hadoop.hdds.protocol.proto.HddsProtos.BlockTokenSecretProto.AccessModeProto.WRITE;
+import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_SECURITY_ENABLED_KEY;
/**
* This class tests container commands on EC containers.
*/
public class TestContainerCommandsEC {
+ private static final String ANY_USER = "any";
private static MiniOzoneCluster cluster;
private static StorageContainerManager scm;
private static OzoneClient rpcClient;
@@ -119,8 +136,12 @@ public class TestContainerCommandsEC {
private static long containerID;
private static Pipeline pipeline;
private static List<DatanodeDetails> datanodeDetails;
+ private static Token<ContainerTokenIdentifier> containerToken;
+ private static ContainerTokenSecretManager containerTokenGenerator;
+ private static OzoneBlockTokenSecretManager blockTokenGenerator;
private List<XceiverClientSpi> clients = null;
private static OzoneConfiguration config;
+ private static CertificateClient certClient;
@BeforeAll
public static void init() throws Exception {
@@ -129,6 +150,8 @@ public class TestContainerCommandsEC {
config.setBoolean(OzoneConfigKeys.OZONE_ACL_ENABLED, true);
config.set(OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS,
OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS_NATIVE);
+ config.setBoolean(HDDS_BLOCK_TOKEN_ENABLED, true);
+ config.setBoolean(HDDS_CONTAINER_TOKEN_ENABLED, true);
startCluster(config);
prepareData(KEY_SIZE_RANGES);
rpcClient = OzoneClientFactory.getRpcClient(config);
@@ -200,7 +223,7 @@ public class TestContainerCommandsEC {
Throwable t = Assertions.assertThrows(StorageContainerException.class,
() -> ContainerProtocolCalls
.listBlock(clients.get(j), containerID, null,
- numExpectedBlocks + 1, null));
+ numExpectedBlocks + 1, containerToken));
Assertions
.assertEquals("ContainerID " + containerID + " does not exist",
t.getMessage());
@@ -208,7 +231,7 @@ public class TestContainerCommandsEC {
}
ListBlockResponseProto response = ContainerProtocolCalls
.listBlock(clients.get(i), containerID, null, numExpectedBlocks + 1,
- null);
+ containerToken);
Assertions.assertEquals(numExpectedBlocks, response.getBlockDataCount(),
"blocks count doesn't match on DN " + i);
Assertions.assertEquals(numExpectedChunks,
@@ -226,8 +249,10 @@ public class TestContainerCommandsEC {
Pipeline newPipeline =
scm.getPipelineManager().createPipeline(replicationConfig);
scm.getPipelineManager().activatePipeline(newPipeline.getId());
- ContainerInfo container =
+ final ContainerInfo container =
scm.getContainerManager().allocateContainer(replicationConfig, "test");
+ Token<ContainerTokenIdentifier> cToken = containerTokenGenerator
+ .generateToken(ANY_USER, container.containerID());
scm.getContainerManager().getContainerStateManager()
.addContainer(container.getProtobuf());
@@ -245,15 +270,22 @@ public class TestContainerCommandsEC {
HddsProtos.LifeCycleEvent.CLOSE);
//Create the recovering container in DN.
+ String encodedToken = cToken.encodeToUrlString();
ContainerProtocolCalls.createRecoveringContainer(dnClient,
- container.containerID().getProtobuf().getId(), null, 4);
+ container.containerID().getProtobuf().getId(),
+ encodedToken, 4);
BlockID blockID = ContainerTestHelper
.getTestBlockID(container.containerID().getProtobuf().getId());
+ Token<? extends TokenIdentifier> blockToken =
+ blockTokenGenerator.generateToken(ANY_USER, blockID,
+ EnumSet.of(READ, WRITE), Long.MAX_VALUE);
byte[] data = "TestData".getBytes(UTF_8);
ContainerProtos.ContainerCommandRequestProto writeChunkRequest =
ContainerTestHelper.newWriteChunkRequestBuilder(newPipeline, blockID,
- ChunkBuffer.wrap(ByteBuffer.wrap(data)), 0).build();
+ ChunkBuffer.wrap(ByteBuffer.wrap(data)), 0)
+ .setEncodedToken(blockToken.encodeToUrlString())
+ .build();
dnClient.sendCommand(writeChunkRequest);
// Now, explicitly make a putKey request for the block.
@@ -264,7 +296,7 @@ public class TestContainerCommandsEC {
ContainerProtos.ReadContainerResponseProto readContainerResponseProto =
ContainerProtocolCalls.readContainer(dnClient,
- container.containerID().getProtobuf().getId(), null);
+ container.containerID().getProtobuf().getId(), encodedToken);
Assert.assertEquals(ContainerProtos.ContainerDataProto.State.RECOVERING,
readContainerResponseProto.getContainerData().getState());
// Container at SCM should be still in closed state.
@@ -273,17 +305,17 @@ public class TestContainerCommandsEC {
.getContainer(container.containerID()).getState());
// close container call
ContainerProtocolCalls.closeContainer(dnClient,
- container.containerID().getProtobuf().getId(), null);
+ container.containerID().getProtobuf().getId(), encodedToken);
// Make sure we have the container and readable.
readContainerResponseProto = ContainerProtocolCalls
.readContainer(dnClient,
- container.containerID().getProtobuf().getId(), null);
+ container.containerID().getProtobuf().getId(), encodedToken);
Assert.assertEquals(ContainerProtos.ContainerDataProto.State.CLOSED,
readContainerResponseProto.getContainerData().getState());
ContainerProtos.ReadChunkResponseProto readChunkResponseProto =
ContainerProtocolCalls.readChunk(dnClient,
writeChunkRequest.getWriteChunk().getChunkData(), blockID, null,
- null);
+ blockToken);
ByteBuffer[] readOnlyByteBuffersArray = BufferUtils
.getReadOnlyByteBuffersArray(
readChunkResponseProto.getDataBuffers().getBuffersList());
@@ -361,10 +393,12 @@ public class TestContainerCommandsEC {
}
ECReconstructionCoordinator coordinator =
- new ECReconstructionCoordinator(config, null);
+ new ECReconstructionCoordinator(config, certClient);
OzoneKeyDetails key = bucket.getKey(keyString);
long conID = key.getOzoneKeyLocations().get(0).getContainerID();
+ Token<ContainerTokenIdentifier> cToken = containerTokenGenerator
+ .generateToken(ANY_USER, new ContainerID(conID));
//Close the container first.
scm.getContainerManager().getContainerStateManager().updateContainerState(
@@ -412,15 +446,15 @@ public class TestContainerCommandsEC {
blockDataArrList = new ArrayList<>();
for (int j = 0; j < containerToDeletePipeline.size(); j++) {
org.apache.hadoop.ozone.container.common.helpers.BlockData[] blockData =
- new ECContainerOperationClient(new OzoneConfiguration(), null)
+ new ECContainerOperationClient(new OzoneConfiguration(), certClient)
.listBlock(conID,
containerToDeletePipeline.get(j).getFirstNode(),
(ECReplicationConfig) containerToDeletePipeline.get(j)
- .getReplicationConfig(), null);
+ .getReplicationConfig(), cToken);
blockDataArrList.add(blockData);
// Delete the first index container
ContainerProtocolCalls.deleteContainer(
xceiverClientManager.acquireClient(containerToDeletePipeline.get(j)),
- conID, true, null);
+ conID, true, cToken.encodeToUrlString());
}
//Give the new target to reconstruct the container
@@ -452,17 +486,17 @@ public class TestContainerCommandsEC {
org.apache.hadoop.ozone.container.common.helpers.BlockData[]
reconstructedBlockData =
- new ECContainerOperationClient(new OzoneConfiguration(), null)
+ new ECContainerOperationClient(new OzoneConfiguration(), certClient)
.listBlock(conID, newTargetPipeline.getFirstNode(),
(ECReplicationConfig) newTargetPipeline
- .getReplicationConfig(), null);
+ .getReplicationConfig(), cToken);
Assert.assertEquals(blockDataArrList.get(i).length,
reconstructedBlockData.length);
checkBlockData(blockDataArrList.get(i), reconstructedBlockData);
ContainerProtos.ReadContainerResponseProto readContainerResponseProto =
ContainerProtocolCalls.readContainer(
xceiverClientManager.acquireClient(newTargetPipeline), conID,
- null);
+ cToken.encodeToUrlString());
Assert.assertEquals(ContainerProtos.ContainerDataProto.State.CLOSED,
readContainerResponseProto.getContainerData().getState());
i++;
@@ -506,9 +540,15 @@ public class TestContainerCommandsEC {
writableECContainerProviderConfig.setMinimumPipelines(1);
conf.setFromObject(writableECContainerProviderConfig);
+ OzoneManager.setTestSecureOmFlag(true);
+ certClient = new CertificateClientTestImpl(config);
+
cluster = MiniOzoneCluster.newBuilder(conf).setNumDatanodes(NUM_DN)
- .setScmId(SCM_ID).setClusterId(CLUSTER_ID).build();
+ .setScmId(SCM_ID).setClusterId(CLUSTER_ID)
+ .setCertificateClient(new CertificateClientTestImpl(conf))
+ .build();
cluster.waitForClusterToBeReady();
+ cluster.getOzoneManager().startSecretManager();
scm = cluster.getStorageContainerManager();
rpcClient = OzoneClientFactory.getRpcClient(conf);
store = rpcClient.getObjectStore();
@@ -543,6 +583,19 @@ public class TestContainerCommandsEC {
Assertions.assertEquals(1, pipelines.size());
pipeline = pipelines.get(0);
datanodeDetails = pipeline.getNodes();
+
+ OzoneConfiguration tweakedConfig = new OzoneConfiguration(config);
+ tweakedConfig.setBoolean(OZONE_SECURITY_ENABLED_KEY, true);
+ SecurityConfig conf = new SecurityConfig(tweakedConfig);
+ long tokenLifetime = TimeUnit.DAYS.toMillis(1);
+ containerTokenGenerator = new ContainerTokenSecretManager(
+ conf, tokenLifetime, "1");
+ containerTokenGenerator.start(certClient);
+ blockTokenGenerator = new OzoneBlockTokenSecretManager(
+ conf, tokenLifetime, "1");
+ blockTokenGenerator.start(certClient);
+ containerToken = containerTokenGenerator
+ .generateToken(ANY_USER, new ContainerID(containerID));
}
public static void stopCluster() throws IOException {
@@ -557,6 +610,14 @@ public class TestContainerCommandsEC {
if (cluster != null) {
cluster.shutdown();
}
+
+ if (blockTokenGenerator != null) {
+ blockTokenGenerator.stop();
+ }
+
+ if (containerTokenGenerator != null) {
+ containerTokenGenerator.stop();
+ }
}
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
index 1b06940e12..68c4e7168f 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestSecureOzoneRpcClient.java
@@ -53,7 +53,7 @@ import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRespo
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.S3Authentication;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.Status;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.VolumeInfo;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.ozone.test.GenericTestUtils;
import org.apache.ozone.test.LambdaTestUtils;
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
index 5b65d92d15..c5a4a9339b 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/ozoneimpl/TestOzoneContainerWithTLS.java
@@ -35,7 +35,7 @@ import org.apache.hadoop.hdds.scm.XceiverClientSpi;
import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
import
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
import org.apache.hadoop.ozone.container.common.statemachine.StateContext;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import org.apache.hadoop.security.token.Token;
import org.apache.ozone.test.GenericTestUtils;
import org.junit.Assert;
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
index cd7c995544..361158edb9 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/server/TestSecureContainerServer.java
@@ -67,7 +67,7 @@ import
org.apache.hadoop.ozone.container.common.volume.MutableVolumeSet;
import org.apache.hadoop.ozone.container.common.volume.StorageVolume;
import org.apache.hadoop.ozone.container.common.volume.VolumeSet;
import org.apache.hadoop.ozone.container.ozoneimpl.ContainerController;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import org.apache.hadoop.security.token.Token;
import org.apache.ozone.test.GenericTestUtils;
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
index b592d25036..cbc492161f 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java
@@ -88,7 +88,7 @@ import org.apache.hadoop.ozone.om.request.OMClientRequest;
import org.apache.hadoop.ozone.om.request.file.OMFileRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OpenKeyBucket;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.PartKeyInfo;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.ozone.security.acl.RequestContext;
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 408d2e67f4..60ba6bb852 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
@@ -167,7 +167,7 @@ import
org.apache.hadoop.ozone.protocolPB.OMInterServiceProtocolServerSideImpl;
import org.apache.hadoop.ozone.protocolPB.OMAdminProtocolServerSideImpl;
import
org.apache.hadoop.ozone.storage.proto.OzoneManagerStorageProtos.PersistedUserVolumeInfo;
import
org.apache.hadoop.ozone.protocolPB.OzoneManagerProtocolServerSideTranslatorPB;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import org.apache.hadoop.ozone.security.OzoneDelegationTokenSecretManager;
import org.apache.hadoop.ozone.security.OzoneTokenIdentifier;
import org.apache.hadoop.ozone.security.acl.IAccessAuthorizer;
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
index b1e13ca2e9..79e0d51443 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyRequest.java
@@ -78,7 +78,7 @@ import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.KeyArgs;
import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos
.OMRequest;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import org.apache.hadoop.security.SecurityUtil;
import org.apache.hadoop.security.UserGroupInformation;
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/OmTestManagers.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/OmTestManagers.java
index 89cbac4313..79de54efa3 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/OmTestManagers.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/OmTestManagers.java
@@ -26,7 +26,7 @@ import
org.apache.hadoop.hdds.scm.protocol.StorageContainerLocationProtocol;
import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
import org.apache.hadoop.ozone.client.OzoneClientFactory;
import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import
org.apache.hadoop.security.authentication.client.AuthenticationException;
import org.mockito.Mockito;
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
index 26068664ff..c2232931d7 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyRequest.java
@@ -64,7 +64,7 @@ import org.apache.hadoop.ozone.om.OMMetrics;
import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
import org.apache.hadoop.ozone.om.OzoneManager;
import org.apache.hadoop.ozone.om.ScmClient;
-import org.apache.hadoop.ozone.security.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
import org.apache.hadoop.util.Time;
import static org.mockito.ArgumentMatchers.any;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]