mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	Resource details: added way of generic access of resource DAO based on the resourceType passed in (was hardcoded before)
This commit is contained in:
		
							parent
							
								
									0fb4d9d5a2
								
							
						
					
					
						commit
						aa9f8e64ae
					
				| @ -16,8 +16,11 @@ | |||||||
| // under the License.package com.cloud.server; | // under the License.package com.cloud.server; | ||||||
| 
 | 
 | ||||||
| package com.cloud.server; | package com.cloud.server; | ||||||
|  | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| 
 | 
 | ||||||
|  | import org.apache.cloudstack.api.ResourceDetail; | ||||||
|  | 
 | ||||||
| import com.cloud.server.ResourceTag.ResourceObjectType; | import com.cloud.server.ResourceTag.ResourceObjectType; | ||||||
| 
 | 
 | ||||||
| public interface ResourceMetaDataService { | public interface ResourceMetaDataService { | ||||||
| @ -41,4 +44,10 @@ public interface ResourceMetaDataService { | |||||||
|     public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key); |     public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |     List<? extends ResourceDetail> getDetails(long resourceId, ResourceObjectType resourceType); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     ResourceDetail getDetail(long resourceId, ResourceObjectType resourceType, String key); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -17,7 +17,8 @@ | |||||||
| 
 | 
 | ||||||
| package org.apache.cloudstack.api.command.user.volume; | 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.APICommand; | ||||||
| import org.apache.cloudstack.api.ApiConstants; | import org.apache.cloudstack.api.ApiConstants; | ||||||
| import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; | 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.ResourceDetailResponse; | ||||||
| import org.apache.cloudstack.api.response.ResourceTagResponse; | 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") | @APICommand(name = "listResourceDetails", description = "List resource detail(s)", responseObject = ResourceTagResponse.class, since = "4.2") | ||||||
| public class ListResourceDetailsCmd extends BaseListProjectAndAccountResourcesCmd{ | public class ListResourceDetailsCmd extends BaseListProjectAndAccountResourcesCmd{ | ||||||
|     private static final String s_name = "listresourcedetailsresponse"; |     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; |     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; |     private String resourceId; | ||||||
| 
 | 
 | ||||||
|     @Parameter(name=ApiConstants.KEY, type=CommandType.STRING, description="list by key") |     @Parameter(name=ApiConstants.KEY, type=CommandType.STRING, description="list by key") | ||||||
|  | |||||||
| @ -138,7 +138,6 @@ import com.cloud.event.dao.EventJoinDao; | |||||||
| import com.cloud.exception.CloudAuthenticationException; | import com.cloud.exception.CloudAuthenticationException; | ||||||
| import com.cloud.exception.InvalidParameterValueException; | import com.cloud.exception.InvalidParameterValueException; | ||||||
| import com.cloud.exception.PermissionDeniedException; | import com.cloud.exception.PermissionDeniedException; | ||||||
| import com.cloud.exception.UnsupportedServiceException; |  | ||||||
| import com.cloud.ha.HighAvailabilityManager; | import com.cloud.ha.HighAvailabilityManager; | ||||||
| import com.cloud.hypervisor.Hypervisor.HypervisorType; | import com.cloud.hypervisor.Hypervisor.HypervisorType; | ||||||
| import com.cloud.network.dao.NetworkDetailsDao; | import com.cloud.network.dao.NetworkDetailsDao; | ||||||
| @ -3264,54 +3263,25 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { | |||||||
|     public List<ResourceDetailResponse> listResource(ListResourceDetailsCmd cmd) { |     public List<ResourceDetailResponse> listResource(ListResourceDetailsCmd cmd) { | ||||||
|         String key = cmd.getKey(); |         String key = cmd.getKey(); | ||||||
|         ResourceTag.ResourceObjectType resourceType = cmd.getResourceType(); |         ResourceTag.ResourceObjectType resourceType = cmd.getResourceType(); | ||||||
|         String resourceId = cmd.getResourceId(); |         String resourceIdStr = cmd.getResourceId(); | ||||||
|         long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); |         long resourceId = _taggedResourceMgr.getResourceId(resourceIdStr, resourceType); | ||||||
|         List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>(); |  | ||||||
|         List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();         |         List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();         | ||||||
|         ResourceDetail requestedDetail = null; |         ResourceDetail requestedDetail = null; | ||||||
| 
 | 
 | ||||||
|          |  | ||||||
|         if (resourceType == ResourceTag.ResourceObjectType.Volume) { |  | ||||||
|         if (key == null) { |         if (key == null) { | ||||||
|                 detailList = _volumeDetailDao.findDetailsList(id); |             detailList = _resourceMetaDataMgr.getDetails(resourceId, resourceType); | ||||||
|         } else { |         } else { | ||||||
|                 requestedDetail = _volumeDetailDao.findDetail(id, key); |             requestedDetail = _resourceMetaDataMgr.getDetail(resourceId, resourceType, 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"); |  | ||||||
|         } |         } | ||||||
|          |          | ||||||
|  |         List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>(); | ||||||
|         if (requestedDetail != null) { |         if (requestedDetail != null) { | ||||||
|             ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, requestedDetail.getName(), requestedDetail.getValue(), |             ResourceDetailResponse detailResponse = createResourceDetailsResponse(resourceId, requestedDetail.getName(), requestedDetail.getValue(), | ||||||
|                     resourceType); |                     resourceType); | ||||||
|             responseList.add(detailResponse); |             responseList.add(detailResponse); | ||||||
|         } else { |         } else { | ||||||
|             for (ResourceDetail detail : detailList) { |             for (ResourceDetail detail : detailList) { | ||||||
|                 ResourceDetailResponse detailResponse = createResourceDetailsResponse(id, detail.getName(), detail.getValue(), |                 ResourceDetailResponse detailResponse = createResourceDetailsResponse(resourceId, detail.getName(), detail.getValue(), | ||||||
|                         resourceType); |                         resourceType); | ||||||
|                 responseList.add(detailResponse); |                 responseList.add(detailResponse); | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -16,17 +16,22 @@ | |||||||
| // under the License. | // under the License. | ||||||
| package com.cloud.metadata; | package com.cloud.metadata; | ||||||
| 
 | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| 
 | 
 | ||||||
| import javax.ejb.Local; | import javax.ejb.Local; | ||||||
| import javax.inject.Inject; | import javax.inject.Inject; | ||||||
| import javax.naming.ConfigurationException; | import javax.naming.ConfigurationException; | ||||||
| 
 | 
 | ||||||
|  | import org.apache.cloudstack.api.ResourceDetail; | ||||||
| import org.apache.log4j.Logger; | import org.apache.log4j.Logger; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
| 
 | 
 | ||||||
| import com.cloud.dc.DataCenterDetailVO; | import com.cloud.dc.DataCenterDetailVO; | ||||||
| import com.cloud.dc.dao.DataCenterDetailsDao; | import com.cloud.dc.dao.DataCenterDetailsDao; | ||||||
|  | import com.cloud.dc.dao.ResourceDetailDao; | ||||||
| import com.cloud.event.ActionEvent; | import com.cloud.event.ActionEvent; | ||||||
| import com.cloud.event.EventTypes; | import com.cloud.event.EventTypes; | ||||||
| import com.cloud.exception.InvalidParameterValueException; | import com.cloud.exception.InvalidParameterValueException; | ||||||
| @ -71,13 +76,21 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource | |||||||
|     @Inject |     @Inject | ||||||
|     VMTemplateDetailsDao _templateDetailsDao; |     VMTemplateDetailsDao _templateDetailsDao; | ||||||
|     @Inject |     @Inject | ||||||
|     UserVmDetailsDao _userVmDetailsDao; |  | ||||||
|     @Inject |  | ||||||
|     ServiceOfferingDetailsDao _serviceOfferingDetailsDao; |     ServiceOfferingDetailsDao _serviceOfferingDetailsDao; | ||||||
|      |      | ||||||
|  |     private static Map<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>> _daoMap=  | ||||||
|  |             new HashMap<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>>(); | ||||||
|  |      | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { |     public boolean configure(String name, Map<String, Object> 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; |         return true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -100,40 +113,34 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource | |||||||
|             @Override |             @Override | ||||||
|             public Boolean doInTransaction(TransactionStatus status) { |             public Boolean doInTransaction(TransactionStatus status) { | ||||||
|                 for (String key : details.keySet()) { |                 for (String key : details.keySet()) { | ||||||
|  |                     long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); | ||||||
|                     String value = details.get(key); |                     String value = details.get(key); | ||||||
| 
 | 
 | ||||||
|                     if (value == null || value.isEmpty()) { |                     if (value == null || value.isEmpty()) { | ||||||
|                         throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty"); |                         throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty"); | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|                         if (!resourceType.resourceMetadataSupport())  { |                     DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); | ||||||
|                             throw new InvalidParameterValueException("The resource type " + resourceType + " doesn't support metadata (resource details)"); |                     ResourceDetail detail = null; | ||||||
|                         } |  | ||||||
|                      |                      | ||||||
|                         long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); |  | ||||||
|                     // TODO - Have a better design here for getting the DAO. |                     // TODO - Have a better design here for getting the DAO. | ||||||
|                     if(resourceType == ResourceObjectType.Volume){ |                     if(resourceType == ResourceObjectType.Volume){ | ||||||
|                             VolumeDetailVO detail = new VolumeDetailVO(id, key, value); |                         detail = new VolumeDetailVO(id, key, value); | ||||||
|                             _volumeDetailDao.addDetail(detail); |  | ||||||
|                     } else if (resourceType == ResourceObjectType.Nic){ |                     } else if (resourceType == ResourceObjectType.Nic){ | ||||||
|                             NicDetailVO detail = new NicDetailVO(id, key, value); |                         detail = new NicDetailVO(id, key, value); | ||||||
|                             _nicDetailDao.addDetail(detail); |  | ||||||
|                     } else if (resourceType == ResourceObjectType.Zone){ |                     } else if (resourceType == ResourceObjectType.Zone){ | ||||||
|                              DataCenterDetailVO dataCenterDetail = new DataCenterDetailVO(id, key, value); |                         detail = new DataCenterDetailVO(id, key, value); | ||||||
|                              _dcDetailsDao.addDetail(dataCenterDetail); |  | ||||||
|                     } else if (resourceType == ResourceObjectType.Network){ |                     } else if (resourceType == ResourceObjectType.Network){ | ||||||
|                             NetworkDetailVO detail = new NetworkDetailVO(id, key, value); |                         detail = new NetworkDetailVO(id, key, value); | ||||||
|                             _networkDetailsDao.addDetail(detail); |  | ||||||
|                     } else if (resourceType == ResourceObjectType.UserVm) { |                     } else if (resourceType == ResourceObjectType.UserVm) { | ||||||
|                             UserVmDetailVO detail = new UserVmDetailVO(id, key, value); |                         detail = new UserVmDetailVO(id, key, value); | ||||||
|                             _userVmDetailsDao.addDetail(detail); |  | ||||||
|                     } else if (resourceType == ResourceObjectType.Template) { |                     } else if (resourceType == ResourceObjectType.Template) { | ||||||
|                              VMTemplateDetailVO detail = new VMTemplateDetailVO(id, key, value); |                         detail = new VMTemplateDetailVO(id, key, value); | ||||||
|                             _templateDetailsDao.addDetail(detail); |  | ||||||
|                     } else if (resourceType == ResourceObjectType.ServiceOffering) { |                     } else if (resourceType == ResourceObjectType.ServiceOffering) { | ||||||
|                             ServiceOfferingDetailsVO detail = new ServiceOfferingDetailsVO(id, key, value); |                         detail = new ServiceOfferingDetailsVO(id, key, value); | ||||||
|                             _serviceOfferingDetailsDao.addDetail(detail); |  | ||||||
|                     } |                     } | ||||||
|  |                     newDetailDaoHelper.addDetail(detail); | ||||||
|  |                          | ||||||
|                 } |                 } | ||||||
|                  |                  | ||||||
|                  |                  | ||||||
| @ -147,32 +154,56 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource | |||||||
|     @DB |     @DB | ||||||
|     @ActionEvent(eventType = EventTypes.EVENT_RESOURCE_DETAILS_DELETE, eventDescription = "deleting resource meta data") |     @ActionEvent(eventType = EventTypes.EVENT_RESOURCE_DETAILS_DELETE, eventDescription = "deleting resource meta data") | ||||||
|     public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key){ |     public boolean deleteResourceMetaData(String resourceId, ResourceObjectType resourceType, String key){ | ||||||
| 
 |  | ||||||
|         long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); |         long id = _taggedResourceMgr.getResourceId(resourceId, resourceType); | ||||||
|          |          | ||||||
|         if (!resourceType.resourceMetadataSupport()) { |         DetailDaoHelper newDetailDaoHelper = new DetailDaoHelper(resourceType); | ||||||
|             throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet"); |         newDetailDaoHelper.removeDetail(id, key); | ||||||
|         } |  | ||||||
|          |  | ||||||
|         // 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); |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         return true; |         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<ResourceDetail> dao = (ResourceDetailDao<ResourceDetail>)_daoMap.get(resourceType); | ||||||
|  |             dao.addDetail(detail);    | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         private void removeDetail(long resourceId, String key) { | ||||||
|  |             ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType); | ||||||
|  |             dao.removeDetail(resourceId, key); | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         private List<? extends ResourceDetail> getDetails(long resourceId) { | ||||||
|  |             ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType); | ||||||
|  |             List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();         | ||||||
|  |             detailList = dao.findDetailsList(resourceId); | ||||||
|  |             return detailList; | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         private ResourceDetail getDetail(long resourceId, String key) { | ||||||
|  |             ResourceDetailDao<? extends ResourceDetail> dao = _daoMap.get(resourceType); | ||||||
|  |             return dao.findDetail(resourceId, key); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     @Override | ||||||
|  |     public List<? extends ResourceDetail> 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);   | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user