CLOUDSTACK-3950:Set cross-zone flag in registerTemplate/registerIso in

case of region-wide secondary is enabled.
This commit is contained in:
Min Chen 2013-08-20 14:13:06 -07:00
parent fe012f29e8
commit 3bd2bbf59d
5 changed files with 259 additions and 215 deletions

View File

@ -31,6 +31,8 @@ public interface ImageStoreDao extends GenericDao<ImageStoreVO, Long> {
List<ImageStoreVO> findByScope(ZoneScope scope); List<ImageStoreVO> findByScope(ZoneScope scope);
List<ImageStoreVO> findRegionImageStores();
List<ImageStoreVO> findImageCacheByScope(ZoneScope scope); List<ImageStoreVO> findImageCacheByScope(ZoneScope scope);
List<ImageStoreVO> listImageStores(); List<ImageStoreVO> listImageStores();

View File

@ -38,6 +38,7 @@ import com.cloud.utils.db.SearchCriteria;
public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implements ImageStoreDao { public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implements ImageStoreDao {
private SearchBuilder<ImageStoreVO> nameSearch; private SearchBuilder<ImageStoreVO> nameSearch;
private SearchBuilder<ImageStoreVO> providerSearch; private SearchBuilder<ImageStoreVO> providerSearch;
private SearchBuilder<ImageStoreVO> regionSearch;
@Override @Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@ -50,9 +51,14 @@ public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implem
providerSearch = createSearchBuilder(); providerSearch = createSearchBuilder();
providerSearch.and("providerName", providerSearch.entity().getProviderName(), SearchCriteria.Op.EQ); providerSearch.and("providerName", providerSearch.entity().getProviderName(), SearchCriteria.Op.EQ);
providerSearch.and("role", providerSearch.entity().getProviderName(), SearchCriteria.Op.EQ); providerSearch.and("role", providerSearch.entity().getRole(), SearchCriteria.Op.EQ);
providerSearch.done(); providerSearch.done();
regionSearch = createSearchBuilder();
regionSearch.and("scope", regionSearch.entity().getScope(), SearchCriteria.Op.EQ);
regionSearch.and("role", regionSearch.entity().getRole(), SearchCriteria.Op.EQ);
regionSearch.done();
return true; return true;
} }
@ -86,6 +92,14 @@ public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implem
return listBy(sc); return listBy(sc);
} }
@Override
public List<ImageStoreVO> findRegionImageStores() {
SearchCriteria<ImageStoreVO> sc = regionSearch.create();
sc.setParameters("scope", ScopeType.REGION);
sc.setParameters("role", DataStoreRole.Image);
return listBy(sc);
}
@Override @Override
public List<ImageStoreVO> findImageCacheByScope(ZoneScope scope) { public List<ImageStoreVO> findImageCacheByScope(ZoneScope scope) {
SearchCriteria<ImageStoreVO> sc = createSearchCriteria(); SearchCriteria<ImageStoreVO> sc = createSearchCriteria();

View File

@ -431,6 +431,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory;
import org.apache.cloudstack.framework.config.ConfigurationVO; import org.apache.cloudstack.framework.config.ConfigurationVO;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.cloudstack.utils.identity.ManagementServerNode;
@ -675,6 +677,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
private List<StoragePoolAllocator> _storagePoolAllocators; private List<StoragePoolAllocator> _storagePoolAllocators;
@Inject @Inject
private ResourceTagDao _resourceTagDao; private ResourceTagDao _resourceTagDao;
@Inject
private ImageStoreDao _imgStoreDao;
@Inject @Inject
ProjectManager _projectMgr; ProjectManager _projectMgr;
@ -3256,6 +3260,13 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
Integer apiLimitInterval = Integer.valueOf(_configDao.getValue(Config.ApiLimitInterval.key())); Integer apiLimitInterval = Integer.valueOf(_configDao.getValue(Config.ApiLimitInterval.key()));
Integer apiLimitMax = Integer.valueOf(_configDao.getValue(Config.ApiLimitMax.key())); Integer apiLimitMax = Integer.valueOf(_configDao.getValue(Config.ApiLimitMax.key()));
// check if region-wide secondary storage is used
boolean regionSecondaryEnabled = false;
List<ImageStoreVO> imgStores = _imgStoreDao.findRegionImageStores();
if ( imgStores != null && imgStores.size() > 0){
regionSecondaryEnabled = true;
}
capabilities.put("securityGroupsEnabled", securityGroupsEnabled); capabilities.put("securityGroupsEnabled", securityGroupsEnabled);
capabilities capabilities
.put("userPublicTemplateEnabled", (userPublicTemplateEnabled == null || userPublicTemplateEnabled.equals("false") ? false : true)); .put("userPublicTemplateEnabled", (userPublicTemplateEnabled == null || userPublicTemplateEnabled.equals("false") ? false : true));
@ -3264,6 +3275,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
capabilities.put("projectInviteRequired", _projectMgr.projectInviteRequired()); capabilities.put("projectInviteRequired", _projectMgr.projectInviteRequired());
capabilities.put("allowusercreateprojects", _projectMgr.allowUserToCreateProject()); capabilities.put("allowusercreateprojects", _projectMgr.allowUserToCreateProject());
capabilities.put("customDiskOffMaxSize", diskOffMaxSize); capabilities.put("customDiskOffMaxSize", diskOffMaxSize);
capabilities.put("regionSecondaryEnabled", regionSecondaryEnabled);
if (apiLimitEnabled) { if (apiLimitEnabled) {
capabilities.put("apiLimitInterval", apiLimitInterval); capabilities.put("apiLimitInterval", apiLimitInterval);
capabilities.put("apiLimitMax", apiLimitMax); capabilities.put("apiLimitMax", apiLimitMax);

View File

@ -21,6 +21,8 @@ import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd; 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.iso.RegisterIsoCmd;
@ -28,13 +30,11 @@ import org.apache.cloudstack.api.command.user.template.DeleteTemplateCmd;
import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd; import org.apache.cloudstack.api.command.user.template.ExtractTemplateCmd;
import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd; import org.apache.cloudstack.api.command.user.template.RegisterTemplateCmd;
import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreDao;
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
import org.apache.log4j.Logger;
import com.cloud.api.ApiDBUtils; import com.cloud.api.ApiDBUtils;
import com.cloud.configuration.Config; import com.cloud.configuration.Config;
import com.cloud.configuration.Resource.ResourceType; import com.cloud.configuration.Resource.ResourceType;
@ -86,7 +86,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
protected @Inject UserVmDao _userVmDao; protected @Inject UserVmDao _userVmDao;
protected @Inject GuestOSHypervisorDao _osHyperDao; protected @Inject GuestOSHypervisorDao _osHyperDao;
protected @Inject ResourceLimitService _resourceLimitMgr; protected @Inject ResourceLimitService _resourceLimitMgr;
protected @Inject DataStoreManager storeMgr; protected @Inject ImageStoreDao _imgStoreDao;
@Inject TemplateManager templateMgr; @Inject TemplateManager templateMgr;
@Inject ConfigurationServer _configServer; @Inject ConfigurationServer _configServer;
@Inject ProjectManager _projectMgr; @Inject ProjectManager _projectMgr;
@ -232,9 +232,16 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
boolean isRouting = (cmd.isRoutingType() == null) ? false : cmd.isRoutingType(); boolean isRouting = (cmd.isRoutingType() == null) ? false : cmd.isRoutingType();
Long zoneId = cmd.getZoneId();
// ignore passed zoneId if we are using region wide image store
List<ImageStoreVO> stores = _imgStoreDao.findRegionImageStores();
if (stores != null && stores.size() > 0) {
zoneId = -1L;
}
return prepare(false, CallContext.current().getCallingUserId(), cmd.getTemplateName(), cmd.getDisplayText(), return prepare(false, CallContext.current().getCallingUserId(), cmd.getTemplateName(), cmd.getDisplayText(),
cmd.getBits(), cmd.isPasswordEnabled(), cmd.getRequiresHvm(), cmd.getUrl(), cmd.isPublic(), cmd.isFeatured(), cmd.getBits(), cmd.isPasswordEnabled(), cmd.getRequiresHvm(), cmd.getUrl(), cmd.isPublic(), cmd.isFeatured(),
cmd.isExtractable(), cmd.getFormat(), cmd.getOsTypeId(), cmd.getZoneId(), HypervisorType.getType(cmd.getHypervisor()), cmd.isExtractable(), cmd.getFormat(), cmd.getOsTypeId(), zoneId, HypervisorType.getType(cmd.getHypervisor()),
cmd.getChecksum(), true, cmd.getTemplateTag(), owner, cmd.getDetails(), cmd.isSshKeyEnabled(), null, cmd.isDynamicallyScalable(), cmd.getChecksum(), true, cmd.getTemplateTag(), owner, cmd.getDetails(), cmd.isSshKeyEnabled(), null, cmd.isDynamicallyScalable(),
isRouting ? TemplateType.ROUTING : TemplateType.USER); isRouting ? TemplateType.ROUTING : TemplateType.USER);
@ -247,9 +254,16 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
Account owner = _accountMgr.getAccount(cmd.getEntityOwnerId()); Account owner = _accountMgr.getAccount(cmd.getEntityOwnerId());
_accountMgr.checkAccess(caller, null, true, owner); _accountMgr.checkAccess(caller, null, true, owner);
Long zoneId = cmd.getZoneId();
// ignore passed zoneId if we are using region wide image store
List<ImageStoreVO> stores = _imgStoreDao.findRegionImageStores();
if (stores != null && stores.size() > 0) {
zoneId = -1L;
}
return prepare(true, CallContext.current().getCallingUserId(), cmd.getIsoName(), cmd.getDisplayText(), 64, false, return prepare(true, CallContext.current().getCallingUserId(), cmd.getIsoName(), cmd.getDisplayText(), 64, false,
true, cmd.getUrl(), cmd.isPublic(), cmd.isFeatured(), cmd.isExtractable(), ImageFormat.ISO.toString(), cmd.getOsTypeId(), true, cmd.getUrl(), cmd.isPublic(), cmd.isFeatured(), cmd.isExtractable(), ImageFormat.ISO.toString(), cmd.getOsTypeId(),
cmd.getZoneId(), HypervisorType.None, cmd.getChecksum(), cmd.isBootable(), null, owner, null, false, cmd.getImageStoreUuid(), cmd.isDynamicallyScalable(), zoneId, HypervisorType.None, cmd.getChecksum(), cmd.isBootable(), null, owner, null, false, cmd.getImageStoreUuid(), cmd.isDynamicallyScalable(),
TemplateType.USER); TemplateType.USER);
} }
@ -347,6 +361,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
return new TemplateProfile(userId, template, zoneId); return new TemplateProfile(userId, template, zoneId);
} }
@Override
public TemplateProfile prepareExtractTemplate(ExtractTemplateCmd cmd) { public TemplateProfile prepareExtractTemplate(ExtractTemplateCmd cmd) {
Long templateId = cmd.getId(); Long templateId = cmd.getId();
Long userId = CallContext.current().getCallingUserId(); Long userId = CallContext.current().getCallingUserId();
@ -359,6 +374,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
return new TemplateProfile(userId, template, zoneId); return new TemplateProfile(userId, template, zoneId);
} }
@Override
public TemplateProfile prepareDelete(DeleteIsoCmd cmd) { public TemplateProfile prepareDelete(DeleteIsoCmd cmd) {
Long templateId = cmd.getId(); Long templateId = cmd.getId();
Long userId = CallContext.current().getCallingUserId(); Long userId = CallContext.current().getCallingUserId();

View File

@ -123,7 +123,6 @@ import com.cloud.server.ConfigurationServer;
import com.cloud.storage.DataStoreRole; import com.cloud.storage.DataStoreRole;
import com.cloud.storage.GuestOSVO; import com.cloud.storage.GuestOSVO;
import com.cloud.storage.LaunchPermissionVO; import com.cloud.storage.LaunchPermissionVO;
import com.cloud.storage.ScopeType;
import com.cloud.storage.Snapshot; import com.cloud.storage.Snapshot;
import com.cloud.storage.SnapshotVO; import com.cloud.storage.SnapshotVO;
import com.cloud.storage.Storage; import com.cloud.storage.Storage;
@ -698,6 +697,11 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
throw new InvalidParameterValueException("Unable to find template with id"); throw new InvalidParameterValueException("Unable to find template with id");
} }
if (template.isCrossZones()){
s_logger.debug("Template " + templateId + " is cross-zone, don't need to copy");
return template;
}
DataStore dstSecStore = getImageStore(destZoneId, templateId); DataStore dstSecStore = getImageStore(destZoneId, templateId);
if (dstSecStore != null) { if (dstSecStore != null) {
s_logger.debug("There is template " + templateId + " in secondary storage " + dstSecStore.getName() + " in zone " + destZoneId s_logger.debug("There is template " + templateId + " in secondary storage " + dstSecStore.getName() + " in zone " + destZoneId
@ -709,10 +713,6 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
if (srcSecStore == null) { if (srcSecStore == null) {
throw new InvalidParameterValueException("There is no template " + templateId + " in zone " + sourceZoneId); throw new InvalidParameterValueException("There is no template " + templateId + " in zone " + sourceZoneId);
} }
if (srcSecStore.getScope().getScopeType() == ScopeType.REGION) {
s_logger.debug("Template " + templateId + " is in region-wide secondary storage " + srcSecStore.getName() + " , don't need to copy");
return template;
}
_accountMgr.checkAccess(caller, AccessType.ModifyEntry, true, template); _accountMgr.checkAccess(caller, AccessType.ModifyEntry, true, template);