blob: d22850b93f5d796ff53db3de41d5c0df83f7f60e [file] [log] [blame]
// 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;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.affinity.AffinityGroupResponse;
import org.apache.cloudstack.api.ApiConstants.DomainDetails;
import org.apache.cloudstack.api.ApiConstants.HostDetails;
import org.apache.cloudstack.api.ApiConstants.VMDetails;
import org.apache.cloudstack.api.ResponseObject.ResponseView;
import org.apache.cloudstack.api.response.AccountResponse;
import org.apache.cloudstack.api.response.AsyncJobResponse;
import org.apache.cloudstack.api.response.DiskOfferingResponse;
import org.apache.cloudstack.api.response.DomainResponse;
import org.apache.cloudstack.api.response.DomainRouterResponse;
import org.apache.cloudstack.api.response.EventResponse;
import org.apache.cloudstack.api.response.HostForMigrationResponse;
import org.apache.cloudstack.api.response.HostResponse;
import org.apache.cloudstack.api.response.HostTagResponse;
import org.apache.cloudstack.api.response.ImageStoreResponse;
import org.apache.cloudstack.api.response.InstanceGroupResponse;
import org.apache.cloudstack.api.response.ObjectStoreResponse;
import org.apache.cloudstack.api.response.ProjectAccountResponse;
import org.apache.cloudstack.api.response.ProjectInvitationResponse;
import org.apache.cloudstack.api.response.ProjectResponse;
import org.apache.cloudstack.api.response.ResourceTagResponse;
import org.apache.cloudstack.api.response.SecurityGroupResponse;
import org.apache.cloudstack.api.response.ServiceOfferingResponse;
import org.apache.cloudstack.api.response.SnapshotResponse;
import org.apache.cloudstack.api.response.StoragePoolResponse;
import org.apache.cloudstack.api.response.StorageTagResponse;
import org.apache.cloudstack.api.response.TemplateResponse;
import org.apache.cloudstack.api.response.UserResponse;
import org.apache.cloudstack.api.response.UserVmResponse;
import org.apache.cloudstack.api.response.VolumeResponse;
import org.apache.cloudstack.api.response.ZoneResponse;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.storage.datastore.db.ObjectStoreVO;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import com.cloud.api.ApiDBUtils;
import com.cloud.api.query.vo.AccountJoinVO;
import com.cloud.api.query.vo.AffinityGroupJoinVO;
import com.cloud.api.query.vo.AsyncJobJoinVO;
import com.cloud.api.query.vo.DataCenterJoinVO;
import com.cloud.api.query.vo.DiskOfferingJoinVO;
import com.cloud.api.query.vo.DomainJoinVO;
import com.cloud.api.query.vo.DomainRouterJoinVO;
import com.cloud.api.query.vo.EventJoinVO;
import com.cloud.api.query.vo.HostJoinVO;
import com.cloud.api.query.vo.HostTagVO;
import com.cloud.api.query.vo.ImageStoreJoinVO;
import com.cloud.api.query.vo.InstanceGroupJoinVO;
import com.cloud.api.query.vo.ProjectAccountJoinVO;
import com.cloud.api.query.vo.ProjectInvitationJoinVO;
import com.cloud.api.query.vo.ProjectJoinVO;
import com.cloud.api.query.vo.ResourceTagJoinVO;
import com.cloud.api.query.vo.SecurityGroupJoinVO;
import com.cloud.api.query.vo.ServiceOfferingJoinVO;
import com.cloud.api.query.vo.SnapshotJoinVO;
import com.cloud.api.query.vo.StoragePoolJoinVO;
import com.cloud.api.query.vo.TemplateJoinVO;
import com.cloud.api.query.vo.UserAccountJoinVO;
import com.cloud.api.query.vo.UserVmJoinVO;
import com.cloud.api.query.vo.VolumeJoinVO;
import com.cloud.configuration.Resource;
import com.cloud.domain.Domain;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.StoragePoolTagVO;
import com.cloud.storage.VolumeStats;
import com.cloud.user.Account;
/**
* Helper class to generate response from DB view VO objects.
*
*/
public class ViewResponseHelper {
protected Logger logger = LogManager.getLogger(getClass());
public static List<UserResponse> createUserResponse(UserAccountJoinVO... users) {
return createUserResponse(null, users);
}
public static List<UserResponse> createUserResponse(Long domainId, UserAccountJoinVO... users) {
List<UserResponse> respList = new ArrayList<UserResponse>();
for (UserAccountJoinVO vt : users) {
respList.add(ApiDBUtils.newUserResponse(vt, domainId));
}
return respList;
}
public static List<EventResponse> createEventResponse(EventJoinVO... events) {
List<EventResponse> respList = new ArrayList<EventResponse>();
for (EventJoinVO vt : events) {
respList.add(ApiDBUtils.newEventResponse(vt));
}
return respList;
}
public static List<ResourceTagResponse> createResourceTagResponse(boolean keyValueOnly, ResourceTagJoinVO... tags) {
List<ResourceTagResponse> respList = new ArrayList<ResourceTagResponse>();
for (ResourceTagJoinVO vt : tags) {
respList.add(ApiDBUtils.newResourceTagResponse(vt, keyValueOnly));
}
return respList;
}
public static List<InstanceGroupResponse> createInstanceGroupResponse(InstanceGroupJoinVO... groups) {
List<InstanceGroupResponse> respList = new ArrayList<InstanceGroupResponse>();
for (InstanceGroupJoinVO vt : groups) {
respList.add(ApiDBUtils.newInstanceGroupResponse(vt));
}
return respList;
}
public static List<UserVmResponse> createUserVmResponse(ResponseView view, String objectName, UserVmJoinVO... userVms) {
return createUserVmResponse(view, objectName, EnumSet.of(VMDetails.all), null, null, userVms);
}
public static List<UserVmResponse> createUserVmResponse(ResponseView view, String objectName, Set<VMDetails> details, UserVmJoinVO... userVms) {
return createUserVmResponse(view, objectName, details, null, null, userVms);
}
public static List<UserVmResponse> createUserVmResponse(ResponseView view, String objectName, Set<VMDetails> details, Boolean accumulateStats, UserVmJoinVO... userVms) {
return createUserVmResponse(view, objectName, details, accumulateStats, null, userVms);
}
public static List<UserVmResponse> createUserVmResponse(ResponseView view, String objectName, Set<VMDetails> details, Boolean accumulateStats, Boolean showUserData,
UserVmJoinVO... userVms) {
Account caller = CallContext.current().getCallingAccount();
LinkedHashMap<Long, UserVmResponse> vmDataList = new LinkedHashMap<>();
// Initialise the vmdatalist with the input data
for (UserVmJoinVO userVm : userVms) {
UserVmResponse userVmData = vmDataList.get(userVm.getId());
if (userVmData == null) {
// first time encountering this vm
userVmData = ApiDBUtils.newUserVmResponse(view, objectName, userVm, details, accumulateStats, showUserData, caller);
} else{
// update nics, securitygroups, tags, affinitygroups for 1 to many mapping fields
userVmData = ApiDBUtils.fillVmDetails(view, userVmData, userVm);
}
vmDataList.put(userVm.getId(), userVmData);
}
return new ArrayList<UserVmResponse>(vmDataList.values());
}
public static List<DomainRouterResponse> createDomainRouterResponse(DomainRouterJoinVO... routers) {
Account caller = CallContext.current().getCallingAccount();
LinkedHashMap<Long, DomainRouterResponse> vrDataList = new LinkedHashMap<>();
// Initialise the vrdatalist with the input data
for (DomainRouterJoinVO vr : routers) {
DomainRouterResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this vm
vrData = ApiDBUtils.newDomainRouterResponse(vr, caller);
} else {
// update nics for 1 to many mapping fields
vrData = ApiDBUtils.fillRouterDetails(vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<DomainRouterResponse>(vrDataList.values());
}
public static List<SecurityGroupResponse> createSecurityGroupResponses(List<SecurityGroupJoinVO> securityGroups) {
Account caller = CallContext.current().getCallingAccount();
LinkedHashMap<Long, SecurityGroupResponse> vrDataList = new LinkedHashMap<>();
// Initialise the vrdatalist with the input data
for (SecurityGroupJoinVO vr : securityGroups) {
SecurityGroupResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this sg
vrData = ApiDBUtils.newSecurityGroupResponse(vr, caller);
} else {
// update rules for 1 to many mapping fields
vrData = ApiDBUtils.fillSecurityGroupDetails(vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<SecurityGroupResponse>(vrDataList.values());
}
public static List<ProjectResponse> createProjectResponse(EnumSet<DomainDetails> details, ProjectJoinVO... projects) {
LinkedHashMap<Long, ProjectResponse> prjDataList = new LinkedHashMap<>();
// Initialise the prjdatalist with the input data
for (ProjectJoinVO p : projects) {
ProjectResponse pData = prjDataList.get(p.getId());
if (pData == null) {
// first time encountering this vm
pData = ApiDBUtils.newProjectResponse(details, p);
prjDataList.put(p.getId(), pData);
}
}
return new ArrayList<ProjectResponse>(prjDataList.values());
}
public static List<ProjectAccountResponse> createProjectAccountResponse(ProjectAccountJoinVO... projectAccounts) {
List<ProjectAccountResponse> responseList = new ArrayList<ProjectAccountResponse>();
for (ProjectAccountJoinVO proj : projectAccounts) {
ProjectAccountResponse resp = ApiDBUtils.newProjectAccountResponse(proj);
// update user list
Account caller = CallContext.current().getCallingAccount();
if (ApiDBUtils.isAdmin(caller)) {
List<UserAccountJoinVO> users = null;
if (proj.getUserUuid() != null) {
users = Collections.singletonList(ApiDBUtils.findUserAccountById(proj.getUserId()));
} else {
users = ApiDBUtils.findUserViewByAccountId(proj.getAccountId());
}
resp.setUsers(ViewResponseHelper.createUserResponse(users.toArray(new UserAccountJoinVO[users.size()])));
}
responseList.add(resp);
}
return responseList;
}
public static List<ProjectInvitationResponse> createProjectInvitationResponse(ProjectInvitationJoinVO... invites) {
List<ProjectInvitationResponse> respList = new ArrayList<ProjectInvitationResponse>();
for (ProjectInvitationJoinVO v : invites) {
respList.add(ApiDBUtils.newProjectInvitationResponse(v));
}
return respList;
}
public static List<HostResponse> createHostResponse(EnumSet<HostDetails> details, HostJoinVO... hosts) {
LinkedHashMap<Long, HostResponse> vrDataList = new LinkedHashMap<>();
// Initialise the vrdatalist with the input data
for (HostJoinVO vr : hosts) {
HostResponse vrData = ApiDBUtils.newHostResponse(vr, details);
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<HostResponse>(vrDataList.values());
}
public static List<HostForMigrationResponse> createHostForMigrationResponse(EnumSet<HostDetails> details, HostJoinVO... hosts) {
LinkedHashMap<Long, HostForMigrationResponse> vrDataList = new LinkedHashMap<>();
// Initialise the vrdatalist with the input data
for (HostJoinVO vr : hosts) {
HostForMigrationResponse vrData = ApiDBUtils.newHostForMigrationResponse(vr, details);
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<HostForMigrationResponse>(vrDataList.values());
}
public static List<VolumeResponse> createVolumeResponse(ResponseView view, VolumeJoinVO... volumes) {
LinkedHashMap<Long, VolumeResponse> vrDataList = new LinkedHashMap<>();
DecimalFormat df = new DecimalFormat("0.0%");
for (VolumeJoinVO vr : volumes) {
VolumeResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this volume
vrData = ApiDBUtils.newVolumeResponse(view, vr);
}
else{
// update tags
vrData = ApiDBUtils.fillVolumeDetails(view, vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
VolumeStats vs = null;
if (vr.getFormat() == ImageFormat.VHD || vr.getFormat() == ImageFormat.QCOW2 || vr.getFormat() == ImageFormat.RAW) {
if (vrData.getPath() != null) {
vs = ApiDBUtils.getVolumeStatistics(vrData.getPath());
}
} else if (vr.getFormat() == ImageFormat.OVA) {
if (vrData.getChainInfo() != null) {
vs = ApiDBUtils.getVolumeStatistics(vrData.getChainInfo());
}
}
if (vs != null) {
long vsz = vs.getVirtualSize();
long psz = vs.getPhysicalSize() ;
double util = (double)psz/vsz;
vrData.setUtilization(df.format(util));
if (view == ResponseView.Full) {
vrData.setVirtualsize(vsz);
vrData.setPhysicalsize(psz);
}
}
}
return new ArrayList<VolumeResponse>(vrDataList.values());
}
public static List<StoragePoolResponse> createStoragePoolResponse(StoragePoolJoinVO... pools) {
LinkedHashMap<Long, StoragePoolResponse> vrDataList = new LinkedHashMap<>();
// Initialise the vrdatalist with the input data
for (StoragePoolJoinVO vr : pools) {
StoragePoolResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this vm
vrData = ApiDBUtils.newStoragePoolResponse(vr);
} else {
// update tags
vrData = ApiDBUtils.fillStoragePoolDetails(vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<StoragePoolResponse>(vrDataList.values());
}
public static List<StorageTagResponse> createStorageTagResponse(StoragePoolTagVO... storageTags) {
ArrayList<StorageTagResponse> list = new ArrayList<StorageTagResponse>();
for (StoragePoolTagVO vr : storageTags) {
list.add(ApiDBUtils.newStorageTagResponse(vr));
}
return list;
}
public static List<HostTagResponse> createHostTagResponse(HostTagVO... hostTags) {
ArrayList<HostTagResponse> list = new ArrayList<HostTagResponse>();
for (HostTagVO vr : hostTags) {
list.add(ApiDBUtils.newHostTagResponse(vr));
}
return list;
}
public static List<ImageStoreResponse> createImageStoreResponse(ImageStoreJoinVO... stores) {
LinkedHashMap<Long, ImageStoreResponse> vrDataList = new LinkedHashMap<>();
// Initialise the vrdatalist with the input data
for (ImageStoreJoinVO vr : stores) {
ImageStoreResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this vm
vrData = ApiDBUtils.newImageStoreResponse(vr);
} else {
// update tags
vrData = ApiDBUtils.fillImageStoreDetails(vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<ImageStoreResponse>(vrDataList.values());
}
public static List<StoragePoolResponse> createStoragePoolForMigrationResponse(StoragePoolJoinVO... pools) {
LinkedHashMap<Long, StoragePoolResponse> vrDataList = new LinkedHashMap<>();
// Initialise the vrdatalist with the input data
for (StoragePoolJoinVO vr : pools) {
StoragePoolResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this vm
vrData = ApiDBUtils.newStoragePoolForMigrationResponse(vr);
} else {
// update tags
vrData = ApiDBUtils.fillStoragePoolForMigrationDetails(vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<StoragePoolResponse>(vrDataList.values());
}
public static List<DomainResponse> createDomainResponse(ResponseView view, EnumSet<DomainDetails> details, List<DomainJoinVO> domains) {
List<DomainResponse> respList = new ArrayList<DomainResponse>();
//-- Coping the list to keep original order
List<DomainJoinVO> domainsCopy = new ArrayList<>(domains);
Collections.sort(domainsCopy, DomainJoinVO.domainIdComparator);
for (DomainJoinVO domainJoinVO : domains){
//-- Set parent information
DomainJoinVO parentDomainJoinVO = searchParentDomainUsingBinary(domainsCopy, domainJoinVO);
if(parentDomainJoinVO == null && domainJoinVO.getParent() != null) {
//-- fetch the parent from the database
parentDomainJoinVO = ApiDBUtils.findDomainJoinVOById(domainJoinVO.getParent());
if(parentDomainJoinVO != null) {
//-- Add parent domain to the domain copy for future use
domainsCopy.add(parentDomainJoinVO);
Collections.sort(domainsCopy, DomainJoinVO.domainIdComparator);
}
}
if(parentDomainJoinVO != null) {
domainJoinVO.setParentName(parentDomainJoinVO.getName());
domainJoinVO.setParentUuid(parentDomainJoinVO.getUuid());
}
//-- Set correct resource limits
if(domainJoinVO.getParent() != null && domainJoinVO.getParent() != Domain.ROOT_DOMAIN) {
Map<Resource.ResourceType, Long> resourceLimitMap = new HashMap<>();
copyResourceLimitsIntoMap(resourceLimitMap, domainJoinVO);
//-- Fetching the parent domain resource limit if absent in current domain
setParentResourceLimitIfNeeded(resourceLimitMap, domainJoinVO, domainsCopy);
//-- copy the final correct resource limit
copyResourceLimitsFromMap(resourceLimitMap, domainJoinVO);
}
respList.add(ApiDBUtils.newDomainResponse(view, details, domainJoinVO));
}
return respList;
}
private static DomainJoinVO searchParentDomainUsingBinary(List<DomainJoinVO> domainsCopy, DomainJoinVO domainJoinVO){
Long parentId = domainJoinVO.getParent() == null ? 0 : domainJoinVO.getParent();
int totalDomains = domainsCopy.size();
int left = 0;
int right = totalDomains -1;
while(left <= right){
int middle = (left + right) /2;
DomainJoinVO middleObject = domainsCopy.get(middle);
if(middleObject.getId() == parentId){
return middleObject;
}
if(middleObject.getId() > parentId){
right = middle - 1 ;
}
else{
left = middle + 1;
}
}
return null;
}
private static void copyResourceLimitsIntoMap(Map<Resource.ResourceType, Long> resourceLimitMap, DomainJoinVO domainJoinVO){
resourceLimitMap.put(Resource.ResourceType.user_vm, domainJoinVO.getVmLimit());
resourceLimitMap.put(Resource.ResourceType.public_ip, domainJoinVO.getIpLimit());
resourceLimitMap.put(Resource.ResourceType.volume, domainJoinVO.getVolumeLimit());
resourceLimitMap.put(Resource.ResourceType.snapshot, domainJoinVO.getSnapshotLimit());
resourceLimitMap.put(Resource.ResourceType.template, domainJoinVO.getTemplateLimit());
resourceLimitMap.put(Resource.ResourceType.network, domainJoinVO.getNetworkLimit());
resourceLimitMap.put(Resource.ResourceType.vpc, domainJoinVO.getVpcLimit());
resourceLimitMap.put(Resource.ResourceType.cpu, domainJoinVO.getCpuLimit());
resourceLimitMap.put(Resource.ResourceType.memory, domainJoinVO.getMemoryLimit());
resourceLimitMap.put(Resource.ResourceType.primary_storage, domainJoinVO.getPrimaryStorageLimit());
resourceLimitMap.put(Resource.ResourceType.secondary_storage, domainJoinVO.getSecondaryStorageLimit());
resourceLimitMap.put(Resource.ResourceType.project, domainJoinVO.getProjectLimit());
}
private static void copyResourceLimitsFromMap(Map<Resource.ResourceType, Long> resourceLimitMap, DomainJoinVO domainJoinVO){
domainJoinVO.setVmLimit(resourceLimitMap.get(Resource.ResourceType.user_vm));
domainJoinVO.setIpLimit(resourceLimitMap.get(Resource.ResourceType.public_ip));
domainJoinVO.setVolumeLimit(resourceLimitMap.get(Resource.ResourceType.volume));
domainJoinVO.setSnapshotLimit(resourceLimitMap.get(Resource.ResourceType.snapshot));
domainJoinVO.setTemplateLimit(resourceLimitMap.get(Resource.ResourceType.template));
domainJoinVO.setNetworkLimit(resourceLimitMap.get(Resource.ResourceType.network));
domainJoinVO.setVpcLimit(resourceLimitMap.get(Resource.ResourceType.vpc));
domainJoinVO.setCpuLimit(resourceLimitMap.get(Resource.ResourceType.cpu));
domainJoinVO.setMemoryLimit(resourceLimitMap.get(Resource.ResourceType.memory));
domainJoinVO.setPrimaryStorageLimit(resourceLimitMap.get(Resource.ResourceType.primary_storage));
domainJoinVO.setSecondaryStorageLimit(resourceLimitMap.get(Resource.ResourceType.secondary_storage));
domainJoinVO.setProjectLimit(resourceLimitMap.get(Resource.ResourceType.project));
}
private static void setParentResourceLimitIfNeeded(Map<Resource.ResourceType, Long> resourceLimitMap, DomainJoinVO domainJoinVO, List<DomainJoinVO> domainsCopy) {
DomainJoinVO parentDomainJoinVO = searchParentDomainUsingBinary(domainsCopy, domainJoinVO);
if(parentDomainJoinVO != null) {
Long vmLimit = resourceLimitMap.get(Resource.ResourceType.user_vm);
Long ipLimit = resourceLimitMap.get(Resource.ResourceType.public_ip);
Long volumeLimit = resourceLimitMap.get(Resource.ResourceType.volume);
Long snapshotLimit = resourceLimitMap.get(Resource.ResourceType.snapshot);
Long templateLimit = resourceLimitMap.get(Resource.ResourceType.template);
Long networkLimit = resourceLimitMap.get(Resource.ResourceType.network);
Long vpcLimit = resourceLimitMap.get(Resource.ResourceType.vpc);
Long cpuLimit = resourceLimitMap.get(Resource.ResourceType.cpu);
Long memoryLimit = resourceLimitMap.get(Resource.ResourceType.memory);
Long primaryStorageLimit = resourceLimitMap.get(Resource.ResourceType.primary_storage);
Long secondaryStorageLimit = resourceLimitMap.get(Resource.ResourceType.secondary_storage);
Long projectLimit = resourceLimitMap.get(Resource.ResourceType.project);
if (vmLimit == null) {
vmLimit = parentDomainJoinVO.getVmLimit();
resourceLimitMap.put(Resource.ResourceType.user_vm, vmLimit);
}
if (ipLimit == null) {
ipLimit = parentDomainJoinVO.getIpLimit();
resourceLimitMap.put(Resource.ResourceType.public_ip, ipLimit);
}
if (volumeLimit == null) {
volumeLimit = parentDomainJoinVO.getVolumeLimit();
resourceLimitMap.put(Resource.ResourceType.volume, volumeLimit);
}
if (snapshotLimit == null) {
snapshotLimit = parentDomainJoinVO.getSnapshotLimit();
resourceLimitMap.put(Resource.ResourceType.snapshot, snapshotLimit);
}
if (templateLimit == null) {
templateLimit = parentDomainJoinVO.getTemplateLimit();
resourceLimitMap.put(Resource.ResourceType.template, templateLimit);
}
if (networkLimit == null) {
networkLimit = parentDomainJoinVO.getNetworkLimit();
resourceLimitMap.put(Resource.ResourceType.network, networkLimit);
}
if (vpcLimit == null) {
vpcLimit = parentDomainJoinVO.getVpcLimit();
resourceLimitMap.put(Resource.ResourceType.vpc, vpcLimit);
}
if (cpuLimit == null) {
cpuLimit = parentDomainJoinVO.getCpuLimit();
resourceLimitMap.put(Resource.ResourceType.cpu, cpuLimit);
}
if (memoryLimit == null) {
memoryLimit = parentDomainJoinVO.getMemoryLimit();
resourceLimitMap.put(Resource.ResourceType.memory, memoryLimit);
}
if (primaryStorageLimit == null) {
primaryStorageLimit = parentDomainJoinVO.getPrimaryStorageLimit();
resourceLimitMap.put(Resource.ResourceType.primary_storage, primaryStorageLimit);
}
if (secondaryStorageLimit == null) {
secondaryStorageLimit = parentDomainJoinVO.getSecondaryStorageLimit();
resourceLimitMap.put(Resource.ResourceType.secondary_storage, secondaryStorageLimit);
}
if (projectLimit == null) {
projectLimit = parentDomainJoinVO.getProjectLimit();
resourceLimitMap.put(Resource.ResourceType.project, projectLimit);
}
//-- try till parent present
if (parentDomainJoinVO.getParent() != null && parentDomainJoinVO.getParent() != Domain.ROOT_DOMAIN) {
setParentResourceLimitIfNeeded(resourceLimitMap, parentDomainJoinVO, domainsCopy);
}
}
}
public static List<AccountResponse> createAccountResponse(ResponseView view, EnumSet<DomainDetails> details, AccountJoinVO... accounts) {
return ApiDBUtils.newAccountResponses(view, details, accounts);
}
public static List<AsyncJobResponse> createAsyncJobResponse(AsyncJobJoinVO... jobs) {
List<AsyncJobResponse> respList = new ArrayList<AsyncJobResponse>();
for (AsyncJobJoinVO vt : jobs) {
respList.add(ApiDBUtils.newAsyncJobResponse(vt));
}
return respList;
}
public static List<DiskOfferingResponse> createDiskOfferingResponses(Long vmId, List<DiskOfferingJoinVO> offerings) {
return ApiDBUtils.newDiskOfferingResponses(vmId, offerings);
}
public static List<ServiceOfferingResponse> createServiceOfferingResponse(ServiceOfferingJoinVO... offerings) {
List<ServiceOfferingResponse> respList = new ArrayList<ServiceOfferingResponse>();
for (ServiceOfferingJoinVO vt : offerings) {
respList.add(ApiDBUtils.newServiceOfferingResponse(vt));
}
return respList;
}
public static List<ZoneResponse> createDataCenterResponse(ResponseView view, Boolean showCapacities, Boolean showResourceImage, DataCenterJoinVO... dcs) {
List<ZoneResponse> respList = new ArrayList<ZoneResponse>();
for (DataCenterJoinVO vt : dcs){
respList.add(ApiDBUtils.newDataCenterResponse(view, vt, showCapacities, showResourceImage));
}
return respList;
}
public static List<TemplateResponse> createTemplateResponse(EnumSet<ApiConstants.DomainDetails> detailsView, ResponseView view, TemplateJoinVO... templates) {
LinkedHashMap<String, TemplateResponse> vrDataList = new LinkedHashMap<>();
for (TemplateJoinVO vr : templates) {
TemplateResponse vrData = vrDataList.get(vr.getTempZonePair());
if (vrData == null) {
// first time encountering this volume
vrData = ApiDBUtils.newTemplateResponse(detailsView, view, vr);
}
else{
// update tags
vrData = ApiDBUtils.fillTemplateDetails(detailsView, view, vrData, vr);
}
vrDataList.put(vr.getTempZonePair(), vrData);
}
return new ArrayList<TemplateResponse>(vrDataList.values());
}
public static List<SnapshotResponse> createSnapshotResponse(ResponseView view, boolean isShowUnique, SnapshotJoinVO... snapshots) {
LinkedHashMap<String, SnapshotResponse> vrDataList = new LinkedHashMap<>();
for (SnapshotJoinVO vr : snapshots) {
SnapshotResponse vrData = vrDataList.get(vr.getSnapshotStorePair());
if (vrData == null) {
// first time encountering this snapshot
vrData = ApiDBUtils.newSnapshotResponse(view, isShowUnique, vr);
}
else{
// update tags
vrData = ApiDBUtils.fillSnapshotDetails(vrData, vr);
}
vrDataList.put(vr.getSnapshotStorePair(), vrData);
}
return new ArrayList<SnapshotResponse>(vrDataList.values());
}
public static List<TemplateResponse> createTemplateUpdateResponse(ResponseView view, TemplateJoinVO... templates) {
LinkedHashMap<Long, TemplateResponse> vrDataList = new LinkedHashMap<>();
for (TemplateJoinVO vr : templates) {
TemplateResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this volume
vrData = ApiDBUtils.newTemplateUpdateResponse(vr);
} else {
// update tags
vrData = ApiDBUtils.fillTemplateDetails(EnumSet.of(DomainDetails.all), view, vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<TemplateResponse>(vrDataList.values());
}
public static List<TemplateResponse> createIsoResponse(ResponseView view, TemplateJoinVO... templates) {
LinkedHashMap<String, TemplateResponse> vrDataList = new LinkedHashMap<>();
for (TemplateJoinVO vr : templates) {
TemplateResponse vrData = vrDataList.get(vr.getTempZonePair());
if (vrData == null) {
// first time encountering this volume
vrData = ApiDBUtils.newIsoResponse(vr, view);
} else {
// update tags
vrData = ApiDBUtils.fillTemplateDetails(EnumSet.of(DomainDetails.all), view, vrData, vr);
}
vrDataList.put(vr.getTempZonePair(), vrData);
}
return new ArrayList<TemplateResponse>(vrDataList.values());
}
public static List<AffinityGroupResponse> createAffinityGroupResponses(List<AffinityGroupJoinVO> groups) {
LinkedHashMap<Long, AffinityGroupResponse> vrDataList = new LinkedHashMap<>();
for (AffinityGroupJoinVO vr : groups) {
AffinityGroupResponse vrData = vrDataList.get(vr.getId());
if (vrData == null) {
// first time encountering this AffinityGroup
vrData = ApiDBUtils.newAffinityGroupResponse(vr);
} else {
// update vms
vrData = ApiDBUtils.fillAffinityGroupDetails(vrData, vr);
}
vrDataList.put(vr.getId(), vrData);
}
return new ArrayList<AffinityGroupResponse>(vrDataList.values());
}
public static List<ObjectStoreResponse> createObjectStoreResponse(ObjectStoreVO[] stores) {
Hashtable<Long, ObjectStoreResponse> storeList = new Hashtable<Long, ObjectStoreResponse>();
// Initialise the storeList with the input data
for (ObjectStoreVO store : stores) {
ObjectStoreResponse storeData = storeList.get(store.getId());
if (storeData == null) {
// first time encountering this store
storeData = ApiDBUtils.newObjectStoreResponse(store);
} else {
// update tags
storeData = ApiDBUtils.fillObjectStoreDetails(storeData, store);
}
storeList.put(store.getId(), storeData);
}
return new ArrayList<>(storeList.values());
}
}