Updated Branches: refs/heads/javelin 992fa473b -> a4f4c9867
OrchestrationService: some changes for DeployVM Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/a4f4c986 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/a4f4c986 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/a4f4c986 Branch: refs/heads/javelin Commit: a4f4c9867063cb25e32935376cb0fa3ae3343aa0 Parents: 992fa47 Author: Prachi Damle <[email protected]> Authored: Tue Jan 8 11:53:41 2013 -0800 Committer: Prachi Damle <[email protected]> Committed: Tue Jan 8 11:53:54 2013 -0800 ---------------------------------------------------------------------- api/src/com/cloud/vm/VirtualMachine.java | 2 + core/src/com/cloud/vm/VMInstanceVO.java | 6 + .../cloud/entity/api/VirtualMachineEntity.java | 2 +- .../engine/service/api/OrchestrationService.java | 16 +- engine/orchestration/pom.xml | 5 + .../engine/cloud/entity/api/VMEntityManager.java | 10 + .../cloud/entity/api/VirtualMachineEntityImpl.java | 223 + .../engine/cloud/entity/api/db/VMEntityVO.java | 560 + .../platform/orchestration/CloudOrchestrator.java | 132 +- server/pom.xml | 5 + server/src/com/cloud/vm/UserVmManagerImpl.java | 8017 ++++++++------- server/src/com/cloud/vm/dao/VMInstanceDao.java | 2 + server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 6 + setup/db/4.1-new-db-schema.sql | 22 + 14 files changed, 5413 insertions(+), 3595 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/api/src/com/cloud/vm/VirtualMachine.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java index b3c40a3..82ff937 100755 --- a/api/src/com/cloud/vm/VirtualMachine.java +++ b/api/src/com/cloud/vm/VirtualMachine.java @@ -286,6 +286,8 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, S public Date getCreated(); public long getServiceOfferingId(); + + public long getDiskOfferingId(); Type getType(); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/core/src/com/cloud/vm/VMInstanceVO.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/vm/VMInstanceVO.java b/core/src/com/cloud/vm/VMInstanceVO.java index 986c421..4f9717e 100644 --- a/core/src/com/cloud/vm/VMInstanceVO.java +++ b/core/src/com/cloud/vm/VMInstanceVO.java @@ -475,4 +475,10 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi this.serviceOfferingId = serviceOfferingId; } + @Override + public long getDiskOfferingId() { + // TODO Auto-generated method stub + return 0; + } + } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java index 8fb3896..964bcaa 100755 --- a/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java +++ b/engine/api/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntity.java @@ -40,7 +40,7 @@ import com.cloud.vm.VirtualMachine; @Path("vm/{id}") @Produces({"application/json", "application/xml"}) @XmlRootElement(name="vm") -public interface VirtualMachineEntity extends VirtualMachine, CloudStackEntity { +public interface VirtualMachineEntity extends CloudStackEntity { /** * @return List of uuids for volumes attached to this virtual machine. http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/engine/api/src/org/apache/cloudstack/engine/service/api/OrchestrationService.java ---------------------------------------------------------------------- diff --git a/engine/api/src/org/apache/cloudstack/engine/service/api/OrchestrationService.java b/engine/api/src/org/apache/cloudstack/engine/service/api/OrchestrationService.java index 4231914..1daf53a 100755 --- a/engine/api/src/org/apache/cloudstack/engine/service/api/OrchestrationService.java +++ b/engine/api/src/org/apache/cloudstack/engine/service/api/OrchestrationService.java @@ -32,6 +32,8 @@ import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity; import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.exception.InsufficientCapacityException; import com.cloud.hypervisor.Hypervisor; @Path("orchestration") @@ -61,13 +63,16 @@ public interface OrchestrationService { @QueryParam("template-id") String templateId, @QueryParam("host-name") String hostName, @QueryParam("display-name") String displayName, + @QueryParam("hypervisor") String hypervisor, @QueryParam("cpu") int cpu, @QueryParam("speed") int speed, - @QueryParam("ram") long memory, + @QueryParam("ram") long memory, + @QueryParam("disk-size") Long diskSize, @QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags, - @QueryParam("networks") List<String> networks - ); + @QueryParam("networks") List<String> networks, + @QueryParam("deploymentplan") DeploymentPlan plan + ) throws InsufficientCapacityException; @POST VirtualMachineEntity createVirtualMachineFromScratch( @@ -81,9 +86,12 @@ public interface OrchestrationService { @QueryParam("cpu") int cpu, @QueryParam("speed") int speed, @QueryParam("ram") long memory, + @QueryParam("disk-size") Long diskSize, @QueryParam("compute-tags") List<String> computeTags, @QueryParam("root-disk-tags") List<String> rootDiskTags, - @QueryParam("networks") List<String> networks); + @QueryParam("networks") List<String> networks, + @QueryParam("deploymentplan") DeploymentPlan plan + ) throws InsufficientCapacityException; @POST NetworkEntity createNetwork(String id, String name, String domainName, String cidr, String gateway); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/engine/orchestration/pom.xml ---------------------------------------------------------------------- diff --git a/engine/orchestration/pom.xml b/engine/orchestration/pom.xml index 8b9210c..5e2495e 100755 --- a/engine/orchestration/pom.xml +++ b/engine/orchestration/pom.xml @@ -49,6 +49,11 @@ <version>${project.version}</version> </dependency> <dependency> + <groupId>org.apache.cloudstack</groupId> + <artifactId>cloud-server</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java new file mode 100644 index 0000000..0649645 --- /dev/null +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java @@ -0,0 +1,10 @@ +package org.apache.cloudstack.engine.cloud.entity.api; + +import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO; + +public interface VMEntityManager { + + VMEntityVO loadVirtualMachine(String vmId); + + void saveVirtualMachine(VMEntityVO vmInstanceVO); +} http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java new file mode 100644 index 0000000..70530dc --- /dev/null +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java @@ -0,0 +1,223 @@ +package org.apache.cloudstack.engine.cloud.entity.api; + +import java.lang.reflect.Method; +import java.util.Date; +import java.util.List; +import java.util.Map; + + + +import org.apache.cloudstack.engine.cloud.entity.api.db.VMEntityVO; +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlanner.ExcludeList; + +public class VirtualMachineEntityImpl implements VirtualMachineEntity { + + private VMEntityManager manager; + + private VMEntityVO vmEntityVO; + + public VirtualMachineEntityImpl(String vmId, VMEntityManager manager) { + this.manager = manager; + this.vmEntityVO = this.manager.loadVirtualMachine(vmId); + } + + public VirtualMachineEntityImpl(String vmId, String owner, String hostName, String displayName, int cpu, int speed, long memory, List<String> computeTags, List<String> rootDiskTags, List<String> networks, VMEntityManager manager) { + this(vmId, manager); + this.vmEntityVO.setOwner(owner); + this.vmEntityVO.setHostname(hostName); + this.vmEntityVO.setDisplayname(displayName); + this.vmEntityVO.setSpeed(speed); + this.vmEntityVO.setComputeTags(computeTags); + this.vmEntityVO.setRootDiskTags(rootDiskTags); + this.vmEntityVO.setNetworkIds(networks); + + manager.saveVirtualMachine(vmEntityVO); + } + + @Override + public String getUuid() { + return vmEntityVO.getUuid(); + } + + @Override + public long getId() { + return vmEntityVO.getId(); + } + + @Override + public String getCurrentState() { + // TODO Auto-generated method stub + return null; + } + + @Override + public String getDesiredState() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Date getCreatedTime() { + return vmEntityVO.getCreated(); + } + + @Override + public Date getLastUpdatedTime() { + return vmEntityVO.getUpdateTime(); + } + + @Override + public String getOwner() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Map<String, String> getDetails() { + return vmEntityVO.getDetails(); + } + + @Override + public void addDetail(String name, String value) { + vmEntityVO.setDetail(name, value); + } + + @Override + public void delDetail(String name, String value) { + // TODO Auto-generated method stub + } + + @Override + public void updateDetail(String name, String value) { + // TODO Auto-generated method stub + } + + @Override + public List<Method> getApplicableActions() { + // TODO Auto-generated method stub + return null; + } + + @Override + public List<String> listVolumeIds() { + // TODO Auto-generated method stub + return null; + } + + @Override + public List<VolumeEntity> listVolumes() { + // TODO Auto-generated method stub + return null; + } + + @Override + public List<String> listNicUuids() { + // TODO Auto-generated method stub + return null; + } + + @Override + public List<NicEntity> listNics() { + // TODO Auto-generated method stub + return null; + } + + @Override + public TemplateEntity getTemplate() { + // TODO Auto-generated method stub + return null; + } + + @Override + public List<String> listTags() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void addTag() { + // TODO Auto-generated method stub + + } + + @Override + public void delTag() { + // TODO Auto-generated method stub + + } + + @Override + public String reserve(String plannerToUse, DeployDestination dest, + ExcludeList exclude) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void migrateTo(String reservationId) { + // TODO Auto-generated method stub + + } + + @Override + public void deploy(String reservationId) { + // TODO Auto-generated method stub + + } + + @Override + public void stop() { + // TODO Auto-generated method stub + + } + + @Override + public void cleanup() { + // TODO Auto-generated method stub + + } + + @Override + public void destroy() { + // TODO Auto-generated method stub + + } + + @Override + public VirtualMachineEntity duplicate(String externalId) { + // TODO Auto-generated method stub + return null; + } + + @Override + public SnapshotEntity takeSnapshotOf() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void attach(VolumeEntity volume, short deviceId) { + // TODO Auto-generated method stub + + } + + @Override + public void detach(VolumeEntity volume) { + // TODO Auto-generated method stub + + } + + @Override + public void connectTo(NetworkEntity network, short nicId) { + // TODO Auto-generated method stub + + } + + @Override + public void disconnectFrom(NetworkEntity netowrk, short nicId) { + // TODO Auto-generated method stub + + } + +} http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java new file mode 100644 index 0000000..cebca33 --- /dev/null +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java @@ -0,0 +1,560 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.engine.cloud.entity.api.db; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.UUID; + +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 javax.persistence.Transient; + +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.utils.db.Encrypt; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.StateMachine; +import com.cloud.utils.fsm.FiniteStateObject; +import com.cloud.vm.VirtualMachine; +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 VMEntityVO implements VirtualMachine, FiniteStateObject<State, VirtualMachine.Event> { + @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 hostName = null; + + @Encrypt + @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=true, 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 podIdToDeployIn; + + @Column(name="private_mac_address", updatable=true, nullable=true) + protected String privateMacAddress; + + @Column(name="data_center_id", updatable=true, nullable=false) + protected long dataCenterIdToDeployIn; + + @Column(name="vm_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="limit_cpu_use", updatable=true, nullable=true) + private boolean limitCpuUse; + + @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; + + @Column(name="ram") + protected long ram; + + @Column(name="cpu") + protected int cpu; + + @Column(name="tags") + protected String tags; + + @Transient + Map<String, String> details; + + @Column(name="uuid") + protected String uuid = UUID.randomUUID().toString(); + + //orchestration columns + @Column(name="owner") + private String owner = null; + + @Column(name="speed") + private int speed; + + @Transient + List<String> computeTags; + + @Transient + List<String> rootDiskTags; + + @Column(name="hostname") + private String hostname = null; + + @Column(name="displayname") + private String displayname = null; + + @Transient + List<String> networkIds; + + + public VMEntityVO(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.hostName = name != null ? name : this.uuid; + if (vmTemplateId != null) { + this.templateId = vmTemplateId; + } + this.instanceName = instanceName; + this.type = type; + this.guestOSId = guestOSId; + this.haEnabled = haEnabled; + this.vncPassword = Long.toHexString(new Random().nextLong()); + this.state = State.Stopped; + this.accountId = accountId; + this.domainId = domainId; + this.serviceOfferingId = serviceOfferingId; + this.hypervisorType = hypervisorType; + this.limitCpuUse = false; + } + + public VMEntityVO(long id, + long serviceOfferingId, + String name, + String instanceName, + Type type, + Long vmTemplateId, + HypervisorType hypervisorType, + long guestOSId, + long domainId, + long accountId, + boolean haEnabled, + boolean limitResourceUse) { + this(id, serviceOfferingId, name, instanceName, type, vmTemplateId, hypervisorType, guestOSId, domainId, accountId, haEnabled); + this.limitCpuUse = limitResourceUse; + } + + + + protected VMEntityVO() { + } + + 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 String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public HypervisorType getHypervisorType() { + return hypervisorType; + } + + @Override + public Date getCreated() { + return created; + } + + public Date getUpdateTime() { + return updateTime; + } + + @Override + public long getDataCenterIdToDeployIn() { + return dataCenterIdToDeployIn; + } + + @Override + public String getHostName() { + return hostName; + } + + @Override + public String getInstanceName() { + return 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++; + } + + public void decrUpdated() { + 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 boolean limitCpuUse() { + return limitCpuUse; + } + + public void setLimitCpuUse(boolean value) { + limitCpuUse = value; + } + + @Override + public String getPrivateMacAddress() { + return privateMacAddress; + } + + @Override + public Long getPodIdToDeployIn() { + return podIdToDeployIn; + } + + public void setPodId(long podId) { + this.podIdToDeployIn = podId; + } + + public void setPrivateMacAddress(String privateMacAddress) { + this.privateMacAddress = privateMacAddress; + } + + public void setDataCenterId(long dataCenterId) { + this.dataCenterIdToDeployIn = dataCenterId; + } + + public boolean isRemoved() { + return removed != null; + } + + public void setHaEnabled(boolean value) { + haEnabled = value; + } + + public void setReservationId(String reservationId) { + this.reservationId = reservationId; + } + + public String getReservationId() { + return this.reservationId; + } + + @Override + public Map<String, String> getDetails() { + return details; + } + + public void setDetail(String name, String value) { + assert (details != null) : "Did you forget to load the details?"; + + details.put(name, value); + } + + public void setDetails(Map<String, String> details) { + this.details = details; + } + + transient String toString; + @Override + public String toString() { + if (toString == null) { + toString = new StringBuilder("VM[").append(type.toString()).append("|").append(hostName).append("]").toString(); + } + return toString; + } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (int) (id ^ (id >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + VMEntityVO other = (VMEntityVO) obj; + if (id != other.id) + return false; + return true; + } + + + public void setServiceOfferingId(long serviceOfferingId) { + this.serviceOfferingId = serviceOfferingId; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public int getSpeed() { + return speed; + } + + public void setSpeed(int speed) { + this.speed = speed; + } + + public List<String> getComputeTags() { + return computeTags; + } + + public void setComputeTags(List<String> computeTags) { + this.computeTags = computeTags; + } + + public List<String> getRootDiskTags() { + return rootDiskTags; + } + + public void setRootDiskTags(List<String> rootDiskTags) { + this.rootDiskTags = rootDiskTags; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public String getDisplayname() { + return displayname; + } + + public void setDisplayname(String displayname) { + this.displayname = displayname; + } + + public List<String> getNetworkIds() { + return networkIds; + } + + public void setNetworkIds(List<String> networkIds) { + this.networkIds = networkIds; + } + +} http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java index 36784c5..30595f0 100755 --- a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java @@ -19,23 +19,57 @@ package org.apache.cloudstack.platform.orchestration; import java.net.URL; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import javax.inject.Inject; + import org.apache.cloudstack.engine.cloud.entity.api.NetworkEntity; import org.apache.cloudstack.engine.cloud.entity.api.TemplateEntity; import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity; +import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl; +import org.apache.cloudstack.engine.cloud.entity.api.VMEntityManager; import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity; import org.apache.cloudstack.engine.service.api.OrchestrationService; +import com.cloud.deploy.DeploymentPlan; import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.hypervisor.Hypervisor; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.service.ServiceOfferingVO; +import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.dao.DiskOfferingDao; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.utils.Pair; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.dao.VMInstanceDao; -public class CloudOrchestrator implements OrchestrationService { - +public class CloudOrchestrator implements OrchestrationService { + @Inject + private VMEntityManager vmEntityManager; + + @Inject + private VirtualMachineManager _itMgr; + + @Inject + protected VMTemplateDao _templateDao = null; + + @Inject + protected VMInstanceDao _vmDao; + + @Inject + protected ServiceOfferingDao _serviceOfferingDao; + + @Inject + protected DiskOfferingDao _diskOfferingDao = null; + public VirtualMachineEntity createFromScratch(String uuid, String iso, String os, String hypervisor, String hostName, int cpu, int speed, long memory, List<String> networks, List<String> computeTags, Map<String, String> details, String owner) { // TODO Auto-generated method stub @@ -96,21 +130,99 @@ public class CloudOrchestrator implements OrchestrationService { String owner, String templateId, String hostName, - String displayName, + String displayName, + String hypervisor, int cpu, int speed, - long memory, + long memory, + Long diskSize, List<String> computeTags, List<String> rootDiskTags, - List<String> networks) { - return null; + List<String> networks, DeploymentPlan plan) throws InsufficientCapacityException { + + VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager); + + HypervisorType hypervisorType = HypervisorType.valueOf(hypervisor); + + //load vm instance and offerings and call virtualMachineManagerImpl + VMInstanceVO vm = _vmDao.findByUUID(id); + + // If the template represents an ISO, a disk offering must be passed in, + // and will be used to create the root disk + // Else, a disk offering is optional, and if present will be used to + // create the data disk + Pair<DiskOfferingVO, Long> rootDiskOffering = new Pair<DiskOfferingVO, Long>(null, null); + List<Pair<DiskOfferingVO, Long>> dataDiskOfferings = new ArrayList<Pair<DiskOfferingVO, Long>>(); + + ServiceOfferingVO offering = _serviceOfferingDao.findById(vm.getServiceOfferingId()); + rootDiskOffering.first(offering); + + DiskOfferingVO diskOffering = _diskOfferingDao.findById(vm.getDiskOfferingId()); + if (diskOffering == null) { + throw new InvalidParameterValueException( + "Unable to find disk offering " + vm.getDiskOfferingId()); + } + Long size = null; + if (diskOffering.getDiskSize() == 0) { + size = diskSize; + if (size == null) { + throw new InvalidParameterValueException( + "Disk offering " + diskOffering + + " requires size parameter."); + } + } + dataDiskOfferings.add(new Pair<DiskOfferingVO, Long>(diskOffering, size)); + + if (_itMgr.allocate(vm, _templateDao.findById(new Long(templateId)), offering, rootDiskOffering, dataDiskOfferings, null, null, plan, hypervisorType, null) == null) { + return null; + } + + return vmEntity; } @Override - public VirtualMachineEntity createVirtualMachineFromScratch(String id, String owner, String isoId, String hostName, String displayName, String hypervisor, String os, int cpu, int speed, long memory, - List<String> computeTags, List<String> rootDiskTags, List<String> networks) { - // TODO Auto-generated method stub - return null; + public VirtualMachineEntity createVirtualMachineFromScratch(String id, String owner, String isoId, String hostName, String displayName, String hypervisor, String os, int cpu, int speed, long memory,Long diskSize, + List<String> computeTags, List<String> rootDiskTags, List<String> networks, DeploymentPlan plan) throws InsufficientCapacityException { + + VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager); + + //load vm instance and offerings and call virtualMachineManagerImpl + VMInstanceVO vm = _vmDao.findByUUID(id); + + + Pair<DiskOfferingVO, Long> rootDiskOffering = new Pair<DiskOfferingVO, Long>(null, null); + ServiceOfferingVO offering = _serviceOfferingDao.findById(vm.getServiceOfferingId()); + rootDiskOffering.first(offering); + + List<Pair<DiskOfferingVO, Long>> dataDiskOfferings = new ArrayList<Pair<DiskOfferingVO, Long>>(); + Long diskOfferingId = vm.getDiskOfferingId(); + if (diskOfferingId == null) { + throw new InvalidParameterValueException( + "Installing from ISO requires a disk offering to be specified for the root disk."); + } + DiskOfferingVO diskOffering = _diskOfferingDao.findById(diskOfferingId); + if (diskOffering == null) { + throw new InvalidParameterValueException("Unable to find disk offering " + diskOfferingId); + } + Long size = null; + if (diskOffering.getDiskSize() == 0) { + size = diskSize; + if (size == null) { + throw new InvalidParameterValueException("Disk offering " + + diskOffering + " requires size parameter."); + } + } + rootDiskOffering.first(diskOffering); + rootDiskOffering.second(size); + + + HypervisorType hypervisorType = HypervisorType.valueOf(hypervisor); + + if (_itMgr.allocate(vm, _templateDao.findById(new Long(isoId)), offering, rootDiskOffering, dataDiskOfferings, null, null, plan, hypervisorType, null) == null) { + return null; + } + + return vmEntity; } @Override http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/a4f4c986/server/pom.xml ---------------------------------------------------------------------- diff --git a/server/pom.xml b/server/pom.xml index 29922b6..ed21c37 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -70,6 +70,11 @@ <classifier>tests</classifier> <scope>test</scope> </dependency> + <dependency> + <groupId>org.apache.cloudstack</groupId> + <artifactId>cloud-engine-api</artifactId> + <version>${project.version}</version> + </dependency> </dependencies> <build>
