From aa9f8e64ae35adab531c92c7ee5c1dc9f60bc6cd Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 25 Oct 2013 11:49:13 -0700 Subject: [PATCH] Resource details: added way of generic access of resource DAO based on the resourceType passed in (was hardcoded before) --- .../cloud/server/ResourceMetaDataService.java | 9 ++ .../user/volume/ListResourceDetailsCmd.java | 9 +- .../com/cloud/api/query/QueryManagerImpl.java | 50 ++---- .../metadata/ResourceMetaDataManagerImpl.java | 143 +++++++++++------- 4 files changed, 111 insertions(+), 100 deletions(-) diff --git a/api/src/com/cloud/server/ResourceMetaDataService.java b/api/src/com/cloud/server/ResourceMetaDataService.java index 1a12b6af66e..46f1c4a2d09 100644 --- a/api/src/com/cloud/server/ResourceMetaDataService.java +++ b/api/src/com/cloud/server/ResourceMetaDataService.java @@ -16,8 +16,11 @@ // under the License.package com.cloud.server; package com.cloud.server; +import java.util.List; import java.util.Map; +import org.apache.cloudstack.api.ResourceDetail; + import com.cloud.server.ResourceTag.ResourceObjectType; public interface ResourceMetaDataService { @@ -41,4 +44,10 @@ public interface ResourceMetaDataService { public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key); + List getDetails(long resourceId, ResourceObjectType resourceType); + + + ResourceDetail getDetail(long resourceId, ResourceObjectType resourceType, String key); + + } diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java index 4c2856b6a7a..18accac5bd0 100644 --- a/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/volume/ListResourceDetailsCmd.java @@ -17,7 +17,8 @@ package org.apache.cloudstack.api.command.user.volume; -import com.cloud.server.ResourceTag; +import java.util.List; + import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; @@ -26,16 +27,16 @@ import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ResourceDetailResponse; import org.apache.cloudstack.api.response.ResourceTagResponse; -import java.util.List; +import com.cloud.server.ResourceTag; @APICommand(name = "listResourceDetails", description = "List resource detail(s)", responseObject = ResourceTagResponse.class, since = "4.2") public class ListResourceDetailsCmd extends BaseListProjectAndAccountResourcesCmd{ private static final String s_name = "listresourcedetailsresponse"; - @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.STRING, description="list by resource type") + @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.STRING, description="list by resource type", required=true) private String resourceType; - @Parameter(name=ApiConstants.RESOURCE_ID, type=CommandType.STRING, description="list by resource id") + @Parameter(name=ApiConstants.RESOURCE_ID, type=CommandType.STRING, description="list by resource id", required=true) private String resourceId; @Parameter(name=ApiConstants.KEY, type=CommandType.STRING, description="list by key") diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 8cf09bfa7b0..85674ea76ff 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -138,7 +138,6 @@ import com.cloud.event.dao.EventJoinDao; import com.cloud.exception.CloudAuthenticationException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; -import com.cloud.exception.UnsupportedServiceException; import com.cloud.ha.HighAvailabilityManager; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.dao.NetworkDetailsDao; @@ -3264,54 +3263,25 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { public List listResource(ListResourceDetailsCmd cmd) { String key = cmd.getKey(); ResourceTag.ResourceObjectType resourceType = cmd.getResourceType(); - String resourceId = cmd.getResourceId(); - long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); - List responseList = new ArrayList(); - List detailList = new ArrayList(); + String resourceIdStr = cmd.getResourceId(); + long resourceId = _taggedResourceMgr.getResourceId(resourceIdStr, resourceType); + List detailList = new ArrayList(); ResourceDetail requestedDetail = null; - - if (resourceType == ResourceTag.ResourceObjectType.Volume) { - if (key == null) { - detailList = _volumeDetailDao.findDetailsList(id); - } else { - requestedDetail = _volumeDetailDao.findDetail(id, key); - } - } else if (resourceType == ResourceTag.ResourceObjectType.Nic){ - if (key == null) { - detailList = _nicDetailDao.findDetailsList(id); - } else { - requestedDetail = _nicDetailDao.findDetail(id, key); - } - } else if (resourceType == ResourceTag.ResourceObjectType.UserVm){ - if (key == null) { - detailList = _userVmDetailDao.findDetailsList(id); - } else { - requestedDetail = _userVmDetailDao.findDetail(id, key); - } - } else if (resourceType == ResourceTag.ResourceObjectType.Zone){ - if (key == null) { - detailList = _dcDetailsDao.findDetailsList(id); - } else { - requestedDetail = _dcDetailsDao.findDetail(id, key); - } - } else if (resourceType == ResourceObjectType.Network){ - if (key == null) { - detailList = _networkDetailsDao.findDetailsList(id); - } else { - requestedDetail = _networkDetailsDao.findDetail(id, key); - } - }else { - throw new UnsupportedServiceException("Resource type " + resourceType + " is not supported by the cloudStack"); + if (key == null) { + detailList = _resourceMetaDataMgr.getDetails(resourceId, resourceType); + } else { + requestedDetail = _resourceMetaDataMgr.getDetail(resourceId, resourceType, key); } + List responseList = new ArrayList(); if (requestedDetail != null) { - ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, requestedDetail.getName(), requestedDetail.getValue(), + ResourceDetailResponse detailResponse = createResourceDetailsResponse(resourceId, requestedDetail.getName(), requestedDetail.getValue(), resourceType); responseList.add(detailResponse); } else { for (ResourceDetail detail : detailList) { - ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(), + ResourceDetailResponse detailResponse = createResourceDetailsResponse(resourceId, detail.getName(), detail.getValue(), resourceType); responseList.add(detailResponse); } diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java index 152e57fad72..5bfe004d0a0 100644 --- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java +++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java @@ -16,17 +16,22 @@ // under the License. package com.cloud.metadata; +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 javax.naming.ConfigurationException; +import org.apache.cloudstack.api.ResourceDetail; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.cloud.dc.DataCenterDetailVO; import com.cloud.dc.dao.DataCenterDetailsDao; +import com.cloud.dc.dao.ResourceDetailDao; import com.cloud.event.ActionEvent; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; @@ -71,13 +76,21 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource @Inject VMTemplateDetailsDao _templateDetailsDao; @Inject - UserVmDetailsDao _userVmDetailsDao; - @Inject ServiceOfferingDetailsDao _serviceOfferingDetailsDao; + private static Map> _daoMap= + new HashMap>(); + @Override public boolean configure(String name, Map params) throws ConfigurationException { + _daoMap.put(ResourceObjectType.UserVm, _userVmDetailDao); + _daoMap.put(ResourceObjectType.Volume, _volumeDetailDao); + _daoMap.put(ResourceObjectType.Template, _templateDetailsDao); + _daoMap.put(ResourceObjectType.Network, _networkDetailsDao); + _daoMap.put(ResourceObjectType.Nic, _nicDetailDao); + _daoMap.put(ResourceObjectType.ServiceOffering, _serviceOfferingDetailsDao); + _daoMap.put(ResourceObjectType.Zone, _dcDetailsDao); return true; } @@ -100,40 +113,34 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource @Override public Boolean doInTransaction(TransactionStatus status) { for (String key : details.keySet()) { - String value = details.get(key); + long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); + String value = details.get(key); - if (value == null || value.isEmpty()) { - throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty"); - } + if (value == null || value.isEmpty()) { + throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty"); + } + + DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); + ResourceDetail detail = null; + + // TODO - Have a better design here for getting the DAO. + if(resourceType == ResourceObjectType.Volume){ + detail = new VolumeDetailVO(id, key, value); + } else if (resourceType == ResourceObjectType.Nic){ + detail = new NicDetailVO(id, key, value); + } else if (resourceType == ResourceObjectType.Zone){ + detail = new DataCenterDetailVO(id, key, value); + } else if (resourceType == ResourceObjectType.Network){ + detail = new NetworkDetailVO(id, key, value); + } else if (resourceType == ResourceObjectType.UserVm) { + detail = new UserVmDetailVO(id, key, value); + } else if (resourceType == ResourceObjectType.Template) { + detail = new VMTemplateDetailVO(id, key, value); + } else if (resourceType == ResourceObjectType.ServiceOffering) { + detail = new ServiceOfferingDetailsVO(id, key, value); + } + newDetailDaoHelper.addDetail(detail); - if (!resourceType.resourceMetadataSupport()) { - throw new InvalidParameterValueException("The resource type " + resourceType + " doesn't support metadata (resource details)"); - } - - long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); - // TODO - Have a better design here for getting the DAO. - if(resourceType == ResourceObjectType.Volume){ - VolumeDetailVO detail = new VolumeDetailVO(id, key, value); - _volumeDetailDao.addDetail(detail); - } else if (resourceType == ResourceObjectType.Nic){ - NicDetailVO detail = new NicDetailVO(id, key, value); - _nicDetailDao.addDetail(detail); - } else if (resourceType == ResourceObjectType.Zone){ - DataCenterDetailVO dataCenterDetail = new DataCenterDetailVO(id, key, value); - _dcDetailsDao.addDetail(dataCenterDetail); - } else if (resourceType == ResourceObjectType.Network){ - NetworkDetailVO detail = new NetworkDetailVO(id, key, value); - _networkDetailsDao.addDetail(detail); - } else if (resourceType == ResourceObjectType.UserVm) { - UserVmDetailVO detail = new UserVmDetailVO(id, key, value); - _userVmDetailsDao.addDetail(detail); - } else if (resourceType == ResourceObjectType.Template) { - VMTemplateDetailVO detail = new VMTemplateDetailVO(id, key, value); - _templateDetailsDao.addDetail(detail); - } else if (resourceType == ResourceObjectType.ServiceOffering) { - ServiceOfferingDetailsVO detail = new ServiceOfferingDetailsVO(id, key, value); - _serviceOfferingDetailsDao.addDetail(detail); - } } @@ -147,32 +154,56 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource @DB @ActionEvent(eventType = EventTypes.EVENT_RESOURCE_DETAILS_DELETE, eventDescription = "deleting resource meta data") public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key){ - long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); - if (!resourceType.resourceMetadataSupport()) { - throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet"); - } - - // TODO - Have a better design here for getting the DAO. - if (resourceType == ResourceObjectType.Volume){ - _volumeDetailDao.removeDetail(id, key); - } else if (resourceType == ResourceObjectType.Nic){ - _nicDetailDao.removeDetail(id, key); - } else if (resourceType == ResourceObjectType.UserVm) { - _userVmDetailsDao.removeDetail(id, key); - } else if (resourceType == ResourceObjectType.Template) { - _templateDetailsDao.removeDetail(id, key); - } else if (resourceType == ResourceObjectType.Zone){ - _dcDetailsDao.removeDetail(id, key); - } else if (resourceType == ResourceObjectType.ServiceOffering) { - _serviceOfferingDetailsDao.removeDetail(id, key); - } else if (resourceType == ResourceObjectType.Network) { - _networkDetailsDao.removeDetail(id, key); - } + DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); + newDetailDaoHelper.removeDetail(id, key); return true; } - + private class DetailDaoHelper { + private ResourceObjectType resourceType; + + private DetailDaoHelper(ResourceObjectType resourceType) { + if (!resourceType.resourceMetadataSupport()) { + throw new UnsupportedOperationException("ResourceType " + resourceType + " doesn't support metadata"); + } + this.resourceType = resourceType; + } + + private void addDetail(ResourceDetail detail) { + ResourceDetailDao dao = (ResourceDetailDao)_daoMap.get(resourceType); + dao.addDetail(detail); + } + + private void removeDetail(long resourceId, String key) { + ResourceDetailDao dao = _daoMap.get(resourceType); + dao.removeDetail(resourceId, key); + } + + private List getDetails(long resourceId) { + ResourceDetailDao dao = _daoMap.get(resourceType); + List detailList = new ArrayList(); + detailList = dao.findDetailsList(resourceId); + return detailList; + } + + private ResourceDetail getDetail(long resourceId, String key) { + ResourceDetailDao dao = _daoMap.get(resourceType); + return dao.findDetail(resourceId, key); + } + } + + @Override + public List getDetails(long resourceId, ResourceObjectType resourceType) { + DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); + return newDetailDaoHelper.getDetails(resourceId); + } + + @Override + public ResourceDetail getDetail(long resourceId, ResourceObjectType resourceType, String key) { + DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); + return newDetailDaoHelper.getDetail(resourceId, key); + } }