http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b7db056/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java index 0000000,d4c9560..f6d7b40 mode 000000,100644..100644 --- a/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/TemplateJoinDaoImpl.java @@@ -1,0 -1,462 +1,463 @@@ + // Licensed to the Apache Software Foundation (ASF) under one + // or more contributor license agreements. See the NOTICE file + // distributed with this work for additional information + // regarding copyright ownership. The ASF licenses this file + // to you under the Apache License, Version 2.0 (the + // "License"); you may not use this file except in compliance + // with the License. You may obtain a copy of the License at + // + // http://www.apache.org/licenses/LICENSE-2.0 + // + // Unless required by applicable law or agreed to in writing, + // software distributed under the License is distributed on an + // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + // KIND, either express or implied. See the License for the + // specific language governing permissions and limitations + // under the License. + package com.cloud.api.query.dao; + + import java.util.ArrayList; + import java.util.HashMap; + import java.util.List; + import java.util.Map; + + import javax.ejb.Local; + import javax.inject.Inject; + ++import org.apache.log4j.Logger; ++import org.springframework.stereotype.Component; ++ + import org.apache.cloudstack.api.BaseCmd; + import org.apache.cloudstack.api.response.TemplateResponse; + import org.apache.cloudstack.api.response.TemplateZoneResponse; ++import org.apache.cloudstack.context.CallContext; + import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; + import org.apache.cloudstack.engine.subsystem.api.storage.TemplateState; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; + + import com.cloud.api.ApiDBUtils; + import com.cloud.api.ApiResponseHelper; + import com.cloud.api.query.vo.ResourceTagJoinVO; + import com.cloud.api.query.vo.TemplateJoinVO; + import com.cloud.configuration.dao.ConfigurationDao; + import com.cloud.storage.Storage; -import com.cloud.storage.VMTemplateHostVO; + import com.cloud.storage.Storage.TemplateType; ++import com.cloud.storage.VMTemplateHostVO; + import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; + import com.cloud.template.VirtualMachineTemplate; + import com.cloud.user.Account; -import com.cloud.user.UserContext; + import com.cloud.utils.db.GenericDaoBase; + import com.cloud.utils.db.SearchBuilder; + import com.cloud.utils.db.SearchCriteria; + + + @Component + @Local(value={TemplateJoinDao.class}) + public class TemplateJoinDaoImpl extends GenericDaoBase<TemplateJoinVO, Long> implements TemplateJoinDao { + + + + public static final Logger s_logger = Logger.getLogger(TemplateJoinDaoImpl.class); + + @Inject + private ConfigurationDao _configDao; + + private final SearchBuilder<TemplateJoinVO> tmpltSearch; + + private final SearchBuilder<TemplateJoinVO> tmpltIdSearch; + + private final SearchBuilder<TemplateJoinVO> tmpltZoneSearch; + + private final SearchBuilder<TemplateJoinVO> activeTmpltSearch; + + + protected TemplateJoinDaoImpl() { + + tmpltSearch = createSearchBuilder(); + tmpltSearch.and("idIN", tmpltSearch.entity().getId(), SearchCriteria.Op.IN); + tmpltSearch.done(); + + tmpltIdSearch = createSearchBuilder(); + tmpltIdSearch.and("id", tmpltIdSearch.entity().getId(), SearchCriteria.Op.EQ); + tmpltIdSearch.done(); + + tmpltZoneSearch = createSearchBuilder(); + tmpltZoneSearch.and("id", tmpltZoneSearch.entity().getId(), SearchCriteria.Op.EQ); + tmpltZoneSearch.and("dataCenterId", tmpltZoneSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); + tmpltZoneSearch.and("state", tmpltZoneSearch.entity().getState(), SearchCriteria.Op.EQ); + tmpltZoneSearch.done(); + + activeTmpltSearch = createSearchBuilder(); + activeTmpltSearch.and("store_id", activeTmpltSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ); + activeTmpltSearch.and("type", activeTmpltSearch.entity().getTemplateType(), SearchCriteria.Op.EQ); + activeTmpltSearch.done(); + + // select distinct pair (template_id, zone_id) - this._count = "select count(distinct id) from template_view WHERE "; ++ _count = "select count(distinct id) from template_view WHERE "; + } + + + + + @Override + public TemplateResponse newTemplateResponse(TemplateJoinVO template) { + TemplateResponse templateResponse = new TemplateResponse(); + templateResponse.setId(template.getUuid()); + templateResponse.setName(template.getName()); + templateResponse.setDisplayText(template.getDisplayText()); + templateResponse.setPublic(template.isPublicTemplate()); + templateResponse.setCreated(template.getCreatedOnStore()); + if ( template.getFormat() == Storage.ImageFormat.BAREMETAL ){ + // for baremetal template, we didn't download, but is ready to use. + templateResponse.setReady(true); + } + else{ + templateResponse.setReady(template.getState() == ObjectInDataStoreStateMachine.State.Ready); + } + templateResponse.setFeatured(template.isFeatured()); + templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM)); + templateResponse.setPasswordEnabled(template.isEnablePassword()); + templateResponse.setSshKeyEnabled(template.isEnableSshKey()); + templateResponse.setCrossZones(template.isCrossZones()); + templateResponse.setFormat(template.getFormat()); + if (template.getTemplateType() != null) { + templateResponse.setTemplateType(template.getTemplateType().toString()); + } + + templateResponse.setHypervisor(template.getHypervisorType().toString()); + + + templateResponse.setOsTypeId(template.getGuestOSUuid()); + templateResponse.setOsTypeName(template.getGuestOSName()); + + // populate owner. + ApiResponseHelper.populateOwner(templateResponse, template); + + // populate domain + templateResponse.setDomainId(template.getDomainUuid()); + templateResponse.setDomainName(template.getDomainName()); + + + + boolean isAdmin = false; - Account caller = UserContext.current().getCaller(); ++ Account caller = CallContext.current().getCallingAccount(); + if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { + isAdmin = true; + } + + // If the user is an Admin, add the template download status + if (isAdmin || caller.getId() == template.getAccountId()) { + // add download status + if (template.getDownloadState() != Status.DOWNLOADED) { + String templateStatus = "Processing"; + if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (template.getDownloadPercent() == 100) { + templateStatus = "Installing Template"; + } else { + templateStatus = template.getDownloadPercent() + "% Downloaded"; + } + } else { + templateStatus = template.getErrorString(); + } + templateResponse.setStatus(templateStatus); + } else if (template.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + templateResponse.setStatus("Download Complete"); + } else { + templateResponse.setStatus("Successfully Installed"); + } + } + + Long templateSize = template.getSize(); + if (templateSize > 0) { + templateResponse.setSize(templateSize); + } + + templateResponse.setChecksum(template.getChecksum()); + if (template.getSourceTemplateId() != null) { + templateResponse.setSourceTemplateId(template.getSourceTemplateUuid()); + } + templateResponse.setTemplateTag(template.getTemplateTag()); + + // set template zone information + if (template.getDataCenterId() > 0 ){ + TemplateZoneResponse tmplZoneResp = new TemplateZoneResponse(template.getDataCenterUuid(), template.getDataCenterName()); + templateResponse.addZone(tmplZoneResp); + // set the first found associated zone directly in TemplateResponse + templateResponse.setZoneId(template.getDataCenterUuid()); + templateResponse.setZoneName(template.getDataCenterName()); + } + + // set details map + if (template.getDetailName() != null){ + Map<String, String> details = new HashMap<String, String>(); + details.put(template.getDetailName(), template.getDetailValue()); + templateResponse.setDetails(details); + } + + // update tag information + long tag_id = template.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if ( vtag != null ){ + templateResponse.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + + templateResponse.setObjectName("template"); + return templateResponse; + } + + + //TODO: This is to keep compatibility with 4.1 API, where updateTemplateCmd and updateIsoCmd will return a simpler TemplateResponse + // compared to listTemplates and listIsos. + @Override + public TemplateResponse newUpdateResponse(TemplateJoinVO result) { + TemplateResponse response = new TemplateResponse(); + response.setId(result.getUuid()); + response.setName(result.getName()); + response.setDisplayText(result.getDisplayText()); + response.setPublic(result.isPublicTemplate()); + response.setCreated(result.getCreated()); + response.setFormat(result.getFormat()); + response.setOsTypeId(result.getGuestOSUuid()); + response.setOsTypeName(result.getGuestOSName()); + response.setBootable(result.isBootable()); + response.setHypervisor(result.getHypervisorType().toString()); + + // populate owner. + ApiResponseHelper.populateOwner(response, result); + + // populate domain + response.setDomainId(result.getDomainUuid()); + response.setDomainName(result.getDomainName()); + + // set details map + if (result.getDetailName() != null) { + Map<String, String> details = new HashMap<String, String>(); + details.put(result.getDetailName(), result.getDetailValue()); + response.setDetails(details); + } + + // update tag information + long tag_id = result.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if (vtag != null) { + response.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + response.setObjectName("iso"); + return response; + } + + + + + @Override + public TemplateResponse setTemplateResponse(TemplateResponse templateResponse, TemplateJoinVO template) { + + // update template zone information + if (template.getDataCenterId() > 0 ){ + TemplateZoneResponse tmplZoneResp = new TemplateZoneResponse(template.getDataCenterUuid(), template.getDataCenterName()); + templateResponse.addZone(tmplZoneResp); + if (templateResponse.getZoneId() == null) { + // set the first found associated zone directly in + // TemplateResponse + templateResponse.setZoneId(template.getDataCenterUuid()); + templateResponse.setZoneName(template.getDataCenterName()); + } + } + + // update details map + if (template.getDetailName() != null){ + Map<String, String> details = templateResponse.getDetails(); + if ( details == null ){ + details = new HashMap<String, String>(); + } + details.put(template.getDetailName(), template.getDetailValue()); + templateResponse.setDetails(details); + } + + // update tag information + long tag_id = template.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if ( vtag != null ){ + templateResponse.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + return templateResponse; + } + + + @Override + public TemplateResponse newIsoResponse(TemplateJoinVO iso) { + + TemplateResponse isoResponse = new TemplateResponse(); + isoResponse.setId(iso.getUuid()); + isoResponse.setName(iso.getName()); + isoResponse.setDisplayText(iso.getDisplayText()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST)); + isoResponse.setCreated(iso.getCreatedOnStore()); + if ( iso.getTemplateType() == TemplateType.PERHOST ){ + // for xs-tools.iso and vmware-tools.iso, we didn't download, but is ready to use. + isoResponse.setReady(true); + } + else{ + isoResponse.setReady(iso.getState() == ObjectInDataStoreStateMachine.State.Ready); + } + isoResponse.setBootable(iso.isBootable()); + isoResponse.setFeatured(iso.isFeatured()); + isoResponse.setCrossZones(iso.isCrossZones()); + isoResponse.setPublic(iso.isPublicTemplate()); + isoResponse.setChecksum(iso.getChecksum()); + + isoResponse.setOsTypeId(iso.getGuestOSUuid()); + isoResponse.setOsTypeName(iso.getGuestOSName()); + + // populate owner. + ApiResponseHelper.populateOwner(isoResponse, iso); + + // populate domain + isoResponse.setDomainId(iso.getDomainUuid()); + isoResponse.setDomainName(iso.getDomainName()); + + // set template zone information + if (iso.getDataCenterId() > 0 ){ + TemplateZoneResponse tmplZoneResp = new TemplateZoneResponse(iso.getDataCenterUuid(), iso.getDataCenterName()); + isoResponse.addZone(tmplZoneResp); + // set the first found associated zone directly in TemplateResponse + isoResponse.setZoneId(iso.getDataCenterUuid()); + isoResponse.setZoneName(iso.getDataCenterName()); + } + + - Account caller = UserContext.current().getCaller(); ++ Account caller = CallContext.current().getCallingAccount(); + boolean isAdmin = false; + if ((caller == null) || BaseCmd.isAdmin(caller.getType())) { + isAdmin = true; + } + + + // If the user is an admin, add the template download status + if (isAdmin || caller.getId() == iso.getAccountId()) { + // add download status + if (iso.getDownloadState() != Status.DOWNLOADED) { + String isoStatus = "Processing"; + if (iso.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) { + isoStatus = "Download Complete"; + } else if (iso.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) { + if (iso.getDownloadPercent() == 100) { + isoStatus = "Installing ISO"; + } else { + isoStatus = iso.getDownloadPercent() + "% Downloaded"; + } + } else { + isoStatus = iso.getErrorString(); + } + isoResponse.setStatus(isoStatus); + } else { + isoResponse.setStatus("Successfully Installed"); + } + } + + Long isoSize = iso.getSize(); + if (isoSize > 0) { + isoResponse.setSize(isoSize); + } + + // update tag information + long tag_id = iso.getTagId(); + if (tag_id > 0) { + ResourceTagJoinVO vtag = ApiDBUtils.findResourceTagViewById(tag_id); + if ( vtag != null ){ + isoResponse.addTag(ApiDBUtils.newResourceTagResponse(vtag, false)); + } + } + + isoResponse.setObjectName("iso"); + return isoResponse; + + } + + @Override + public List<TemplateJoinVO> newTemplateView(VirtualMachineTemplate template) { + SearchCriteria<TemplateJoinVO> sc = tmpltIdSearch.create(); + sc.setParameters("id", template.getId()); + return searchIncludingRemoved(sc, null, null, false); + } + + @Override + public List<TemplateJoinVO> newTemplateView(VirtualMachineTemplate template, long zoneId, boolean readyOnly) { + SearchCriteria<TemplateJoinVO> sc = tmpltZoneSearch.create(); + sc.setParameters("id", template.getId()); + sc.setParameters("dataCenterId", zoneId); + if ( readyOnly ){ + sc.setParameters("state", TemplateState.Ready); + } + return searchIncludingRemoved(sc, null, null, false); + } + + + + @Override + public List<TemplateJoinVO> searchByIds(Long... tmplIds) { + // set detail batch query size + int DETAILS_BATCH_SIZE = 2000; + String batchCfg = _configDao.getValue("detail.batch.query.size"); + if ( batchCfg != null ){ + DETAILS_BATCH_SIZE = Integer.parseInt(batchCfg); + } + // query details by batches + List<TemplateJoinVO> uvList = new ArrayList<TemplateJoinVO>(); + // query details by batches + int curr_index = 0; + if ( tmplIds.length > DETAILS_BATCH_SIZE ){ + while ( (curr_index + DETAILS_BATCH_SIZE ) <= tmplIds.length ) { + Long[] ids = new Long[DETAILS_BATCH_SIZE]; + for (int k = 0, j = curr_index; j < curr_index + DETAILS_BATCH_SIZE; j++, k++) { + ids[k] = tmplIds[j]; + } + SearchCriteria<TemplateJoinVO> sc = tmpltSearch.create(); + sc.setParameters("idIN", ids); + List<TemplateJoinVO> vms = searchIncludingRemoved(sc, null, null, false); + if (vms != null) { + uvList.addAll(vms); + } + curr_index += DETAILS_BATCH_SIZE; + } + } + if (curr_index < tmplIds.length) { + int batch_size = (tmplIds.length - curr_index); + // set the ids value + Long[] ids = new Long[batch_size]; + for (int k = 0, j = curr_index; j < curr_index + batch_size; j++, k++) { + ids[k] = tmplIds[j]; + } + SearchCriteria<TemplateJoinVO> sc = tmpltSearch.create(); + sc.setParameters("idIN", ids); + List<TemplateJoinVO> vms = searchIncludingRemoved(sc, null, null, false); + if (vms != null) { + uvList.addAll(vms); + } + } + return uvList; + } + + + + + @Override + public List<TemplateJoinVO> listActiveTemplates(long storeId) { + SearchCriteria<TemplateJoinVO> sc = activeTmpltSearch.create(); + sc.setParameters("store_id", storeId); + sc.setParameters("type", TemplateType.USER); + return searchIncludingRemoved(sc, null, null, false); + } + + + + }
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b7db056/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java index 5406122,ed2732e..562cf65 --- a/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/VolumeJoinDaoImpl.java @@@ -87,8 -86,7 +87,7 @@@ public class VolumeJoinDaoImpl extends volResponse.setZoneId(volume.getDataCenterUuid()); volResponse.setZoneName(volume.getDataCenterName()); - volResponse.setZoneType(volume.getDataCenterType()); - + volResponse.setVolumeType(volume.getVolumeType().toString()); volResponse.setDeviceId(volume.getDeviceId()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b7db056/server/src/com/cloud/capacity/CapacityManager.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b7db056/server/src/com/cloud/capacity/CapacityManagerImpl.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b7db056/server/src/com/cloud/configuration/Config.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/configuration/Config.java index 7cb6c6b,3a6d3aa..390b51e --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@@ -72,7 -72,10 +72,10 @@@ public enum Config StorageOverprovisioningFactor("Storage", StoragePoolAllocator.class, String.class, "storage.overprovisioning.factor", "2", "Used for storage overprovisioning calculation; available storage will be (actualStorageSize * storage.overprovisioning.factor)", null, ConfigurationParameterScope.zone.toString()), StorageStatsInterval("Storage", ManagementServer.class, String.class, "storage.stats.interval", "60000", "The interval (in milliseconds) when storage stats (per host) are retrieved from agents.", null), MaxVolumeSize("Storage", ManagementServer.class, Integer.class, "storage.max.volume.size", "2000", "The maximum size for a volume (in GB).", null), + StorageCacheReplacementLRUTimeInterval("Storage", ManagementServer.class, Integer.class, "storage.cache.replacement.lru.interval", "30", "time interval for unsed data on cache storage (in days).", null), + StorageCacheReplacementEnabled("Storage", ManagementServer.class, Boolean.class, "storage.cache.replacement.enabled", "true", "enable or disable cache storage replacement algorithm.", null), + StorageCacheReplacementInterval("Storage", ManagementServer.class, Integer.class, "storage.cache.replacement.interval", "86400", "time interval between cache replacement threads (in seconds).", null), - MaxUploadVolumeSize("Storage", ManagementServer.class, Integer.class, "storage.max.volume.upload.size", "500", "The maximum size for a uploaded volume(in GB).", null), + MaxUploadVolumeSize("Storage", ManagementServer.class, Integer.class, "storage.max.volume.upload.size", "500", "The maximum size for a uploaded volume(in GB).", null), TotalRetries("Storage", AgentManager.class, Integer.class, "total.retries", "4", "The number of times each command sent to a host should be retried in case of failure.", null), StoragePoolMaxWaitSeconds("Storage", ManagementServer.class, Integer.class, "storage.pool.max.waitseconds", "3600", "Timeout (in seconds) to synchronize storage pool operations.", null), StorageTemplateCleanupEnabled("Storage", ManagementServer.class, Boolean.class, "storage.template.cleanup.enabled", "true", "Enable/disable template cleanup activity, only take effect when overall storage cleanup is enabled", null), @@@ -413,7 -419,9 +420,9 @@@ ApiLimitMax("Advanced", ManagementServer.class, Integer.class, "api.throttling.max", "25", "Max allowed number of APIs within fixed interval", null), ApiLimitCacheSize("Advanced", ManagementServer.class, Integer.class, "api.throttling.cachesize", "50000", "Account based API count cache size", null), + // object store + S3EnableRRS("Advanced", ManagementServer.class, Boolean.class, "s3.rrs.enabled", "false", "enable s3 reduced redundancy storage", null), - + // VMSnapshots VMSnapshotMax("Advanced", VMSnapshotManager.class, Integer.class, "vmsnapshot.max", "10", "Maximum vm snapshots for a vm", null), VMSnapshotCreateWait("Advanced", VMSnapshotManager.class, Integer.class, "vmsnapshot.create.wait", "1800", "In second, timeout for create vm snapshot", null), http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7b7db056/server/src/com/cloud/configuration/ConfigurationManager.java ----------------------------------------------------------------------