// 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.util.ArrayList; import java.util.EnumSet; import java.util.Hashtable; import java.util.List; import org.apache.log4j.Logger; import org.apache.cloudstack.affinity.AffinityGroupResponse; 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.AclGroupResponse; import org.apache.cloudstack.api.response.AclPolicyResponse; import org.apache.cloudstack.api.response.AsyncJobResponse; import org.apache.cloudstack.api.response.DiskOfferingResponse; 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.ImageStoreResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; 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.StoragePoolResponse; 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 com.cloud.api.ApiDBUtils; import com.cloud.api.query.vo.AccountJoinVO; import com.cloud.api.query.vo.AclGroupJoinVO; import com.cloud.api.query.vo.AclPolicyJoinVO; 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.DomainRouterJoinVO; import com.cloud.api.query.vo.EventJoinVO; import com.cloud.api.query.vo.HostJoinVO; 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.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.user.Account; /** * Helper class to generate response from DB view VO objects. * */ public class ViewResponseHelper { public static final Logger s_logger = Logger.getLogger(ViewResponseHelper.class); public static List createUserResponse(UserAccountJoinVO... users) { return createUserResponse(null, users); } public static List createUserResponse(Long domainId, UserAccountJoinVO... users) { List respList = new ArrayList(); for (UserAccountJoinVO vt : users){ respList.add(ApiDBUtils.newUserResponse(vt, domainId)); } return respList; } public static List createEventResponse(EventJoinVO... events) { List respList = new ArrayList(); for (EventJoinVO vt : events){ respList.add(ApiDBUtils.newEventResponse(vt)); } return respList; } public static List createResourceTagResponse(boolean keyValueOnly, ResourceTagJoinVO... tags) { List respList = new ArrayList(); for (ResourceTagJoinVO vt : tags){ respList.add(ApiDBUtils.newResourceTagResponse(vt, keyValueOnly)); } return respList; } public static List createInstanceGroupResponse(InstanceGroupJoinVO... groups) { List respList = new ArrayList(); for (InstanceGroupJoinVO vt : groups){ respList.add(ApiDBUtils.newInstanceGroupResponse(vt)); } return respList; } public static List createUserVmResponse(ResponseView view, String objectName, UserVmJoinVO... userVms) { return createUserVmResponse(view, objectName, EnumSet.of(VMDetails.all), userVms); } public static List createUserVmResponse(ResponseView view, String objectName, EnumSet details, UserVmJoinVO... userVms) { Account caller = CallContext.current().getCallingAccount(); Hashtable vmDataList = new Hashtable(); // 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, 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(vmDataList.values()); } public static List createDomainRouterResponse(DomainRouterJoinVO... routers) { Account caller = CallContext.current().getCallingAccount(); Hashtable vrDataList = new Hashtable(); // 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(vrDataList.values()); } public static List createSecurityGroupResponses(List securityGroups) { Account caller = CallContext.current().getCallingAccount(); Hashtable vrDataList = new Hashtable(); // 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(vrDataList.values()); } public static List createProjectResponse(ProjectJoinVO... projects) { Hashtable prjDataList = new Hashtable(); // 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(p); } else{ // update those 1 to many mapping fields pData = ApiDBUtils.fillProjectDetails(pData, p); } prjDataList.put(p.getId(), pData); } return new ArrayList(prjDataList.values()); } public static List createProjectAccountResponse(ProjectAccountJoinVO... projectAccounts) { List responseList = new ArrayList(); for (ProjectAccountJoinVO proj : projectAccounts){ ProjectAccountResponse resp = ApiDBUtils.newProjectAccountResponse(proj); // update user list Account caller = CallContext.current().getCallingAccount(); if (ApiDBUtils.isAdmin(caller)) { List users = ApiDBUtils.findUserViewByAccountId(proj.getAccountId()); resp.setUsers(ViewResponseHelper.createUserResponse(users.toArray(new UserAccountJoinVO[users.size()]))); } responseList.add(resp); } return responseList; } public static List createProjectInvitationResponse(ProjectInvitationJoinVO... invites) { List respList = new ArrayList(); for (ProjectInvitationJoinVO v : invites){ respList.add(ApiDBUtils.newProjectInvitationResponse(v)); } return respList; } public static List createHostResponse(EnumSet details, HostJoinVO... hosts) { Hashtable vrDataList = new Hashtable(); // Initialise the vrdatalist with the input data for (HostJoinVO vr : hosts) { HostResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ){ // first time encountering this vm vrData = ApiDBUtils.newHostResponse(vr, details); } else{ // update tags vrData = ApiDBUtils.fillHostDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createHostForMigrationResponse(EnumSet details, HostJoinVO... hosts) { Hashtable vrDataList = new Hashtable(); // Initialise the vrdatalist with the input data for (HostJoinVO vr : hosts) { HostForMigrationResponse vrData = vrDataList.get(vr.getId()); if ( vrData == null ) { // first time encountering this vm vrData = ApiDBUtils.newHostForMigrationResponse(vr, details); } else { // update tags vrData = ApiDBUtils.fillHostForMigrationDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createVolumeResponse(ResponseView view, VolumeJoinVO... volumes) { Hashtable vrDataList = new Hashtable(); 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); } return new ArrayList(vrDataList.values()); } public static List createStoragePoolResponse(StoragePoolJoinVO... pools) { Hashtable vrDataList = new Hashtable(); // 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(vrDataList.values()); } public static List createImageStoreResponse(ImageStoreJoinVO... stores) { Hashtable vrDataList = new Hashtable(); // 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(vrDataList.values()); } public static List createStoragePoolForMigrationResponse(StoragePoolJoinVO... pools) { Hashtable vrDataList = new Hashtable(); // 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(vrDataList.values()); } public static List createAccountResponse(AccountJoinVO... accounts) { List respList = new ArrayList(); for (AccountJoinVO vt : accounts){ respList.add(ApiDBUtils.newAccountResponse(vt)); } return respList; } public static List createAsyncJobResponse(AsyncJobJoinVO... jobs) { List respList = new ArrayList(); for (AsyncJobJoinVO vt : jobs){ respList.add(ApiDBUtils.newAsyncJobResponse(vt)); } return respList; } public static List createDiskOfferingResponse(DiskOfferingJoinVO... offerings) { List respList = new ArrayList(); for (DiskOfferingJoinVO vt : offerings){ respList.add(ApiDBUtils.newDiskOfferingResponse(vt)); } return respList; } public static List createServiceOfferingResponse(ServiceOfferingJoinVO... offerings) { List respList = new ArrayList(); for (ServiceOfferingJoinVO vt : offerings){ respList.add(ApiDBUtils.newServiceOfferingResponse(vt)); } return respList; } public static List createDataCenterResponse(ResponseView view, Boolean showCapacities, DataCenterJoinVO... dcs) { List respList = new ArrayList(); for (DataCenterJoinVO vt : dcs){ respList.add(ApiDBUtils.newDataCenterResponse(view, vt, showCapacities)); } return respList; } public static List createTemplateResponse(ResponseView view, TemplateJoinVO... templates) { Hashtable vrDataList = new Hashtable(); for (TemplateJoinVO vr : templates) { TemplateResponse vrData = vrDataList.get(vr.getTempZonePair()); if ( vrData == null ){ // first time encountering this volume vrData = ApiDBUtils.newTemplateResponse(view, vr); } else{ // update tags vrData = ApiDBUtils.fillTemplateDetails(view, vrData, vr); } vrDataList.put(vr.getTempZonePair(), vrData); } return new ArrayList(vrDataList.values()); } public static List createTemplateUpdateResponse(ResponseView view, TemplateJoinVO... templates) { Hashtable vrDataList = new Hashtable(); 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(view, vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createIsoResponse(ResponseView view, TemplateJoinVO... templates) { Hashtable vrDataList = new Hashtable(); for (TemplateJoinVO vr : templates) { TemplateResponse vrData = vrDataList.get(vr.getTempZonePair()); if ( vrData == null ){ // first time encountering this volume vrData = ApiDBUtils.newIsoResponse(vr); } else{ // update tags vrData = ApiDBUtils.fillTemplateDetails(view, vrData, vr); } vrDataList.put(vr.getTempZonePair(), vrData); } return new ArrayList(vrDataList.values()); } public static List createAffinityGroupResponses(List groups) { Hashtable vrDataList = new Hashtable(); 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(vrDataList.values()); } public static List createAclPolicyResponses(List policies) { Hashtable vrDataList = new Hashtable(); for (AclPolicyJoinVO vr : policies) { AclPolicyResponse vrData = vrDataList.get(vr.getId()); if (vrData == null) { // first time encountering this Acl policy vrData = ApiDBUtils.newAclPolicyResponse(vr); } else { // update vms vrData = ApiDBUtils.fillAclPolicyDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } public static List createAclGroupResponses(List groups) { Hashtable vrDataList = new Hashtable(); for (AclGroupJoinVO vr : groups) { AclGroupResponse vrData = vrDataList.get(vr.getId()); if (vrData == null) { // first time encountering this Acl role vrData = ApiDBUtils.newAclGroupResponse(vr); } else { // update vms vrData = ApiDBUtils.fillAclGroupDetails(vrData, vr); } vrDataList.put(vr.getId(), vrData); } return new ArrayList(vrDataList.values()); } }