You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/06/21 00:48:03 UTC
[3/4] git commit: Completed API / Management server code for Resource
tags feature. UI is yet to be done
Completed API / Management server code for Resource tags feature. UI is yet to be done
Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/55a12582
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/55a12582
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/55a12582
Branch: refs/heads/master
Commit: 55a12582b4630a7bbdae21a1eeeedaf742448cf4
Parents: 62d45b9
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Thu Jun 14 15:17:11 2012 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Wed Jun 20 15:45:08 2012 -0700
----------------------------------------------------------------------
api/src/com/cloud/api/ApiConstants.java | 1 +
api/src/com/cloud/api/commands/CreateTagsCmd.java | 14 +-
api/src/com/cloud/api/commands/DeleteTagsCmd.java | 112 +++++++
api/src/com/cloud/api/commands/ListTagsCmd.java | 7 +
.../cloud/api/response/ResourceTagResponse.java | 6 +
api/src/com/cloud/configuration/Resource.java | 16 -
api/src/com/cloud/server/ResourceTag.java | 22 ++-
.../com/cloud/server/TaggedResourceService.java | 16 +-
server/src/com/cloud/api/ApiDBUtils.java | 2 +-
server/src/com/cloud/api/ApiResponseHelper.java | 2 +
server/src/com/cloud/tags/ResourceTagVO.java | 19 +-
.../com/cloud/tags/TaggedResourceManagerImpl.java | 233 ++++++++++++---
.../cloud/uuididentity/dao/IdentityDaoImpl.java | 38 ++-
utils/src/com/cloud/utils/db/DbUtil.java | 5 +
utils/src/com/cloud/utils/db/GenericDao.java | 5 +
utils/src/com/cloud/utils/db/GenericDaoBase.java | 1 +
16 files changed, 419 insertions(+), 80 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/api/ApiConstants.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java
index 54bfaff..00ec392 100755
--- a/api/src/com/cloud/api/ApiConstants.java
+++ b/api/src/com/cloud/api/ApiConstants.java
@@ -360,6 +360,7 @@ public class ApiConstants {
public static final String CAN_USE_FOR_DEPLOY = "canusefordeploy";
public static final String RESOURCE_IDS = "resourceids";
public static final String RESOURCE_ID = "resourceid";
+ public static final String CUSTOMER = "customer";
public enum HostDetails {
all, capacity, events, stats, min;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/api/commands/CreateTagsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/CreateTagsCmd.java b/api/src/com/cloud/api/commands/CreateTagsCmd.java
index c0ac974..5a0b56e 100644
--- a/api/src/com/cloud/api/commands/CreateTagsCmd.java
+++ b/api/src/com/cloud/api/commands/CreateTagsCmd.java
@@ -27,9 +27,9 @@ import com.cloud.api.Implementation;
import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.SuccessResponse;
-import com.cloud.configuration.Resource;
import com.cloud.event.EventTypes;
import com.cloud.server.ResourceTag;
+import com.cloud.server.ResourceTag.TaggedResourceType;
/**
* @author Alena Prokharchyk
@@ -54,13 +54,17 @@ public class CreateTagsCmd extends BaseAsyncCmd{
@Parameter(name=ApiConstants.RESOURCE_IDS, type=CommandType.LIST, required=true,
collectionType=CommandType.STRING, description="list of resources to create the tags for")
private List<String> resourceIds;
+
+ @Parameter(name=ApiConstants.CUSTOMER, type=CommandType.STRING, description="identifies client specific tag. " +
+ "When the value is not null, the tag can't be used by cloudStack code internally")
+ private String customer;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
- public Resource.TaggedResourceType getResourceType(){
+ public TaggedResourceType getResourceType(){
return _taggedResourceService.getResourceType(resourceType);
}
@@ -83,6 +87,10 @@ public class CreateTagsCmd extends BaseAsyncCmd{
public List<String> getResourceIds() {
return resourceIds;
}
+
+ public String getCustomer() {
+ return customer;
+ }
// ///////////////////////////////////////////////////
// ///////////// API Implementation///////////////////
@@ -101,7 +109,7 @@ public class CreateTagsCmd extends BaseAsyncCmd{
@Override
public void execute() {
- List<ResourceTag> tags = _taggedResourceService.createTags(getResourceIds(), getResourceType(), getTags());
+ List<ResourceTag> tags = _taggedResourceService.createTags(getResourceIds(), getResourceType(), getTags(), getCustomer());
if (tags != null && !tags.isEmpty()) {
SuccessResponse response = new SuccessResponse(getCommandName());
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/api/commands/DeleteTagsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/DeleteTagsCmd.java b/api/src/com/cloud/api/commands/DeleteTagsCmd.java
new file mode 100644
index 0000000..a84a09e
--- /dev/null
+++ b/api/src/com/cloud/api/commands/DeleteTagsCmd.java
@@ -0,0 +1,112 @@
+// Copyright 2012 Citrix Systems, Inc. Licensed under the
+package com.cloud.api.commands;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseAsyncCmd;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.api.response.SuccessResponse;
+import com.cloud.event.EventTypes;
+import com.cloud.server.ResourceTag;
+import com.cloud.server.ResourceTag.TaggedResourceType;
+
+/**
+ * @author Alena Prokharchyk
+ */
+
+@Implementation(description = "Deleting resource tag(s)", responseObject = SuccessResponse.class, since = "Burbank")
+public class DeleteTagsCmd extends BaseAsyncCmd{
+ public static final Logger s_logger = Logger.getLogger(DeleteTagsCmd.class.getName());
+
+ private static final String s_name = "deleteTagsresponse";
+
+ // ///////////////////////////////////////////////////
+ // ////////////// API parameters /////////////////////
+ // ///////////////////////////////////////////////////
+
+ @Parameter(name = ApiConstants.TAGS, type = CommandType.MAP, description = "Delete tags matching key/value pairs")
+ private Map tag;
+
+ @Parameter(name=ApiConstants.RESOURCE_TYPE, type=CommandType.STRING, required=true, description="Delete tag by resource type")
+ private String resourceType;
+
+ @Parameter(name=ApiConstants.RESOURCE_IDS, type=CommandType.LIST, required=true,
+ collectionType=CommandType.STRING, description="Delete tags for resource id(s)")
+ private List<String> resourceIds;
+
+ /////////////////////////////////////////////////////
+ /////////////////// Accessors ///////////////////////
+ /////////////////////////////////////////////////////
+
+
+ public TaggedResourceType getResourceType(){
+ return _taggedResourceService.getResourceType(resourceType);
+ }
+
+ public Map<String, String> getTags() {
+ Map<String, String> tagsMap = null;
+ if (tag != null && !tag.isEmpty()) {
+ tagsMap = new HashMap<String, String>();
+ Collection<?> servicesCollection = tag.values();
+ Iterator<?> iter = servicesCollection.iterator();
+ while (iter.hasNext()) {
+ HashMap<String, String> services = (HashMap<String, String>) iter.next();
+ String key = services.get("key");
+ String value = services.get("value");
+ tagsMap.put(key, value);
+ }
+ }
+ return tagsMap;
+ }
+
+ public List<String> getResourceIds() {
+ return resourceIds;
+ }
+
+ // ///////////////////////////////////////////////////
+ // ///////////// API Implementation///////////////////
+ // ///////////////////////////////////////////////////
+
+ @Override
+ public String getCommandName() {
+ return s_name;
+ }
+
+ @Override
+ public long getEntityOwnerId() {
+ //FIXME - validate the owner here
+ return 1;
+ }
+
+ @Override
+ public void execute() {
+ boolean success = _taggedResourceService.deleteTags(getResourceIds(), getResourceType(), getTags());
+
+ if (success) {
+ SuccessResponse response = new SuccessResponse(getCommandName());
+ this.setResponseObject(response);
+ } else {
+ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to delete tags");
+ }
+ }
+
+ @Override
+ public String getEventType() {
+ return EventTypes.EVENT_TAGS_DELETE;
+ }
+
+ @Override
+ public String getEventDescription() {
+ return "Deleting tags";
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/api/commands/ListTagsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/commands/ListTagsCmd.java b/api/src/com/cloud/api/commands/ListTagsCmd.java
index 80e2a2a..8b9eae1 100644
--- a/api/src/com/cloud/api/commands/ListTagsCmd.java
+++ b/api/src/com/cloud/api/commands/ListTagsCmd.java
@@ -43,6 +43,9 @@ public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd{
@Parameter(name=ApiConstants.VALUE, type=CommandType.STRING, description="list by value")
private String value;
+ @Parameter(name=ApiConstants.CUSTOMER, type=CommandType.STRING, description="list by customer name")
+ private String customer;
+
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
@@ -84,4 +87,8 @@ public class ListTagsCmd extends BaseListProjectAndAccountResourcesCmd{
public String getCommandName() {
return s_name;
}
+
+ public String getCustomer() {
+ return customer;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/api/response/ResourceTagResponse.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/api/response/ResourceTagResponse.java b/api/src/com/cloud/api/response/ResourceTagResponse.java
index fc8d43c..aa69141 100644
--- a/api/src/com/cloud/api/response/ResourceTagResponse.java
+++ b/api/src/com/cloud/api/response/ResourceTagResponse.java
@@ -52,6 +52,9 @@ public class ResourceTagResponse extends BaseResponse implements ControlledEntit
@SerializedName(ApiConstants.DOMAIN)
@Param(description = "the domain associated with the tag")
private String domainName;
+
+ @SerializedName(ApiConstants.CUSTOMER) @Param(description="customer associated with the tag")
+ private String customer;
public void setKey(String key) {
this.key = key;
@@ -91,4 +94,7 @@ public class ResourceTagResponse extends BaseResponse implements ControlledEntit
this.projectName = projectName;
}
+ public void setCustomer(String customer) {
+ this.customer = customer;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/configuration/Resource.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/configuration/Resource.java b/api/src/com/cloud/configuration/Resource.java
index bb2121b..24bb669 100644
--- a/api/src/com/cloud/configuration/Resource.java
+++ b/api/src/com/cloud/configuration/Resource.java
@@ -19,22 +19,6 @@ package com.cloud.configuration;
public interface Resource {
public static final short RESOURCE_UNLIMITED = -1;
-
- public enum TaggedResourceType {
- UserVm,
- Template,
- ISO,
- Volume,
- Snapshot,
- Network,
- LoadBalancingRule,
- PortForwardingRule,
- FirewallRule,
- SecurityGroup,
- RemoteAccessVpn,
- PublicIpAdddress,
- SecondaryStorageVm
- }
public enum ResourceType {
user_vm("user_vm", 0, ResourceOwnerType.Account, ResourceOwnerType.Domain),
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/server/ResourceTag.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/server/ResourceTag.java b/api/src/com/cloud/server/ResourceTag.java
index 050c8c8..c3307b6 100644
--- a/api/src/com/cloud/server/ResourceTag.java
+++ b/api/src/com/cloud/server/ResourceTag.java
@@ -13,12 +13,25 @@
package com.cloud.server;
import com.cloud.acl.ControlledEntity;
-import com.cloud.configuration.Resource;
/**
* @author Alena Prokharchyk
*/
public interface ResourceTag extends ControlledEntity{
+
+ public enum TaggedResourceType {
+ UserVm,
+ Template,
+ ISO,
+ Volume,
+ Snapshot,
+ Network,
+ LoadBalancer,
+ PortForwardingRule,
+ FirewallRule,
+ SecurityGroup,
+ PublicIpAddress
+ }
/**
* @return
@@ -43,6 +56,11 @@ public interface ResourceTag extends ControlledEntity{
/**
* @return
*/
- Resource.TaggedResourceType getResourceType();
+ TaggedResourceType getResourceType();
+
+ /**
+ * @return
+ */
+ String getCustomer();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/api/src/com/cloud/server/TaggedResourceService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/server/TaggedResourceService.java b/api/src/com/cloud/server/TaggedResourceService.java
index 9a4bd32..d76d192 100644
--- a/api/src/com/cloud/server/TaggedResourceService.java
+++ b/api/src/com/cloud/server/TaggedResourceService.java
@@ -16,23 +16,23 @@ import java.util.List;
import java.util.Map;
import com.cloud.api.commands.ListTagsCmd;
-import com.cloud.configuration.Resource;
-import com.cloud.configuration.Resource.TaggedResourceType;
+import com.cloud.server.ResourceTag.TaggedResourceType;
/**
* @author Alena Prokharchyk
*/
public interface TaggedResourceService {
- Resource.TaggedResourceType getResourceType (String resourceTypeStr);
+ TaggedResourceType getResourceType (String resourceTypeStr);
/**
* @param resourceIds TODO
* @param resourceType
* @param tags
+ * @param customer TODO
* @return
*/
- List<ResourceTag> createTags(List<String> resourceIds, TaggedResourceType resourceType, Map<String, String> tags);
+ List<ResourceTag> createTags(List<String> resourceIds, TaggedResourceType resourceType, Map<String, String> tags, String customer);
/**
* @param resourceId
@@ -46,4 +46,12 @@ public interface TaggedResourceService {
* @return
*/
List<? extends ResourceTag> listTags(ListTagsCmd listTagsCmd);
+
+ /**
+ * @param resourceIds
+ * @param resourceType
+ * @param tags
+ * @return
+ */
+ boolean deleteTags(List<String> resourceIds, TaggedResourceType resourceType, Map<String, String> tags);
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/server/src/com/cloud/api/ApiDBUtils.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java
index d75ab73..2a0eaaf 100755
--- a/server/src/com/cloud/api/ApiDBUtils.java
+++ b/server/src/com/cloud/api/ApiDBUtils.java
@@ -25,7 +25,6 @@ import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
import com.cloud.configuration.Config;
import com.cloud.configuration.ConfigurationService;
import com.cloud.configuration.Resource.ResourceType;
-import com.cloud.configuration.Resource.TaggedResourceType;
import com.cloud.configuration.dao.ConfigurationDao;
import com.cloud.dc.AccountVlanMapVO;
import com.cloud.dc.ClusterVO;
@@ -78,6 +77,7 @@ import com.cloud.projects.ProjectService;
import com.cloud.resource.ResourceManager;
import com.cloud.server.Criteria;
import com.cloud.server.ManagementServer;
+import com.cloud.server.ResourceTag.TaggedResourceType;
import com.cloud.server.StatsCollector;
import com.cloud.server.TaggedResourceService;
import com.cloud.service.ServiceOfferingVO;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/server/src/com/cloud/api/ApiResponseHelper.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index d3c91b8..973a74e 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -3430,6 +3430,8 @@ public class ApiResponseHelper implements ResponseGenerator {
response.setDomainName(ApiDBUtils.findDomainById(domainId).getName());
}
+ response.setCustomer(resourceTag.getCustomer());
+
response.setObjectName("tag");
return response;
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/server/src/com/cloud/tags/ResourceTagVO.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/tags/ResourceTagVO.java b/server/src/com/cloud/tags/ResourceTagVO.java
index 74786ba..7aef1e4 100644
--- a/server/src/com/cloud/tags/ResourceTagVO.java
+++ b/server/src/com/cloud/tags/ResourceTagVO.java
@@ -24,8 +24,6 @@ import javax.persistence.Id;
import javax.persistence.Table;
import com.cloud.api.Identity;
-import com.cloud.configuration.Resource;
-import com.cloud.configuration.Resource.TaggedResourceType;
import com.cloud.server.ResourceTag;
/**
@@ -61,7 +59,10 @@ public class ResourceTagVO implements Identity, ResourceTag{
@Column(name="resource_type")
@Enumerated(value=EnumType.STRING)
- private Resource.TaggedResourceType resourceType;
+ private TaggedResourceType resourceType;
+
+ @Column(name="customer")
+ String customer;
protected ResourceTagVO(){
@@ -75,8 +76,10 @@ public class ResourceTagVO implements Identity, ResourceTag{
* @param domainId
* @param resourceId
* @param resourceType
+ * @param customer TODO
*/
- public ResourceTagVO(String key, String value, long accountId, long domainId, long resourceId, TaggedResourceType resourceType) {
+ public ResourceTagVO(String key, String value, long accountId, long domainId, long resourceId,
+ TaggedResourceType resourceType, String customer) {
super();
this.key = key;
this.value = value;
@@ -85,6 +88,7 @@ public class ResourceTagVO implements Identity, ResourceTag{
this.resourceId = resourceId;
this.resourceType = resourceType;
this.uuid = UUID.randomUUID().toString();
+ this.customer = customer;
}
@@ -128,7 +132,7 @@ public class ResourceTagVO implements Identity, ResourceTag{
}
@Override
- public Resource.TaggedResourceType getResourceType() {
+ public TaggedResourceType getResourceType() {
return resourceType;
}
@@ -136,4 +140,9 @@ public class ResourceTagVO implements Identity, ResourceTag{
public String getUuid() {
return uuid;
}
+
+ @Override
+ public String getCustomer() {
+ return customer;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
index 7e442a9..3d3cf27 100644
--- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
+++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
@@ -23,14 +23,25 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import com.cloud.api.commands.ListTagsCmd;
-import com.cloud.configuration.Resource;
-import com.cloud.configuration.Resource.TaggedResourceType;
import com.cloud.domain.Domain;
+import com.cloud.event.ActionEvent;
+import com.cloud.event.EventTypes;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
+import com.cloud.network.dao.FirewallRulesDao;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.LoadBalancerDao;
+import com.cloud.network.dao.NetworkDao;
+import com.cloud.network.dao.RemoteAccessVpnDao;
+import com.cloud.network.rules.dao.PortForwardingRulesDao;
+import com.cloud.network.security.dao.SecurityGroupDao;
import com.cloud.projects.Project.ListProjectResourcesCriteria;
import com.cloud.server.ResourceTag;
+import com.cloud.server.ResourceTag.TaggedResourceType;
import com.cloud.server.TaggedResourceService;
+import com.cloud.storage.dao.SnapshotDao;
+import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VolumeDao;
import com.cloud.tags.dao.ResourceTagDao;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
@@ -48,7 +59,6 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
import com.cloud.uuididentity.dao.IdentityDao;
-import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.dao.UserVmDao;
/**
@@ -59,11 +69,8 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
public static final Logger s_logger = Logger.getLogger(TaggedResourceManagerImpl.class);
private String _name;
- private static Map<Resource.TaggedResourceType, String> _resourceMap=
- new HashMap<Resource.TaggedResourceType, String>();
-
- private static Map<Resource.TaggedResourceType, GenericDao<?, Long>> _daoMap=
- new HashMap<Resource.TaggedResourceType, GenericDao<?, Long>>();
+ private static Map<TaggedResourceType, GenericDao<?, Long>> _daoMap=
+ new HashMap<TaggedResourceType, GenericDao<?, Long>>();
@Inject
AccountManager _accountMgr;
@@ -75,15 +82,42 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
DomainManager _domainMgr;
@Inject
UserVmDao _userVmDao;
+ @Inject
+ VolumeDao _volumeDao;
+ @Inject
+ VMTemplateDao _templateDao;
+ @Inject
+ SnapshotDao _snapshotDao;
+ @Inject
+ NetworkDao _networkDao;
+ @Inject
+ LoadBalancerDao _lbDao;
+ @Inject
+ PortForwardingRulesDao _pfDao;
+ @Inject
+ FirewallRulesDao _firewallDao;
+ @Inject
+ SecurityGroupDao _securityGroupDao;
+ @Inject
+ RemoteAccessVpnDao _vpnDao;
+ @Inject
+ IPAddressDao _publicIpDao;
-
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
_name = name;
- _resourceMap.put(TaggedResourceType.UserVm, DbUtil.getTableName(VMInstanceVO.class));
_daoMap.put(TaggedResourceType.UserVm, _userVmDao);
-
-
+ _daoMap.put(TaggedResourceType.Volume, _volumeDao);
+ _daoMap.put(TaggedResourceType.Template, _templateDao);
+ _daoMap.put(TaggedResourceType.ISO, _templateDao);
+ _daoMap.put(TaggedResourceType.Snapshot, _snapshotDao);
+ _daoMap.put(TaggedResourceType.Network, _networkDao);
+ _daoMap.put(TaggedResourceType.LoadBalancer, _lbDao);
+ _daoMap.put(TaggedResourceType.PortForwardingRule, _pfDao);
+ _daoMap.put(TaggedResourceType.FirewallRule, _firewallDao);
+ _daoMap.put(TaggedResourceType.SecurityGroup, _securityGroupDao);
+ _daoMap.put(TaggedResourceType.PublicIpAddress, _publicIpDao);
+
return true;
}
@@ -103,24 +137,61 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
}
- private Long getResourceId(String resourceId, Resource.TaggedResourceType resourceType) {
- String tableName = _resourceMap.get(resourceType);
-
- if (tableName == null) {
- throw new InvalidParameterValueException("Unable to find resource of type " + resourceType + " in the database");
- }
+ private Long getResourceId(String resourceId, TaggedResourceType resourceType) {
+ GenericDao<?, Long> dao = _daoMap.get(resourceType);
+ Class<?> claz = DbUtil.getEntityBeanType(dao);
- return _identityDao.getIdentityId(tableName, resourceId);
+ Long identityId = null;
+
+ while (claz != null && claz != Object.class) {
+ try {
+ String tableName = DbUtil.getTableName(claz);
+ if (tableName == null) {
+ throw new InvalidParameterValueException("Unable to find resource of type " + resourceType + " in the database");
+ }
+ identityId = _identityDao.getIdentityId(tableName, resourceId);
+ if (identityId != null) {
+ break;
+ }
+ } catch (Exception ex) {
+ //do nothing here, it might mean uuid field is missing and we have to search further
+ }
+ claz = claz.getSuperclass();
+ }
+
+ if (identityId == null) {
+ throw new InvalidParameterValueException("Unable to find resource by id " + resourceId + " and type " + resourceType);
+ }
+ return identityId;
}
-
- private Pair<Long, Long> getAccountDomain(long resourceId, Resource.TaggedResourceType resourceType) {
- String tableName = _resourceMap.get(resourceType);
- if (tableName == null) {
- throw new InvalidParameterValueException("Unable to find resource of type " + resourceType + " in the database");
+ protected String getTableName(TaggedResourceType resourceType) {
+ GenericDao<?, Long> dao = _daoMap.get(resourceType);
+ Class<?> claz = DbUtil.getEntityBeanType(dao);
+ return DbUtil.getTableName(claz);
+ }
+
+ private Pair<Long, Long> getAccountDomain(long resourceId, TaggedResourceType resourceType) {
+
+ Pair<Long, Long> pair = null;
+ GenericDao<?, Long> dao = _daoMap.get(resourceType);
+ Class<?> claz = DbUtil.getEntityBeanType(dao);
+ while (claz != null && claz != Object.class) {
+ try {
+ String tableName = DbUtil.getTableName(claz);
+ if (tableName == null) {
+ throw new InvalidParameterValueException("Unable to find resource of type " + resourceType + " in the database");
+ }
+ pair = _identityDao.getAccountDomainInfo(tableName, resourceId);
+ if (pair.first() != null || pair.second() != null) {
+ break;
+ }
+ } catch (Exception ex) {
+ //do nothing here, it might mean uuid field is missing and we have to search further
+ }
+ claz = claz.getSuperclass();
}
-
- Pair<Long, Long> pair = _identityDao.getAccountDomainInfo(tableName, resourceId);
+
Long accountId = pair.first();
Long domainId = pair.second();
@@ -137,19 +208,20 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
@Override
public TaggedResourceType getResourceType(String resourceTypeStr) {
- Resource.TaggedResourceType resourceType = null;
- try {
- resourceType = Resource.TaggedResourceType.valueOf(resourceTypeStr);
- } catch (IllegalArgumentException ex) {
- throw new InvalidParameterValueException("Invalid resource type " + resourceType);
- }
-
- return resourceType;
+
+ for (TaggedResourceType type : ResourceTag.TaggedResourceType.values()) {
+ if (type.toString().equalsIgnoreCase(resourceTypeStr)) {
+ return type;
+ }
+ }
+ throw new InvalidParameterValueException("Invalid resource type " + resourceTypeStr);
}
@Override
@DB
- public List<ResourceTag> createTags(List<String> resourceIds, TaggedResourceType resourceType, Map<String, String> tags) {
+ @ActionEvent(eventType = EventTypes.EVENT_TAGS_CREATE, eventDescription = "creating resource tags")
+ public List<ResourceTag> createTags(List<String> resourceIds, TaggedResourceType resourceType,
+ Map<String, String> tags, String customer) {
Account caller = UserContext.current().getCaller();
List<ResourceTag> resourceTags = new ArrayList<ResourceTag>(tags.size());
@@ -181,7 +253,7 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
ResourceTagVO resourceTag = new ResourceTagVO(tag, tags.get(tag), accountDomainPair.first(),
accountDomainPair.second(),
- id, resourceType);
+ id, resourceType, customer);
resourceTag = _resourceTagDao.persist(resourceTag);
resourceTags.add(resourceTag);
@@ -195,7 +267,32 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
@Override
public String getUuid(String resourceId, TaggedResourceType resourceType) {
- return _identityDao.getIdentityUuid(_resourceMap.get(resourceType), resourceId);
+ GenericDao<?, Long> dao = _daoMap.get(resourceType);
+ Class<?> claz = DbUtil.getEntityBeanType(dao);
+
+ String identiyUUId = null;
+
+ while (claz != null && claz != Object.class) {
+ try {
+ String tableName = DbUtil.getTableName(claz);
+ if (tableName == null) {
+ throw new InvalidParameterValueException("Unable to find resource of type " + resourceType + " in the database");
+ }
+ identiyUUId = _identityDao.getIdentityUuid(tableName, resourceId);
+ if (identiyUUId != null) {
+ break;
+ }
+ } catch (Exception ex) {
+ //do nothing here, it might mean uuid field is missing and we have to search further
+ }
+ claz = claz.getSuperclass();
+ }
+
+ if (identiyUUId == null) {
+ return resourceId;
+ }
+
+ return identiyUUId;
}
@Override
@@ -206,6 +303,7 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
String value = cmd.getValue();
String resourceId = cmd.getResourceId();
String resourceType = cmd.getResourceType();
+ String customerName = cmd.getCustomer();
boolean listAll = cmd.listAll();
Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject =
@@ -224,6 +322,7 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ);
sb.and("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ);
sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ);
+ sb.and("customer", sb.entity().getCustomer(), SearchCriteria.Op.EQ);
// now set the SC criteria...
SearchCriteria<ResourceTagVO> sc = sb.create();
@@ -245,7 +344,67 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
sc.setParameters("resourceType", resourceType);
}
+ if (customerName != null) {
+ sc.setParameters("customer", customerName);
+ }
+
return _resourceTagDao.search(sc, searchFilter);
}
+ @Override
+ @DB
+ @ActionEvent(eventType = EventTypes.EVENT_TAGS_DELETE, eventDescription = "deleting resource tags")
+ public boolean deleteTags(List<String> resourceIds, TaggedResourceType resourceType, Map<String, String> tags) {
+ Account caller = UserContext.current().getCaller();
+
+ SearchBuilder<ResourceTagVO> sb = _resourceTagDao.createSearchBuilder();
+ sb.and("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.IN);
+ sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ);
+ SearchCriteria<ResourceTagVO> sc = sb.create();
+ sc.setParameters("resourceId", resourceIds.toArray());
+ sc.setParameters("resourceType", resourceType);
+
+ List<? extends ResourceTag> resourceTags = _resourceTagDao.search(sc, null);;
+ List<ResourceTag> tagsToRemove = new ArrayList<ResourceTag>();
+
+ // Finalize which tags should be removed
+ for (ResourceTag resourceTag : resourceTags) {
+ //1) validate the permissions
+ Account owner = _accountMgr.getAccount(resourceTag.getAccountId());
+ _accountMgr.checkAccess(caller, null, false, owner);
+ //2) Only remove tag if it matches key value pairs
+ if (tags != null && !tags.isEmpty()) {
+ for (String key : tags.keySet()) {
+ boolean canBeRemoved = false;
+ if (resourceTag.getKey().equalsIgnoreCase(key)) {
+ String value = tags.get(key);
+ if (value != null) {
+ if (resourceTag.getValue().equalsIgnoreCase(value)) {
+ canBeRemoved = true;
+ }
+ } else {
+ canBeRemoved = true;
+ }
+ if (canBeRemoved) {
+ tagsToRemove.add(resourceTag);
+ break;
+ }
+ }
+ }
+ } else {
+ tagsToRemove.add(resourceTag);
+ }
+ }
+
+ //Remove the tags
+ Transaction txn = Transaction.currentTxn();
+ txn.start();
+ for (ResourceTag tagToRemove : tagsToRemove) {
+ _resourceTagDao.remove(tagToRemove.getId());
+ s_logger.debug("Removed the tag " + tagToRemove);
+ }
+ txn.commit();
+
+ return true;
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
index 219ed90..a86dbcb 100644
--- a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
+++ b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
@@ -51,7 +51,14 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
PreparedStatement pstmt = null;
Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
- try {
+ try {
+ try {
+ pstmt = txn.prepareAutoCloseStatement(String.format("SELECT uuid FROM `%s`", tableName));
+ pstmt.executeQuery();
+ } catch (SQLException e) {
+ throw new InvalidParameterValueException("uuid field doesn't exist in table " + tableName);
+ }
+
pstmt = txn.prepareAutoCloseStatement(
String.format("SELECT id FROM `%s` WHERE id=? OR uuid=?", tableName)
@@ -96,26 +103,33 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
PreparedStatement pstmt = null;
Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
+ Long domainId = null;
+ Long accountId = null;
+ //get domainId
+ try {
+ pstmt = txn.prepareAutoCloseStatement(String.format("SELECT domain_id FROM `%s` WHERE id=?", tableName));
+ pstmt.setLong(1, identityId);
+ ResultSet rs = pstmt.executeQuery();
+ if (rs.next()) {
+ domainId = rs.getLong(1);
+ }
+ } catch (SQLException e) {
+ }
+
+ //get accountId
try {
- pstmt = txn.prepareAutoCloseStatement(
- String.format("SELECT account_id, domain_id FROM `%s` WHERE id=?", tableName)
- );
-
+ pstmt = txn.prepareAutoCloseStatement(String.format("SELECT account_id FROM `%s` WHERE id=?", tableName));
pstmt.setLong(1, identityId);
-
ResultSet rs = pstmt.executeQuery();
- if(rs.next()) {
- return new Pair<Long, Long>(rs.getLong(1), rs.getLong(2));
- } else {
- throw new InvalidParameterValueException("Object " + tableName + "(id: " + identityId + ") does not exist.");
+ if (rs.next()) {
+ accountId = rs.getLong(1);
}
} catch (SQLException e) {
- s_logger.error("Unexpected exception ", e);
}
+ return new Pair<Long, Long>(accountId, domainId);
} finally {
txn.close();
}
- return null;
}
@DB
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/utils/src/com/cloud/utils/db/DbUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/db/DbUtil.java b/utils/src/com/cloud/utils/db/DbUtil.java
index dbaa2fa..feef7b3 100755
--- a/utils/src/com/cloud/utils/db/DbUtil.java
+++ b/utils/src/com/cloud/utils/db/DbUtil.java
@@ -244,6 +244,11 @@ public class DbUtil {
return false;
}
+
+ public static Class<?> getEntityBeanType(GenericDao<?, Long> dao) {
+ return dao.getEntityBeanType();
+ }
+
public static boolean releaseGlobalLock(String name) {
Connection conn = getConnectionForGlobalLocks(name, false);
if(conn == null) {
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/utils/src/com/cloud/utils/db/GenericDao.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/db/GenericDao.java b/utils/src/com/cloud/utils/db/GenericDao.java
index 8fbea61..3ab319e 100755
--- a/utils/src/com/cloud/utils/db/GenericDao.java
+++ b/utils/src/com/cloud/utils/db/GenericDao.java
@@ -255,4 +255,9 @@ public interface GenericDao<T, ID extends Serializable> {
SearchCriteria2 createSearchCriteria2();
public T findOneBy(final SearchCriteria<T> sc);
+
+ /**
+ * @return
+ */
+ Class<T> getEntityBeanType();
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/55a12582/utils/src/com/cloud/utils/db/GenericDaoBase.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/utils/src/com/cloud/utils/db/GenericDaoBase.java
index 563232d..938ae15 100755
--- a/utils/src/com/cloud/utils/db/GenericDaoBase.java
+++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java
@@ -840,6 +840,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> implements Gene
}
@DB(txn=false)
+ @Override
public Class<T> getEntityBeanType() {
return _entityBeanType;
}