/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for
* license information.
*/
package com.microsoft.azure.management.compute.implementation;
import com.microsoft.azure.PagedList;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.compute.CachingTypes;
import com.microsoft.azure.management.compute.DataDisk;
import com.microsoft.azure.management.compute.DiagnosticsProfile;
import com.microsoft.azure.management.compute.ImageReference;
import com.microsoft.azure.management.compute.OSProfile;
import com.microsoft.azure.management.compute.OperatingSystemTypes;
import com.microsoft.azure.management.compute.PowerState;
import com.microsoft.azure.management.compute.Sku;
import com.microsoft.azure.management.compute.StorageProfile;
import com.microsoft.azure.management.compute.VirtualMachineCustomImage;
import com.microsoft.azure.management.compute.VirtualMachineDataDisk;
import com.microsoft.azure.management.compute.VirtualMachineImage;
import com.microsoft.azure.management.compute.VirtualMachineInstanceView;
import com.microsoft.azure.management.compute.VirtualMachineScaleSet;
import com.microsoft.azure.management.compute.VirtualMachineScaleSetVM;
import com.microsoft.azure.management.compute.VirtualMachineScaleSetVMInstanceExtension;
import com.microsoft.azure.management.compute.VirtualMachineSizeTypes;
import com.microsoft.azure.management.compute.VirtualMachineUnmanagedDataDisk;
import com.microsoft.azure.management.network.VirtualMachineScaleSetNetworkInterface;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.resources.fluentcore.arm.models.implementation.ChildResourceImpl;
import com.microsoft.azure.management.resources.fluentcore.utils.Utils;
import rx.Completable;
import rx.Observable;
import rx.functions.Func1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Implementation of {@link VirtualMachineScaleSetVM}.
*/
@LangDefinition
class VirtualMachineScaleSetVMImpl
extends ChildResourceImpl<VirtualMachineScaleSetVMInner,
VirtualMachineScaleSetImpl,
VirtualMachineScaleSet>
implements VirtualMachineScaleSetVM {
private VirtualMachineInstanceView virtualMachineInstanceView;
private final VirtualMachineScaleSetVMsInner client;
private final ComputeManager computeManager;
VirtualMachineScaleSetVMImpl(VirtualMachineScaleSetVMInner inner,
final VirtualMachineScaleSetImpl parent,
final VirtualMachineScaleSetVMsInner client,
final ComputeManager computeManager) {
super(inner, parent);
this.client = client;
this.computeManager = computeManager;
this.virtualMachineInstanceView = this.inner().instanceView();
}
@Override
public String id() {
return this.inner().id();
}
@Override
public String name() {
return this.inner().name();
}
@Override
public String regionName() {
return this.inner().location();
}
@Override
public Region region() {
return Region.fromName(this.regionName());
}
@Override
public String type() {
return this.inner().type();
}
@Override
public Map<String, String> tags() {
if (this.inner().getTags() == null) {
return Collections.unmodifiableMap(new LinkedHashMap<String, String>());
}
return Collections.unmodifiableMap(this.inner().getTags());
}
@Override
public String instanceId() {
return this.inner().instanceId();
}
@Override
public Sku sku() {
return this.inner().sku();
}
@Override
public VirtualMachineSizeTypes size() {
if (this.inner().hardwareProfile() != null && this.inner().hardwareProfile().vmSize() != null) {
return this.inner().hardwareProfile().vmSize();
}
if (this.sku() != null && this.sku().name() != null) {
return new VirtualMachineSizeTypes(this.sku().name());
}
return null;
}
@Override
public boolean isLatestScaleSetUpdateApplied() {
return this.inner().latestModelApplied();
}
@Override
public boolean isOSBasedOnPlatformImage() {
ImageReferenceInner imageReference = this.inner().storageProfile().imageReference();
if (imageReference != null
&& imageReference.publisher() != null
&& imageReference.sku() != null
&& imageReference.offer() != null
&& imageReference.version() != null) {
return true;
}
return false;
}
@Override
public boolean isOSBasedOnCustomImage() {
ImageReferenceInner imageReference = this.inner().storageProfile().imageReference();
if (imageReference != null
&& imageReference.id() != null) {
return true;
}
return false;
}
@Override
public boolean isOSBasedOnStoredImage() {
if (this.inner().storageProfile().osDisk() != null
&& this.inner().storageProfile().osDisk().image() != null) {
return this.inner().storageProfile().osDisk().image().uri() != null;
}
return false;
}
@Override
public ImageReference platformImageReference() {
if (isOSBasedOnPlatformImage()) {
return new ImageReference(this.inner().storageProfile().imageReference());
}
return null;
}
@Override
public VirtualMachineImage getOSPlatformImage() {
if (this.isOSBasedOnPlatformImage()) {
ImageReference imageReference = this.platformImageReference();
return this.computeManager.virtualMachineImages().getImage(this.region(),
imageReference.publisher(),
imageReference.offer(),
imageReference.sku(),
imageReference.version());
}
return null;
}
@Override
public VirtualMachineCustomImage getOSCustomImage() {
if (this.isOSBasedOnCustomImage()) {
ImageReferenceInner imageReference = this.inner().storageProfile().imageReference();
return this.computeManager.virtualMachineCustomImages().getById(imageReference.id());
}
return null;
}
@Override
public String storedImageUnmanagedVhdUri() {
if (this.inner().storageProfile().osDisk().image() != null) {
return this.inner().storageProfile().osDisk().image().uri();
}
return null;
}
@Override
public String osDiskName() {
return this.inner().storageProfile().osDisk().name();
}
@Override
public String osUnmanagedDiskVhdUri() {
if (this.inner().storageProfile().osDisk().vhd() != null) {
return this.inner().storageProfile().osDisk().vhd().uri();
}
return null;
}
@Override
public String osDiskId() {
if (this.storageProfile().osDisk().managedDisk() != null) {
return this.storageProfile().osDisk().managedDisk().id();
}
return null;
}
@Override
public Map<Integer, VirtualMachineUnmanagedDataDisk> unmanagedDataDisks() {
Map<Integer, VirtualMachineUnmanagedDataDisk> dataDisks = new HashMap<>();
if (!isManagedDiskEnabled()) {
List<DataDisk> innerDataDisks = this.inner().storageProfile().dataDisks();
if (innerDataDisks != null) {
for (DataDisk innerDataDisk : innerDataDisks) {
dataDisks.put(innerDataDisk.lun(), new UnmanagedDataDiskImpl(innerDataDisk, null));
}
}
}
return Collections.unmodifiableMap(dataDisks);
}
@Override
public Map<Integer, VirtualMachineDataDisk> dataDisks() {
Map<Integer, VirtualMachineDataDisk> dataDisks = new HashMap<>();
if (isManagedDiskEnabled()) {
List<DataDisk> innerDataDisks = this.inner().storageProfile().dataDisks();
if (innerDataDisks != null) {
for (DataDisk innerDataDisk : innerDataDisks) {
dataDisks.put(innerDataDisk.lun(), new VirtualMachineDataDiskImpl(innerDataDisk));
}
}
}
return Collections.unmodifiableMap(dataDisks);
}
@Override
public CachingTypes osDiskCachingType() {
return this.inner().storageProfile().osDisk().caching();
}
@Override
public int osDiskSizeInGB() {
return Utils.toPrimitiveInt(this.inner().storageProfile().osDisk().diskSizeGB());
}
@Override
public String computerName() {
return this.inner().osProfile().computerName();
}
@Override
public String administratorUserName() {
return this.inner().osProfile().adminUsername();
}
@Override
public OperatingSystemTypes osType() {
return this.inner().storageProfile().osDisk().osType();
}
@Override
public boolean isLinuxPasswordAuthenticationEnabled() {
if (this.inner().osProfile().linuxConfiguration() != null) {
return !Utils.toPrimitiveBoolean(this.inner().osProfile().linuxConfiguration().disablePasswordAuthentication());
}
return false;
}
@Override
public boolean isWindowsVMAgentProvisioned() {
if (this.inner().osProfile().windowsConfiguration() != null) {
return Utils.toPrimitiveBoolean(this.inner().osProfile().windowsConfiguration().provisionVMAgent());
}
return false;
}
@Override
public boolean isWindowsAutoUpdateEnabled() {
if (this.inner().osProfile().windowsConfiguration() != null) {
return Utils.toPrimitiveBoolean(this.inner().osProfile().windowsConfiguration().enableAutomaticUpdates());
}
return false;
}
@Override
public String windowsTimeZone() {
if (this.inner().osProfile().windowsConfiguration() != null) {
return this.inner().osProfile().windowsConfiguration().timeZone();
}
return null;
}
@Override
public boolean bootDiagnosticEnabled() {
if (this.inner().diagnosticsProfile() != null
&& this.inner().diagnosticsProfile().bootDiagnostics() != null) {
return Utils.toPrimitiveBoolean(this.inner().diagnosticsProfile().bootDiagnostics().enabled());
}
return false;
}
@Override
public String bootDiagnosticStorageAccountUri() {
if (this.inner().diagnosticsProfile() != null
&& this.inner().diagnosticsProfile().bootDiagnostics() != null) {
return this.inner().diagnosticsProfile().bootDiagnostics().storageUri();
}
return null;
}
@Override
public String availabilitySetId() {
if (this.inner().availabilitySet() != null) {
return this.inner().availabilitySet().id();
}
return null;
}
@Override
public List<String> networkInterfaceIds() {
List<String> resourceIds = new ArrayList<>();
for (NetworkInterfaceReferenceInner reference : this.inner().networkProfile().networkInterfaces()) {
resourceIds.add(reference.id());
}
return Collections.unmodifiableList(resourceIds);
}
@Override
public String primaryNetworkInterfaceId() {
for (NetworkInterfaceReferenceInner reference : this.inner().networkProfile().networkInterfaces()) {
if (reference.primary() != null && reference.primary()) {
return reference.id();
}
}
return null;
}
@Override
public Map<String, VirtualMachineScaleSetVMInstanceExtension> extensions() {
Map<String, VirtualMachineScaleSetVMInstanceExtension> extensions = new LinkedHashMap<>();
if (this.inner().resources() != null) {
for (VirtualMachineExtensionInner extensionInner : this.inner().resources()) {
extensions.put(extensionInner.name(), new VirtualMachineScaleSetVMInstanceExtensionImpl(extensionInner, this));
}
}
return Collections.unmodifiableMap(extensions);
}
@Override
public StorageProfile storageProfile() {
return this.inner().storageProfile();
}
@Override
public OSProfile osProfile() {
return this.inner().osProfile();
}
@Override
public DiagnosticsProfile diagnosticsProfile() {
return this.inner().diagnosticsProfile();
}
@Override
public VirtualMachineInstanceView instanceView() {
if (this.virtualMachineInstanceView == null) {
refreshInstanceView();
}
return this.virtualMachineInstanceView;
}
@Override
public VirtualMachineInstanceView refreshInstanceView() {
VirtualMachineScaleSetVMInstanceViewInner instanceViewInner = this.client.getInstanceView(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId());
if (instanceViewInner != null) {
this.virtualMachineInstanceView = new VirtualMachineInstanceView()
.withBootDiagnostics(instanceViewInner.bootDiagnostics())
.withDisks(instanceViewInner.disks())
.withExtensions(instanceViewInner.extensions())
.withPlatformFaultDomain(instanceViewInner.platformFaultDomain())
.withPlatformUpdateDomain(instanceViewInner.platformUpdateDomain())
.withRdpThumbPrint(instanceViewInner.rdpThumbPrint())
.withStatuses(instanceViewInner.statuses())
.withVmAgent(instanceViewInner.vmAgent());
}
return this.virtualMachineInstanceView;
}
@Override
public PowerState powerState() {
return PowerState.fromInstanceView(this.instanceView());
}
@Override
public void reimage() {
this.reimageAsync().await();
}
@Override
public Completable reimageAsync() {
return this.client.reimageAsync(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId()).toCompletable();
}
@Override
public void deallocate() {
this.deallocateAsync().await();
}
@Override
public Completable deallocateAsync() {
return this.client.deallocateAsync(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId()).toCompletable();
}
@Override
public void powerOff() {
this.powerOffAsync().await();
}
@Override
public Completable powerOffAsync() {
return this.client.powerOffAsync(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId()).toCompletable();
}
@Override
public void start() {
this.startAsync().await();
}
@Override
public Completable startAsync() {
return this.client.startAsync(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId()).toCompletable();
}
@Override
public void restart() {
this.restartAsync().await();
}
@Override
public Completable restartAsync() {
return this.client.restartAsync(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId())
.toCompletable();
}
@Override
public void delete() {
deleteAsync().await();
}
@Override
public Completable deleteAsync() {
return this.client.deleteAsync(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId()).toCompletable();
}
@Override
public VirtualMachineScaleSetVM refresh() {
return this.refreshAsync().toBlocking().last();
}
@Override
public Observable<VirtualMachineScaleSetVM> refreshAsync() {
final VirtualMachineScaleSetVMImpl self = this;
return this.client.getAsync(this.parent().resourceGroupName(),
this.parent().name(),
this.instanceId()).map(new Func1<VirtualMachineScaleSetVMInner, VirtualMachineScaleSetVM>() {
@Override
public VirtualMachineScaleSetVM call(VirtualMachineScaleSetVMInner virtualMachineScaleSetVMInner) {
self.setInner(virtualMachineScaleSetVMInner);
self.clearCachedRelatedResources();
return self;
}
});
}
@Override
public VirtualMachineScaleSetNetworkInterface getNetworkInterface(String name) {
return this.parent().getNetworkInterfaceByInstanceId(this.instanceId(), name);
}
@Override
public PagedList<VirtualMachineScaleSetNetworkInterface> listNetworkInterfaces() {
return this.parent().listNetworkInterfacesByInstanceId(this.instanceId());
}
private void clearCachedRelatedResources() {
this.virtualMachineInstanceView = null;
}
@Override
public boolean isManagedDiskEnabled() {
if (isOSBasedOnCustomImage()) {
return true;
}
if (isOSBasedOnStoredImage()) {
return false;
}
if (isOSBasedOnPlatformImage()) {
if (this.inner().storageProfile().osDisk() != null
&& this.inner().storageProfile().osDisk().vhd() != null) {
return false;
}
}
return true;
}
}