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;
|
||||
|
||||
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<? 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;
|
||||
|
||||
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")
|
||||
|
||||
@ -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<ResourceDetailResponse> listResource(ListResourceDetailsCmd cmd) {
|
||||
String key = cmd.getKey();
|
||||
ResourceTag.ResourceObjectType resourceType = cmd.getResourceType();
|
||||
String resourceId = cmd.getResourceId();
|
||||
long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
|
||||
List<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>();
|
||||
List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();
|
||||
String resourceIdStr = cmd.getResourceId();
|
||||
long resourceId = _taggedResourceMgr.getResourceId(resourceIdStr, resourceType);
|
||||
List<? extends ResourceDetail> detailList = new ArrayList<ResourceDetail>();
|
||||
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<ResourceDetailResponse> responseList = new ArrayList<ResourceDetailResponse>();
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>> _daoMap=
|
||||
new HashMap<ResourceObjectType, ResourceDetailDao<? extends ResourceDetail>>();
|
||||
|
||||
|
||||
@Override
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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<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