|
@@ -45,7 +45,9 @@ import org.apache.hadoop.crypto.CipherSuite;
|
|
|
import org.apache.hadoop.crypto.CryptoProtocolVersion;
|
|
|
import org.apache.hadoop.crypto.key.JavaKeyStoreProvider;
|
|
|
import org.apache.hadoop.crypto.key.KeyProvider;
|
|
|
+import org.apache.hadoop.crypto.key.KeyProviderCryptoExtension;
|
|
|
import org.apache.hadoop.crypto.key.KeyProviderFactory;
|
|
|
+import org.apache.hadoop.crypto.key.kms.server.EagerKeyGeneratorKeyProviderCryptoExtension;
|
|
|
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
|
|
|
import org.apache.hadoop.fs.CreateFlag;
|
|
|
import org.apache.hadoop.fs.FSDataOutputStream;
|
|
@@ -734,14 +736,33 @@ public class TestEncryptionZones {
|
|
|
// Roll the key of the encryption zone
|
|
|
assertNumZones(1);
|
|
|
String keyName = dfsAdmin.listEncryptionZones().next().getKeyName();
|
|
|
+ FileEncryptionInfo feInfo1 = getFileEncryptionInfo(encFile1);
|
|
|
cluster.getNamesystem().getProvider().rollNewVersion(keyName);
|
|
|
+ /**
|
|
|
+ * due to the cache on the server side, client may get old keys.
|
|
|
+ * @see EagerKeyGeneratorKeyProviderCryptoExtension#rollNewVersion(String)
|
|
|
+ */
|
|
|
+ boolean rollSucceeded = false;
|
|
|
+ for (int i = 0; i <= EagerKeyGeneratorKeyProviderCryptoExtension
|
|
|
+ .KMS_KEY_CACHE_SIZE_DEFAULT + CommonConfigurationKeysPublic.
|
|
|
+ KMS_CLIENT_ENC_KEY_CACHE_SIZE_DEFAULT; ++i) {
|
|
|
+ KeyProviderCryptoExtension.EncryptedKeyVersion ekv2 =
|
|
|
+ cluster.getNamesystem().getProvider().generateEncryptedKey(TEST_KEY);
|
|
|
+ if (!(feInfo1.getEzKeyVersionName()
|
|
|
+ .equals(ekv2.getEncryptionKeyVersionName()))) {
|
|
|
+ rollSucceeded = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Assert.assertTrue("rollover did not generate a new key even after"
|
|
|
+ + " queue is drained", rollSucceeded);
|
|
|
+
|
|
|
// Read them back in and compare byte-by-byte
|
|
|
verifyFilesEqual(fs, baseFile, encFile1, len);
|
|
|
// Write a new enc file and validate
|
|
|
final Path encFile2 = new Path(zone, "myfile2");
|
|
|
DFSTestUtil.createFile(fs, encFile2, len, (short) 1, 0xFEED);
|
|
|
// FEInfos should be different
|
|
|
- FileEncryptionInfo feInfo1 = getFileEncryptionInfo(encFile1);
|
|
|
FileEncryptionInfo feInfo2 = getFileEncryptionInfo(encFile2);
|
|
|
assertFalse("EDEKs should be different", Arrays
|
|
|
.equals(feInfo1.getEncryptedDataEncryptionKey(),
|