Populate system vm template to template_store_ref in adding an image

store.
This commit is contained in:
Min Chen 2013-05-01 12:10:24 -07:00
parent 881165e5d3
commit 3c6b7c2a01
12 changed files with 94 additions and 96 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -190,6 +190,26 @@ public class TemplateDataStoreVO implements StateObject<ObjectInDataStoreStateMa
this.jobId = jobId;
this.installPath = installPath;
this.setDownloadUrl(downloadUrl);
switch (downloadState) {
case DOWNLOADED:
this.state = ObjectInDataStoreStateMachine.State.Ready;
break;
case CREATING:
case DOWNLOAD_IN_PROGRESS:
case UPLOAD_IN_PROGRESS:
this.state = ObjectInDataStoreStateMachine.State.Creating2;
break;
case DOWNLOAD_ERROR:
case UPLOAD_ERROR:
this.state = ObjectInDataStoreStateMachine.State.Failed;
break;
case ABANDONED:
this.state = ObjectInDataStoreStateMachine.State.Destroyed;
break;
default:
this.state = ObjectInDataStoreStateMachine.State.Allocated;
break;
}
}
public TemplateDataStoreVO() {

View File

@ -18,8 +18,10 @@
*/
package org.apache.cloudstack.storage.image;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@ -55,6 +57,7 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.image.store.TemplateObject;
import com.cloud.storage.template.TemplateConstants;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@ -549,4 +552,19 @@ public class TemplateServiceImpl implements TemplateService {
return null;
}
@Override
public void addSystemVMTemplatesToSecondary(DataStore store){
long storeId = store.getId();
List<VMTemplateVO> 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);
}
}
}
}

View File

@ -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"));

View File

@ -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<HostVO> 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;
}

View File

@ -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

View File

@ -1521,18 +1521,22 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId);
}
List<HostVO> hosts = new ArrayList<HostVO>();
List<Long> hosts = new ArrayList<Long>();
if (hostId != null) {
hosts.add(ApiDBUtils.findHostById(hostId));
hosts.add(hostId);
} else {
hosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
}
List<DataStore> 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);

View File

@ -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());

View File

@ -508,8 +508,8 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar
}
protected Map<String, Object> 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<String, String> 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<SecondaryStorageVmVO> 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<HostVO> ssHosts = _ssvmMgr.listSecondaryStorageHostsInOneZone(dataCenterId);
int hostSize = (ssHosts == null)? 0 : ssHosts.size();
if ( hostSize > vmSize ) {
List<DataStore> 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, Object>(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<HostVO, HostVO> sc = SearchCriteria2.create(HostVO.class);
sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.SecondaryStorage);
sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId);
List<HostVO> storageHosts = sc.list();
if (storageHosts == null || storageHosts.size() < 1) {
return null;
} else {
Collections.shuffle(storageHosts);
return storageHosts.get(0);
}
}
@Override
public List<HostVO> listSecondaryStorageHostsInAllZones() {
@ -1377,29 +1364,7 @@ public class SecondaryStorageManagerImpl extends ManagerBase implements Secondar
return sc.list();
}
@Override
public List<HostVO> listSecondaryStorageHostsInOneZone(long dataCenterId) {
SearchCriteriaService<HostVO, HostVO> 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<HostVO> listLocalSecondaryStorageHostsInOneZone(long dataCenterId) {
SearchCriteriaService<HostVO, HostVO> 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<HostVO> listAllTypesSecondaryStorageHostsInOneZone(long dataCenterId) {
SearchCriteriaService<HostVO, HostVO> 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<HostVO> listUpAndConnectingSecondaryStorageVmHost(Long dcId) {

View File

@ -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<HostVO, SecondaryStorageVmVO> assignSecStorageVm(long zoneId, Command cmd);
boolean generateSetupCommand(Long hostId);
//boolean deleteHost(Long hostId);
public HostVO findSecondaryStorageHost(long dcId);
public List<HostVO> listSecondaryStorageHostsInAllZones();
public List<HostVO> listSecondaryStorageHostsInOneZone(long dataCenterId);
public List<HostVO> listLocalSecondaryStorageHostsInOneZone(long dataCenterId);
public List<HostVO> listAllTypesSecondaryStorageHostsInOneZone(long dataCenterId);
public List<HostVO> listUpAndConnectingSecondaryStorageVmHost(Long dcId);
public HostVO pickSsvmHost(HostVO ssHost);
}

View File

@ -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<T> extends AsyncRpcConext<T> {
final TemplateInfo template;
public CreateTemplateContext(AsyncCompletionCallback<T> callback, TemplateInfo template) {
@ -207,15 +192,15 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase implements Te
this.template = template;
}
}
protected Void createTemplateAsyncCallBack(AsyncCallbackDispatcher<HypervisorTemplateAdapter,
protected Void createTemplateAsyncCallBack(AsyncCallbackDispatcher<HypervisorTemplateAdapter,
TemplateApiResult> callback, CreateTemplateContext<TemplateApiResult> 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;