/**
* 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.management.compute.DataDisk;
import com.microsoft.azure.management.compute.VirtualMachine;
import com.microsoft.azure.management.apigeneration.LangDefinition;
import com.microsoft.azure.management.compute.CachingTypes;
import com.microsoft.azure.management.compute.DiskCreateOptionTypes;
import com.microsoft.azure.management.compute.VirtualHardDisk;
import com.microsoft.azure.management.compute.VirtualMachineUnmanagedDataDisk;
import com.microsoft.azure.management.resources.fluentcore.arm.models.implementation.ChildResourceImpl;
import com.microsoft.azure.management.resources.fluentcore.utils.Utils;
import com.microsoft.azure.management.storage.StorageAccount;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* The implementation for {@link DataDisk} and its create and update interfaces.
*/
@LangDefinition
class UnmanagedDataDiskImpl
extends ChildResourceImpl<DataDisk, VirtualMachineImpl, VirtualMachine>
implements
VirtualMachineUnmanagedDataDisk,
VirtualMachineUnmanagedDataDisk.DefinitionWithExistingVhd<VirtualMachine.DefinitionStages.WithUnmanagedCreate>,
VirtualMachineUnmanagedDataDisk.DefinitionWithNewVhd<VirtualMachine.DefinitionStages.WithUnmanagedCreate>,
VirtualMachineUnmanagedDataDisk.DefinitionWithImage<VirtualMachine.DefinitionStages.WithUnmanagedCreate>,
VirtualMachineUnmanagedDataDisk.UpdateDefinitionWithExistingVhd<VirtualMachine.Update>,
VirtualMachineUnmanagedDataDisk.UpdateDefinitionWithNewVhd<VirtualMachine.Update>,
VirtualMachineUnmanagedDataDisk.Update {
protected UnmanagedDataDiskImpl(DataDisk inner, VirtualMachineImpl parent) {
super(inner, parent);
}
protected static UnmanagedDataDiskImpl prepareDataDisk(String name,
VirtualMachineImpl parent) {
DataDisk dataDiskInner = new DataDisk();
dataDiskInner.withLun(-1)
.withName(name)
.withVhd(null);
return new UnmanagedDataDiskImpl(dataDiskInner, parent);
}
@Override
public String name() {
return this.inner().name();
}
@Override
public int size() {
return Utils.toPrimitiveInt(this.inner().diskSizeGB());
}
@Override
public int lun() {
return Utils.toPrimitiveInt(this.inner().lun());
}
@Override
public String vhdUri() {
return this.inner().vhd().uri();
}
@Override
public CachingTypes cachingType() {
return this.inner().caching();
}
@Override
public String sourceImageUri() {
if (this.inner().image() != null) {
return this.inner().image().uri();
}
return null;
}
@Override
public DiskCreateOptionTypes creationMethod() {
return this.inner().createOption();
}
@Override
public UnmanagedDataDiskImpl withNewVhd(int sizeInGB) {
this.inner()
.withCreateOption(DiskCreateOptionTypes.EMPTY)
.withDiskSizeGB(sizeInGB);
return this;
}
@Override
public UnmanagedDataDiskImpl withExistingVhd(String storageAccountName, String containerName, String vhdName) {
this.inner()
.withCreateOption(DiskCreateOptionTypes.ATTACH)
.withVhd(new VirtualHardDisk()
.withUri(blobUrl(storageAccountName, containerName, vhdName)));
return this;
}
@Override
public UnmanagedDataDiskImpl fromImage(int imageLun) {
this.inner()
.withCreateOption(DiskCreateOptionTypes.FROM_IMAGE)
.withLun(imageLun);
return this;
}
@Override
public UnmanagedDataDiskImpl withSizeInGB(Integer sizeInGB) {
this.inner().withDiskSizeGB(sizeInGB);
return this;
}
@Override
public UnmanagedDataDiskImpl withLun(Integer lun) {
this.inner().withLun(lun);
return this;
}
@Override
public UnmanagedDataDiskImpl withCaching(CachingTypes cachingType) {
this.inner().withCaching(cachingType);
return this;
}
@Override
public UnmanagedDataDiskImpl storeAt(String storageAccountName, String containerName, String vhdName) {
this.inner().withVhd(new VirtualHardDisk());
// URL points to where the underlying vhd needs to be stored
this.inner().vhd().withUri(blobUrl(storageAccountName, containerName, vhdName));
return this;
}
@Override
public VirtualMachineImpl attach() {
return this.parent().withUnmanagedDataDisk(this);
}
protected static void setDataDisksDefaults(List<VirtualMachineUnmanagedDataDisk> dataDisks, String namePrefix) {
List<Integer> usedLuns = new ArrayList<>();
for (VirtualMachineUnmanagedDataDisk dataDisk : dataDisks) {
if (dataDisk.lun() != -1) {
usedLuns.add(dataDisk.lun());
}
}
for (VirtualMachineUnmanagedDataDisk dataDisk : dataDisks) {
if (dataDisk.lun() == -1) {
Integer i = 0;
while (usedLuns.contains(i)) {
i++;
}
dataDisk.inner().withLun(i);
usedLuns.add(i);
}
if (dataDisk.name() == null) {
dataDisk.inner().withName(namePrefix + "-data-disk-" + dataDisk.lun());
}
if (dataDisk.inner().caching() == null) {
dataDisk.inner().withCaching(CachingTypes.READ_WRITE);
}
}
}
protected static void ensureDisksVhdUri(List<VirtualMachineUnmanagedDataDisk> dataDisks, StorageAccount storageAccount, String namePrefix) {
for (VirtualMachineUnmanagedDataDisk dataDisk : dataDisks) {
if (dataDisk.creationMethod() == DiskCreateOptionTypes.EMPTY
|| dataDisk.creationMethod() == DiskCreateOptionTypes.FROM_IMAGE) {
//New empty and from image data disk requires Vhd Uri to be set
if (dataDisk.inner().vhd() == null) {
dataDisk.inner().withVhd(new VirtualHardDisk());
dataDisk.inner().vhd().withUri(storageAccount.endPoints().primary().blob()
+ "vhds/"
+ namePrefix + "-data-disk-" + dataDisk.lun() + "-" + UUID.randomUUID().toString() + ".vhd");
}
}
}
}
protected static void ensureDisksVhdUri(List<VirtualMachineUnmanagedDataDisk> dataDisks, String namePrefix) {
String containerUrl = null;
for (VirtualMachineUnmanagedDataDisk dataDisk : dataDisks) {
if (dataDisk.creationMethod() == DiskCreateOptionTypes.EMPTY && dataDisk.inner().vhd() != null) {
int idx = dataDisk.inner().vhd().uri().lastIndexOf('/');
containerUrl = dataDisk.inner().vhd().uri().substring(0, idx);
break;
}
}
if (containerUrl != null) {
for (VirtualMachineUnmanagedDataDisk dataDisk : dataDisks) {
if (dataDisk.creationMethod() == DiskCreateOptionTypes.EMPTY) {
//New data disk requires Vhd Uri to be set
if (dataDisk.inner().vhd() == null) {
dataDisk.inner().withVhd(new VirtualHardDisk());
dataDisk.inner().vhd().withUri(containerUrl
+ namePrefix + "-data-disk-" + dataDisk.lun() + "-" + UUID.randomUUID().toString() + ".vhd");
}
}
}
}
}
private static String blobUrl(String storageAccountName, String containerName, String blobName) {
// Future: Get the storage domain from the environment
return "https://" + storageAccountName + ".blob.core.windows.net" + "/" + containerName + "/" + blobName;
}
}