Resource tags: CS-15473 - fixed delete/list by resourceId when UUID is specified as a value

This commit is contained in:
Alena Prokharchyk 2012-07-06 10:31:20 -07:00
parent c86c08a64f
commit ed63a14d5e
18 changed files with 71 additions and 25 deletions

View File

@ -67,4 +67,9 @@ public interface ResourceTag extends ControlledEntity{
*/
String getCustomer();
/**
* @return
*/
String getResourceUuid();
}

View File

@ -293,13 +293,13 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
FirewallRuleVO entry = findById(id);
if (entry != null) {
if (entry.getPurpose() == Purpose.LoadBalancing) {
_tagsDao.removeBy(id, TaggedResourceType.LoadBalancer);
_tagsDao.removeByIdAndType(id, TaggedResourceType.LoadBalancer);
} else if (entry.getPurpose() == Purpose.PortForwarding) {
_tagsDao.removeBy(id, TaggedResourceType.PortForwardingRule);
_tagsDao.removeByIdAndType(id, TaggedResourceType.PortForwardingRule);
} else if (entry.getPurpose() == Purpose.Firewall) {
_tagsDao.removeBy(id, TaggedResourceType.FirewallRule);
_tagsDao.removeByIdAndType(id, TaggedResourceType.FirewallRule);
} else if (entry.getPurpose() == Purpose.NetworkACL) {
_tagsDao.removeBy(id, TaggedResourceType.NetworkACL);
_tagsDao.removeByIdAndType(id, TaggedResourceType.NetworkACL);
}
}
boolean result = super.remove(id);

View File

