blob: 3dac30de0e5fc44c50feeeb9fcc3fecb198d3447 [file] [log] [blame]
package org.jclouds.smartos.compute.domain;
import java.util.Map;
import java.util.UUID;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
/**
* Representing a Virtual Machine (Zone / KVM )
**/
public class VM {
public enum State {
RUNNING, STOPPED, INCOMPLETE
}
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return builder().fromVM(this);
}
public static class Builder {
protected SmartOSHost host;
protected UUID uuid;
protected String type;
protected String ram;
protected State state = State.STOPPED;
protected String alias;
public Builder uuid(UUID uuid) {
this.uuid = uuid;
return this;
}
public Builder uuid(String uuid) {
this.uuid = UUID.fromString(uuid);
return this;
}
public Builder host(SmartOSHost host) {
this.host = host;
return this;
}
public Builder type(String type) {
this.type = type;
return this;
}
public Builder ram(String ram) {
this.ram = ram;
return this;
}
public Builder state(String state) {
this.state = State.valueOf(state.toUpperCase());
return this;
}
public Builder state(State state) {
this.state = state;
return this;
}
public Builder alias(String alias) {
this.alias = alias;
return this;
}
public Builder fromVmadmString(String string) {
String[] sections = string.split(":");
uuid(sections[0]);
type(sections[1]);
ram(sections[2]);
state(sections[3]);
if (sections.length > 4)
alias(sections[4]);
return this;
}
public VM build() {
return new VM(host, uuid, type, ram, state, alias);
}
public Builder fromVM(VM in) {
return host(in.getHost()).uuid(in.getUuid()).type(in.getType()).ram(in.getRam()).state(in.getState())
.alias(in.getAlias());
}
}
protected SmartOSHost host;
protected final UUID uuid;
protected String type;
protected String ram;
protected State state;
protected String alias;
public VM(SmartOSHost host, UUID uuid, String type, String ram, State state, String alias) {
this.host = host;
this.uuid = uuid;
this.type = type;
this.ram = ram;
this.state = state;
this.alias = alias;
}
public State getState() {
return state;
}
public void destroy() {
host.destroyHost(uuid);
}
public void reboot() {
host.rebootHost(uuid);
}
public void stop() {
host.stopHost(uuid);
}
public void start() {
host.startHost(uuid);
}
public Optional<String> getPublicAddress() throws InterruptedException {
Map<String, String> ipAddresses;
for (int i = 0; i < 30; i++) {
ipAddresses = host.getVMIpAddresses(uuid);
if (!ipAddresses.isEmpty()) {
// Got some
String ip = ipAddresses.get("net0");
if (ip != null && !ip.equals("0.0.0.0"))
return Optional.of(ip);
}
Thread.sleep(1000);
}
return Optional.absent();
}
public SmartOSHost getHost() {
return host;
}
public UUID getUuid() {
return uuid;
}
public String getType() {
return type;
}
public String getRam() {
return ram;
}
public String getAlias() {
return alias;
}
/**
* {@inheritDoc}
*/
@Override
public int hashCode() {
// UUID is primary key
return uuid.hashCode();
}
/**
* {@inheritDoc}
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
return uuid.equals(((DataSet) obj).getUuid());
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return Objects.toStringHelper(this).omitNullValues().add("uuid", uuid).add("type", type).add("ram", ram)
.add("alias", alias).toString();
}
}