package com.urbancode.terraform.tasks.microsoft;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import com.urbancode.terraform.tasks.microsoft.util.AzureCmdRunner;
import com.urbancode.x2o.tasks.SubTask;
public class VMTask extends SubTask {
//**********************************************************************************************
// CLASS
//**********************************************************************************************
static private final Logger log = Logger.getLogger(VMTask.class);
//**********************************************************************************************
// INSTANCE
//**********************************************************************************************
private String vmName;
private String roleFileName = "";
private boolean addUuid = false;
private String uuid = "";
private String imageName;
private String location;
private String affinityGroup;
private String size = "small";
private String user;
private String password = "";
private List<EndpointTask> endpointTasks = new ArrayList<EndpointTask>();
private boolean ssh = false;
private boolean rdp = false;
private String virtualNetworkName = "";
private String subnetNames = "";
private String blobUrl = "";
//----------------------------------------------------------------------------------------------
public VMTask() {
super();
}
//----------------------------------------------------------------------------------------------
public String getVmName() {
return vmName;
}
//----------------------------------------------------------------------------------------------
public String getImageName() {
return imageName;
}
//----------------------------------------------------------------------------------------------
public String getLocation() {
return location;
}
//----------------------------------------------------------------------------------------------
public String getAffinityGroup() {
return affinityGroup;
}
//----------------------------------------------------------------------------------------------
public String getSize() {
return size;
}
//----------------------------------------------------------------------------------------------
public String getUser() {
return user;
}
//----------------------------------------------------------------------------------------------
public String getPassword() {
return password;
}
//----------------------------------------------------------------------------------------------
public String getRoleFileName() {
return roleFileName;
}
//----------------------------------------------------------------------------------------------
public String getVirtualNetworkName() {
return virtualNetworkName;
}
//----------------------------------------------------------------------------------------------
public String getSubnetNames() {
return subnetNames;
}
//----------------------------------------------------------------------------------------------
public boolean getSsh() {
return ssh;
}
//----------------------------------------------------------------------------------------------
public boolean getRdp() {
return rdp;
}
//----------------------------------------------------------------------------------------------
public String getBlobUrl() {
return blobUrl;
}
//----------------------------------------------------------------------------------------------
public List<EndpointTask> getEndpointTasks() {
return endpointTasks;
}
//----------------------------------------------------------------------------------------------
public void setVmName(String vmName) {
this.vmName = vmName;
}
//----------------------------------------------------------------------------------------------
public void setAddUuid(boolean addUuid) {
this.addUuid = addUuid;
}
//----------------------------------------------------------------------------------------------
public void setUuid(String uuid) {
this.uuid = uuid;
}
//----------------------------------------------------------------------------------------------
public void setImageName(String imageName) {
this.imageName = imageName;
}
//----------------------------------------------------------------------------------------------
public void setLocation(String location) {
this.location = location;
}
//----------------------------------------------------------------------------------------------
public void setAffinityGroup(String affinityGroup) {
this.affinityGroup = affinityGroup;
}
//----------------------------------------------------------------------------------------------
public void setSize(String size) {
this.size = size;
}
//----------------------------------------------------------------------------------------------
public void setVmSize(String size) {
//alias for size
this.size = size;
}
//----------------------------------------------------------------------------------------------
public void setUser(String user) {
this.user = user;
}
//----------------------------------------------------------------------------------------------
public void setPassword(String password) {
this.password = password;
}
//----------------------------------------------------------------------------------------------
public void setRoleFileName(String roleFileName) {
this.roleFileName = roleFileName;
}
//----------------------------------------------------------------------------------------------
public void setVirtualNetworkName(String virtualNetworkName) {
this.virtualNetworkName = virtualNetworkName;
}
//----------------------------------------------------------------------------------------------
public void setSubnetNames(String subnetNames) {
this.subnetNames = subnetNames;
}
//----------------------------------------------------------------------------------------------
public void setSsh(boolean ssh) {
this.ssh = ssh;
}
//----------------------------------------------------------------------------------------------
public void setRdp(boolean rdp) {
this.rdp = rdp;
}
//----------------------------------------------------------------------------------------------
public void setBlobUrl(String blobUrl) {
this.blobUrl = blobUrl;
}
//----------------------------------------------------------------------------------------------
public EndpointTask createEndpointTask() {
EndpointTask task = new EndpointTask();
task.setDnsName(vmName);
endpointTasks.add(task);
return task;
}
//----------------------------------------------------------------------------------------------
private boolean isValidString(String s) {
return !(s == null || "".equals(s) || "null".equals(s));
}
//----------------------------------------------------------------------------------------------
public List<String> makeCommandList() {
List<String> result = new ArrayList<String>();
result.add("vm");
if(isValidString(roleFileName)) {
result.add("create-from");
result.add(vmName);
result.add(roleFileName);
}
else {
result.add("create");
result.add(vmName);
result.add(imageName);
result.add(user);
result.add(password);
result.add("--vm-size");
result.add(size);
if(isValidString(subnetNames)) {
result.add("--subnet-names");
result.add(subnetNames);
}
if (ssh) {
result.add("--ssh");
}
if (rdp) {
result.add("--rdp");
}
}
if (isValidString(affinityGroup)) {
result.add("--affinity-group");
result.add(affinityGroup);
}
else if (isValidString(location)) {
result.add("--location");
result.add(location);
}
else {
throw new IllegalArgumentException("no affinity group or location was specified. " +
"Please specify one or the other in your template.");
}
if(isValidString(virtualNetworkName)) {
result.add("--virtual-network-name");
result.add(virtualNetworkName);
}
if(isValidString(blobUrl)) {
result.add("--blob-url");
result.add(blobUrl);
}
return result;
}
//----------------------------------------------------------------------------------------------
@Override
public void create() throws Exception {
vmName = addUuid ? vmName + "-" + uuid : vmName;
AzureCmdRunner runner = new AzureCmdRunner();
runner.runCommand(makeCommandList());
for(EndpointTask task : endpointTasks) {
task.create();
}
}
//----------------------------------------------------------------------------------------------
@Override
public void destroy() throws Exception {
AzureCmdRunner runner = new AzureCmdRunner();
runner.runCommand("vm", "delete", vmName);
}
}