package com.microsoft.azure.management.compute.implementation;
import com.microsoft.azure.management.apigeneration.Beta;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.compute.DiskVolumeEncryptionMonitor;
import com.microsoft.azure.management.compute.EncryptionStatus;
import com.microsoft.azure.management.compute.InstanceViewStatus;
import com.microsoft.azure.management.compute.OperatingSystemTypes;
import com.microsoft.azure.management.resources.fluentcore.arm.ResourceUtils;
import rx.Observable;
import rx.functions.Func1;
import java.util.HashMap;
import java.util.Map;
@LangDefinition
class LinuxDiskVolumeLegacyEncryptionMonitorImpl implements DiskVolumeEncryptionMonitor {
private final String rgName;
private final String vmName;
private final ComputeManager computeManager;
private VirtualMachineExtensionInner encryptionExtension;
LinuxDiskVolumeLegacyEncryptionMonitorImpl(String virtualMachineId, ComputeManager computeManager) {
this.rgName = ResourceUtils.groupFromResourceId(virtualMachineId);
this.vmName = ResourceUtils.nameFromResourceId(virtualMachineId);
this.computeManager = computeManager;
}
@Override
public OperatingSystemTypes osType() {
return OperatingSystemTypes.LINUX;
}
@Override
public String progressMessage() {
if (!hasEncryptionExtension()) {
return null;
}
return LinuxEncryptionExtensionUtil.progressMessage(this.encryptionExtension.instanceView());
}
@Override
public EncryptionStatus osDiskStatus() {
if (!hasEncryptionExtension()) {
return EncryptionStatus.NOT_ENCRYPTED;
}
return LinuxEncryptionExtensionUtil.osDiskStatus(this.encryptionExtension.instanceView());
}
@Override
public EncryptionStatus dataDiskStatus() {
if (!hasEncryptionExtension()) {
return EncryptionStatus.NOT_ENCRYPTED;
}
return LinuxEncryptionExtensionUtil.dataDiskStatus(this.encryptionExtension.instanceView());
}
@Beta
@Override
public Map<String, InstanceViewStatus> diskInstanceViewEncryptionStatuses() {
return new HashMap<String, InstanceViewStatus>();
}
@Override
public DiskVolumeEncryptionMonitor refresh() {
return refreshAsync().toBlocking().last();
}
@Override
public Observable<DiskVolumeEncryptionMonitor> refreshAsync() {
final DiskVolumeEncryptionMonitor self = this;
return retrieveEncryptExtensionWithInstanceViewAsync()
.flatMap(new Func1<VirtualMachineExtensionInner, Observable<DiskVolumeEncryptionMonitor>>() {
@Override
public Observable<DiskVolumeEncryptionMonitor> call(VirtualMachineExtensionInner virtualMachineExtensionInner) {
encryptionExtension = virtualMachineExtensionInner;
return Observable.just(self);
}
})
.switchIfEmpty(Observable.just(self));
}
private Observable<VirtualMachineExtensionInner> retrieveEncryptExtensionWithInstanceViewAsync() {
if (encryptionExtension != null) {
return retrieveExtensionWithInstanceViewAsync(encryptionExtension);
} else {
return retrieveEncryptExtensionWithInstanceViewFromVMAsync();
}
}
private Observable<VirtualMachineExtensionInner> retrieveExtensionWithInstanceViewAsync(VirtualMachineExtensionInner extension) {
return this.computeManager
.inner()
.virtualMachineExtensions()
.getAsync(rgName, vmName, extension.name(), "instanceView")
.flatMap(new Func1<VirtualMachineExtensionInner, Observable<VirtualMachineExtensionInner>>() {
@Override
public Observable<VirtualMachineExtensionInner> call(VirtualMachineExtensionInner virtualMachineExtensionInner) {
if (virtualMachineExtensionInner == null) {
return Observable.empty();
}
return Observable.just(virtualMachineExtensionInner);
}
});
}
private Observable<VirtualMachineExtensionInner> retrieveEncryptExtensionWithInstanceViewFromVMAsync() {
return this.computeManager
.inner()
.virtualMachines()
.getByResourceGroupAsync(rgName, vmName)
.flatMap(new Func1<VirtualMachineInner, Observable<VirtualMachineExtensionInner>>() {
@Override
public Observable<VirtualMachineExtensionInner> call(VirtualMachineInner virtualMachine) {
if (virtualMachine == null) {
return Observable.error(new Exception(String.format("VM with name '%s' not found (resource group '%s')",
vmName, rgName)));
}
if (virtualMachine.resources() != null) {
for (VirtualMachineExtensionInner extension : virtualMachine.resources()) {
if (EncryptionExtensionIdentifier.isEncryptionPublisherName(extension.publisher())
&& EncryptionExtensionIdentifier.isEncryptionTypeName(extension.virtualMachineExtensionType(), OperatingSystemTypes.LINUX)) {
return retrieveExtensionWithInstanceViewAsync(extension);
}
}
}
return Observable.empty();
}
});
}
private boolean hasEncryptionExtension() {
return this.encryptionExtension != null;
}
}