|
@@ -151,7 +151,7 @@ public class TestBlockToken {
|
|
assertTrue("Received BlockTokenIdentifier is wrong", ident.equals(id));
|
|
assertTrue("Received BlockTokenIdentifier is wrong", ident.equals(id));
|
|
sm.checkAccess(id, null, PBHelperClient.convert(req.getBlock()),
|
|
sm.checkAccess(id, null, PBHelperClient.convert(req.getBlock()),
|
|
BlockTokenIdentifier.AccessMode.WRITE,
|
|
BlockTokenIdentifier.AccessMode.WRITE,
|
|
- new StorageType[]{StorageType.DEFAULT});
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null);
|
|
result = id.getBlockId();
|
|
result = id.getBlockId();
|
|
}
|
|
}
|
|
return GetReplicaVisibleLengthResponseProto.newBuilder()
|
|
return GetReplicaVisibleLengthResponseProto.newBuilder()
|
|
@@ -160,11 +160,11 @@ public class TestBlockToken {
|
|
}
|
|
}
|
|
|
|
|
|
private BlockTokenIdentifier generateTokenId(BlockTokenSecretManager sm,
|
|
private BlockTokenIdentifier generateTokenId(BlockTokenSecretManager sm,
|
|
- ExtendedBlock block,
|
|
|
|
- EnumSet<BlockTokenIdentifier.AccessMode> accessModes,
|
|
|
|
- StorageType... storageTypes) throws IOException {
|
|
|
|
|
|
+ ExtendedBlock block, EnumSet<BlockTokenIdentifier.AccessMode> accessModes,
|
|
|
|
+ StorageType[] storageTypes, String[] storageIds)
|
|
|
|
+ throws IOException {
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block, accessModes,
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block, accessModes,
|
|
- storageTypes);
|
|
|
|
|
|
+ storageTypes, storageIds);
|
|
BlockTokenIdentifier id = sm.createIdentifier();
|
|
BlockTokenIdentifier id = sm.createIdentifier();
|
|
id.readFields(new DataInputStream(new ByteArrayInputStream(token
|
|
id.readFields(new DataInputStream(new ByteArrayInputStream(token
|
|
.getIdentifier())));
|
|
.getIdentifier())));
|
|
@@ -178,29 +178,28 @@ public class TestBlockToken {
|
|
enableProtobuf);
|
|
enableProtobuf);
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
- StorageType.DEFAULT));
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null));
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
EnumSet.of(BlockTokenIdentifier.AccessMode.WRITE),
|
|
EnumSet.of(BlockTokenIdentifier.AccessMode.WRITE),
|
|
- StorageType.DEFAULT));
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null));
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
- StorageType.DEFAULT));
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null));
|
|
TestWritable.testWritable(generateTokenId(sm, block1,
|
|
TestWritable.testWritable(generateTokenId(sm, block1,
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
- StorageType.DEFAULT));
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null));
|
|
TestWritable.testWritable(generateTokenId(sm, block2,
|
|
TestWritable.testWritable(generateTokenId(sm, block2,
|
|
EnumSet.of(BlockTokenIdentifier.AccessMode.WRITE),
|
|
EnumSet.of(BlockTokenIdentifier.AccessMode.WRITE),
|
|
- StorageType.DEFAULT));
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null));
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
- StorageType.DEFAULT));
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null));
|
|
// We must be backwards compatible when adding storageType
|
|
// We must be backwards compatible when adding storageType
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
- EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
|
|
- (StorageType[]) null));
|
|
|
|
|
|
+ EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class), null, null));
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
TestWritable.testWritable(generateTokenId(sm, block3,
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
- StorageType.EMPTY_ARRAY));
|
|
|
|
|
|
+ StorageType.EMPTY_ARRAY, null));
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -215,35 +214,36 @@ 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) throws SecretManager.InvalidToken {
|
|
|
|
- m.checkAccess(t, null, blk, mode, new StorageType[]{ StorageType.DEFAULT });
|
|
|
|
|
|
+ BlockTokenIdentifier.AccessMode mode, StorageType[] storageTypes,
|
|
|
|
+ String[] storageIds) throws SecretManager.InvalidToken {
|
|
|
|
+ m.checkAccess(t, null, blk, mode, storageTypes, storageIds);
|
|
}
|
|
}
|
|
|
|
|
|
private void tokenGenerationAndVerification(BlockTokenSecretManager master,
|
|
private void tokenGenerationAndVerification(BlockTokenSecretManager master,
|
|
- BlockTokenSecretManager slave, StorageType... storageTypes)
|
|
|
|
- throws Exception {
|
|
|
|
|
|
+ BlockTokenSecretManager slave, StorageType[] storageTypes,
|
|
|
|
+ String[] storageIds) throws Exception {
|
|
// single-mode tokens
|
|
// single-mode tokens
|
|
for (BlockTokenIdentifier.AccessMode mode : BlockTokenIdentifier.AccessMode
|
|
for (BlockTokenIdentifier.AccessMode mode : BlockTokenIdentifier.AccessMode
|
|
.values()) {
|
|
.values()) {
|
|
// generated by master
|
|
// generated by master
|
|
Token<BlockTokenIdentifier> token1 = master.generateToken(block1,
|
|
Token<BlockTokenIdentifier> token1 = master.generateToken(block1,
|
|
- EnumSet.of(mode), storageTypes);
|
|
|
|
- checkAccess(master, token1, block1, mode);
|
|
|
|
- checkAccess(slave, token1, block1, mode);
|
|
|
|
|
|
+ EnumSet.of(mode), storageTypes, storageIds);
|
|
|
|
+ checkAccess(master, token1, block1, mode, storageTypes, storageIds);
|
|
|
|
+ checkAccess(slave, token1, block1, mode, storageTypes, storageIds);
|
|
// generated by slave
|
|
// generated by slave
|
|
Token<BlockTokenIdentifier> token2 = slave.generateToken(block2,
|
|
Token<BlockTokenIdentifier> token2 = slave.generateToken(block2,
|
|
- EnumSet.of(mode), storageTypes);
|
|
|
|
- checkAccess(master, token2, block2, mode);
|
|
|
|
- checkAccess(slave, token2, block2, mode);
|
|
|
|
|
|
+ EnumSet.of(mode), storageTypes, storageIds);
|
|
|
|
+ checkAccess(master, token2, block2, mode, storageTypes, storageIds);
|
|
|
|
+ checkAccess(slave, token2, block2, mode, storageTypes, storageIds);
|
|
}
|
|
}
|
|
// multi-mode tokens
|
|
// multi-mode tokens
|
|
Token<BlockTokenIdentifier> mtoken = master.generateToken(block3,
|
|
Token<BlockTokenIdentifier> mtoken = master.generateToken(block3,
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
- storageTypes);
|
|
|
|
|
|
+ storageTypes, storageIds);
|
|
for (BlockTokenIdentifier.AccessMode mode : BlockTokenIdentifier.AccessMode
|
|
for (BlockTokenIdentifier.AccessMode mode : BlockTokenIdentifier.AccessMode
|
|
.values()) {
|
|
.values()) {
|
|
- checkAccess(master, mtoken, block3, mode);
|
|
|
|
- checkAccess(slave, mtoken, block3, mode);
|
|
|
|
|
|
+ checkAccess(master, mtoken, block3, mode, storageTypes, storageIds);
|
|
|
|
+ checkAccess(slave, mtoken, block3, mode, storageTypes, storageIds);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -259,18 +259,18 @@ public class TestBlockToken {
|
|
ExportedBlockKeys keys = masterHandler.exportKeys();
|
|
ExportedBlockKeys keys = masterHandler.exportKeys();
|
|
slaveHandler.addKeys(keys);
|
|
slaveHandler.addKeys(keys);
|
|
tokenGenerationAndVerification(masterHandler, slaveHandler,
|
|
tokenGenerationAndVerification(masterHandler, slaveHandler,
|
|
- StorageType.DEFAULT);
|
|
|
|
- tokenGenerationAndVerification(masterHandler, slaveHandler, null);
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null);
|
|
|
|
+ tokenGenerationAndVerification(masterHandler, slaveHandler, null, null);
|
|
// key updating
|
|
// key updating
|
|
masterHandler.updateKeys();
|
|
masterHandler.updateKeys();
|
|
tokenGenerationAndVerification(masterHandler, slaveHandler,
|
|
tokenGenerationAndVerification(masterHandler, slaveHandler,
|
|
- StorageType.DEFAULT);
|
|
|
|
- tokenGenerationAndVerification(masterHandler, slaveHandler, null);
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null);
|
|
|
|
+ tokenGenerationAndVerification(masterHandler, slaveHandler, null, null);
|
|
keys = masterHandler.exportKeys();
|
|
keys = masterHandler.exportKeys();
|
|
slaveHandler.addKeys(keys);
|
|
slaveHandler.addKeys(keys);
|
|
tokenGenerationAndVerification(masterHandler, slaveHandler,
|
|
tokenGenerationAndVerification(masterHandler, slaveHandler,
|
|
- StorageType.DEFAULT);
|
|
|
|
- tokenGenerationAndVerification(masterHandler, slaveHandler, null);
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, null);
|
|
|
|
+ tokenGenerationAndVerification(masterHandler, slaveHandler, null, null);
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -315,7 +315,7 @@ public class TestBlockToken {
|
|
enableProtobuf);
|
|
enableProtobuf);
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block3,
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block3,
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
- new StorageType[]{StorageType.DEFAULT});
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, new String[0]);
|
|
|
|
|
|
final Server server = createMockDatanode(sm, token, conf);
|
|
final Server server = createMockDatanode(sm, token, conf);
|
|
|
|
|
|
@@ -365,7 +365,7 @@ public class TestBlockToken {
|
|
enableProtobuf);
|
|
enableProtobuf);
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block3,
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block3,
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
- new StorageType[]{StorageType.DEFAULT});
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, new String[0]);
|
|
|
|
|
|
final Server server = createMockDatanode(sm, token, conf);
|
|
final Server server = createMockDatanode(sm, token, conf);
|
|
server.start();
|
|
server.start();
|
|
@@ -451,19 +451,23 @@ public class TestBlockToken {
|
|
|
|
|
|
ExportedBlockKeys keys = masterHandler.exportKeys();
|
|
ExportedBlockKeys keys = masterHandler.exportKeys();
|
|
bpMgr.addKeys(bpid, keys);
|
|
bpMgr.addKeys(bpid, keys);
|
|
|
|
+ String[] storageIds = new String[] {"DS-9001"};
|
|
tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid),
|
|
tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid),
|
|
- StorageType.DEFAULT);
|
|
|
|
- tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid), null);
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, storageIds);
|
|
|
|
+ tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid), null,
|
|
|
|
+ null);
|
|
// Test key updating
|
|
// Test key updating
|
|
masterHandler.updateKeys();
|
|
masterHandler.updateKeys();
|
|
tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid),
|
|
tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid),
|
|
- StorageType.DEFAULT);
|
|
|
|
- tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid), null);
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, storageIds);
|
|
|
|
+ tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid), null,
|
|
|
|
+ null);
|
|
keys = masterHandler.exportKeys();
|
|
keys = masterHandler.exportKeys();
|
|
bpMgr.addKeys(bpid, keys);
|
|
bpMgr.addKeys(bpid, keys);
|
|
tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid),
|
|
tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid),
|
|
- StorageType.DEFAULT);
|
|
|
|
- tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid), null);
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, new String[]{"DS-9001"});
|
|
|
|
+ tokenGenerationAndVerification(masterHandler, bpMgr.get(bpid), null,
|
|
|
|
+ null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -540,7 +544,7 @@ public class TestBlockToken {
|
|
useProto);
|
|
useProto);
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block1,
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block1,
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
- new StorageType[]{StorageType.DEFAULT});
|
|
|
|
|
|
+ new StorageType[]{StorageType.DEFAULT}, new String[0]);
|
|
final byte[] tokenBytes = token.getIdentifier();
|
|
final byte[] tokenBytes = token.getIdentifier();
|
|
BlockTokenIdentifier legacyToken = new BlockTokenIdentifier();
|
|
BlockTokenIdentifier legacyToken = new BlockTokenIdentifier();
|
|
BlockTokenIdentifier protobufToken = new BlockTokenIdentifier();
|
|
BlockTokenIdentifier protobufToken = new BlockTokenIdentifier();
|
|
@@ -605,7 +609,7 @@ public class TestBlockToken {
|
|
useProto);
|
|
useProto);
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block1,
|
|
Token<BlockTokenIdentifier> token = sm.generateToken(block1,
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
EnumSet.noneOf(BlockTokenIdentifier.AccessMode.class),
|
|
- StorageType.EMPTY_ARRAY);
|
|
|
|
|
|
+ StorageType.EMPTY_ARRAY, new String[0]);
|
|
final byte[] tokenBytes = token.getIdentifier();
|
|
final byte[] tokenBytes = token.getIdentifier();
|
|
BlockTokenIdentifier legacyToken = new BlockTokenIdentifier();
|
|
BlockTokenIdentifier legacyToken = new BlockTokenIdentifier();
|
|
BlockTokenIdentifier protobufToken = new BlockTokenIdentifier();
|
|
BlockTokenIdentifier protobufToken = new BlockTokenIdentifier();
|
|
@@ -699,7 +703,8 @@ public class TestBlockToken {
|
|
*/
|
|
*/
|
|
BlockTokenIdentifier identifier = new BlockTokenIdentifier("user",
|
|
BlockTokenIdentifier identifier = new BlockTokenIdentifier("user",
|
|
"blockpool", 123, EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
"blockpool", 123, EnumSet.allOf(BlockTokenIdentifier.AccessMode.class),
|
|
- new StorageType[]{StorageType.DISK, StorageType.ARCHIVE}, true);
|
|
|
|
|
|
+ new StorageType[]{StorageType.DISK, StorageType.ARCHIVE},
|
|
|
|
+ new String[] {"fake-storage-id"}, true);
|
|
Calendar cal = new GregorianCalendar();
|
|
Calendar cal = new GregorianCalendar();
|
|
cal.set(2017, 1, 9, 0, 12, 35);
|
|
cal.set(2017, 1, 9, 0, 12, 35);
|
|
long datetime = cal.getTimeInMillis();
|
|
long datetime = cal.getTimeInMillis();
|
|
@@ -749,7 +754,8 @@ public class TestBlockToken {
|
|
new StorageType[]{StorageType.RAM_DISK, StorageType.SSD,
|
|
new StorageType[]{StorageType.RAM_DISK, StorageType.SSD,
|
|
StorageType.DISK, StorageType.ARCHIVE};
|
|
StorageType.DISK, StorageType.ARCHIVE};
|
|
BlockTokenIdentifier ident = new BlockTokenIdentifier("user", "bpool",
|
|
BlockTokenIdentifier ident = new BlockTokenIdentifier("user", "bpool",
|
|
- 123, accessModes, storageTypes, useProto);
|
|
|
|
|
|
+ 123, accessModes, storageTypes, new String[] {"fake-storage-id"},
|
|
|
|
+ useProto);
|
|
ident.setExpiryDate(1487080345L);
|
|
ident.setExpiryDate(1487080345L);
|
|
BlockTokenIdentifier ret = writeAndReadBlockToken(ident);
|
|
BlockTokenIdentifier ret = writeAndReadBlockToken(ident);
|
|
assertEquals(ret.getExpiryDate(), 1487080345L);
|
|
assertEquals(ret.getExpiryDate(), 1487080345L);
|
|
@@ -760,6 +766,7 @@ public class TestBlockToken {
|
|
assertEquals(ret.getAccessModes(),
|
|
assertEquals(ret.getAccessModes(),
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class));
|
|
EnumSet.allOf(BlockTokenIdentifier.AccessMode.class));
|
|
assertArrayEquals(ret.getStorageTypes(), storageTypes);
|
|
assertArrayEquals(ret.getStorageTypes(), storageTypes);
|
|
|
|
+ assertArrayEquals(ret.getStorageIds(), new String[] {"fake-storage-id"});
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -767,5 +774,4 @@ public class TestBlockToken {
|
|
testBlockTokenSerialization(false);
|
|
testBlockTokenSerialization(false);
|
|
testBlockTokenSerialization(true);
|
|
testBlockTokenSerialization(true);
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|