/** * 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.SubResource; import com.microsoft.azure.management.apigeneration.LangDefinition; import com.microsoft.azure.management.compute.CachingTypes; import com.microsoft.azure.management.compute.Disk; import com.microsoft.azure.management.compute.ImageDataDisk; import com.microsoft.azure.management.compute.ImageOSDisk; import com.microsoft.azure.management.compute.ImageStorageProfile; import com.microsoft.azure.management.compute.OperatingSystemStateTypes; import com.microsoft.azure.management.compute.OperatingSystemTypes; import com.microsoft.azure.management.compute.Snapshot; import com.microsoft.azure.management.compute.VirtualMachine; import com.microsoft.azure.management.compute.VirtualMachineCustomImage; import com.microsoft.azure.management.resources.fluentcore.arm.models.implementation.GroupableResourceImpl; import rx.Observable; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * The implementation for VirtualMachineCustomImage. */ @LangDefinition class VirtualMachineCustomImageImpl extends GroupableResourceImpl< VirtualMachineCustomImage, ImageInner, VirtualMachineCustomImageImpl, ComputeManager> implements VirtualMachineCustomImage, VirtualMachineCustomImage.Definition { VirtualMachineCustomImageImpl(final String name, ImageInner innerModel, final ComputeManager computeManager) { super(name, innerModel, computeManager); } @Override public boolean isCreatedFromVirtualMachine() { return this.sourceVirtualMachineId() != null; } @Override public String sourceVirtualMachineId() { if (this.inner().sourceVirtualMachine() == null) { return null; } return this.inner().sourceVirtualMachine().id(); } @Override public ImageOSDisk osDiskImage() { if (this.inner().storageProfile() == null) { return null; } return this.inner().storageProfile().osDisk(); } @Override public Map<Integer, ImageDataDisk> dataDiskImages() { if (this.inner().storageProfile() == null || this.inner().storageProfile().dataDisks() == null) { return Collections.unmodifiableMap(new HashMap<Integer, ImageDataDisk>()); } HashMap<Integer, ImageDataDisk> diskImages = new HashMap<>(); for (ImageDataDisk dataDisk : this.inner().storageProfile().dataDisks()) { diskImages.put(dataDisk.lun(), dataDisk); } return Collections.unmodifiableMap(diskImages); } @Override public VirtualMachineCustomImageImpl fromVirtualMachine(String virtualMachineId) { this.inner().withSourceVirtualMachine(new SubResource().withId(virtualMachineId)); return this; } @Override public VirtualMachineCustomImageImpl fromVirtualMachine(VirtualMachine virtualMachine) { return this.fromVirtualMachine(virtualMachine.id()); } @Override public VirtualMachineCustomImageImpl withWindowsFromVhd(String sourceVhdUrl, OperatingSystemStateTypes osState) { this.ensureOsDiskImage() .withOsState(osState) .withOsType(OperatingSystemTypes.WINDOWS) .withBlobUri(sourceVhdUrl); return this; } @Override public VirtualMachineCustomImageImpl withLinuxFromVhd(String sourceVhdUrl, OperatingSystemStateTypes osState) { this.ensureOsDiskImage() .withOsState(osState) .withOsType(OperatingSystemTypes.LINUX) .withBlobUri(sourceVhdUrl); return this; } @Override public VirtualMachineCustomImageImpl withWindowsFromSnapshot(String sourceSnapshotId, OperatingSystemStateTypes osState) { this.ensureOsDiskImage() .withOsState(osState) .withOsType(OperatingSystemTypes.WINDOWS) .withSnapshot(new SubResource().withId(sourceSnapshotId)); return this; } @Override public VirtualMachineCustomImageImpl withLinuxFromSnapshot(String sourceSnapshotId, OperatingSystemStateTypes osState) { this.ensureOsDiskImage() .withOsState(osState) .withOsType(OperatingSystemTypes.LINUX) .withSnapshot(new SubResource().withId(sourceSnapshotId)); return this; } @Override public VirtualMachineCustomImageImpl withWindowsFromSnapshot(Snapshot sourceSnapshot, OperatingSystemStateTypes osState) { return this.withWindowsFromSnapshot(sourceSnapshot.id(), osState); } @Override public VirtualMachineCustomImageImpl withLinuxFromSnapshot(Snapshot sourceSnapshot, OperatingSystemStateTypes osState) { return this.withLinuxFromSnapshot(sourceSnapshot.id(), osState); } @Override public VirtualMachineCustomImageImpl withWindowsFromDisk(String sourceManagedDiskId, OperatingSystemStateTypes osState) { this.ensureOsDiskImage() .withOsState(osState) .withOsType(OperatingSystemTypes.WINDOWS) .withManagedDisk(new SubResource().withId(sourceManagedDiskId)); return this; } @Override public VirtualMachineCustomImageImpl withLinuxFromDisk(String sourceManagedDiskId, OperatingSystemStateTypes osState) { this.ensureOsDiskImage() .withOsState(osState) .withOsType(OperatingSystemTypes.LINUX) .withManagedDisk(new SubResource().withId(sourceManagedDiskId)); return this; } @Override public VirtualMachineCustomImageImpl withWindowsFromDisk(Disk sourceManagedDisk, OperatingSystemStateTypes osState) { return withWindowsFromDisk(sourceManagedDisk.id(), osState); } @Override public VirtualMachineCustomImageImpl withLinuxFromDisk(Disk sourceManagedDisk, OperatingSystemStateTypes osState) { return withLinuxFromDisk(sourceManagedDisk.id(), osState); } @Override public VirtualMachineCustomImageImpl withDataDiskImageFromVhd(String sourceVhdUrl) { this.defineDataDiskImage() .withLun(-1) .fromVhd(sourceVhdUrl) .attach(); return this; } @Override public VirtualMachineCustomImageImpl withDataDiskImageFromSnapshot(String sourceSnapshotId) { this.defineDataDiskImage() .withLun(-1) .fromSnapshot(sourceSnapshotId) .attach(); return this; } @Override public VirtualMachineCustomImageImpl withDataDiskImageFromManagedDisk(String sourceManagedDiskId) { this.defineDataDiskImage() .withLun(-1) .fromManagedDisk(sourceManagedDiskId) .attach(); return this; } @Override public CustomImageDataDiskImpl defineDataDiskImage() { return new CustomImageDataDiskImpl(new ImageDataDisk(), this); } @Override public VirtualMachineCustomImageImpl withOSDiskSizeInGB(int diskSizeGB) { this.ensureOsDiskImage() .withDiskSizeGB(diskSizeGB); return this; } @Override public VirtualMachineCustomImageImpl withOSDiskCaching(CachingTypes cachingType) { this.ensureOsDiskImage() .withCaching(cachingType); return this; } @Override public Observable<VirtualMachineCustomImage> createResourceAsync() { ensureDefaultLuns(); return this.manager().inner().images().createOrUpdateAsync(resourceGroupName(), name(), this.inner()) .map(innerToFluentMap(this)); } @Override protected Observable<ImageInner> getInnerAsync() { return this.manager().inner().images().getByResourceGroupAsync(this.resourceGroupName(), this.name()); } private ImageOSDisk ensureOsDiskImage() { if (this.inner().storageProfile() == null) { this.inner().withStorageProfile(new ImageStorageProfile()); } if (this.inner().storageProfile().osDisk() == null) { this.inner() .storageProfile() .withOsDisk(new ImageOSDisk()); } return this.inner().storageProfile().osDisk(); } private void ensureDefaultLuns() { if (this.inner().storageProfile() != null && this.inner().storageProfile().dataDisks() != null) { List<ImageDataDisk> imageDisks = this.inner().storageProfile().dataDisks(); List<Integer> usedLuns = new ArrayList<>(); for (ImageDataDisk imageDisk : imageDisks) { if (imageDisk.lun() != -1) { usedLuns.add(imageDisk.lun()); } } if (usedLuns.size() == imageDisks.size()) { return; } for (ImageDataDisk imageDisk : imageDisks) { if (imageDisk.lun() != -1) { continue; } Integer i = 0; while (usedLuns.contains(i)) { i++; } imageDisk.withLun(i); usedLuns.add(i); } } } VirtualMachineCustomImageImpl withCustomImageDataDisk(CustomImageDataDiskImpl customImageDataDisk) { if (this.inner().storageProfile() == null) { this.inner().withStorageProfile(new ImageStorageProfile()); } if (this.inner().storageProfile().dataDisks() == null) { this.inner().storageProfile().withDataDisks(new ArrayList<ImageDataDisk>()); } this.inner().storageProfile().dataDisks().add(customImageDataDisk.inner()); return this; } }