diff --git a/api/src/org/apache/cloudstack/api/ResourceDetail.java b/api/src/org/apache/cloudstack/api/ResourceDetail.java new file mode 100644 index 00000000000..0c5dcabe7dc --- /dev/null +++ b/api/src/org/apache/cloudstack/api/ResourceDetail.java @@ -0,0 +1,27 @@ +// 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 org.apache.cloudstack.api; + +public interface ResourceDetail { + + public long getResourceDetail(); + + public String getName(); + + public String getValue(); + +} diff --git a/engine/schema/src/com/cloud/dc/DcDetailVO.java b/engine/schema/src/com/cloud/dc/DcDetailVO.java index 15bfacbb3e1..158a8ed93e4 100644 --- a/engine/schema/src/com/cloud/dc/DcDetailVO.java +++ b/engine/schema/src/com/cloud/dc/DcDetailVO.java @@ -16,8 +16,6 @@ // under the License. package com.cloud.dc; -import org.apache.cloudstack.api.InternalIdentity; - import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -25,9 +23,12 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.api.ResourceDetail; + @Entity @Table(name="data_center_details") -public class DcDetailVO implements InternalIdentity { +public class DcDetailVO implements InternalIdentity, ResourceDetail { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") @@ -70,4 +71,9 @@ public class DcDetailVO implements InternalIdentity { public long getId() { return id; } + + @Override + public long getResourceDetail() { + return dcId; + } } diff --git a/engine/schema/src/com/cloud/storage/VolumeDetailVO.java b/engine/schema/src/com/cloud/storage/VolumeDetailVO.java index b0c8c1dbf35..6d2a618abdd 100644 --- a/engine/schema/src/com/cloud/storage/VolumeDetailVO.java +++ b/engine/schema/src/com/cloud/storage/VolumeDetailVO.java @@ -16,8 +16,6 @@ // under the License. package com.cloud.storage; -import org.apache.cloudstack.api.InternalIdentity; - import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -25,9 +23,12 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.api.ResourceDetail; + @Entity @Table(name="volume_details") -public class VolumeDetailVO implements InternalIdentity { +public class VolumeDetailVO implements InternalIdentity, ResourceDetail { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") @@ -82,4 +83,9 @@ public class VolumeDetailVO implements InternalIdentity { this.value = value; } + @Override + public long getResourceDetail() { + return volumeId; + } + } diff --git a/engine/schema/src/com/cloud/vm/NicDetailVO.java b/engine/schema/src/com/cloud/vm/NicDetailVO.java index 91499721e80..5d055018045 100644 --- a/engine/schema/src/com/cloud/vm/NicDetailVO.java +++ b/engine/schema/src/com/cloud/vm/NicDetailVO.java @@ -16,8 +16,6 @@ // under the License. package com.cloud.vm; -import org.apache.cloudstack.api.InternalIdentity; - import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -25,9 +23,12 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.api.ResourceDetail; + @Entity @Table(name="nic_details") -public class NicDetailVO implements InternalIdentity { +public class NicDetailVO implements InternalIdentity, ResourceDetail { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") @@ -82,4 +83,9 @@ public class NicDetailVO implements InternalIdentity { this.value = value; } + @Override + public long getResourceDetail() { + return nicId; + } + } diff --git a/engine/schema/src/com/cloud/vm/UserVmDetailVO.java b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java index 245b577bc39..5811ab48e98 100644 --- a/engine/schema/src/com/cloud/vm/UserVmDetailVO.java +++ b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java @@ -16,8 +16,6 @@ // under the License. package com.cloud.vm; -import org.apache.cloudstack.api.InternalIdentity; - import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -25,9 +23,12 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.api.ResourceDetail; + @Entity @Table(name="user_vm_details") -public class UserVmDetailVO implements InternalIdentity { +public class UserVmDetailVO implements InternalIdentity, ResourceDetail { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") @@ -81,5 +82,10 @@ public class UserVmDetailVO implements InternalIdentity { public void setValue(String value) { this.value = value; } + + @Override + public long getResourceDetail() { + return vmId; + } } diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 21fa25e87e3..3b247fae949 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -19,7 +19,6 @@ package com.cloud.api.query; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -34,6 +33,7 @@ import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; +import org.apache.cloudstack.api.ResourceDetail; import org.apache.cloudstack.api.command.admin.host.ListHostsCmd; import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd; import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; @@ -128,7 +128,6 @@ 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.dc.DcDetailVO; import com.cloud.dc.DedicatedResourceVO; import com.cloud.dc.dao.DcDetailsDao; import com.cloud.dc.dao.DedicatedResourceDao; @@ -166,7 +165,6 @@ import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; -import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDetailsDao; import com.cloud.template.VirtualMachineTemplate.TemplateFilter; @@ -185,8 +183,6 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.vm.DomainRouterVO; -import com.cloud.vm.NicDetailVO; -import com.cloud.vm.UserVmDetailVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.dao.DomainRouterDao; @@ -3226,73 +3222,50 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { String resourceId = cmd.getResourceId(); Long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); List responseList = new ArrayList(); + List detailList = new ArrayList(); + ResourceDetail requestedDetail = null; + if (resourceType == ResourceTag.TaggedResourceType.Volume) { - List detailList; if (key == null) { detailList = _volumeDetailDao.findDetails(id); } else { - VolumeDetailVO volumeDetail = _volumeDetailDao.findDetail(id, key); - detailList = new LinkedList(); - detailList.add(volumeDetail); + requestedDetail = _volumeDetailDao.findDetail(id, key); } - - for (VolumeDetailVO detail : detailList) { - ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(), - ResourceTag.TaggedResourceType.Volume); - responseList.add(detailResponse); - } - } else if (resourceType == ResourceTag.TaggedResourceType.Nic){ - List detailList; if (key == null) { detailList = _nicDetailDao.findDetails(id); } else { - NicDetailVO nicDetail = _nicDetailDao.findDetail(id, key); - detailList = new LinkedList(); - detailList.add(nicDetail); - } - - for (NicDetailVO detail : detailList) { - ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(), - ResourceTag.TaggedResourceType.Nic); - responseList.add(detailResponse); + requestedDetail = _nicDetailDao.findDetail(id, key); } } else if (resourceType == ResourceTag.TaggedResourceType.UserVm){ - List detailList; if (key == null) { detailList = _userVmDetailDao.findDetailsList(id); } else { - UserVmDetailVO vmDetail = _userVmDetailDao.findDetail(id, key); - detailList = new LinkedList(); - detailList.add(vmDetail); - } - for (UserVmDetailVO detail : detailList) { - ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(), - ResourceTag.TaggedResourceType.UserVm); - responseList.add(detailResponse); + requestedDetail = _userVmDetailDao.findDetail(id, key); } } else if (resourceType == ResourceTag.TaggedResourceType.Zone){ - - List details; if (key == null) { - details = _dcDetailsDao.findDetailsList(id); + detailList = _dcDetailsDao.findDetailsList(id); } else { - DcDetailVO zoneDetail = _dcDetailsDao.findDetail(id, key); - details = new LinkedList(); - details.add(zoneDetail); - } - - List dcDetailResponseList = new ArrayList(); - for (DcDetailVO detail : details) { - ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(), - ResourceTag.TaggedResourceType.Zone); - responseList.add(detailResponse); + requestedDetail = _dcDetailsDao.findDetail(id, key); } } else { throw new UnsupportedServiceException("Resource type " + resourceType + " is not supported by the cloudStack"); } + if (requestedDetail != null) { + ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, requestedDetail.getName(), requestedDetail.getValue(), + resourceType); + responseList.add(detailResponse); + } else { + for (ResourceDetail detail : detailList) { + ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(), + resourceType); + responseList.add(detailResponse); + } + } + return responseList; }