/** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. * * This software is licensed under the GNU General Public License v3 or later. * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ package com.cloud.vm; import java.util.Date; import java.util.Random; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; import javax.persistence.TableGenerator; import javax.persistence.Temporal; import javax.persistence.TemporalType; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.utils.db.GenericDao; import com.cloud.utils.db.StateMachine; import com.cloud.utils.fsm.FiniteStateObject; import com.cloud.utils.fsm.StateObject; import com.cloud.vm.VirtualMachine.State; @Entity @Table(name="vm_instance") @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING, length=32) public class VMInstanceVO implements VirtualMachine, FiniteStateObject, StateObject { @Id @TableGenerator(name="vm_instance_sq", table="sequence", pkColumnName="name", valueColumnName="value", pkColumnValue="vm_instance_seq", allocationSize=1) @Column(name="id", updatable=false, nullable = false) protected long id; @Column(name="name", updatable=false, nullable=false, length=255) protected String name = null; @Column(name="vnc_password", updatable=true, nullable=false, length=255) protected String vncPassword; @Column(name="proxy_id", updatable=true, nullable=true) protected Long proxyId; @Temporal(TemporalType.TIMESTAMP) @Column(name="proxy_assign_time", updatable=true, nullable=true) protected Date proxyAssignTime; /** * Note that state is intentionally missing the setter. Any updates to * the state machine needs to go through the DAO object because someone * else could be updating it as well. */ @Enumerated(value=EnumType.STRING) @StateMachine(state=State.class, event=Event.class) @Column(name="state", updatable=true, nullable=false, length=32) protected State state = null; @Column(name="private_ip_address", updatable=true) protected String privateIpAddress; @Column(name="instance_name", updatable=true, nullable=false) protected String instanceName; @Column(name="vm_template_id", updatable=false, nullable=true, length=17) protected Long templateId = new Long(-1); @Column(name="guest_os_id", nullable=false, length=17) protected long guestOSId; @Column(name="host_id", updatable=true, nullable=true) protected Long hostId; @Column(name="last_host_id", updatable=true, nullable=true) protected Long lastHostId; @Column(name="pod_id", updatable=true, nullable=false) protected Long podId; @Column(name="private_mac_address", updatable=true, nullable=true) protected String privateMacAddress; @Column(name="private_netmask") protected String privateNetmask; @Column(name="data_center_id", updatable=true, nullable=false) protected long dataCenterId; @Column(name="type", updatable=false, nullable=false, length=32) @Enumerated(value=EnumType.STRING) protected Type type; @Column(name="ha_enabled", updatable=true, nullable=true) protected boolean haEnabled; @Column(name="mirrored_vols", updatable=true, nullable=true) protected boolean mirroredVols; @Column(name="update_count", updatable = true, nullable=false) protected long updated; // This field should be updated everytime the state is updated. There's no set method in the vo object because it is done with in the dao code. @Column(name=GenericDao.CREATED_COLUMN) protected Date created; @Column(name=GenericDao.REMOVED_COLUMN) protected Date removed; @Column(name="update_time", updatable=true) @Temporal(value=TemporalType.TIMESTAMP) protected Date updateTime; @Column(name="domain_id") protected long domainId; @Column(name="account_id") protected long accountId; @Column(name="service_offering_id") protected long serviceOfferingId; @Column(name="reservation_id") protected String reservationId; @Column(name="hypervisor_type") @Enumerated(value=EnumType.STRING) protected HypervisorType hypervisorType; public VMInstanceVO(long id, long serviceOfferingId, String name, String instanceName, Type type, Long vmTemplateId, HypervisorType hypervisorType, long guestOSId, long domainId, long accountId, boolean haEnabled) { this.id = id; this.name = name; if (vmTemplateId != null) { this.templateId = vmTemplateId; } this.instanceName = instanceName; this.type = type; this.guestOSId = guestOSId; this.haEnabled = haEnabled; this.mirroredVols = false; this.vncPassword = Long.toHexString(new Random().nextLong()); this.state = State.Creating; this.accountId = accountId; this.domainId = domainId; this.serviceOfferingId = serviceOfferingId; this.hypervisorType = hypervisorType; } protected VMInstanceVO() { } public Date getRemoved() { return removed; } @Override public long getDomainId() { return domainId; } @Override public long getAccountId() { return accountId; } @Override public Type getType() { return type; } public long getUpdated() { return updated; } @Override public long getId() { return id; } @Override public HypervisorType getHypervisorType() { return hypervisorType; } @Override public Date getCreated() { return created; } public Date getUpdateTime() { return updateTime; } @Override public long getDataCenterId() { return dataCenterId; } public void setPrivateNetmask(String privateNetmask) { this.privateNetmask = privateNetmask; } public String getPrivateNetmask() { return privateNetmask; } public void setId(long id) { this.id = id; } @Override public String getName() { return name; } @Override public String getInstanceName() { return instanceName; } public void setInstanceName(String instanceName) { this.instanceName = instanceName; } @Override public State getState() { return state; } // don't use this directly, use VM state machine instead, this method is added for migration tool only @Override public void setState(State state) { this.state = state; } @Override public String getPrivateIpAddress() { return privateIpAddress; } public void setPrivateIpAddress(String address) { privateIpAddress = address; } public void setVncPassword(String vncPassword) { this.vncPassword = vncPassword; } @Override public String getVncPassword() { return vncPassword; } @Override public long getServiceOfferingId() { return serviceOfferingId; } public Long getProxyId() { return proxyId; } public void setProxyId(Long proxyId) { this.proxyId = proxyId; } public Date getProxyAssignTime() { return this.proxyAssignTime; } public void setProxyAssignTime(Date time) { this.proxyAssignTime = time; } @Override public long getTemplateId() { if (templateId == null) { return -1; } else { return templateId; } } public void setTemplateId(Long templateId) { this.templateId = templateId; } @Override public long getGuestOSId() { return guestOSId; } public void setGuestOSId(long guestOSId) { this.guestOSId = guestOSId; } public void incrUpdated() { updated++; } @Override public Long getHostId() { return hostId; } @Override public Long getLastHostId() { return lastHostId; } public void setLastHostId(Long lastHostId) { this.lastHostId = lastHostId; } public void setHostId(Long hostId) { this.hostId = hostId; } @Override public boolean isHaEnabled() { return haEnabled; } @Override public String getPrivateMacAddress() { return privateMacAddress; } @Override public Long getPodId() { return podId; } public void setPodId(long podId) { this.podId = podId; } public void setPrivateMacAddress(String privateMacAddress) { this.privateMacAddress = privateMacAddress; } public void setDataCenterId(long dataCenterId) { this.dataCenterId = dataCenterId; } public boolean isRemoved() { return removed != null; } public boolean isMirroredVols() { return mirroredVols; } public void setHaEnabled(boolean value) { haEnabled = value; } public void setMirroredVols(boolean mirroredVols) { this.mirroredVols = mirroredVols; } public void setReservationId(String reservationId) { this.reservationId = reservationId; } public String getReservationId() { return this.reservationId; } transient String toString; @Override public String toString() { if (toString == null) { toString = new StringBuilder("VM[").append(type.toString()).append("|").append(instanceName).append("]").toString(); } return toString; } }