mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
CLOUDSTACK-3950:Set cross-zone flag in registerTemplate/registerIso in
case of region-wide secondary is enabled.
This commit is contained in:
parent
fe012f29e8
commit
3bd2bbf59d
@ -31,6 +31,8 @@ public interface ImageStoreDao extends GenericDao<ImageStoreVO, Long> {
|
||||
|
||||
List<ImageStoreVO> findByScope(ZoneScope scope);
|
||||
|
||||
List<ImageStoreVO> findRegionImageStores();
|
||||
|
||||
List<ImageStoreVO> findImageCacheByScope(ZoneScope scope);
|
||||
|
||||
List<ImageStoreVO> listImageStores();
|
||||
|
||||
@ -38,6 +38,7 @@ import com.cloud.utils.db.SearchCriteria;
|
||||
public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implements ImageStoreDao {
|
||||
private SearchBuilder<ImageStoreVO> nameSearch;
|
||||
private SearchBuilder<ImageStoreVO> providerSearch;
|
||||
private SearchBuilder<ImageStoreVO> regionSearch;
|
||||
|
||||
@Override
|
||||
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.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();
|
||||
|
||||
regionSearch = createSearchBuilder();
|
||||
regionSearch.and("scope", regionSearch.entity().getScope(), SearchCriteria.Op.EQ);
|
||||
regionSearch.and("role", regionSearch.entity().getRole(), SearchCriteria.Op.EQ);
|
||||
regionSearch.done();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -86,6 +92,14 @@ public class ImageStoreDaoImpl extends GenericDaoBase<ImageStoreVO, Long> implem
|
||||
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
|
||||
public List<ImageStoreVO> findImageCacheByScope(ZoneScope scope) {
|
||||
SearchCriteria<ImageStoreVO> sc = createSearchCriteria();
|
||||
|
||||
@ -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.framework.config.ConfigurationVO;
|
||||
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.StoragePoolVO;
|
||||
import org.apache.cloudstack.utils.identity.ManagementServerNode;
|
||||
@ -675,6 +677,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
||||
private List<StoragePoolAllocator> _storagePoolAllocators;
|
||||
@Inject
|
||||
private ResourceTagDao _resourceTagDao;
|
||||
@Inject
|
||||
private ImageStoreDao _imgStoreDao;
|
||||
|
||||
@Inject
|
||||
ProjectManager _projectMgr;
|
||||
@ -3256,6 +3260,13 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
||||
Integer apiLimitInterval = Integer.valueOf(_configDao.getValue(Config.ApiLimitInterval.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("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("allowusercreateprojects", _projectMgr.allowUserToCreateProject());
|
||||
capabilities.put("customDiskOffMaxSize", diskOffMaxSize);
|
||||
capabilities.put("regionSecondaryEnabled", regionSecondaryEnabled);
|
||||
if (apiLimitEnabled) {
|
||||
capabilities.put("apiLimitInterval", apiLimitInterval);
|
||||
capabilities.put("apiLimitMax", apiLimitMax);
|
||||
|
||||
@ -21,6 +21,8 @@ import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import org.apache.cloudstack.api.ApiConstants;
|
||||
import org.apache.cloudstack.api.command.user.iso.DeleteIsoCmd;
|
||||
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.RegisterTemplateCmd;
|
||||
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.storage.datastore.db.ImageStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.ImageStoreVO;
|
||||
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.api.ApiDBUtils;
|
||||
import com.cloud.configuration.Config;
|
||||
import com.cloud.configuration.Resource.ResourceType;
|
||||
@ -86,7 +86,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
|
||||
protected @Inject UserVmDao _userVmDao;
|
||||
protected @Inject GuestOSHypervisorDao _osHyperDao;
|
||||
protected @Inject ResourceLimitService _resourceLimitMgr;
|
||||
protected @Inject DataStoreManager storeMgr;
|
||||
protected @Inject ImageStoreDao _imgStoreDao;
|
||||
@Inject TemplateManager templateMgr;
|
||||
@Inject ConfigurationServer _configServer;
|
||||
@Inject ProjectManager _projectMgr;
|
||||
@ -232,9 +232,16 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
|
||||
|
||||
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(),
|
||||
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(),
|
||||
isRouting ? TemplateType.ROUTING : TemplateType.USER);
|
||||
|
||||
@ -247,9 +254,16 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
|
||||
Account owner = _accountMgr.getAccount(cmd.getEntityOwnerId());
|
||||
_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,
|
||||
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);
|
||||
}
|
||||
|
||||
@ -347,6 +361,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
|
||||
return new TemplateProfile(userId, template, zoneId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TemplateProfile prepareExtractTemplate(ExtractTemplateCmd cmd) {
|
||||
Long templateId = cmd.getId();
|
||||
Long userId = CallContext.current().getCallingUserId();
|
||||
@ -359,6 +374,7 @@ public abstract class TemplateAdapterBase extends AdapterBase implements Templat
|
||||
return new TemplateProfile(userId, template, zoneId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TemplateProfile prepareDelete(DeleteIsoCmd cmd) {
|
||||
Long templateId = cmd.getId();
|
||||
Long userId = CallContext.current().getCallingUserId();
|
||||
|
||||
@ -123,7 +123,6 @@ import com.cloud.server.ConfigurationServer;
|
||||
import com.cloud.storage.DataStoreRole;
|
||||
import com.cloud.storage.GuestOSVO;
|
||||
import com.cloud.storage.LaunchPermissionVO;
|
||||
import com.cloud.storage.ScopeType;
|
||||
import com.cloud.storage.Snapshot;
|
||||
import com.cloud.storage.SnapshotVO;
|
||||
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");
|
||||
}
|
||||
|
||||
if (template.isCrossZones()){
|
||||
s_logger.debug("Template " + templateId + " is cross-zone, don't need to copy");
|
||||
return template;
|
||||
}
|
||||
|
||||
DataStore dstSecStore = getImageStore(destZoneId, templateId);
|
||||
if (dstSecStore != null) {
|
||||
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) {
|
||||
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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user