HDFS-13941. make storageId in BlockPoolTokenSecretManager.checkAccess optional. Contributed by Wei-Chiu Chuang.

This commit is contained in:
Ajay Kumar 2018-10-24 22:35:06 -07:00
parent 1d5390679e
commit 2caf69debd
3 changed files with 37 additions and 2 deletions

View File

@ -94,6 +94,18 @@ public class BlockPoolTokenSecretManager extends
storageTypes, storageIds); storageTypes, storageIds);
} }
/**
* See {@link BlockTokenSecretManager#checkAccess(BlockTokenIdentifier,
* String, ExtendedBlock, BlockTokenIdentifier.AccessMode,
* StorageType[])}
*/
public void checkAccess(BlockTokenIdentifier id, String userId,
ExtendedBlock block, AccessMode mode, StorageType[] storageTypes)
throws InvalidToken {
get(block.getBlockPoolId()).checkAccess(id, userId, block, mode,
storageTypes);
}
/** /**
* See {@link BlockTokenSecretManager#checkAccess(Token, String, * See {@link BlockTokenSecretManager#checkAccess(Token, String,
* ExtendedBlock, BlockTokenIdentifier.AccessMode, * ExtendedBlock, BlockTokenIdentifier.AccessMode,
@ -108,7 +120,7 @@ public class BlockPoolTokenSecretManager extends
} }
/** /**
* See {@link BlockTokenSecretManager#addKeys(ExportedBlockKeys)} * See {@link BlockTokenSecretManager#addKeys(ExportedBlockKeys)}.
*/ */
public void addKeys(String bpid, ExportedBlockKeys exportedKeys) public void addKeys(String bpid, ExportedBlockKeys exportedKeys)
throws IOException { throws IOException {

View File

@ -31,6 +31,7 @@ import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceAudience;
@ -291,6 +292,23 @@ public class BlockTokenSecretManager extends
} }
} }
/**
* Check if access should be allowed. userID is not checked if null. This
* method doesn't check if token password is correct. It should be used only
* when token password has already been verified (e.g., in the RPC layer).
*
* Some places need to check the access using StorageTypes and for other
* places the StorageTypes is not relevant.
*/
public void checkAccess(BlockTokenIdentifier id, String userId,
ExtendedBlock block, BlockTokenIdentifier.AccessMode mode,
StorageType[] storageTypes) throws InvalidToken {
checkAccess(id, userId, block, mode);
if (ArrayUtils.isNotEmpty(storageTypes)) {
checkAccess(id.getStorageTypes(), storageTypes, "StorageTypes");
}
}
public void checkAccess(BlockTokenIdentifier id, String userId, public void checkAccess(BlockTokenIdentifier id, String userId,
ExtendedBlock block, BlockTokenIdentifier.AccessMode mode) ExtendedBlock block, BlockTokenIdentifier.AccessMode mode)
throws InvalidToken { throws InvalidToken {

View File

@ -215,7 +215,11 @@ public class TestBlockToken {
private static void checkAccess(BlockTokenSecretManager m, private static void checkAccess(BlockTokenSecretManager m,
Token<BlockTokenIdentifier> t, ExtendedBlock blk, Token<BlockTokenIdentifier> t, ExtendedBlock blk,
BlockTokenIdentifier.AccessMode mode, StorageType[] storageTypes, BlockTokenIdentifier.AccessMode mode, StorageType[] storageTypes,
String[] storageIds) throws SecretManager.InvalidToken { String[] storageIds) throws IOException {
if(storageIds == null) {
// Test overloaded checkAccess method.
m.checkAccess(t.decodeIdentifier(), null, blk, mode, storageTypes);
}
m.checkAccess(t, null, blk, mode, storageTypes, storageIds); m.checkAccess(t, null, blk, mode, storageTypes, storageIds);
} }
@ -801,6 +805,7 @@ public class TestBlockToken {
emptyStorageIds); emptyStorageIds);
sm.checkAccess(id, null, block3, mode, storageTypes, sm.checkAccess(id, null, block3, mode, storageTypes,
null); null);
sm.checkAccess(id, null, block3, mode, storageTypes);
} }
@Test @Test