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.DownloadAnswer;
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.VolumeTO;
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.resource.ServerResource;
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.StoragePoolVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.template.Processor;
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.Script;
import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.DomainRouter;
import com.cloud.vm.State;
import com.cloud.vm.VirtualMachineName;
@ -1162,13 +1163,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
}
protected StorageResourceType getStorageResourceType() {
return StorageResourceType.STORAGE_POOL;
protected Storage.StorageResourceType getStorageResourceType() {
return Storage.StorageResourceType.STORAGE_POOL;
}
protected Answer execute(CreateCommand cmd) {
StoragePoolTO pool = cmd.getPool();
DiskCharacteristicsTO dskch = cmd.getDiskCharacteristics();
DiskCharacteristics dskch = cmd.getDiskCharacteristics();
StorageVol tmplVol = null;
StoragePool primaryPool = null;
StorageVol vol = null;

View File

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

View File

@ -17,16 +17,23 @@
*/
package com.cloud.storage;
import com.cloud.async.AsyncInstanceCreateStatus;
public interface Volume {
enum VolumeType {UNKNOWN, ROOT, SWAP, DATADISK};
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
*/
String getName();
@ -69,12 +76,9 @@ public interface Volume {
VolumeType getVolumeType();
StorageResourceType getStorageResourceType();
Storage.StorageResourceType getStorageResourceType();
Long getPoolId();
public AsyncInstanceCreateStatus getStatus();
public void setStatus(AsyncInstanceCreateStatus status);
State getState();
}

View File

@ -15,63 +15,97 @@
* 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;
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 String[] tags;
private Volume.VolumeType type;
private String name;
private boolean useLocalStorage;
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.name = name;
this.size = size;
this.tags = tags;
this.useLocalStorage = useLocalStorage;
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());
}
public DiskCharacteristicsTO(Volume.VolumeType type, String name, DiskOfferingVO offering) {
this(type, name, offering.getDiskSizeInBytes(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.isRecreatable());
}
/**
* @return size of the disk requested in bytes.
*/
public long getSize() {
return size;
}
/**
* @return Unique name for the disk.
*/
public String getName() {
return name;
}
/**
* @return tags for the disk. This can be used to match it to different storage pools.
*/
public String[] getTags() {
return tags;
}
/**
* @return type of volume.
*/
public Volume.VolumeType getType() {
return type;
}
/**
* @return Does this volume require local storage?
*/
public boolean 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() {
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
public String 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;
public class VmCharacteristics {
long id;
int core;
int speed; // in mhz
long ram; // in bytes
Hypervisor.Type hypervisorType;
VirtualMachine.Type type;
Map<String, String> params;
public VmCharacteristics(VirtualMachine.Type type) {
@ -39,9 +39,6 @@ public class VmCharacteristics {
}
public VmCharacteristics() {
}
public int getCores() {
return core;
}
@ -58,11 +55,15 @@ public class VmCharacteristics {
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.speed = speed;
this.ram = ram;
this.hypervisorType = type;
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

@ -27,6 +27,18 @@
<target name="run" depends="start-tomcat"/>
<target name="stop" depends="stop-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">
<java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
@ -86,23 +98,11 @@
<target name="unzip-usage" if="usagezip.uptodate">
<unzip src="${deploy.work.dir}/usage.zip" dest="${deploy.work.dir}/usage"/>
</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" >
<copy todir="${server.deploy.to.dir}/webapps/client/WEB-INF/lib/vms" file="${dist.dir}/systemvm.zip" />
</target>
<target name="deploy-common" >
<condition property="zip.uptodate">
<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.Map;
import com.cloud.storage.Volume;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.template.TemplateInfo;
@ -31,7 +31,7 @@ public class StartupStorageCommand extends StartupCommand {
Map<String, TemplateInfo> templateInfo;
long totalSize;
StoragePoolInfo poolInfo;
Volume.StorageResourceType resourceType;
Storage.StorageResourceType resourceType;
StoragePoolType fsType;
Map<String, String> hostDetails = new HashMap<String, String>();
String nfsShare;
@ -91,11 +91,11 @@ public class StartupStorageCommand extends StartupCommand {
this.poolInfo = poolInfo;
}
public Volume.StorageResourceType getResourceType() {
public Storage.StorageResourceType getResourceType() {
return resourceType;
}
public void setResourceType(Volume.StorageResourceType resourceType) {
public void setResourceType(Storage.StorageResourceType resourceType) {
this.resourceType = resourceType;
}

View File

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

View File

@ -17,12 +17,13 @@
*/
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.VMTemplateStoragePoolVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Volume.StorageResourceType;
public class VolumeTO {
@ -35,11 +36,11 @@ public class VolumeTO {
private String path;
private long size;
private Volume.VolumeType type;
private Volume.StorageResourceType resourceType;
private Storage.StorageResourceType resourceType;
private StoragePoolType storagePoolType;
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.name= name;
this.path = path;
@ -65,12 +66,12 @@ public class VolumeTO {
this.id = templatePoolRef.getId();
this.path = templatePoolRef.getInstallPath();
this.size = templatePoolRef.getTemplateSize();
this.resourceType = StorageResourceType.STORAGE_POOL;
this.resourceType = Storage.StorageResourceType.STORAGE_POOL;
this.storagePoolType = pool.getPoolType();
this.mountPoint = pool.getPath();
}
public Volume.StorageResourceType getResourceType() {
public Storage.StorageResourceType getResourceType() {
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.ShareAnswer;
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.VolumeTO;
import com.cloud.exception.InternalErrorException;
import com.cloud.host.Host.Type;
import com.cloud.hypervisor.Hypervisor;
import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Storage.StorageResourceType;
import com.cloud.storage.StorageLayer;
import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.VolumeVO;
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.script.Script;
import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.DomainRouter;
import com.cloud.vm.SecondaryStorageVmVO;
import com.cloud.vm.State;
@ -1119,8 +1120,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
}
}
protected StorageResourceType getStorageResourceType() {
return StorageResourceType.STORAGE_POOL;
protected Storage.StorageResourceType getStorageResourceType() {
return Storage.StorageResourceType.STORAGE_POOL;
}
protected CheckHealthAnswer execute(CheckHealthCommand cmd) {
@ -3423,7 +3424,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
StartupStorageCommand cmd = new StartupStorageCommand();
cmd.setPoolInfo(pInfo);
cmd.setGuid(_host.uuid);
cmd.setResourceType(StorageResourceType.STORAGE_POOL);
cmd.setResourceType(Storage.StorageResourceType.STORAGE_POOL);
return cmd;
} catch (XenAPIException e) {
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) {
StoragePoolTO pool = cmd.getPool();
DiskCharacteristicsTO dskch = cmd.getDiskCharacteristics();
DiskCharacteristics dskch = cmd.getDiskCharacteristics();
VDI vdi = null;
Connection conn = getConnection();
@ -4293,7 +4294,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
vdir = vdi.getRecord(conn);
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);
return new CreateAnswer(cmd, vol);
} catch (Exception e) {

View File

@ -86,8 +86,7 @@ public class DiskOfferingVO implements DiskOffering {
@Column(name="use_local_storage")
private boolean useLocalStorage;
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.to.VolumeTO;
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.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NfsUtils;
@ -329,8 +329,8 @@ public abstract class FileSystemStorageResource extends StorageResource {
}
@Override
protected StorageResourceType getStorageResourceType() {
return StorageResourceType.STORAGE_POOL;
protected Storage.StorageResourceType getStorageResourceType() {
return Storage.StorageResourceType.STORAGE_POOL;
}
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.service.ServiceOfferingVO;
import com.cloud.user.Account;
import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair;
import com.cloud.utils.component.Manager;
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 UpgradeDiskAnswer execute(final UpgradeDiskCommand cmd);
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 ;

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;
@Column(name="disk_offering_id")
Long diskOfferingId;
long diskOfferingId;
@Expose
@Column(name="mirror_vol")
@ -129,7 +129,7 @@ public class VolumeVO implements Volume {
@Expose
@Column(name="resource_type")
@Enumerated(EnumType.STRING)
StorageResourceType storageResourceType;
Storage.StorageResourceType storageResourceType;
@Expose
@Column(name="status", updatable = true, nullable=false)
@ -143,6 +143,10 @@ public class VolumeVO implements Volume {
@Column(name="recreatable")
boolean recreatable;
@Column(name="state")
@Enumerated(value=EnumType.STRING)
private State state;
/**
* Constructor for data disk.
* @param type
@ -167,9 +171,24 @@ public class VolumeVO implements Volume {
this.templateId = null;
this.mirrorState = MirrorState.NOT_MIRRORED;
this.mirrorVolume = null;
this.storageResourceType = StorageResourceType.STORAGE_POOL;
this.storageResourceType = Storage.StorageResourceType.STORAGE_POOL;
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.
@ -371,11 +390,11 @@ public class VolumeVO implements Volume {
this.mirrorState = mirrorState;
}
public Long getDiskOfferingId() {
public long getDiskOfferingId() {
return diskOfferingId;
}
public void setDiskOfferingId(Long diskOfferingId) {
public void setDiskOfferingId(long diskOfferingId) {
this.diskOfferingId = diskOfferingId;
}
@ -404,11 +423,11 @@ public class VolumeVO implements Volume {
}
@Override
public StorageResourceType getStorageResourceType() {
public Storage.StorageResourceType getStorageResourceType() {
return storageResourceType;
}
public void setStorageResourceType(StorageResourceType storageResourceType2) {
public void setStorageResourceType(Storage.StorageResourceType storageResourceType2) {
this.storageResourceType = storageResourceType2;
}
@ -420,12 +439,10 @@ public class VolumeVO implements Volume {
this.poolId = poolId;
}
@Override
public AsyncInstanceCreateStatus getStatus() {
return status;
}
@Override
public void setStatus(AsyncInstanceCreateStatus status) {
this.status = status;
}
@ -433,6 +450,10 @@ public class VolumeVO implements Volume {
public Date getUpdated() {
return updated;
}
public State getState() {
return state;
}
public void setUpdated(Date updated) {
this.updated = updated;

View File

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

View File

@ -52,8 +52,8 @@ import com.cloud.host.Host;
import com.cloud.host.Host.Type;
import com.cloud.resource.ServerResource;
import com.cloud.resource.ServerResourceBase;
import com.cloud.storage.Storage;
import com.cloud.storage.StorageLayer;
import com.cloud.storage.Volume;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.template.DownloadManager;
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>());
cmd.setResourceType(Volume.StorageResourceType.SECONDARY_STORAGE);
cmd.setResourceType(Storage.StorageResourceType.SECONDARY_STORAGE);
cmd.setIqn(null);
fillNetworkInformation(cmd);

View File

@ -110,11 +110,12 @@ import com.cloud.resource.Discoverer;
import com.cloud.resource.ServerResource;
import com.cloud.service.ServiceOfferingVO;
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.VMTemplateHostVO;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VirtualMachineTemplate;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.dao.GuestOSCategoryDao;
import com.cloud.storage.dao.StoragePoolDao;
import com.cloud.storage.dao.StoragePoolHostDao;
@ -1403,7 +1404,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory {
if (startup instanceof StartupStorageCommand) {
StartupStorageCommand ssCmd = ((StartupStorageCommand) startup);
if (ssCmd.getResourceType() == StorageResourceType.SECONDARY_STORAGE) {
if (ssCmd.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE) {
type = Host.Type.SecondaryStorage;
if (resource != null && resource instanceof DummySecondaryStorageResource){
resource = null;
@ -1755,7 +1756,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory {
if (startup instanceof StartupStorageCommand) {
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_TYPE_STORAGE);
_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.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_DISPLAY_TEXT.getName(),getManagementServer().findDiskOfferingById(volume.getDiskOfferingId()).getDisplayText()));
}
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()));
Long poolId = volume.getPoolId();
String poolName = (poolId == null) ? "none" : getManagementServer().findPoolById(poolId).getName();
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.host.HostVO;
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.StoragePoolHostDao;
import com.cloud.utils.component.Inject;
@ -72,7 +72,7 @@ public class LocalStoragePoolListener implements Listener {
StartupStorageCommand ssCmd = (StartupStorageCommand)cmd;
if (ssCmd.getResourceType() != StorageResourceType.STORAGE_POOL) {
if (ssCmd.getResourceType() != Storage.StorageResourceType.STORAGE_POOL) {
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.DeleteTemplateCommand;
import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.agent.api.to.VolumeTO;
import com.cloud.alert.AlertManager;
import com.cloud.api.BaseCmd;
@ -64,7 +63,6 @@ import com.cloud.async.AsyncJobExecutor;
import com.cloud.async.AsyncJobManager;
import com.cloud.async.AsyncJobVO;
import com.cloud.async.BaseAsyncJobExecutor;
import com.cloud.async.executor.VMOperationParam;
import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao;
import com.cloud.configuration.Config;
@ -91,9 +89,9 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceInUseException;
import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.Host;
import com.cloud.host.Host.Type;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.host.Host.Type;
import com.cloud.host.dao.DetailsDao;
import com.cloud.host.dao.HostDao;
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.StoragePoolType;
import com.cloud.storage.Volume.MirrorState;
import com.cloud.storage.Volume.StorageResourceType;
import com.cloud.storage.Volume.VolumeType;
import com.cloud.storage.allocator.StoragePoolAllocator;
import com.cloud.storage.dao.DiskOfferingDao;
@ -122,6 +119,7 @@ import com.cloud.storage.snapshot.SnapshotScheduler;
import com.cloud.template.TemplateManager;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO;
import com.cloud.user.User;
import com.cloud.user.dao.AccountDao;
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.exception.CloudRuntimeException;
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.UserVmManager;
import com.cloud.vm.UserVmVO;
@ -227,6 +225,39 @@ public class StorageManagerImpl implements StorageManager {
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) {
List<VolumeVO> vols = _volsDao.findCreatedByInstance(vm.getId());
List<VolumeVO> recreateVols = new ArrayList<VolumeVO>(vols.size());
@ -259,9 +290,7 @@ public class StorageManagerImpl implements StorageManager {
DataCenterVO dc = _dcDao.findById(create.getDataCenterId());
HostPodVO pod = _podDao.findById(host.getPodId());
DiskOfferingVO diskOffering = null;
if (vol.getDiskOfferingId() != null) {
diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId());
}
diskOffering = _diskOfferingDao.findById(vol.getDiskOfferingId());
ServiceOfferingVO offering;
if (vm instanceof UserVmVO) {
offering = _offeringDao.findById(((UserVmVO)vm).getServiceOfferingId());
@ -333,7 +362,7 @@ public class StorageManagerImpl implements StorageManager {
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();
while (en.hasMoreElements()) {
final StoragePoolAllocator allocator = en.nextElement();
@ -385,7 +414,7 @@ public class StorageManagerImpl implements StorageManager {
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()) {
SearchCriteria<VMTemplateHostVO> sc = HostTemplateStatesSearch.create();
sc.setParameters("id", template.getId());
@ -398,9 +427,9 @@ public class StorageManagerImpl implements StorageManager {
}
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 {
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.setSize(originalVolumeSize);
volume.setStorageResourceType(StorageResourceType.STORAGE_POOL);
volume.setStorageResourceType(Storage.StorageResourceType.STORAGE_POOL);
volume.setInstanceId(null);
volume.setUpdated(new Date());
volume.setStatus(AsyncInstanceCreateStatus.Creating);
@ -462,7 +491,7 @@ public class StorageManagerImpl implements StorageManager {
String volumeUUID = 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
@ -617,9 +646,7 @@ public class StorageManagerImpl implements StorageManager {
if(originalVolume.getTemplateId() != null){
templateId = originalVolume.getTemplateId();
}
if(originalVolume.getDiskOfferingId() != null){
diskOfferingId = originalVolume.getDiskOfferingId();
}
diskOfferingId = originalVolume.getDiskOfferingId();
long sizeMB = createdVolume.getSize()/(1024*1024);
String poolName = _storagePoolDao.findById(createdVolume.getPoolId()).getName();
@ -690,7 +717,7 @@ public class StorageManagerImpl implements StorageManager {
StoragePoolVO pool = null;
final HashSet<StoragePool> avoidPools = new HashSet<StoragePool>(avoids);
DiskCharacteristicsTO dskCh = null;
DiskCharacteristics dskCh = null;
if (volume.getVolumeType() == VolumeType.ROOT && Storage.ImageFormat.ISO != template.getFormat()) {
dskCh = createDiskCharacteristics(volume, template, dc, offering);
} else {
@ -1439,7 +1466,7 @@ public class StorageManagerImpl implements StorageManager {
public VolumeVO moveVolume(VolumeVO volume, long destPoolDcId, Long destPoolPodId, Long destPoolClusterId) throws InternalErrorException {
// Find a destination storage pool with the specified criteria
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);
HostPodVO destPoolPod = _podDao.findById(destPoolPodId);
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.setMirrorState(MirrorState.NOT_MIRRORED);
volume.setDiskOfferingId(diskOffering.getId());
volume.setStorageResourceType(StorageResourceType.STORAGE_POOL);
volume.setStorageResourceType(Storage.StorageResourceType.STORAGE_POOL);
volume.setInstanceId(null);
volume.setUpdated(new Date());
volume.setStatus(AsyncInstanceCreateStatus.Creating);

View File

@ -27,7 +27,6 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.host.Host;
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.ComponentLocator;
import com.cloud.utils.component.Inject;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
@ -100,7 +100,7 @@ public abstract class AbstractStoragePoolAllocator extends AdapterBase implement
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) {
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) {
// We are finding a pool for a volume, so we need a shared storage allocator
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);
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) {
if (avoid.contains(pool)) {
return false;

View File

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

View File

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

View File

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

View File

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

View File

@ -19,7 +19,6 @@ package com.cloud.storage.allocator;
import java.util.Set;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
import com.cloud.host.Host;
@ -27,6 +26,7 @@ import com.cloud.offering.ServiceOffering;
import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateVO;
import com.cloud.utils.component.Adapter;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
@ -36,7 +36,7 @@ import com.cloud.vm.VirtualMachine;
*/
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);
}

View File

@ -23,7 +23,6 @@ import java.util.Set;
import javax.ejb.Local;
import javax.naming.ConfigurationException;
import com.cloud.agent.api.to.DiskCharacteristicsTO;
import com.cloud.configuration.Config;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.DataCenterVO;
@ -34,6 +33,7 @@ import com.cloud.storage.StoragePool;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume.VolumeType;
import com.cloud.utils.component.ComponentLocator;
import com.cloud.vm.DiskCharacteristics;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
@ -42,7 +42,7 @@ public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implemen
boolean _useLocalStorage;
@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) {
return null;
}
@ -69,7 +69,7 @@ public class UseLocalForRootAllocator extends LocalStoragePoolAllocator implemen
}
@Override
protected boolean localStorageAllocationNeeded(DiskCharacteristicsTO dskCh, VMInstanceVO vm, ServiceOffering offering) {
protected boolean localStorageAllocationNeeded(DiskCharacteristics dskCh, VMInstanceVO vm, ServiceOffering offering) {
if (dskCh.getType() == VolumeType.ROOT) {
return true;
} 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.EventVO;
import com.cloud.host.HostVO;
import com.cloud.storage.Storage;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.dao.VMTemplateHostDao;
import com.cloud.storage.download.DownloadState.DownloadEvent;
@ -286,8 +286,8 @@ public class DownloadListener implements Listener {
long agentId = agent.getId();
StartupStorageCommand storage = (StartupStorageCommand)cmd;
if (storage.getResourceType() == Volume.StorageResourceType.STORAGE_HOST ||
storage.getResourceType() == Volume.StorageResourceType.SECONDARY_STORAGE )
if (storage.getResourceType() == Storage.StorageResourceType.STORAGE_HOST ||
storage.getResourceType() == Storage.StorageResourceType.SECONDARY_STORAGE )
{
downloadMonitor.handleTemplateSync(agentId, storage.getTemplateInfo());
} else {

View File

@ -40,8 +40,8 @@ import com.cloud.host.Host;
import com.cloud.host.Host.Type;
import com.cloud.resource.ServerResource;
import com.cloud.resource.ServerResourceBase;
import com.cloud.storage.Storage;
import com.cloud.storage.StorageLayer;
import com.cloud.storage.Volume;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.template.DownloadManager;
import com.cloud.storage.template.DownloadManagerImpl;
@ -160,7 +160,7 @@ public class LocalSecondaryStorageResource extends ServerResourceBase implements
public StartupCommand[] initialize() {
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);
fillNetworkInformation(cmd);
cmd.setDataCenter(_dc);

View File

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

View File

@ -17,6 +17,8 @@
*/
package com.cloud.vm;
import java.util.List;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.service.ServiceOfferingVO;
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) {
return null;
}
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#create(com.cloud.vm.VMInstanceVO)
*/
@Override
public void create(VMInstanceVO vm) {
public void create(VmCharacteristics vm, List<DiskCharacteristics> disks, List<NetworkCharacteristics> networks) {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#destroy()
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#start()
*/
@Override
public void start() {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see com.cloud.vm.VmManager#stop()
*/
@Override
public void stop() {
// TODO Auto-generated method stub
}
}

4
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){
templateId = volume.getTemplateId();
}
if(volume.getDiskOfferingId() !=null){
diskOfferingId = volume.getDiskOfferingId();
}
diskOfferingId = volume.getDiskOfferingId();
long sizeMB = volume.getSize()/(1024*1024);
String eventParams = "id=" + volume.getId() +"\ndoId="+diskOfferingId+"\ntId="+templateId+"\ndcId="+volume.getDataCenterId()+"\nsize="+sizeMB;
EventVO volEvent = new EventVO();

View File

@ -17,6 +17,8 @@
*/
package com.cloud.vm;
import java.util.List;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.storage.DiskOfferingVO;
@ -31,7 +33,7 @@ public interface VmManager {
NetworkOfferingVO[] networkOfferings,
DiskOfferingVO[] diskOffering);
void create(VMInstanceVO vm);
void create(VmCharacteristics vm, List<DiskCharacteristics> disks, List<NetworkCharacteristics> networks);
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',
`iscsi_name` varchar(255) COMMENT 'iscsi target name',
`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',
`pool_type` varchar(64) COMMENT 'type of the pool',
`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',
`removed` datetime COMMENT 'Date removed. not null if removed',
`status` varchar(32) COMMENT 'Async API volume creation status',
`state` varchar(32) COMMENT 'State machine',
PRIMARY KEY (`id`)
) 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>