more changes for the rewrite.

This commit is contained in:
Alex Huang 2010-08-16 11:28:11 -07:00
parent c3c5f7fa7c
commit 867b43dcf9
41 changed files with 918 additions and 169 deletions

View File

@ -136,7 +136,6 @@ import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer;
import com.cloud.agent.api.storage.CreatePrivateTemplateCommand; import com.cloud.agent.api.storage.CreatePrivateTemplateCommand;
import com.cloud.agent.api.storage.DownloadAnswer; import com.cloud.agent.api.storage.DownloadAnswer;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.agent.api.to.StoragePoolTO; import com.cloud.agent.api.to.StoragePoolTO;
import com.cloud.agent.api.to.VolumeTO; import com.cloud.agent.api.to.VolumeTO;
import com.cloud.agent.resource.computing.LibvirtStoragePoolDef.poolType; import com.cloud.agent.resource.computing.LibvirtStoragePoolDef.poolType;
@ -160,13 +159,14 @@ import com.cloud.hypervisor.Hypervisor;
import com.cloud.network.NetworkEnums.RouterPrivateIpStrategy; import com.cloud.network.NetworkEnums.RouterPrivateIpStrategy;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.ServerResourceBase; import com.cloud.resource.ServerResourceBase;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.storage.StorageLayer; import com.cloud.storage.StorageLayer;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.Volume; import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO; import com.cloud.storage.VolumeVO;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.template.Processor; import com.cloud.storage.template.Processor;
import com.cloud.storage.template.QCOW2Processor; import com.cloud.storage.template.QCOW2Processor;
@ -182,6 +182,7 @@ import com.cloud.utils.net.NetUtils;
import com.cloud.utils.script.OutputInterpreter; import com.cloud.utils.script.OutputInterpreter;
import com.cloud.utils.script.Script; import com.cloud.utils.script.Script;
import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.DomainRouter; import com.cloud.vm.DomainRouter;
import com.cloud.vm.State; import com.cloud.vm.State;
import com.cloud.vm.VirtualMachineName; import com.cloud.vm.VirtualMachineName;
@ -1162,13 +1163,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
} }
} }
protected StorageResourceType getStorageResourceType() { protected Storage.StorageResourceType getStorageResourceType() {
return StorageResourceType.STORAGE_POOL; return Storage.StorageResourceType.STORAGE_POOL;
} }
protected Answer execute(CreateCommand cmd) { protected Answer execute(CreateCommand cmd) {
StoragePoolTO pool = cmd.getPool(); StoragePoolTO pool = cmd.getPool();
DiskCharacteristicsTO dskch = cmd.getDiskCharacteristics(); DiskCharacteristics dskch = cmd.getDiskCharacteristics();
StorageVol tmplVol = null; StorageVol tmplVol = null;
StoragePool primaryPool = null; StoragePool primaryPool = null;
StorageVol vol = null; StorageVol vol = null;

View File

@ -18,7 +18,7 @@
package com.cloud.storage; package com.cloud.storage;
public class Storage { public class Storage {
public enum ImageFormat { public static enum ImageFormat {
QCOW2(true, true, false), QCOW2(true, true, false),
RAW(false, false, false), RAW(false, false, false),
VHD(true, true, true), VHD(true, true, true),
@ -51,7 +51,7 @@ public class Storage {
} }
} }
public enum FileSystem { public static enum FileSystem {
Unknown, Unknown,
ext3, ext3,
ntfs, ntfs,
@ -66,7 +66,7 @@ public class Storage {
hfsp hfsp
} }
public enum StoragePoolType { public static enum StoragePoolType {
Filesystem(false), //local directory Filesystem(false), //local directory
NetworkFilesystem(true), //NFS or CIFS NetworkFilesystem(true), //NFS or CIFS
IscsiLUN(true), //shared LUN, with a clusterfs overlay IscsiLUN(true), //shared LUN, with a clusterfs overlay
@ -84,4 +84,6 @@ public class Storage {
return shared; return shared;
} }
} }
public static enum StorageResourceType {STORAGE_POOL, STORAGE_HOST, SECONDARY_STORAGE}
} }

View File

@ -17,14 +17,21 @@
*/ */
package com.cloud.storage; package com.cloud.storage;
import com.cloud.async.AsyncInstanceCreateStatus;
public interface Volume { public interface Volume {
enum VolumeType {UNKNOWN, ROOT, SWAP, DATADISK}; enum VolumeType {UNKNOWN, ROOT, SWAP, DATADISK};
enum MirrorState {NOT_MIRRORED, ACTIVE, DEFUNCT}; enum MirrorState {NOT_MIRRORED, ACTIVE, DEFUNCT};
enum StorageResourceType {STORAGE_POOL, STORAGE_HOST, SECONDARY_STORAGE}; enum State {
Allocated,
Creating,
Created,
Corrupted,
ToBeDestroyed,
Expunging,
Destroyed
}
/** /**
* @return the volume name * @return the volume name
@ -69,12 +76,9 @@ public interface Volume {
VolumeType getVolumeType(); VolumeType getVolumeType();
StorageResourceType getStorageResourceType(); Storage.StorageResourceType getStorageResourceType();
Long getPoolId(); Long getPoolId();
public AsyncInstanceCreateStatus getStatus(); State getState();
public void setStatus(AsyncInstanceCreateStatus status);
} }

View File

@ -15,63 +15,97 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
package com.cloud.agent.api.to; package com.cloud.vm;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.Volume; import com.cloud.storage.Volume;
public class DiskCharacteristicsTO { /**
* DiskCharacteristics describes a disk and what functionality is required from it.
* This object is generated by the management server and passed to the allocators
* and resources to allocate and create disks. There object is immutable once
* it has been created.
*/
public class DiskCharacteristics {
private long size; private long size;
private String[] tags; private String[] tags;
private Volume.VolumeType type; private Volume.VolumeType type;
private String name; private String name;
private boolean useLocalStorage; private boolean useLocalStorage;
private boolean recreatable; private boolean recreatable;
private long diskOfferingId;
private Long templateId;
protected DiskCharacteristicsTO() { protected DiskCharacteristics() {
} }
public DiskCharacteristicsTO(Volume.VolumeType type, String name, long size, String[] tags, boolean useLocalStorage, boolean recreatable) { public DiskCharacteristics(Volume.VolumeType type, String name, long diskOfferingId, long size, String[] tags, boolean useLocalStorage, boolean recreatable, Long templateId) {
this.type = type; this.type = type;
this.name = name; this.name = name;
this.size = size; this.size = size;
this.tags = tags; this.tags = tags;
this.useLocalStorage = useLocalStorage; this.useLocalStorage = useLocalStorage;
this.recreatable = recreatable; this.recreatable = recreatable;
this.diskOfferingId = diskOfferingId;
this.templateId = templateId;
} }
public DiskCharacteristicsTO(Volume.VolumeType type, String name, DiskOfferingVO offering, long size) { /**
this(type, name, size, offering.getTagsArray(), offering.getUseLocalStorage(), offering.isRecreatable()); * @return size of the disk requested in bytes.
} */
public DiskCharacteristicsTO(Volume.VolumeType type, String name, DiskOfferingVO offering) {
this(type, name, offering.getDiskSizeInBytes(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.isRecreatable());
}
public long getSize() { public long getSize() {
return size; return size;
} }
/**
* @return Unique name for the disk.
*/
public String getName() { public String getName() {
return name; return name;
} }
/**
* @return tags for the disk. This can be used to match it to different storage pools.
*/
public String[] getTags() { public String[] getTags() {
return tags; return tags;
} }
/**
* @return type of volume.
*/
public Volume.VolumeType getType() { public Volume.VolumeType getType() {
return type; return type;
} }
/**
* @return Does this volume require local storage?
*/
public boolean useLocalStorage() { public boolean useLocalStorage() {
return useLocalStorage; return useLocalStorage;
} }
/**
* @return Is this volume recreatable? A volume is recreatable if the disk's content can be
* reconstructed from the template.
*/
public boolean isRecreatable() { public boolean isRecreatable() {
return recreatable; return recreatable;
} }
/**
* @return template id the disk is based on. Can be null if it is not based on any templates.
*/
public Long getTemplateId() {
return templateId;
}
/**
* @return disk offering id that the disk is based on.
*/
public long getDiskOfferingId() {
return diskOfferingId;
}
@Override @Override
public String toString() { public String toString() {
return new StringBuilder("DskChr[").append(type).append("|").append(size).append("|").append("]").toString(); return new StringBuilder("DskChr[").append(type).append("|").append(size).append("|").append("]").toString();

View File

@ -0,0 +1,58 @@
/**
*
*/
package com.cloud.vm;
import com.cloud.network.Network.BroadcastDomainType;
import com.cloud.network.Network.Mode;
public class NetworkCharacteristics {
long id;
BroadcastDomainType type;
String ip4Address;
String netmask;
String gateway;
Mode mode;
String[] dns;
public BroadcastDomainType getType() {
return type;
}
public String[] getDns() {
return dns;
}
public String getIp4Address() {
return ip4Address;
}
public String getNetmask() {
return netmask;
}
public String getGateway() {
return gateway;
}
public Mode getMode() {
return mode;
}
public long getNetworkId() {
return id;
}
public NetworkCharacteristics() {
}
public NetworkCharacteristics(long id, BroadcastDomainType type, String ip4Address, String netmask, String gateway, Mode mode, String[] dns) {
this.id = id;
this.type = type;
this.ip4Address = ip4Address;
this.netmask = netmask;
this.gateway = gateway;
this.mode = mode;
this.dns = dns;
}
}

View File

@ -22,12 +22,12 @@ import java.util.Map;
import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor;
public class VmCharacteristics { public class VmCharacteristics {
long id;
int core; int core;
int speed; // in mhz int speed; // in mhz
long ram; // in bytes long ram; // in bytes
Hypervisor.Type hypervisorType; Hypervisor.Type hypervisorType;
VirtualMachine.Type type; VirtualMachine.Type type;
Map<String, String> params; Map<String, String> params;
public VmCharacteristics(VirtualMachine.Type type) { public VmCharacteristics(VirtualMachine.Type type) {
@ -39,9 +39,6 @@ public class VmCharacteristics {
} }
public VmCharacteristics() {
}
public int getCores() { public int getCores() {
return core; return core;
} }
@ -58,11 +55,15 @@ public class VmCharacteristics {
return hypervisorType; return hypervisorType;
} }
public VmCharacteristics(int core, int speed, long ram, Hypervisor.Type type, Map<String, String> params) { public VmCharacteristics(long id, int core, int speed, long ram, Hypervisor.Type type, Map<String, String> params) {
this.core = core; this.core = core;
this.speed = speed; this.speed = speed;
this.ram = ram; this.ram = ram;
this.hypervisorType = type; this.hypervisorType = type;
this.params = params; this.params = params;
this.id = id;
}
protected VmCharacteristics() {
} }
} }

1
build/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/override

3
build/build.number Normal file
View File

@ -0,0 +1,3 @@
#Build Number for ANT. Do not edit!
#Mon Aug 16 11:01:21 PDT 2010
build.number=31

26
build/developer.xml Executable file → Normal file
View File

@ -28,6 +28,18 @@
<target name="stop" depends="stop-tomcat"/> <target name="stop" depends="stop-tomcat"/>
<target name="debug" depends="debug-tomcat"/> <target name="debug" depends="debug-tomcat"/>
<target name="setup">
<mkdir dir="${build.dir}/override"/>
<copy todir="${build.dir}/override">
<fileset dir="${build.dir}">
<include name="build-cloud.properties"/>
<include name="replace.properties"/>
</fileset>
</copy>
<loadproperties srcfile="${build.dir}/override/replace.properties" resource="propertyresource"/>
<!-- propertyfile file="${build.dir}/override/replace.properties"/ -->
</target>
<target name="debug-suspend"> <target name="debug-suspend">
<java jar="${tomcat.home}/bin/bootstrap.jar" fork="true"> <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
<jvmarg value="-Dcatalina.home=${tomcat.home}"/> <jvmarg value="-Dcatalina.home=${tomcat.home}"/>
@ -86,23 +98,11 @@
<target name="unzip-usage" if="usagezip.uptodate"> <target name="unzip-usage" if="usagezip.uptodate">
<unzip src="${deploy.work.dir}/usage.zip" dest="${deploy.work.dir}/usage"/> <unzip src="${deploy.work.dir}/usage.zip" dest="${deploy.work.dir}/usage"/>
</target> </target>
<!--
<target name="deploy-db">
<property file="
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:database-url"
userid="cloud"
password="cloud"
src="data.sql"
/>
</target>
-->
<target name="deploy-server" depends="deploy-common" > <target name="deploy-server" depends="deploy-common" >
<copy todir="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/vms" file="${dist.dir}/systemvm.zip" /> <copy todir="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/vms" file="${dist.dir}/systemvm.zip" />
</target> </target>
<target name="deploy-common" > <target name="deploy-common" >
<condition property="zip.uptodate"> <condition property="zip.uptodate">
<available file="${deploy.work.dir}/client.zip" type="file"/> <available file="${deploy.work.dir}/client.zip" type="file"/>

View File

@ -0,0 +1,19 @@
# This is a template file for defining properties needed by build-vmops.xml.
# If you need to add properties to be used in build-vmops.xml, then you should
# add it in this file. If all you need is to change the default values,
# you should "cp build-vmops.properties.template build-vmops.properties"
# and modify the values within build-vmops.properties.
debug=true
debuglevel=vars,lines,source
tomcat.home=/home/tomcat/current
debug.jvmarg=-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n
deprecation=off
meld.home=/usr/bin
target.compat.version=1.6
source.compat.version=1.6
assertion=-ea
branding.name=default
build.type=developer
premium.name=premium
#manual.build.number=8

View File

@ -0,0 +1,7 @@
DBUSER=cloud
DBROOTPW=
DBPW=cloud
MSLOG=.\/dist\/vmops.log
APISERVERLOG=.\/dist\/api.log
DBHOST=localhost

View File

@ -20,7 +20,7 @@ package com.cloud.agent.api;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.cloud.storage.Volume; import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.template.TemplateInfo; import com.cloud.storage.template.TemplateInfo;
@ -31,7 +31,7 @@ public class StartupStorageCommand extends StartupCommand {
Map<String, TemplateInfo> templateInfo; Map<String, TemplateInfo> templateInfo;
long totalSize; long totalSize;
StoragePoolInfo poolInfo; StoragePoolInfo poolInfo;
Volume.StorageResourceType resourceType; Storage.StorageResourceType resourceType;
StoragePoolType fsType; StoragePoolType fsType;
Map<String, String> hostDetails = new HashMap<String, String>(); Map<String, String> hostDetails = new HashMap<String, String>();
String nfsShare; String nfsShare;
@ -91,11 +91,11 @@ public class StartupStorageCommand extends StartupCommand {
this.poolInfo = poolInfo; this.poolInfo = poolInfo;
} }
public Volume.StorageResourceType getResourceType() { public Storage.StorageResourceType getResourceType() {
return resourceType; return resourceType;
} }
public void setResourceType(Volume.StorageResourceType resourceType) { public void setResourceType(Storage.StorageResourceType resourceType) {
this.resourceType = resourceType; this.resourceType = resourceType;
} }

View File

@ -18,16 +18,16 @@
package com.cloud.agent.api.storage; package com.cloud.agent.api.storage;
import com.cloud.agent.api.Command; import com.cloud.agent.api.Command;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.agent.api.to.StoragePoolTO; import com.cloud.agent.api.to.StoragePoolTO;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VolumeVO; import com.cloud.storage.VolumeVO;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
public class CreateCommand extends Command { public class CreateCommand extends Command {
private long volId; private long volId;
private StoragePoolTO pool; private StoragePoolTO pool;
private DiskCharacteristicsTO diskCharacteristics; private DiskCharacteristics diskCharacteristics;
private String templateUrl; private String templateUrl;
private long size; private long size;
@ -44,7 +44,7 @@ public class CreateCommand extends Command {
* @param templateUrl * @param templateUrl
* @param pool * @param pool
*/ */
public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskCharacteristicsTO diskCharacteristics, String templateUrl, StoragePoolVO pool) { public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskCharacteristics diskCharacteristics, String templateUrl, StoragePoolVO pool) {
this(vol, vm, diskCharacteristics, pool, 0); this(vol, vm, diskCharacteristics, pool, 0);
this.templateUrl = templateUrl; this.templateUrl = templateUrl;
} }
@ -57,7 +57,7 @@ public class CreateCommand extends Command {
* @param diskCharacteristics * @param diskCharacteristics
* @param pool * @param pool
*/ */
public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskCharacteristicsTO diskCharacteristics, StoragePoolVO pool, long size) { public CreateCommand(VolumeVO vol, VMInstanceVO vm, DiskCharacteristics diskCharacteristics, StoragePoolVO pool, long size) {
this.volId = vol.getId(); this.volId = vol.getId();
this.diskCharacteristics = diskCharacteristics; this.diskCharacteristics = diskCharacteristics;
this.pool = new StoragePoolTO(pool); this.pool = new StoragePoolTO(pool);
@ -78,7 +78,7 @@ public class CreateCommand extends Command {
return pool; return pool;
} }
public DiskCharacteristicsTO getDiskCharacteristics() { public DiskCharacteristics getDiskCharacteristics() {
return diskCharacteristics; return diskCharacteristics;
} }

View File

@ -17,12 +17,13 @@
*/ */
package com.cloud.agent.api.to; package com.cloud.agent.api.to;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VMTemplateStoragePoolVO; import com.cloud.storage.VMTemplateStoragePoolVO;
import com.cloud.storage.Volume; import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO; import com.cloud.storage.VolumeVO;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Volume.StorageResourceType;
public class VolumeTO { public class VolumeTO {
@ -35,11 +36,11 @@ public class VolumeTO {
private String path; private String path;
private long size; private long size;
private Volume.VolumeType type; private Volume.VolumeType type;
private Volume.StorageResourceType resourceType; private Storage.StorageResourceType resourceType;
private StoragePoolType storagePoolType; private StoragePoolType storagePoolType;
private long poolId; private long poolId;
public VolumeTO(long id, Volume.VolumeType type, Volume.StorageResourceType resourceType, StoragePoolType poolType, String name, String mountPoint, String path, long size) { public VolumeTO(long id, Volume.VolumeType type, Storage.StorageResourceType resourceType, StoragePoolType poolType, String name, String mountPoint, String path, long size) {
this.id = id; this.id = id;
this.name= name; this.name= name;
this.path = path; this.path = path;
@ -65,12 +66,12 @@ public class VolumeTO {
this.id = templatePoolRef.getId(); this.id = templatePoolRef.getId();
this.path = templatePoolRef.getInstallPath(); this.path = templatePoolRef.getInstallPath();
this.size = templatePoolRef.getTemplateSize(); this.size = templatePoolRef.getTemplateSize();
this.resourceType = StorageResourceType.STORAGE_POOL; this.resourceType = Storage.StorageResourceType.STORAGE_POOL;
this.storagePoolType = pool.getPoolType(); this.storagePoolType = pool.getPoolType();
this.mountPoint = pool.getPath(); this.mountPoint = pool.getPath();
} }
public Volume.StorageResourceType getResourceType() { public Storage.StorageResourceType getResourceType() {
return resourceType; return resourceType;
} }

View File

@ -141,18 +141,18 @@ import com.cloud.agent.api.storage.DownloadAnswer;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand; import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.storage.ShareAnswer; import com.cloud.agent.api.storage.ShareAnswer;
import com.cloud.agent.api.storage.ShareCommand; import com.cloud.agent.api.storage.ShareCommand;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.agent.api.to.StoragePoolTO; import com.cloud.agent.api.to.StoragePoolTO;
import com.cloud.agent.api.to.VolumeTO; import com.cloud.agent.api.to.VolumeTO;
import com.cloud.exception.InternalErrorException; import com.cloud.exception.InternalErrorException;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.storage.StorageLayer; import com.cloud.storage.StorageLayer;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.VolumeVO; import com.cloud.storage.VolumeVO;
import com.cloud.storage.resource.StoragePoolResource; import com.cloud.storage.resource.StoragePoolResource;
@ -165,6 +165,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils; import com.cloud.utils.net.NetUtils;
import com.cloud.utils.script.Script; import com.cloud.utils.script.Script;
import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.DomainRouter; import com.cloud.vm.DomainRouter;
import com.cloud.vm.SecondaryStorageVmVO; import com.cloud.vm.SecondaryStorageVmVO;
import com.cloud.vm.State; import com.cloud.vm.State;
@ -1119,8 +1120,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
} }
} }
protected StorageResourceType getStorageResourceType() { protected Storage.StorageResourceType getStorageResourceType() {
return StorageResourceType.STORAGE_POOL; return Storage.StorageResourceType.STORAGE_POOL;
} }
protected CheckHealthAnswer execute(CheckHealthCommand cmd) { protected CheckHealthAnswer execute(CheckHealthCommand cmd) {
@ -3423,7 +3424,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
StartupStorageCommand cmd = new StartupStorageCommand(); StartupStorageCommand cmd = new StartupStorageCommand();
cmd.setPoolInfo(pInfo); cmd.setPoolInfo(pInfo);
cmd.setGuid(_host.uuid); cmd.setGuid(_host.uuid);
cmd.setResourceType(StorageResourceType.STORAGE_POOL); cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL);
return cmd; return cmd;
} catch (XenAPIException e) { } catch (XenAPIException e) {
String msg = "build startupstoragecommand err in host:" + _host.uuid + e.toString(); String msg = "build startupstoragecommand err in host:" + _host.uuid + e.toString();
@ -4263,7 +4264,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
public CreateAnswer execute(CreateCommand cmd) { public CreateAnswer execute(CreateCommand cmd) {
StoragePoolTO pool = cmd.getPool(); StoragePoolTO pool = cmd.getPool();
DiskCharacteristicsTO dskch = cmd.getDiskCharacteristics(); DiskCharacteristics dskch = cmd.getDiskCharacteristics();
VDI vdi = null; VDI vdi = null;
Connection conn = getConnection(); Connection conn = getConnection();
@ -4293,7 +4294,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
vdir = vdi.getRecord(conn); vdir = vdi.getRecord(conn);
s_logger.debug("Succesfully created VDI for " + cmd + ". Uuid = " + vdir.uuid); s_logger.debug("Succesfully created VDI for " + cmd + ". Uuid = " + vdir.uuid);
VolumeTO vol = new VolumeTO(cmd.getVolumeId(), dskch.getType(), StorageResourceType.STORAGE_POOL, pool.getType(), vdir.nameLabel, pool.getPath(), vdir.uuid, VolumeTO vol = new VolumeTO(cmd.getVolumeId(), dskch.getType(), Storage.StorageResourceType.STORAGE_POOL, pool.getType(), vdir.nameLabel, pool.getPath(), vdir.uuid,
vdir.virtualSize); vdir.virtualSize);
return new CreateAnswer(cmd, vol); return new CreateAnswer(cmd, vol);
} catch (Exception e) { } catch (Exception e) {

View File

@ -87,7 +87,6 @@ public class DiskOfferingVO implements DiskOffering {
@Column(name="use_local_storage") @Column(name="use_local_storage")
private boolean useLocalStorage; private boolean useLocalStorage;
public DiskOfferingVO() { public DiskOfferingVO() {
} }

View File

@ -41,7 +41,7 @@ import com.cloud.agent.api.storage.UpgradeDiskAnswer;
import com.cloud.agent.api.storage.UpgradeDiskCommand; import com.cloud.agent.api.storage.UpgradeDiskCommand;
import com.cloud.agent.api.to.VolumeTO; import com.cloud.agent.api.to.VolumeTO;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Volume.StorageResourceType; import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.storage.template.TemplateInfo; import com.cloud.storage.template.TemplateInfo;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NfsUtils; import com.cloud.utils.net.NfsUtils;
@ -329,8 +329,8 @@ public abstract class FileSystemStorageResource extends StorageResource {
} }
@Override @Override
protected StorageResourceType getStorageResourceType() { protected Storage.StorageResourceType getStorageResourceType() {
return StorageResourceType.STORAGE_POOL; return Storage.StorageResourceType.STORAGE_POOL;
} }
protected String mountNfs(String hostAddress, String hostPath, String localPath) { protected String mountNfs(String hostAddress, String hostPath, String localPath) {

View File

@ -34,7 +34,6 @@ import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
import com.cloud.utils.component.Manager; import com.cloud.utils.component.Manager;
import com.cloud.utils.exception.ExecutionException; import com.cloud.utils.exception.ExecutionException;

2
core/src/com/cloud/storage/StorageResource.java Executable file → Normal file
View File

@ -304,7 +304,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv
protected abstract Answer execute(DestroyCommand cmd) ; protected abstract Answer execute(DestroyCommand cmd) ;
protected abstract UpgradeDiskAnswer execute(final UpgradeDiskCommand cmd); protected abstract UpgradeDiskAnswer execute(final UpgradeDiskCommand cmd);
protected abstract String delete(String imagePath, String extra); protected abstract String delete(String imagePath, String extra);
protected abstract Volume.StorageResourceType getStorageResourceType(); protected abstract Storage.StorageResourceType getStorageResourceType();
protected abstract void configureFolders(String name, Map<String, Object> params) throws ConfigurationException ; protected abstract void configureFolders(String name, Map<String, Object> params) throws ConfigurationException ;

39
core/src/com/cloud/storage/VolumeVO.java Executable file → Normal file
View File

@ -96,7 +96,7 @@ public class VolumeVO implements Volume {
String hostip; String hostip;
@Column(name="disk_offering_id") @Column(name="disk_offering_id")
Long diskOfferingId; long diskOfferingId;
@Expose @Expose
@Column(name="mirror_vol") @Column(name="mirror_vol")
@ -129,7 +129,7 @@ public class VolumeVO implements Volume {
@Expose @Expose
@Column(name="resource_type") @Column(name="resource_type")
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
StorageResourceType storageResourceType; Storage.StorageResourceType storageResourceType;
@Expose @Expose
@Column(name="status", updatable = true, nullable=false) @Column(name="status", updatable = true, nullable=false)
@ -143,6 +143,10 @@ public class VolumeVO implements Volume {
@Column(name="recreatable") @Column(name="recreatable")
boolean recreatable; boolean recreatable;
@Column(name="state")
@Enumerated(value=EnumType.STRING)
private State state;
/** /**
* Constructor for data disk. * Constructor for data disk.
* @param type * @param type
@ -167,10 +171,25 @@ public class VolumeVO implements Volume {
this.templateId = null; this.templateId = null;
this.mirrorState = MirrorState.NOT_MIRRORED; this.mirrorState = MirrorState.NOT_MIRRORED;
this.mirrorVolume = null; this.mirrorVolume = null;
this.storageResourceType = StorageResourceType.STORAGE_POOL; this.storageResourceType = Storage.StorageResourceType.STORAGE_POOL;
this.poolType = null; this.poolType = null;
} }
// Real Constructor
public VolumeVO(VolumeType type, String name, long dcId, long domainId, long accountId, long diskOfferingId, long size) {
this.volumeType = type;
this.name = name;
this.dataCenterId = dcId;
this.accountId = accountId;
this.domainId = domainId;
this.size = size;
this.mirrorVolume = null;
this.mirrorState = MirrorState.NOT_MIRRORED;
this.diskOfferingId = diskOfferingId;
this.status = AsyncInstanceCreateStatus.Creating;
this.state = State.Allocated;
}
/** /**
* Constructor for volume based on a template. * Constructor for volume based on a template.
* *
@ -371,11 +390,11 @@ public class VolumeVO implements Volume {
this.mirrorState = mirrorState; this.mirrorState = mirrorState;
} }
public Long getDiskOfferingId() { public long getDiskOfferingId() {
return diskOfferingId; return diskOfferingId;
} }
public void setDiskOfferingId(Long diskOfferingId) { public void setDiskOfferingId(long diskOfferingId) {
this.diskOfferingId = diskOfferingId; this.diskOfferingId = diskOfferingId;
} }
@ -404,11 +423,11 @@ public class VolumeVO implements Volume {
} }
@Override @Override
public StorageResourceType getStorageResourceType() { public Storage.StorageResourceType getStorageResourceType() {
return storageResourceType; return storageResourceType;
} }
public void setStorageResourceType(StorageResourceType storageResourceType2) { public void setStorageResourceType(Storage.StorageResourceType storageResourceType2) {
this.storageResourceType = storageResourceType2; this.storageResourceType = storageResourceType2;
} }
@ -420,12 +439,10 @@ public class VolumeVO implements Volume {
this.poolId = poolId; this.poolId = poolId;
} }
@Override
public AsyncInstanceCreateStatus getStatus() { public AsyncInstanceCreateStatus getStatus() {
return status; return status;
} }
@Override
public void setStatus(AsyncInstanceCreateStatus status) { public void setStatus(AsyncInstanceCreateStatus status) {
this.status = status; this.status = status;
} }
@ -434,6 +451,10 @@ public class VolumeVO implements Volume {
return updated; return updated;
} }
public State getState() {
return state;
}
public void setUpdated(Date updated) { public void setUpdated(Date updated) {
this.updated = updated; this.updated = updated;
} }

View File

@ -42,7 +42,7 @@ import com.cloud.host.Host;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.ServerResourceBase; import com.cloud.resource.ServerResourceBase;
import com.cloud.storage.Volume; import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.template.TemplateInfo; import com.cloud.storage.template.TemplateInfo;
@ -102,7 +102,7 @@ public class DummySecondaryStorageResource extends ServerResourceBase implements
StoragePoolType.NetworkFilesystem, 1024*1024*1024*100L, StoragePoolType.NetworkFilesystem, 1024*1024*1024*100L,
new HashMap<String, TemplateInfo>()); new HashMap<String, TemplateInfo>());
cmd.setResourceType(Volume.StorageResourceType.SECONDARY_STORAGE); cmd.setResourceType(Storage.StorageResourceType.SECONDARY_STORAGE);
cmd.setIqn(null); cmd.setIqn(null);
cmd.setNfsShare(_guid); cmd.setNfsShare(_guid);

View File

@ -52,8 +52,8 @@ import com.cloud.host.Host;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.ServerResourceBase; import com.cloud.resource.ServerResourceBase;
import com.cloud.storage.Storage;
import com.cloud.storage.StorageLayer; import com.cloud.storage.StorageLayer;
import com.cloud.storage.Volume;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.template.DownloadManager; import com.cloud.storage.template.DownloadManager;
import com.cloud.storage.template.DownloadManagerImpl; import com.cloud.storage.template.DownloadManagerImpl;
@ -600,7 +600,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
final StartupStorageCommand cmd = new StartupStorageCommand(_parent, StoragePoolType.NetworkFilesystem, getTotalSize(), new HashMap<String, TemplateInfo>()); final StartupStorageCommand cmd = new StartupStorageCommand(_parent, StoragePoolType.NetworkFilesystem, getTotalSize(), new HashMap<String, TemplateInfo>());
cmd.setResourceType(Volume.StorageResourceType.SECONDARY_STORAGE); cmd.setResourceType(Storage.StorageResourceType.SECONDARY_STORAGE);
cmd.setIqn(null); cmd.setIqn(null);
fillNetworkInformation(cmd); fillNetworkInformation(cmd);

View File

@ -110,11 +110,12 @@ import com.cloud.resource.Discoverer;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.GuestOSCategoryVO;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VirtualMachineTemplate; import com.cloud.storage.VirtualMachineTemplate;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.dao.GuestOSCategoryDao; import com.cloud.storage.dao.GuestOSCategoryDao;
import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.StoragePoolDao;
import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.StoragePoolHostDao;
@ -1403,7 +1404,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory {
if (startup instanceof StartupStorageCommand) { if (startup instanceof StartupStorageCommand) {
StartupStorageCommand ssCmd = ((StartupStorageCommand) startup); StartupStorageCommand ssCmd = ((StartupStorageCommand) startup);
if (ssCmd.getResourceType() == StorageResourceType.SECONDARY_STORAGE) { if (ssCmd.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE) {
type = Host.Type.SecondaryStorage; type = Host.Type.SecondaryStorage;
if (resource != null && resource instanceof DummySecondaryStorageResource){ if (resource != null && resource instanceof DummySecondaryStorageResource){
resource = null; resource = null;
@ -1755,7 +1756,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory {
if (startup instanceof StartupStorageCommand) { if (startup instanceof StartupStorageCommand) {
StartupStorageCommand ssCmd = (StartupStorageCommand) startup; StartupStorageCommand ssCmd = (StartupStorageCommand) startup;
if (ssCmd.getResourceType() == StorageResourceType.STORAGE_HOST) { if (ssCmd.getResourceType() == Storage.StorageResourceType.STORAGE_HOST) {
CapacityVO capacity = new CapacityVO(server.getId(), server.getDataCenterId(), server.getPodId(), 0L, server.getTotalSize(), CapacityVO capacity = new CapacityVO(server.getId(), server.getDataCenterId(), server.getPodId(), 0L, server.getTotalSize(),
CapacityVO.CAPACITY_TYPE_STORAGE); CapacityVO.CAPACITY_TYPE_STORAGE);
_capacityDao.persist(capacity); _capacityDao.persist(capacity);

View File

@ -218,11 +218,8 @@ public class ListVolumesCmd extends BaseCmd{
volumeData.add(new Pair<String, Object>(BaseCmd.Properties.STORAGE_TYPE.getName(), storageType)); volumeData.add(new Pair<String, Object>(BaseCmd.Properties.STORAGE_TYPE.getName(), storageType));
volumeData.add(new Pair<String, Object>(BaseCmd.Properties.DISK_OFFERING_ID.getName(),volume.getDiskOfferingId())); volumeData.add(new Pair<String, Object>(BaseCmd.Properties.DISK_OFFERING_ID.getName(),volume.getDiskOfferingId()));
if(volume.getDiskOfferingId()!=null)
{
volumeData.add(new Pair<String, Object>(BaseCmd.Properties.DISK_OFFERING_NAME.getName(),getManagementServer().findDiskOfferingById(volume.getDiskOfferingId()).getName())); volumeData.add(new Pair<String, Object>(BaseCmd.Properties.DISK_OFFERING_NAME.getName(),getManagementServer().findDiskOfferingById(volume.getDiskOfferingId()).getName()));
volumeData.add(new Pair<String, Object>(BaseCmd.Properties.DISK_OFFERING_DISPLAY_TEXT.getName(),getManagementServer().findDiskOfferingById(volume.getDiskOfferingId()).getDisplayText())); volumeData.add(new Pair<String, Object>(BaseCmd.Properties.DISK_OFFERING_DISPLAY_TEXT.getName(),getManagementServer().findDiskOfferingById(volume.getDiskOfferingId()).getDisplayText()));
}
Long poolId = volume.getPoolId(); Long poolId = volume.getPoolId();
String poolName = (poolId == null) ? "none" : getManagementServer().findPoolById(poolId).getName(); String poolName = (poolId == null) ? "none" : getManagementServer().findPoolById(poolId).getName();
volumeData.add(new Pair<String, Object>(BaseCmd.Properties.STORAGE.getName(), poolName)); volumeData.add(new Pair<String, Object>(BaseCmd.Properties.STORAGE.getName(), poolName));

View File

@ -29,7 +29,7 @@ import com.cloud.agent.api.StartupStorageCommand;
import com.cloud.agent.api.StoragePoolInfo; import com.cloud.agent.api.StoragePoolInfo;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.storage.Volume.StorageResourceType; import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.storage.dao.StoragePoolDao; import com.cloud.storage.dao.StoragePoolDao;
import com.cloud.storage.dao.StoragePoolHostDao; import com.cloud.storage.dao.StoragePoolHostDao;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
@ -72,7 +72,7 @@ public class LocalStoragePoolListener implements Listener {
StartupStorageCommand ssCmd = (StartupStorageCommand)cmd; StartupStorageCommand ssCmd = (StartupStorageCommand)cmd;
if (ssCmd.getResourceType() != StorageResourceType.STORAGE_POOL) { if (ssCmd.getResourceType() != Storage.StorageResourceType.STORAGE_POOL) {
return true; return true;
} }

View File

@ -55,7 +55,6 @@ import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand; import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.DeleteTemplateCommand; import com.cloud.agent.api.storage.DeleteTemplateCommand;
import com.cloud.agent.api.storage.DestroyCommand; import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.agent.api.to.VolumeTO; import com.cloud.agent.api.to.VolumeTO;
import com.cloud.alert.AlertManager; import com.cloud.alert.AlertManager;
import com.cloud.api.BaseCmd; import com.cloud.api.BaseCmd;
@ -64,7 +63,6 @@ import com.cloud.async.AsyncJobExecutor;
import com.cloud.async.AsyncJobManager; import com.cloud.async.AsyncJobManager;
import com.cloud.async.AsyncJobVO; import com.cloud.async.AsyncJobVO;
import com.cloud.async.BaseAsyncJobExecutor; import com.cloud.async.BaseAsyncJobExecutor;
import com.cloud.async.executor.VMOperationParam;
import com.cloud.capacity.CapacityVO; import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao; import com.cloud.capacity.dao.CapacityDao;
import com.cloud.configuration.Config; import com.cloud.configuration.Config;
@ -91,9 +89,9 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceInUseException; import com.cloud.exception.ResourceInUseException;
import com.cloud.exception.StorageUnavailableException; import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.Host.Type;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.host.Host.Type;
import com.cloud.host.dao.DetailsDao; import com.cloud.host.dao.DetailsDao;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor;
@ -104,7 +102,6 @@ import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Volume.MirrorState; import com.cloud.storage.Volume.MirrorState;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.allocator.StoragePoolAllocator; import com.cloud.storage.allocator.StoragePoolAllocator;
import com.cloud.storage.dao.DiskOfferingDao; import com.cloud.storage.dao.DiskOfferingDao;
@ -122,6 +119,7 @@ import com.cloud.storage.snapshot.SnapshotScheduler;
import com.cloud.template.TemplateManager; import com.cloud.template.TemplateManager;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.AccountManager; import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO;
import com.cloud.user.User; import com.cloud.user.User;
import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.AccountDao;
import com.cloud.uservm.UserVm; import com.cloud.uservm.UserVm;
@ -138,7 +136,7 @@ import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction; import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.exception.ExecutionException; import com.cloud.utils.exception.ExecutionException;
import com.cloud.vm.ConsoleProxyVO; import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.State; import com.cloud.vm.State;
import com.cloud.vm.UserVmManager; import com.cloud.vm.UserVmManager;
import com.cloud.vm.UserVmVO; import com.cloud.vm.UserVmVO;
@ -227,6 +225,39 @@ public class StorageManagerImpl implements StorageManager {
return true; return true;
} }
protected void setDeviceId(VolumeVO vol) {
//TODO: Need to figure out what to do here.
vol.setDeviceId(1l);
}
@DB
public List<VolumeVO> allocate(DiskCharacteristics rootDisk, List<DiskCharacteristics> dataDisks, VMInstanceVO vm, DataCenterVO dc, AccountVO account) {
ArrayList<VolumeVO> vols = new ArrayList<VolumeVO>(dataDisks.size() + 1);
VolumeVO dataVol = null;
VolumeVO rootVol = null;
long deviceId = 0;
Transaction txn = Transaction.currentTxn();
txn.start();
rootVol = new VolumeVO(VolumeType.ROOT, rootDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), rootDisk.getDiskOfferingId(), rootDisk.getSize());
if (rootDisk.getTemplateId() != null) {
rootVol.setTemplateId(rootDisk.getTemplateId());
}
rootVol.setInstanceId(vm.getId());
rootVol.setDeviceId(deviceId++);
rootVol = _volsDao.persist(rootVol);
vols.add(rootVol);
for (DiskCharacteristics dataDisk : dataDisks) {
dataVol = new VolumeVO(VolumeType.DATADISK, dataDisk.getName(), dc.getId(), account.getDomainId(), account.getId(), dataDisk.getDiskOfferingId(), dataDisk.getSize());
dataVol.setDeviceId(deviceId++);
dataVol = _volsDao.persist(dataVol);
dataVol.setInstanceId(vm.getId());
vols.add(dataVol);
}
txn.commit();
return vols;
}
public List<VolumeVO> prepare(VMInstanceVO vm, HostVO host) { public List<VolumeVO> prepare(VMInstanceVO vm, HostVO host) {
List<VolumeVO> vols = _volsDao.findCreatedByInstance(vm.getId()); List<VolumeVO> vols = _volsDao.findCreatedByInstance(vm.getId());
List<VolumeVO> recreateVols = new ArrayList<VolumeVO>(vols.size()); List<VolumeVO> recreateVols = new ArrayList<VolumeVO>(vols.size());
@ -259,9 +290,7 @@ public class StorageManagerImpl implements StorageManager {
DataCenterVO dc = _dcDao.findById(create.getDataCenterId()); DataCenterVO dc = _dcDao.findById(create.getDataCenterId());
HostPodVO pod = _podDao.findById(host.getPodId()); HostPodVO pod = _podDao.findById(host.getPodId());
DiskOfferingVO diskOffering = null; DiskOfferingVO diskOffering = null;
if (vol.getDiskOfferingId() != null) {
diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId()); diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId());
}
ServiceOfferingVO offering; ServiceOfferingVO offering;
if (vm instanceof UserVmVO) { if (vm instanceof UserVmVO) {
offering = _offeringDao.findById(((UserVmVO)vm).getServiceOfferingId()); offering = _offeringDao.findById(((UserVmVO)vm).getServiceOfferingId());
@ -333,7 +362,7 @@ public class StorageManagerImpl implements StorageManager {
return unshare(vm, vols, host) ? vols : null; return unshare(vm, vols, host) ? vols : null;
} }
protected StoragePoolVO findStoragePool(DiskCharacteristicsTO dskCh, final DataCenterVO dc, HostPodVO pod, Long clusterId, final ServiceOffering offering, final VMInstanceVO vm, final VMTemplateVO template, final Set<StoragePool> avoid) { protected StoragePoolVO findStoragePool(DiskCharacteristics dskCh, final DataCenterVO dc, HostPodVO pod, Long clusterId, final ServiceOffering offering, final VMInstanceVO vm, final VMTemplateVO template, final Set<StoragePool> avoid) {
Enumeration<StoragePoolAllocator> en = _storagePoolAllocators.enumeration(); Enumeration<StoragePoolAllocator> en = _storagePoolAllocators.enumeration();
while (en.hasMoreElements()) { while (en.hasMoreElements()) {
final StoragePoolAllocator allocator = en.nextElement(); final StoragePoolAllocator allocator = en.nextElement();
@ -385,7 +414,7 @@ public class StorageManagerImpl implements StorageManager {
return answers[0]; return answers[0];
} }
protected DiskCharacteristicsTO createDiskCharacteristics(VolumeVO volume, VMTemplateVO template, DataCenterVO dc, DiskOfferingVO diskOffering) { protected DiskCharacteristics createDiskCharacteristics(VolumeVO volume, VMTemplateVO template, DataCenterVO dc, DiskOfferingVO diskOffering) {
if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) { if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) {
SearchCriteria<VMTemplateHostVO> sc = HostTemplateStatesSearch.create(); SearchCriteria<VMTemplateHostVO> sc = HostTemplateStatesSearch.create();
sc.setParameters("id", template.getId()); sc.setParameters("id", template.getId());
@ -398,9 +427,9 @@ public class StorageManagerImpl implements StorageManager {
} }
VMTemplateHostVO ss = sss.get(0); VMTemplateHostVO ss = sss.get(0);
return new DiskCharacteristicsTO(volume.getVolumeType(), volume.getName(), diskOffering, ss.getSize()); return new DiskCharacteristics(volume.getVolumeType(), volume.getName(), diskOffering.getId(), ss.getSize(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), Storage.ImageFormat.ISO != template.getFormat() ? template.getId() : null);
} else { } else {
return new DiskCharacteristicsTO(volume.getVolumeType(), volume.getName(), diskOffering); return new DiskCharacteristics(volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSizeInBytes(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null);
} }
} }
@ -436,7 +465,7 @@ public class StorageManagerImpl implements StorageManager {
volume.setDiskOfferingId(diskOffering.getId()); volume.setDiskOfferingId(diskOffering.getId());
} }
volume.setSize(originalVolumeSize); volume.setSize(originalVolumeSize);
volume.setStorageResourceType(StorageResourceType.STORAGE_POOL); volume.setStorageResourceType(Storage.StorageResourceType.STORAGE_POOL);
volume.setInstanceId(null); volume.setInstanceId(null);
volume.setUpdated(new Date()); volume.setUpdated(new Date());
volume.setStatus(AsyncInstanceCreateStatus.Creating); volume.setStatus(AsyncInstanceCreateStatus.Creating);
@ -462,7 +491,7 @@ public class StorageManagerImpl implements StorageManager {
String volumeUUID = null; String volumeUUID = null;
String details = null; String details = null;
DiskCharacteristicsTO dskCh = createDiskCharacteristics(volume, template, dc, diskOffering); DiskCharacteristics dskCh = createDiskCharacteristics(volume, template, dc, diskOffering);
// Determine what pod to store the volume in // Determine what pod to store the volume in
@ -617,9 +646,7 @@ public class StorageManagerImpl implements StorageManager {
if(originalVolume.getTemplateId() != null){ if(originalVolume.getTemplateId() != null){
templateId = originalVolume.getTemplateId(); templateId = originalVolume.getTemplateId();
} }
if(originalVolume.getDiskOfferingId() != null){
diskOfferingId = originalVolume.getDiskOfferingId(); diskOfferingId = originalVolume.getDiskOfferingId();
}
long sizeMB = createdVolume.getSize()/(1024*1024); long sizeMB = createdVolume.getSize()/(1024*1024);
String poolName = _storagePoolDao.findById(createdVolume.getPoolId()).getName(); String poolName = _storagePoolDao.findById(createdVolume.getPoolId()).getName();
@ -690,7 +717,7 @@ public class StorageManagerImpl implements StorageManager {
StoragePoolVO pool = null; StoragePoolVO pool = null;
final HashSet<StoragePool> avoidPools = new HashSet<StoragePool>(avoids); final HashSet<StoragePool> avoidPools = new HashSet<StoragePool>(avoids);
DiskCharacteristicsTO dskCh = null; DiskCharacteristics dskCh = null;
if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) { if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) {
dskCh = createDiskCharacteristics(volume, template, dc, offering); dskCh = createDiskCharacteristics(volume, template, dc, offering);
} else { } else {
@ -1439,7 +1466,7 @@ public class StorageManagerImpl implements StorageManager {
public VolumeVO moveVolume(VolumeVO volume, long destPoolDcId, Long destPoolPodId, Long destPoolClusterId) throws InternalErrorException { public VolumeVO moveVolume(VolumeVO volume, long destPoolDcId, Long destPoolPodId, Long destPoolClusterId) throws InternalErrorException {
// Find a destination storage pool with the specified criteria // Find a destination storage pool with the specified criteria
DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId()); DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
DiskCharacteristicsTO dskCh = new DiskCharacteristicsTO(volume.getVolumeType(), volume.getName(), diskOffering); DiskCharacteristics dskCh = new DiskCharacteristics(volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSizeInBytes(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null);
DataCenterVO destPoolDataCenter = _dcDao.findById(destPoolDcId); DataCenterVO destPoolDataCenter = _dcDao.findById(destPoolDcId);
HostPodVO destPoolPod = _podDao.findById(destPoolPodId); HostPodVO destPoolPod = _podDao.findById(destPoolPodId);
StoragePoolVO destPool = findStoragePool(dskCh, destPoolDataCenter, destPoolPod, destPoolClusterId, null, null, null, new HashSet<StoragePool>()); StoragePoolVO destPool = findStoragePool(dskCh, destPoolDataCenter, destPoolPod, destPoolClusterId, null, null, null, new HashSet<StoragePool>());
@ -1523,7 +1550,7 @@ public class StorageManagerImpl implements StorageManager {
volume.setDomainId(account.getDomainId().longValue()); volume.setDomainId(account.getDomainId().longValue());
volume.setMirrorState(MirrorState.NOT_MIRRORED); volume.setMirrorState(MirrorState.NOT_MIRRORED);
volume.setDiskOfferingId(diskOffering.getId()); volume.setDiskOfferingId(diskOffering.getId());
volume.setStorageResourceType(StorageResourceType.STORAGE_POOL); volume.setStorageResourceType(Storage.StorageResourceType.STORAGE_POOL);
volume.setInstanceId(null); volume.setInstanceId(null);
volume.setUpdated(new Date()); volume.setUpdated(new Date());
volume.setStatus(AsyncInstanceCreateStatus.Creating); volume.setStatus(AsyncInstanceCreateStatus.Creating);

View File

@ -27,7 +27,6 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.host.Host; import com.cloud.host.Host;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
@ -56,6 +55,7 @@ import com.cloud.utils.Pair;
import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.utils.component.Inject; import com.cloud.utils.component.Inject;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
@ -100,7 +100,7 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement
return true; return true;
} }
abstract boolean allocatorIsCorrectType(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering); abstract boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering);
protected boolean templateAvailable(long templateId, long poolId) { protected boolean templateAvailable(long templateId, long poolId) {
VMTemplateStorageResourceAssoc thvo = _templatePoolDao.findByPoolTemplate(poolId, templateId); VMTemplateStorageResourceAssoc thvo = _templatePoolDao.findByPoolTemplate(poolId, templateId);
@ -114,7 +114,7 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement
} }
} }
protected boolean localStorageAllocationNeeded(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering) { protected boolean localStorageAllocationNeeded(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) {
if (vm == null) { if (vm == null) {
// We are finding a pool for a volume, so we need a shared storage allocator // We are finding a pool for a volume, so we need a shared storage allocator
return false; return false;
@ -128,12 +128,12 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement
} }
} }
protected boolean poolIsCorrectType(DiskCharacteristicsTO dskCh, StoragePool pool, VMInstanceVO vm, ServiceOffering offering) { protected boolean poolIsCorrectType(DiskCharacteristics dskCh, StoragePool pool, VMInstanceVO vm, ServiceOffering offering) {
boolean localStorageAllocationNeeded = localStorageAllocationNeeded(dskCh, vm, offering); boolean localStorageAllocationNeeded = localStorageAllocationNeeded(dskCh, vm, offering);
return ((!localStorageAllocationNeeded && pool.getPoolType().isShared()) || (localStorageAllocationNeeded && !pool.getPoolType().isShared())); return ((!localStorageAllocationNeeded && pool.getPoolType().isShared()) || (localStorageAllocationNeeded && !pool.getPoolType().isShared()));
} }
protected boolean checkPool(Set<? extends StoragePool> avoid, StoragePoolVO pool, DiskCharacteristicsTO dskCh, VMTemplateVO template, List<VMTemplateStoragePoolVO> templatesInPool, ServiceOffering offering, protected boolean checkPool(Set<? extends StoragePool> avoid, StoragePoolVO pool, DiskCharacteristics dskCh, VMTemplateVO template, List<VMTemplateStoragePoolVO> templatesInPool, ServiceOffering offering,
VMInstanceVO vm, StatsCollector sc) { VMInstanceVO vm, StatsCollector sc) {
if (avoid.contains(pool)) { if (avoid.contains(pool)) {
return false; return false;

View File

@ -25,7 +25,6 @@ import javax.ejb.Local;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
@ -33,6 +32,7 @@ import com.cloud.server.StatsCollector;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@Local(value=StoragePoolAllocator.class) @Local(value=StoragePoolAllocator.class)
@ -40,12 +40,12 @@ public class FirstFitStoragePoolAllocator extends AbstractStoragePoolAllocator {
private static final Logger s_logger = Logger.getLogger(FirstFitStoragePoolAllocator.class); private static final Logger s_logger = Logger.getLogger(FirstFitStoragePoolAllocator.class);
@Override @Override
public boolean allocatorIsCorrectType(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering) { public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) {
return !localStorageAllocationNeeded(dskCh, vm, offering); return !localStorageAllocationNeeded(dskCh, vm, offering);
} }
@Override @Override
public StoragePool allocateToPool(DiskCharacteristicsTO dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, public StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId,
VMInstanceVO vm, VMTemplateVO template, Set<? extends StoragePool> avoid) { VMInstanceVO vm, VMTemplateVO template, Set<? extends StoragePool> avoid) {
// Check that the allocator type is correct // Check that the allocator type is correct
if (!allocatorIsCorrectType(dskCh, vm, offering)) { if (!allocatorIsCorrectType(dskCh, vm, offering)) {

View File

@ -26,7 +26,6 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
@ -35,6 +34,7 @@ import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@Local(value=StoragePoolAllocator.class) @Local(value=StoragePoolAllocator.class)
@ -48,7 +48,7 @@ public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAl
boolean _storagePoolCleanupEnabled; boolean _storagePoolCleanupEnabled;
@Override @Override
public boolean allocatorIsCorrectType(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering) { public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) {
return true; return true;
} }
@ -61,7 +61,7 @@ public class GarbageCollectingStoragePoolAllocator extends AbstractStoragePoolAl
} }
@Override @Override
public StoragePool allocateToPool(DiskCharacteristicsTO dskCh, public StoragePool allocateToPool(DiskCharacteristics dskCh,
ServiceOffering offering, ServiceOffering offering,
DataCenterVO dc, DataCenterVO dc,
HostPodVO pod, HostPodVO pod,

View File

@ -27,7 +27,6 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.capacity.CapacityVO; import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao; import com.cloud.capacity.dao.CapacityDao;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
@ -49,6 +48,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.State; import com.cloud.vm.State;
import com.cloud.vm.UserVmVO; import com.cloud.vm.UserVmVO;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@ -83,12 +83,12 @@ public class LocalStoragePoolAllocator extends FirstFitStoragePoolAllocator {
@Override @Override
public boolean allocatorIsCorrectType(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering) { public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) {
return localStorageAllocationNeeded(dskCh, vm, offering); return localStorageAllocationNeeded(dskCh, vm, offering);
} }
@Override @Override
public StoragePool allocateToPool(DiskCharacteristicsTO dskCh, public StoragePool allocateToPool(DiskCharacteristics dskCh,
ServiceOffering offering, ServiceOffering offering,
DataCenterVO dc, DataCenterVO dc,
HostPodVO pod, HostPodVO pod,

View File

@ -25,7 +25,6 @@ import javax.ejb.Local;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.offering.ServiceOffering; import com.cloud.offering.ServiceOffering;
@ -33,6 +32,7 @@ import com.cloud.server.StatsCollector;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
@Local(value=StoragePoolAllocator.class) @Local(value=StoragePoolAllocator.class)
@ -40,12 +40,12 @@ public class RandomStoragePoolAllocator extends AbstractStoragePoolAllocator {
private static final Logger s_logger = Logger.getLogger(RandomStoragePoolAllocator.class); private static final Logger s_logger = Logger.getLogger(RandomStoragePoolAllocator.class);
@Override @Override
public boolean allocatorIsCorrectType(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering) { public boolean allocatorIsCorrectType(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) {
return true; return true;
} }
@Override @Override
public StoragePool allocateToPool(DiskCharacteristicsTO dskCh, ServiceOffering offering, public StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering,
DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm, DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm,
VMTemplateVO template, Set<? extends StoragePool> avoid) { VMTemplateVO template, Set<? extends StoragePool> avoid) {

View File

@ -19,7 +19,6 @@ package com.cloud.storage.allocator;
import java.util.Set; import java.util.Set;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.host.Host; import com.cloud.host.Host;
@ -27,6 +26,7 @@ import com.cloud.offering.ServiceOffering;
import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.utils.component.Adapter; import com.cloud.utils.component.Adapter;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
@ -36,7 +36,7 @@ import com.cloud.vm.VirtualMachine;
*/ */
public interface StoragePoolAllocator extends Adapter { public interface StoragePoolAllocator extends Adapter {
StoragePool allocateToPool(DiskCharacteristicsTO dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long cluster, VMInstanceVO vm, VMTemplateVO template, Set<? extends StoragePool> avoids); StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long cluster, VMInstanceVO vm, VMTemplateVO template, Set<? extends StoragePool> avoids);
String chooseStorageIp(VirtualMachine vm, Host host, Host storage); String chooseStorageIp(VirtualMachine vm, Host host, Host storage);
} }

View File

@ -23,7 +23,6 @@ import java.util.Set;
import javax.ejb.Local; import javax.ejb.Local;
import javax.naming.ConfigurationException; import javax.naming.ConfigurationException;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.configuration.Config; import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVO;
@ -34,6 +33,7 @@ import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume.VolumeType; import com.cloud.storage.Volume.VolumeType;
import com.cloud.utils.component.ComponentLocator; import com.cloud.utils.component.ComponentLocator;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine;
@ -42,7 +42,7 @@ public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implemen
boolean _useLocalStorage; boolean _useLocalStorage;
@Override @Override
public StoragePool allocateToPool(DiskCharacteristicsTO dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm, VMTemplateVO template, Set<? extends StoragePool> avoids) { public StoragePool allocateToPool(DiskCharacteristics dskCh, ServiceOffering offering, DataCenterVO dc, HostPodVO pod, Long clusterId, VMInstanceVO vm, VMTemplateVO template, Set<? extends StoragePool> avoids) {
if (!_useLocalStorage) { if (!_useLocalStorage) {
return null; return null;
} }
@ -69,7 +69,7 @@ public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implemen
} }
@Override @Override
protected boolean localStorageAllocationNeeded(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering) { protected boolean localStorageAllocationNeeded(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) {
if (dskCh.getType() == VolumeType.ROOT) { if (dskCh.getType() == VolumeType.ROOT) {
return true; return true;
} else if (dskCh.getType() == VolumeType.DATADISK) { } else if (dskCh.getType() == VolumeType.DATADISK) {

View File

@ -40,9 +40,9 @@ import com.cloud.agent.api.storage.DownloadProgressCommand.RequestType;
import com.cloud.event.EventTypes; import com.cloud.event.EventTypes;
import com.cloud.event.EventVO; import com.cloud.event.EventVO;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.storage.Storage;
import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VMTemplateHostDao;
import com.cloud.storage.download.DownloadState.DownloadEvent; import com.cloud.storage.download.DownloadState.DownloadEvent;
@ -286,8 +286,8 @@ public class DownloadListener implements Listener {
long agentId = agent.getId(); long agentId = agent.getId();
StartupStorageCommand storage = (StartupStorageCommand)cmd; StartupStorageCommand storage = (StartupStorageCommand)cmd;
if (storage.getResourceType() == Volume.StorageResourceType.STORAGE_HOST || if (storage.getResourceType() == Storage.StorageResourceType.STORAGE_HOST ||
storage.getResourceType() == Volume.StorageResourceType.SECONDARY_STORAGE ) storage.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE )
{ {
downloadMonitor.handleTemplateSync(agentId, storage.getTemplateInfo()); downloadMonitor.handleTemplateSync(agentId, storage.getTemplateInfo());
} else { } else {

View File

@ -40,8 +40,8 @@ import com.cloud.host.Host;
import com.cloud.host.Host.Type; import com.cloud.host.Host.Type;
import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResource;
import com.cloud.resource.ServerResourceBase; import com.cloud.resource.ServerResourceBase;
import com.cloud.storage.Storage;
import com.cloud.storage.StorageLayer; import com.cloud.storage.StorageLayer;
import com.cloud.storage.Volume;
import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.template.DownloadManager; import com.cloud.storage.template.DownloadManager;
import com.cloud.storage.template.DownloadManagerImpl; import com.cloud.storage.template.DownloadManagerImpl;
@ -160,7 +160,7 @@ public class LocalSecondaryStorageResource extends ServerResourceBase implements
public StartupCommand[] initialize() { public StartupCommand[] initialize() {
final StartupStorageCommand cmd = new StartupStorageCommand(_parent, StoragePoolType.Filesystem, 1024l*1024l*1024l*1024l, _dlMgr.gatherTemplateInfo()); final StartupStorageCommand cmd = new StartupStorageCommand(_parent, StoragePoolType.Filesystem, 1024l*1024l*1024l*1024l, _dlMgr.gatherTemplateInfo());
cmd.setResourceType(Volume.StorageResourceType.SECONDARY_STORAGE); cmd.setResourceType(Storage.StorageResourceType.SECONDARY_STORAGE);
cmd.setIqn(null); cmd.setIqn(null);
fillNetworkInformation(cmd); fillNetworkInformation(cmd);
cmd.setDataCenter(_dc); cmd.setDataCenter(_dc);

View File

@ -28,7 +28,8 @@ import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupStorageCommand; import com.cloud.agent.api.StartupStorageCommand;
import com.cloud.host.HostVO; import com.cloud.host.HostVO;
import com.cloud.host.Status; import com.cloud.host.Status;
import com.cloud.storage.Volume.StorageResourceType; import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StorageResourceType;
public class SecondaryStorageListener implements Listener { public class SecondaryStorageListener implements Listener {
private final static Logger s_logger = Logger.getLogger(SecondaryStorageListener.class); private final static Logger s_logger = Logger.getLogger(SecondaryStorageListener.class);
@ -82,7 +83,7 @@ public class SecondaryStorageListener implements Listener {
if (cmd instanceof StartupStorageCommand) { if (cmd instanceof StartupStorageCommand) {
StartupStorageCommand ss = (StartupStorageCommand)cmd; StartupStorageCommand ss = (StartupStorageCommand)cmd;
if (ss.getResourceType() == StorageResourceType.SECONDARY_STORAGE) { if (ss.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE) {
_ssVmMgr.onAgentConnect(agent.getDataCenterId(), cmd); _ssVmMgr.onAgentConnect(agent.getDataCenterId(), cmd);
_ssVmMgr.generateFirewallConfiguration(agent.getId()); _ssVmMgr.generateFirewallConfiguration(agent.getId());
_ssVmMgr.generateSetupCommand(agent.getDataCenterId()); _ssVmMgr.generateSetupCommand(agent.getDataCenterId());

View File

@ -17,6 +17,8 @@
*/ */
package com.cloud.vm; package com.cloud.vm;
import java.util.List;
import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO;
@ -27,41 +29,27 @@ public class MauriceMoss implements VmManager {
public VMInstanceVO allocate(VMInstanceVO vm, ServiceOfferingVO serviceOffering, NetworkOfferingVO[] networkOfferings, DiskOfferingVO[] diskOffering) { public VMInstanceVO allocate(VMInstanceVO vm, ServiceOfferingVO serviceOffering, NetworkOfferingVO[] networkOfferings, DiskOfferingVO[] diskOffering) {
return null; return null;
} }
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#create(com.cloud.vm.VMInstanceVO)
*/
@Override @Override
public void create(VMInstanceVO vm) { public void create(VmCharacteristics vm, List<DiskCharacteristics> disks, List<NetworkCharacteristics> networks) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#destroy()
*/
@Override @Override
public void destroy() { public void destroy() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#start()
*/
@Override @Override
public void start() { public void start() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#stop()
*/
@Override @Override
public void stop() { public void stop() {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
} }

2
server/src/com/cloud/vm/UserVmManagerImpl.java Executable file → Normal file
View File

@ -1767,9 +1767,7 @@ public class UserVmManagerImpl implements UserVmManager {
if(volume.getTemplateId() !=null){ if(volume.getTemplateId() !=null){
templateId = volume.getTemplateId(); templateId = volume.getTemplateId();
} }
if(volume.getDiskOfferingId() !=null){
diskOfferingId = volume.getDiskOfferingId(); diskOfferingId = volume.getDiskOfferingId();
}
long sizeMB = volume.getSize()/(1024*1024); long sizeMB = volume.getSize()/(1024*1024);
String eventParams = "id=" + volume.getId() +"\ndoId="+diskOfferingId+"\ntId="+templateId+"\ndcId="+volume.getDataCenterId()+"\nsize="+sizeMB; String eventParams = "id=" + volume.getId() +"\ndoId="+diskOfferingId+"\ntId="+templateId+"\ndcId="+volume.getDataCenterId()+"\nsize="+sizeMB;
EventVO volEvent = new EventVO(); EventVO volEvent = new EventVO();

View File

@ -17,6 +17,8 @@
*/ */
package com.cloud.vm; package com.cloud.vm;
import java.util.List;
import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.service.ServiceOfferingVO; import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.DiskOfferingVO;
@ -31,7 +33,7 @@ public interface VmManager {
NetworkOfferingVO[] networkOfferings, NetworkOfferingVO[] networkOfferings,
DiskOfferingVO[] diskOffering); DiskOfferingVO[] diskOffering);
void create(VMInstanceVO vm); void create(VmCharacteristics vm, List<DiskCharacteristics> disks, List<NetworkCharacteristics> networks);
void start(); void start();

View File

@ -222,7 +222,7 @@ CREATE TABLE `cloud`.`volumes` (
`data_center_id` bigint unsigned NOT NULL COMMENT 'data center this volume belongs to', `data_center_id` bigint unsigned NOT NULL COMMENT 'data center this volume belongs to',
`iscsi_name` varchar(255) COMMENT 'iscsi target name', `iscsi_name` varchar(255) COMMENT 'iscsi target name',
`host_ip` varchar(15) COMMENT 'host ip address for convenience', `host_ip` varchar(15) COMMENT 'host ip address for convenience',
`volume_type` varchar(64) COMMENT 'root, swap or data', `volume_type` varchar(64) NOT NULL COMMENT 'root, swap or data',
`resource_type` varchar(64) COMMENT 'pool-based or host-based', `resource_type` varchar(64) COMMENT 'pool-based or host-based',
`pool_type` varchar(64) COMMENT 'type of the pool', `pool_type` varchar(64) COMMENT 'type of the pool',
`mirror_state` varchar(64) COMMENT 'not_mirrored, active or defunct', `mirror_state` varchar(64) COMMENT 'not_mirrored, active or defunct',
@ -236,6 +236,7 @@ CREATE TABLE `cloud`.`volumes` (
`updated` datetime COMMENT 'Date updated for attach/detach', `updated` datetime COMMENT 'Date updated for attach/detach',
`removed` datetime COMMENT 'Date removed. not null if removed', `removed` datetime COMMENT 'Date removed. not null if removed',
`status` varchar(32) COMMENT 'Async API volume creation status', `status` varchar(32) COMMENT 'Async API volume creation status',
`state` varchar(32) COMMENT 'State machine',
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -0,0 +1,583 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
<version>2.0</version>
<zones>
<zone>
<id>1</id>
<name>AH</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>100-199</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>2</id>
<name>KM</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>200-299</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>3</id>
<name>KY</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>300-399</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>4</id>
<name>WC</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>400-499</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>5</id>
<name>CV</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>500-599</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>6</id>
<name>KS</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>600-699</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>7</id>
<name>ES</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>700-799</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>8</id>
<name>RC</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>800-899</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>9</id>
<name>AX</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>900-999</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>10</id>
<name>JW</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>900-999</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
<zone>
<id>11</id>
<name>AJ</name>
<dns1>72.52.126.11</dns1>
<dns2>72.52.126.12</dns2>
<internalDns1>192.168.10.253</internalDns1>
<internalDns2>192.168.10.254</internalDns2>
<vnet>1000-1099</vnet>
<guestNetworkCidr>10.1.1.0/24</guestNetworkCidr>
</zone>
</zones>
<!--
<storagePools>
<storagePool>
<zoneId>5</zoneId>
<name>sol10-2</name>
<hostAddress>sol10-2</hostAddress>
<hostPath>/tank/vmops-nfs/</hostPath>
</storagePool>
</storagePools>
-->
<vlans>
<vlan>
<zoneId>1</zoneId>
<vlanId>31</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.31.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.31.150-192.168.31.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>2</zoneId>
<vlanId>32</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.32.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.32.150-192.168.32.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>3</zoneId>
<vlanId>33</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.33.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.33.150-192.168.33.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>4</zoneId>
<vlanId>34</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.34.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.34.150-192.168.34.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>5</zoneId>
<vlanId>35</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.35.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.35.150-192.168.35.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>6</zoneId>
<vlanId>36</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.36.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.36.150-192.168.36.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>7</zoneId>
<vlanId>37</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.37.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.37.150-192.168.37.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>8</zoneId>
<vlanId>38</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.38.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.38.150-192.168.38.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>9</zoneId>
<vlanId>39</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.39.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.39.150-192.168.39.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>10</zoneId>
<vlanId>40</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.40.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.40.150-192.168.40.159</ipAddressRange>
</vlan>
<vlan>
<zoneId>11</zoneId>
<vlanId>41</vlanId>
<vlanType>VirtualNetwork</vlanType>
<gateway>192.168.41.1</gateway>
<netmask>255.255.255.0</netmask>
<ipAddressRange>192.168.41.150-192.168.41.159</ipAddressRange>
</vlan>
</vlans>
<pods>
<pod>
<id>1</id>
<name>AH</name>
<zoneId>1</zoneId>
<ipAddressRange>192.168.140.20-192.168.140.24</ipAddressRange>
<cidr>192.168.140.0/24</cidr>
<gateway>192.168.140.1</gateway>
</pod>
<pod>
<id>2</id>
<name>KM</name>
<zoneId>2</zoneId>
<ipAddressRange>192.168.10.25-192.168.10.29</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>3</id>
<name>KY</name>
<zoneId>3</zoneId>
<ipAddressRange>192.168.10.30-192.168.10.34</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>4</id>
<name>WC</name>
<zoneId>4</zoneId>
<ipAddressRange>192.168.10.35-192.168.10.39</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>5</id>
<name>CV</name>
<zoneId>5</zoneId>
<ipAddressRange>192.168.10.40-192.168.10.44</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>6</id>
<name>KS</name>
<zoneId>6</zoneId>
<ipAddressRange>192.168.10.45-192.168.10.49</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>7</id>
<name>ES</name>
<zoneId>7</zoneId>
<ipAddressRange>192.168.10.50-192.168.10.54</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>8</id>
<name>RC</name>
<zoneId>8</zoneId>
<ipAddressRange>192.168.10.55-192.168.10.59</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>9</id>
<name>AX</name>
<zoneId>9</zoneId>
<ipAddressRange>192.168.10.62-192.168.10.64</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>10</id>
<name>JW</name>
<zoneId>10</zoneId>
<ipAddressRange>192.168.10.65-192.168.10.69</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
<pod>
<id>11</id>
<name>AJ</name>
<zoneId>11</zoneId>
<ipAddressRange>192.168.10.70-192.168.10.74</ipAddressRange>
<cidr>192.168.10.0/24</cidr>
<gateway>192.168.10.1</gateway>
</pod>
</pods>
<!--
* cpu is the number of CPUs for the offering
* ramSize is total memory in MB
* speed is the CPU speed for each core in MHZ
* diskSpace is the storage space in MB
* price is the price of the offering per hour
-->
<serviceOfferings>
<serviceOffering>
<id>1</id>
<name>Small Instance</name>
<displayText>Small Instance [500MHZ CPU, 512MB MEM, 16GB Disk] - $0.10 per hour</displayText>
<cpu>1</cpu>
<ramSize>512</ramSize>
<speed>500</speed>
<mirrored>false</mirrored>
</serviceOffering>
<serviceOffering>
<id>2</id>
<name>Medium Instance</name>
<displayText>Medium Instance [500MHZ CPU, 1GB MEM, 32GB Disk] - $0.20 per hour</displayText>
<cpu>1</cpu>
<ramSize>1024</ramSize>
<speed>512</speed>
</serviceOffering>
<serviceOffering>
<id>3</id>
<name>Large Instance</name>
<displayText>Large Instance [2GHZ CPU, 4GB MEM, 64GB Disk] - $0.30 per hour</displayText>
<cpu>2</cpu>
<ramSize>4096</ramSize>
<speed>2000</speed>
</serviceOffering>
</serviceOfferings>
<diskOfferings>
<diskOffering>
<id>1</id>
<domainId>1</domainId>
<name>Small Disk</name>
<displayText>Small Disk [16GB Disk]</displayText>
<diskSpace>16000</diskSpace>
</diskOffering>
<diskOffering>
<id>2</id>
<domainId>1</domainId>
<name>Medium Disk</name>
<displayText>Medium Disk [32GB Disk]</displayText>
<diskSpace>32000</diskSpace>
<tags>mid_disk,mid_performance</tags>
</diskOffering>
<diskOffering>
<id>3</id>
<domainId>1</domainId>
<name>Large Disk</name>
<displayText>Large Disk [64GB Disk]</displayText>
<diskSpace>64000</diskSpace>
<tags>high_performance</tags>
</diskOffering>
</diskOfferings>
<!--
* firstname/lastname are optional parameters
* id, username, password are required parameters
-->
<users>
<user>
<id>2</id>
<username>admin</username>
<password>password</password>
<firstname>Admin</firstname>
<lastname>User</lastname>
<email>admin@mailprovider.com</email>
</user>
</users>
<configurationEntries>
<configuration>
<name>ssh.privatekey</name>
<value>-----BEGIN RSA PRIVATE KEY-----\nMIIEoQIBAAKCAQEAnNUMVgQS87EzAQN9ufGgH3T1kOpqcvTmUrp8RVZyeA5qwptS\nrZxONRbhLK709pZFBJLmeFqiqciWoA/srVIFk+rPmBlVsMw8BK53hTGoax7iSe8s\nLFCAATm6vp0HnZzYqNfrzR2by36ET5aQD/VAyA55u+uUgAlxQuhKff2xjyahEHs+\nUiRlReiAgItygm9g3co3+8fJDOuRse+s0TOip1D0jPdo2AJFscyxrG9hWqQH86R/\nZlLJ7DqsiaAcUmn52u6Nsmd3BkRmGVx/D35Mq6upJqrk/QDfug9LF66yiIP/BEIn\n08N/wQ6m/O37WUtqqyl3rRKqs5TJ9ZnhsqeO9QIBIwKCAQA6QIDsv69EkkYk8qsK\njPJU06uq2rnS7T+bEhDmjdK+4MiRbOQx2vh6HnDktgM3BJ1K13oss/NGYHJ190lH\nsMA+QUXKx5TbRItSMixkrAta/Ne1D7FSScklBtBVbYZ8XtQhdMVML5GjWuCv2NZs\nU8eaw4xNHPyklcr7mBurI7b6p13VK5BNUWR/VNuigT4U89YzRcoEZ/sTlR+4ACYr\nxbUJJGBA03+NhdSAe2vodlMh5lGflD0JmHMFqqg9BcAtVb73JsOsxFQArbXwRd/q\nNckdoAvgJfhTOvXF5GMPLI0lGb6skJkS229F4GaBB2Iz4A9O0aHZob8I8zsWUbiu\npvBrAoGBAMjUDfF2x13NjH1cFHietO5O1oM0nZaAxKodxoAUvHVMUd5DIY50tqYw\n7ecKi2Cw43ONpdj0nP9Nc2NV3NDRqLopwkKUsTtq9AKQ2cIuw3+uS5vm0VZBzmTP\nuF04Qo4bXh/jFRA62u9bXsmIFtaehKxE1Gp6zi393GcbWP4HX/3dAoGBAMfq0KD3\ngeU1PHi9uI3Ss89nXzJsiGcwC5Iunu1aTzJCYhMlJkfmRcXYMAqSfg0nGWnfvlDh\nuOO26CHKjG182mTwYXdgQzIPpBc8suvgUWDBTrIzJI+zuyBLtPbd9DJEVrZkRVQX\nXrOV3Y5oOWsba4F+b20jaaHFAiY7s6OtrX/5AoGBAMMXI3zZyPwJgSlSIoPNX03m\nL3gke9QID4CvNduB26UlkVuRq5GzNRZ4rJdMEl3tqcC1fImdKswfWiX7o06ChqY3\nMb0FePfkPX7V2tnkSOJuzRsavLoxTCdqsxi6T0g318c0XZq81K4A/P5Jr8ksRl40\nPA+qfyVdAf3Cy3ptkHLzAoGASkFGLSi7N+CSzcLPhSJgCzUGGgsOF7LCeB/x4yGL\nIUvbSPCKj7vuB6gR2AqGlyvHnFprQpz7h8eYDI0PlmGS8kqn2+HtEpgYYGcAoMEI\nSIJQbhL+84vmaxTOL87IanEnhZL1LdzLZ0ZK+mE55fQ936P9gE77WVfNmSweJtob\n3xMCgYAl0aLeGf4oUZbI56eEaCbu8U7dEe6MF54VbozyiXqbp455QnUpuBrRn5uf\nc079dNcqTNDuk1+hYX9qNn1aXsvWeuofBXqWoFXu/c4yoWxJAPhEVhzZ9xrXI76I\nBKiPCyKrOa7bSLvs6SQPpuf5AQ8+NJrOxkEB9hbMuaAr2N5rCw==\n-----END RSA PRIVATE KEY-----
</value>
<category>Hidden</category>
</configuration>
<configuration>
<name>ssh.publickey</name>
<value>ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnNUMVgQS87EzAQN9ufGgH3T1kOpqcvTmUrp8RVZyeA5qwptSrZxONRbhLK709pZFBJLmeFqiqciWoA/srVIFk+rPmBlVsMw8BK53hTGoax7iSe8sLFCAATm6vp0HnZzYqNfrzR2by36ET5aQD/VAyA55u+uUgAlxQuhKff2xjyahEHs+UiRlReiAgItygm9g3co3+8fJDOuRse+s0TOip1D0jPdo2AJFscyxrG9hWqQH86R/ZlLJ7DqsiaAcUmn52u6Nsmd3BkRmGVx/D35Mq6upJqrk/QDfug9LF66yiIP/BEIn08N/wQ6m/O37WUtqqyl3rRKqs5TJ9ZnhsqeO9Q== root@test2.lab.vmops.com
</value>
<category>Hidden</category>
</configuration>
<configuration>
<name>default.zone</name>
<value>AH</value>
</configuration>
<configuration>
<name>domain.suffix</name>
<value>vmops-test.vmops.com</value>
</configuration>
<configuration>
<name>instance.name</name>
<value>AH</value>
</configuration>
<configuration>
<name>consoleproxy.ram.size</name>
<value>256</value>
</configuration>
<configuration>
<name>host.stats.interval</name>
<value>3600000</value>
</configuration>
<configuration>
<name>storage.stats.interval</name>
<value>120000</value>
</configuration>
<configuration>
<name>volume.stats.interval</name>
<value>-1</value>
</configuration>
<configuration>
<name>ping.interval</name>
<value>60</value>
</configuration>
<configuration>
<name>alert.wait</name>
<value>1800</value>
</configuration>
<configuration>
<name>expunge.interval</name>
<value>86400</value>
</configuration>
<configuration>
<name>usage.aggregation.timezone</name>
<value>GMT</value>
</configuration>
<configuration>
<name>init</name>
<value>true</value>
</configuration>
<configuration>
<name>use.local.storage</name>
<value>true</value>
</configuration>
<configuration>
<name>system.vm.use.local.storage</name>
<value>true</value>
</configuration>
<configuration>
<name>secondary.storage.vm</name>
<value>false</value>
</configuration>
<!-- the following are for configuring alerts and need to be changed to proper configuration values -->
<!--
<configuration>
<name>alert.smtp.host</name>
<value>smtp.host.com</value>
</configuration>
<configuration>
<name>alert.smtp.port</name>
<value>25</value>
</configuration>
<configuration>
<name>alert.smtp.useAuth</name>
<value>false</value>
</configuration>
<configuration>
<name>alert.smtp.username</name>
<value>some.user@example.com</value>
</configuration>
<configuration>
<name>alert.smtp.password</name>
<value>password</value>
</configuration>
<configuration>
<name>alert.email.sender</name>
<value>some.user@example.com</value>
</configuration>
<configuration>
<name>alert.email.addresses</name>
<value>some.admin@example.com</value>
</configuration>
<configuration>
<name>alert.smtp.debug</name>
<value>false</value>
</configuration>
-->
<configuration>
<name>memory.capacity.threshold</name>
<value>0.85</value>
</configuration>
<configuration>
<name>cpu.capacity.threshold</name>
<value>0.85</value>
</configuration>
<configuration>
<name>storage.capacity.threshold</name>
<value>0.85</value>
</configuration>
<configuration>
<name>storage.allocated.capacity.threshold</name>
<value>0.85</value>
</configuration>
<configuration>
<name>capacity.check.period</name>
<value>3600000</value>
</configuration>
<configuration>
<name>wait</name>
<value>240</value>
</configuration>
<configuration>
<name>network.throttling.rate</name>
<value>200</value>
</configuration>
<configuration>
<name>multicast.throttling.rate</name>
<value>10</value>
</configuration>
<configuration>
<name>management.network.cidr</name>
<value>192.168.1.0/24</value>
</configuration>
<configuration>
<name>usage.aggregation.timezone</name>
<value>GMT</value>
</configuration>
<configuration>
<name>usage.stats.job.exec.time</name>
<value>00:15</value>
</configuration>
<configuration>
<name>system.vm.local.storage.required</name>
<value>false</value>
</configuration>
<configuration>
<name>hypervisor.type</name>
<value>xenserver</value>
</configuration>
<configuration>
<name>secondary.storage.vm</name>
<value>false</value>
</configuration>
</configurationEntries>
<!--
It is possible to specify a single IP address. For example, to add 192.168.1.1
as the only address, specify as follows.
<publicIpAddresses>
<zoneId>1</zoneId>
<ipAddressRange>192.168.1.1</ipAddressRange>
</publicIpAddresses>
For each ip address range, create a new object. For example, to add the range 192.168.2.1 to 192.168.2.255
copy the following object tag into the privateIpRange
<privateIpAddresses>
<zoneId>1</zoneId>
<podId>1</podId>
<ipAddressRange>192.168.2.1-192.168.2.255</ipAddressRange>
</privateIpAddresses>
-->
<!--
It is possible to specify a single IP address. For example, to add 65.37.141.29
as the only address, specify as follows.
<publicIpAddresses>
<zoneId>1</zoneId>
<ipAddressRange>65.37.141.29</ipAddressRange>
</publicIpAddresses>
For each ip address range, create a new object. For example, to add the range 65.37.141.29 to 65.37.141.39
copy the following object tag into the publicIpRange
<publicIpAddresses>
<zoneId>1</zoneId>
<ipAddressRange>65.37.141.29-65.37.141.39</ipAddressRange>
</publicIpAddresses>
-->
</data>