package com.microsoft.azure.management.compute.implementation;
import com.microsoft.azure.SubResource;
import com.microsoft.azure.management.compute.DiskEncryptionSettings;
import com.microsoft.azure.management.compute.DiskVolumeType;
import com.microsoft.azure.management.compute.KeyVaultKeyReference;
import com.microsoft.azure.management.compute.KeyVaultSecretReference;
import com.microsoft.azure.management.compute.OperatingSystemTypes;
import com.microsoft.azure.management.compute.VirtualMachineEncryptionConfiguration;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.UUID;
abstract class EncryptionSettings {
abstract DiskEncryptionSettings storageProfileEncryptionSettings();
abstract HashMap<String, Object> extensionPublicSettings();
abstract HashMap<String, Object> extensionProtectedSettings();
static <T extends VirtualMachineEncryptionConfiguration<T>> Enable<T> createEnable(final VirtualMachineEncryptionConfiguration<T> config) {
return new Enable<T>(config);
}
static Disable createDisable(final DiskVolumeType volumeType) {
return new EncryptionSettings.Disable(volumeType);
}
static class Enable<T extends VirtualMachineEncryptionConfiguration<T>> extends EncryptionSettings {
private final VirtualMachineEncryptionConfiguration<T> config;
Enable(final VirtualMachineEncryptionConfiguration<T> config) {
this.config = config;
}
@Override
DiskEncryptionSettings storageProfileEncryptionSettings() {
KeyVaultKeyReference keyEncryptionKey = null;
if (config.keyEncryptionKeyURL() != null) {
keyEncryptionKey = new KeyVaultKeyReference();
keyEncryptionKey.withKeyUrl(config.keyEncryptionKeyURL());
if (config.keyEncryptionKeyVaultId() != null) {
keyEncryptionKey.withSourceVault(new SubResource().withId(config.keyEncryptionKeyVaultId()));
}
}
DiskEncryptionSettings diskEncryptionSettings = new DiskEncryptionSettings();
diskEncryptionSettings
.withEnabled(true)
.withKeyEncryptionKey(keyEncryptionKey)
.withDiskEncryptionKey(new KeyVaultSecretReference())
.diskEncryptionKey()
.withSourceVault(new SubResource().withId(config.keyVaultId()));
return diskEncryptionSettings;
}
@Override
HashMap<String, Object> extensionPublicSettings() {
HashMap<String, Object> publicSettings = new LinkedHashMap<>();
publicSettings.put("EncryptionOperation", "EnableEncryption");
publicSettings.put("KeyEncryptionAlgorithm", config.volumeEncryptionKeyEncryptAlgorithm());
publicSettings.put("KeyVaultURL", config.keyVaultUrl());
publicSettings.put("VolumeType", config.volumeType().toString());
publicSettings.put("SequenceVersion", UUID.randomUUID());
if (config.keyEncryptionKeyURL() != null) {
publicSettings.put("KeyEncryptionKeyURL", config.keyEncryptionKeyURL());
}
if (this.requestedForLegacyEncryptExtension()) {
publicSettings.put("AADClientID", config.aadClientId());
} else {
publicSettings.put("KeyVaultResourceId", config.keyVaultId());
if (config.keyEncryptionKeyURL() != null && config.keyEncryptionKeyVaultId() != null) {
publicSettings.put("KekVaultResourceId", config.keyEncryptionKeyVaultId());
}
}
return publicSettings;
}
@Override
HashMap<String, Object> extensionProtectedSettings() {
if (this.requestedForLegacyEncryptExtension()) {
HashMap<String, Object> protectedSettings = new LinkedHashMap<>();
protectedSettings.put("AADClientSecret", config.aadSecret());
if (config.osType() == OperatingSystemTypes.LINUX
&& config.linuxPassPhrase() != null) {
protectedSettings.put("Passphrase", config.linuxPassPhrase());
}
return protectedSettings;
} else {
return new LinkedHashMap<>();
}
}
String encryptionExtensionVersion() {
return EncryptionExtensionIdentifier.version(this.config.osType(), requestedForNoAADEncryptExtension());
}
boolean requestedForNoAADEncryptExtension() {
return this.config.aadClientId() == null && this.config.aadSecret() == null;
}
boolean requestedForLegacyEncryptExtension() {
return !requestedForNoAADEncryptExtension();
}
}
static class Disable extends EncryptionSettings {
private final DiskVolumeType volumeType;
Disable(final DiskVolumeType volumeType) {
this.volumeType = volumeType;
}
@Override
DiskEncryptionSettings storageProfileEncryptionSettings() {
DiskEncryptionSettings diskEncryptionSettings = new DiskEncryptionSettings();
diskEncryptionSettings
.withEnabled(false);
return diskEncryptionSettings;
}
@Override
HashMap<String, Object> extensionPublicSettings() {
HashMap<String, Object> publicSettings = new LinkedHashMap<>();
publicSettings.put("EncryptionOperation", "DisableEncryption");
publicSettings.put("SequenceVersion", UUID.randomUUID());
publicSettings.put("VolumeType", this.volumeType);
return publicSettings;
}
@Override
HashMap<String, Object> extensionProtectedSettings() {
return new LinkedHashMap<>();
}
}
}