diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java index dd017a11327..b0f9f37d85b 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/TemplateService.java @@ -50,4 +50,5 @@ public interface TemplateService { void handleSysTemplateDownload(HypervisorType hostHyper, Long dcId); void handleTemplateSync(DataStore store); void downloadBootstrapSysTemplate(DataStore store); + void addSystemVMTemplatesToSecondary(DataStore store); } diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java index 676004b0314..8e6c6a88a84 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/ImageStoreVO.java @@ -60,7 +60,7 @@ public class ImageStoreVO implements ImageStore { private String providerName; @Column(name = "data_center_id") - private long dcId; + private Long dcId; @Column(name = "scope") @Enumerated(value = EnumType.STRING) @@ -117,7 +117,7 @@ public class ImageStoreVO implements ImageStore { return this.protocol; } - public void setDataCenterId(long dcId) { + public void setDataCenterId(Long dcId) { this.dcId = dcId; } diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java index 7d645446fba..6347e613e67 100755 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreVO.java @@ -190,6 +190,26 @@ public class TemplateDataStoreVO implements StateObject rtngTmplts = _templateDao.listAllSystemVMTemplates(); + for ( VMTemplateVO tmplt : rtngTmplts ) { + TemplateDataStoreVO tmpltStore = this._vmTemplateStoreDao.findByStoreTemplate(storeId, tmplt.getId()); + if ( tmpltStore == null ) { + tmpltStore = new TemplateDataStoreVO(storeId, tmplt.getId(), new Date(), 100, Status.DOWNLOADED, null, null, null, TemplateConstants.DEFAULT_SYSTEM_VM_TEMPLATE_PATH + tmplt.getId() + File.separator, tmplt.getUrl()); + tmpltStore.setSize(0); + tmpltStore.setPhysicalSize(0); // no size information for pre-seeded system vm templates + _vmTemplateStoreDao.persist(tmpltStore); + } + } + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java index 1d24f12b2e0..f43bc4093f3 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java @@ -68,6 +68,7 @@ public class ImageStoreHelper { store.setProtocol((String)params.get("protocol")); store.setProviderName((String)params.get("providerName")); store.setScope((ScopeType)params.get("scope")); + store.setDataCenterId((Long)params.get("zoneId")); store.setUuid((String)params.get("uuid")); store.setUrl((String)params.get("url")); store.setRole((DataStoreRole)params.get("role")); diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 4ae0d17ac67..97f87b7dbf9 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -35,6 +35,8 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; @@ -97,6 +99,7 @@ import com.google.gson.Gson; import com.vmware.vim25.AboutInfo; import com.vmware.vim25.HostConnectSpec; import com.vmware.vim25.ManagedObjectReference; +import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;; @Local(value = {VmwareManager.class}) @@ -120,6 +123,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Inject CommandExecLogDao _cmdExecLogDao; @Inject ClusterManager _clusterMgr; @Inject SecondaryStorageVmManager _ssvmMgr; + @Inject DataStoreManager _dataStoreMgr; @Inject CiscoNexusVSMDeviceDao _nexusDao; @Inject ClusterVSMMapDao _vsmMapDao; @Inject ConfigurationDao _configDao; @@ -426,9 +430,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public String getSecondaryStorageStoreUrl(long dcId) { - List secStorageHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dcId); - if(secStorageHosts.size() > 0) - return secStorageHosts.get(0).getStorageUrl(); + DataStore secStore = this._dataStoreMgr.getImageStore(dcId); + if(secStore != null) + return secStore.getUri(); return null; } diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 4328e2a756c..234d4102996 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -2665,7 +2665,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { } if (onlyReady){ - sc.addAnd("downlaadState", SearchCriteria.Op.EQ, Status.DOWNLOADED); + sc.addAnd("downloadState", SearchCriteria.Op.EQ, Status.DOWNLOADED); sc.addAnd("destroyed", SearchCriteria.Op.EQ, false); } @@ -2675,7 +2675,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { if (!showDomr){ // excluding system template - sc.addAnd("type", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM); + sc.addAnd("templateType", SearchCriteria.Op.NEQ, Storage.TemplateType.SYSTEM); } // search unique templates and find details by Ids diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 2eb93709a7f..798ee56a84d 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1521,18 +1521,22 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); } - List hosts = new ArrayList(); + List hosts = new ArrayList(); if (hostId != null) { - hosts.add(ApiDBUtils.findHostById(hostId)); + hosts.add(hostId); } else { - hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId); - } + List stores = this._dataStoreMgr.getImageStoresByScope(new ZoneScope(zoneId)); + if (stores != null){ + for (DataStore store : stores){ + hosts.add(store.getId()); + } + } + } CapacityVO capacity = new CapacityVO(hostId, zoneId, null, null, 0, 0, CapacityVO.CAPACITY_TYPE_SECONDARY_STORAGE); - for (HostVO host : hosts) { - StorageStats stats = ApiDBUtils.getSecondaryStorageStatistics(host - .getId()); + for (Long id : hosts) { + StorageStats stats = ApiDBUtils.getSecondaryStorageStatistics(id); if (stats == null) { continue; } @@ -1916,6 +1920,9 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C if (((ImageStoreProvider) storeProvider).needDownloadSysTemplate()) { // trigger system vm template download this._imageSrv.downloadBootstrapSysTemplate(store); + } else { + // populate template_store_ref table + this._imageSrv.addSystemVMTemplatesToSecondary(store); } return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.Image); diff --git a/server/src/com/cloud/storage/s3/S3ManagerImpl.java b/server/src/com/cloud/storage/s3/S3ManagerImpl.java index cf236b8b9d3..1e8ad4f54ed 100644 --- a/server/src/com/cloud/storage/s3/S3ManagerImpl.java +++ b/server/src/com/cloud/storage/s3/S3ManagerImpl.java @@ -48,6 +48,8 @@ import javax.naming.ConfigurationException; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd; import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -116,8 +118,9 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { @Inject private HostDao hostDao; + @Inject - private SecondaryStorageVmManager secondaryStorageVMManager; + private DataStoreManager dataStoreManager; public S3ManagerImpl() { } @@ -319,11 +322,10 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { return errorMessage; } - final HostVO secondaryStorageHost = secondaryStorageVMManager - .findSecondaryStorageHost(dataCenterId); - if (secondaryStorageHost == null) { + final DataStore secondaryStore = this.dataStoreManager.getImageStore(dataCenterId); + if (secondaryStore == null) { final String errorMessage = format( - "Unable to find secondary storage host for zone id %1$s.", + "Unable to find secondary storage for zone id %1$s.", dataCenterId); LOGGER.error(errorMessage); throw new CloudRuntimeException(errorMessage); @@ -331,7 +333,7 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { final long accountId = template.getAccountId(); final DownloadTemplateFromS3ToSecondaryStorageCommand cmd = new DownloadTemplateFromS3ToSecondaryStorageCommand( - s3, accountId, templateId, secondaryStorageHost.getName(), + s3, accountId, templateId, secondaryStore.getName(), primaryStorageDownloadWait); try { @@ -358,7 +360,7 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { asList("template", "tmpl", accountId, templateId), File.separator); final VMTemplateHostVO tmpltHost = new VMTemplateHostVO( - secondaryStorageHost.getId(), templateId, + secondaryStore.getId(), templateId, now(), 100, Status.DOWNLOADED, null, null, null, installPath, template.getUrl()); tmpltHost.setSize(templateS3VO.getSize()); diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index c4fd848f9f4..a75174645b0 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -508,8 +508,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar } protected Map createSecStorageVmInstance(long dataCenterId, SecondaryStorageVm.Role role) { - HostVO secHost = findSecondaryStorageHost(dataCenterId); - if (secHost == null) { + DataStore secStore = this._dataStoreMgr.getImageStore(dataCenterId); + if (secStore == null) { String msg = "No secondary storage available in zone " + dataCenterId + ", cannot create secondary storage vm"; s_logger.warn(msg); throw new CloudRuntimeException(msg); @@ -1019,8 +1019,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar Map details = _vmDetailsDao.findDetails(vm.getId()); vm.setDetails(details); - HostVO secHost = _ssvmMgr.findSecondaryStorageHost(dest.getDataCenter().getId()); - assert (secHost != null); + DataStore secStore = this._dataStoreMgr.getImageStore(dest.getDataCenter().getId()); + assert (secStore != null); StringBuilder buf = profile.getBootArgsBuilder(); buf.append(" template=domP type=secstorage"); @@ -1265,9 +1265,9 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar List ssVms = _secStorageVmDao.getSecStorageVmListInStates(SecondaryStorageVm.Role.templateProcessor, dataCenterId, State.Running, State.Migrating, State.Starting, State.Stopped, State.Stopping ); int vmSize = (ssVms == null)? 0 : ssVms.size(); - List ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dataCenterId); - int hostSize = (ssHosts == null)? 0 : ssHosts.size(); - if ( hostSize > vmSize ) { + List ssStores = this._dataStoreMgr.getImageStoresByScope(new ZoneScope(dataCenterId)); + int storeSize = (ssStores == null)? 0 : ssStores.size(); + if ( storeSize > vmSize ) { s_logger.info("No secondary storage vms found in datacenter id=" + dataCenterId + ", starting a new one"); return new Pair(AfterScanAction.expand, SecondaryStorageVm.Role.templateProcessor); } @@ -1356,19 +1356,6 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar return null; } - @Override - public HostVO findSecondaryStorageHost(long dcId) { - SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); - sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.SecondaryStorage); - sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); - List storageHosts = sc.list(); - if (storageHosts == null || storageHosts.size() < 1) { - return null; - } else { - Collections.shuffle(storageHosts); - return storageHosts.get(0); - } - } @Override public List listSecondaryStorageHostsInAllZones() { @@ -1377,29 +1364,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar return sc.list(); } - @Override - public List listSecondaryStorageHostsInOneZone(long dataCenterId) { - SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); - sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dataCenterId); - sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.SecondaryStorage); - return sc.list(); - } - @Override - public List listLocalSecondaryStorageHostsInOneZone(long dataCenterId) { - SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); - sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dataCenterId); - sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.LocalSecondaryStorage); - return sc.list(); - } - - @Override - public List listAllTypesSecondaryStorageHostsInOneZone(long dataCenterId) { - SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); - sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dataCenterId); - sc.addAnd(sc.getEntity().getType(), Op.IN, Host.Type.LocalSecondaryStorage, Host.Type.SecondaryStorage); - return sc.list(); - } @Override public List listUpAndConnectingSecondaryStorageVmHost(Long dcId) { diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java b/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java index 0756c72d59e..e4651df3fa6 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageVmManager.java @@ -18,8 +18,6 @@ package com.cloud.storage.secondary; import java.util.List; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; - import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.host.HostVO; @@ -47,12 +45,7 @@ public interface SecondaryStorageVmManager extends Manager { public Pair assignSecStorageVm(long zoneId, Command cmd); boolean generateSetupCommand(Long hostId); - //boolean deleteHost(Long hostId); - public HostVO findSecondaryStorageHost(long dcId); public List listSecondaryStorageHostsInAllZones(); - public List listSecondaryStorageHostsInOneZone(long dataCenterId); - public List listLocalSecondaryStorageHostsInOneZone(long dataCenterId); - public List listAllTypesSecondaryStorageHostsInOneZone(long dataCenterId); public List listUpAndConnectingSecondaryStorageVmHost(Long dcId); public HostVO pickSsvmHost(HostVO ssHost); } diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index cb0bee9cc76..ae1e1788070 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -31,7 +31,6 @@ import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd; import org.apache.cloudstack.api.command.user.iso.RegisterIsoCmd; import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd; import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd; -import org.apache.cloudstack.engine.subsystem.api.storage.CommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; @@ -47,38 +46,24 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.storage.DeleteTemplateCommand; import com.cloud.alert.AlertManager; import com.cloud.configuration.Resource.ResourceType; -import com.cloud.dc.DataCenterVO; -import com.cloud.event.EventTypes; -import com.cloud.event.UsageEventUtils; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.ResourceAllocationException; -import com.cloud.host.HostVO; -import com.cloud.storage.ScopeType; -import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; -import com.cloud.storage.DataStoreRole; import com.cloud.storage.TemplateProfile; -import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.download.DownloadMonitor; -import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.user.Account; import com.cloud.utils.UriUtils; import com.cloud.utils.db.DB; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.vm.UserVmVO; @Local(value=TemplateAdapter.class) public class HypervisorTemplateAdapter extends TemplateAdapterBase implements TemplateAdapter { private final static Logger s_logger = Logger.getLogger(HypervisorTemplateAdapter.class); @Inject DownloadMonitor _downloadMonitor; - @Inject SecondaryStorageVmManager _ssvmMgr; @Inject AgentManager _agentMgr; @Inject DataStoreManager storeMgr; @@ -196,10 +181,10 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te .createTemplateAsync(tmpl, imageStore, caller); } _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template); - + return template; } - + private class CreateTemplateContext extends AsyncRpcConext { final TemplateInfo template; public CreateTemplateContext(AsyncCompletionCallback callback, TemplateInfo template) { @@ -207,15 +192,15 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te this.template = template; } } - - protected Void createTemplateAsyncCallBack(AsyncCallbackDispatcher callback, CreateTemplateContext context) { TemplateInfo template = context.template; VMTemplateVO tmplt = this._tmpltDao.findById(template.getId()); long accountId = tmplt.getAccountId(); _resourceLimitMgr.incrementResourceCount(accountId, ResourceType.secondary_storage, template.getSize()); - + return null; } @@ -280,7 +265,8 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te } - public TemplateProfile prepareDelete(DeleteTemplateCmd cmd) { + @Override + public TemplateProfile prepareDelete(DeleteTemplateCmd cmd) { TemplateProfile profile = super.prepareDelete(cmd); VMTemplateVO template = (VMTemplateVO)profile.getTemplate(); Long zoneId = profile.getZoneId(); @@ -289,19 +275,20 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te throw new InvalidParameterValueException("The DomR template cannot be deleted."); } - if (zoneId != null && (_ssvmMgr.findSecondaryStorageHost(zoneId) == null)) { - throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone."); + if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { + throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); } return profile; } - public TemplateProfile prepareDelete(DeleteIsoCmd cmd) { + @Override + public TemplateProfile prepareDelete(DeleteIsoCmd cmd) { TemplateProfile profile = super.prepareDelete(cmd); Long zoneId = profile.getZoneId(); - if (zoneId != null && (_ssvmMgr.findSecondaryStorageHost(zoneId) == null)) { - throw new InvalidParameterValueException("Failed to find a secondary storage host in the specified zone."); + if (zoneId != null && (this.storeMgr.getImageStore(zoneId) == null)) { + throw new InvalidParameterValueException("Failed to find a secondary storage in the specified zone."); } return profile;