@ -333,7 +333,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
txn.start();
IPAddressVO entry = findById(id);
if (entry != null) {
_tagsDao.removeBy(id, TaggedResourceType.SecurityGroup);
_tagsDao.removeByIdAndType(id, TaggedResourceType.SecurityGroup);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -517,7 +517,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
txn.start();
NetworkVO entry = findById(id);
if (entry != null) {
_tagsDao.removeBy(id, TaggedResourceType.Network);
_tagsDao.removeByIdAndType(id, TaggedResourceType.Network);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -104,7 +104,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase<SecurityGroupVO, Long>
txn.start();
SecurityGroupVO entry = findById(id);
if (entry != null) {
_tagsDao.removeBy(id, TaggedResourceType.SecurityGroup);
_tagsDao.removeByIdAndType(id, TaggedResourceType.SecurityGroup);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -105,7 +105,7 @@ public class StaticRouteDaoImpl extends GenericDaoBase<StaticRouteVO, Long> impl
txn.start();
StaticRouteVO entry = findById(id);
if (entry != null) {
_tagsDao.removeBy(id, TaggedResourceType.StaticRoute);
_tagsDao.removeByIdAndType(id, TaggedResourceType.StaticRoute);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -95,7 +95,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
txn.start();
VpcVO entry = findById(id);
if (entry != null) {
_tagsDao.removeBy(id, TaggedResourceType.Vpc);
_tagsDao.removeByIdAndType(id, TaggedResourceType.Vpc);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -75,7 +75,7 @@ public class ProjectDaoImpl extends GenericDaoBase<ProjectVO, Long> implements P
return false;
}
_tagsDao.removeBy(projectId, TaggedResourceType.Project);
_tagsDao.removeByIdAndType(projectId, TaggedResourceType.Project);
result = super.remove(projectId);
txn.commit();

View File

@ -297,7 +297,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
txn.start();
SnapshotVO entry = findById(id);
if (entry != null) {
_tagsDao.removeBy(id, TaggedResourceType.Snapshot);
_tagsDao.removeByIdAndType(id, TaggedResourceType.Snapshot);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -799,9 +799,9 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
template.setRemoved(new Date());
if (template != null) {
if (template.getFormat() == ImageFormat.ISO) {
_tagsDao.removeBy(id, TaggedResourceType.ISO);
_tagsDao.removeByIdAndType(id, TaggedResourceType.ISO);
} else {
_tagsDao.removeBy(id, TaggedResourceType.Template);
_tagsDao.removeByIdAndType(id, TaggedResourceType.Template);
}
}

View File

@ -403,7 +403,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
txn.start();
VolumeVO entry = findById(id);
if (entry != null) {
_tagsDao.removeBy(id, TaggedResourceType.Volume);
_tagsDao.removeByIdAndType(id, TaggedResourceType.Volume);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -57,6 +57,9 @@ public class ResourceTagVO implements Identity, ResourceTag{
@Column(name="resource_id")
long resourceId;
@Column(name="resource_uuid")
private String resourceUuid;
@Column(name="resource_type")
@Enumerated(value=EnumType.STRING)
private TaggedResourceType resourceType;
@ -77,9 +80,10 @@ public class ResourceTagVO implements Identity, ResourceTag{
* @param resourceId
* @param resourceType
* @param customer TODO
* @param resourceUuid TODO
*/
public ResourceTagVO(String key, String value, long accountId, long domainId, long resourceId,
TaggedResourceType resourceType, String customer) {
TaggedResourceType resourceType, String customer, String resourceUuid) {
super();
this.key = key;
this.value = value;
@ -89,6 +93,7 @@ public class ResourceTagVO implements Identity, ResourceTag{
this.resourceType = resourceType;
this.uuid = UUID.randomUUID().toString();
this.customer = customer;
this.resourceUuid = resourceUuid;
}
@ -145,4 +150,9 @@ public class ResourceTagVO implements Identity, ResourceTag{
public String getCustomer() {
return customer;
}
@Override
public String getResourceUuid() {
return resourceUuid;
}
}

View File

@ -249,10 +249,12 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
for (String tag : tags.keySet()) {
for (String resourceId : resourceIds) {
Long id = getResourceId(resourceId, resourceType);
String resourceUuid = getUuid(resourceId, resourceType);
//check if object exists
if (_daoMap.get(resourceType).findById(id) == null) {
throw new InvalidParameterValueException("Unable to find resource by id " + resourceId + " and type " + resourceType);
throw new InvalidParameterValueException("Unable to find resource by id " + resourceId +
" and type " + resourceType);
}
Pair<Long, Long> accountDomainPair = getAccountDomain(id, resourceType);
@ -270,10 +272,9 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
ResourceTagVO resourceTag = new ResourceTagVO(tag, tags.get(tag), accountDomainPair.first(),
accountDomainPair.second(),
id, resourceType, customer);
id, resourceType, customer, resourceUuid);
resourceTag = _resourceTagDao.persist(resourceTag);
resourceTags.add(resourceTag);
}
}
@ -337,7 +338,9 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
sb.and("key", sb.entity().getKey(), SearchCriteria.Op.EQ);
sb.and("value", sb.entity().getValue(), SearchCriteria.Op.EQ);
sb.and("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ);
sb.and().op("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.EQ);
sb.or("resourceUuid", sb.entity().getResourceUuid(), SearchCriteria.Op.EQ);
sb.cp();
sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ);
sb.and("customer", sb.entity().getCustomer(), SearchCriteria.Op.EQ);
@ -355,6 +358,7 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
if (resourceId != null) {
sc.setParameters("resourceId", resourceId);
sc.setParameters("resourceUuid", resourceId);
}
if (resourceType != null) {
@ -375,10 +379,14 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
Account caller = UserContext.current().getCaller();
SearchBuilder<ResourceTagVO> sb = _resourceTagDao.createSearchBuilder();
sb.and("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.IN);
sb.and().op("resourceId", sb.entity().getResourceId(), SearchCriteria.Op.IN);
sb.or("resourceUuid", sb.entity().getResourceUuid(), SearchCriteria.Op.IN);
sb.cp();
sb.and("resourceType", sb.entity().getResourceType(), SearchCriteria.Op.EQ);
SearchCriteria<ResourceTagVO> sc = sb.create();
sc.setParameters("resourceId", resourceIds.toArray());
sc.setParameters("resourceUuid", resourceIds.toArray());
sc.setParameters("resourceType", resourceType);
List<? extends ResourceTag> resourceTags = _resourceTagDao.search(sc, null);;
@ -413,6 +421,10 @@ public class TaggedResourceManagerImpl implements TaggedResourceService, Manager
}
}
if (tagsToRemove.isEmpty()) {
throw new InvalidParameterValueException("Unable to find tags by parameters specified");
}
//Remove the tags
Transaction txn = Transaction.currentTxn();
txn.start();

View File

@ -29,8 +29,15 @@ public interface ResourceTagDao extends GenericDao<ResourceTagVO, Long>{
* @param resourceType
* @return
*/
boolean removeBy(long resourceId, TaggedResourceType resourceType);
boolean removeByIdAndType(long resourceId, TaggedResourceType resourceType);
List<? extends ResourceTag> listBy(long resourceId, TaggedResourceType resourceType);
// /**
// * @param resourceUuId
// * @param resourceType
// * @return
// */
// ResourceTag findByUuid(String resourceUuId, TaggedResourceType resourceType);
}

View File

@ -35,18 +35,27 @@ public class ResourceTagsDaoImpl extends GenericDaoBase<ResourceTagVO, Long> imp
protected ResourceTagsDaoImpl() {
AllFieldsSearch = createSearchBuilder();
AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), Op.EQ);
AllFieldsSearch.and("uuid", AllFieldsSearch.entity().getResourceUuid(), Op.EQ);
AllFieldsSearch.and("resourceType", AllFieldsSearch.entity().getResourceType(), Op.EQ);
AllFieldsSearch.done();
}
@Override
public boolean removeBy(long resourceId, ResourceTag.TaggedResourceType resourceType) {
public boolean removeByIdAndType(long resourceId, ResourceTag.TaggedResourceType resourceType) {
SearchCriteria<ResourceTagVO> sc = AllFieldsSearch.create();
sc.setParameters("resourceId", resourceId);
sc.setParameters("resourceType", resourceType);
remove(sc);
return true;
}
// @Override
// public ResourceTag findByUuid(String resourceUuId, ResourceTag.TaggedResourceType resourceType) {
// SearchCriteria<ResourceTagVO> sc = AllFieldsSearch.create();
// sc.setParameters("uuid", resourceUuId);
// sc.setParameters("resourceType", resourceType);
// return findOneBy(sc);
// }
@Override
public List<? extends ResourceTag> listBy(long resourceId, TaggedResourceType resourceType) {

View File

@ -549,7 +549,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
public boolean remove(Long id) {
Transaction txn = Transaction.currentTxn();
txn.start();
_tagsDao.removeBy(id, TaggedResourceType.UserVm);
_tagsDao.removeByIdAndType(id, TaggedResourceType.UserVm);
boolean result = super.remove(id);
txn.commit();
return result;

View File

@ -557,7 +557,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
txn.start();
VMInstanceVO vm = findById(id);
if (vm != null && vm.getType() == Type.User) {
_tagsDao.removeBy(id, TaggedResourceType.UserVm);
_tagsDao.removeByIdAndType(id, TaggedResourceType.UserVm);
}
boolean result = super.remove(id);
txn.commit();

View File

@ -2179,6 +2179,7 @@ CREATE TABLE `cloud`.`resource_tags` (
`key` varchar(255),
`value` varchar(255),
`resource_id` bigint unsigned NOT NULL,
`resource_uuid` varchar(40),
`resource_type` varchar(255),
`customer` varchar(255),
`domain_id` bigint unsigned NOT NULL COMMENT 'foreign key to domain id',
@ -2186,7 +2187,9 @@ CREATE TABLE `cloud`.`resource_tags` (
PRIMARY KEY (`id`),
CONSTRAINT `fk_tags__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`),
CONSTRAINT `fk_tags__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`),
UNIQUE `i_tags__resource_id__resource_type__key`(`resource_id`, `resource_type`, `key`)
UNIQUE `i_tags__resource_id__resource_type__key`(`resource_id`, `resource_type`, `key`),
CONSTRAINT `uc_resource_tags__uuid` UNIQUE (`uuid`),
CONSTRAINT `uc_resource_tags__resource_uuid` UNIQUE (`resource_uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `cloud`.`vpc` (