You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ro...@apache.org on 2019/05/30 05:56:04 UTC
[cloudstack] branch 4.11 updated: server: fix duplicate tag
exception as CloudRuntimeException (#3348)
This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch 4.11
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.11 by this push:
new 910b08f server: fix duplicate tag exception as CloudRuntimeException (#3348)
910b08f is described below
commit 910b08f72bbe001ded808280fbc27223b9d0c0b6
Author: dahn <da...@gmail.com>
AuthorDate: Thu May 30 07:55:52 2019 +0200
server: fix duplicate tag exception as CloudRuntimeException (#3348)
See #3339: a runtime exception is thrown but it should be converted to an error return. Wrapping it in a CloudRuntimeException should do the trick.
Fixes #3339
---
.../com/cloud/tags/TaggedResourceManagerImpl.java | 7 +-
test/integration/component/test_tags.py | 80 ++++++++++++++++++++++
2 files changed, 86 insertions(+), 1 deletion(-)
diff --git a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
index 9803ce7..f871b6a 100644
--- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
+++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
@@ -85,6 +85,7 @@ import org.apache.commons.collections.MapUtils;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
+import javax.persistence.EntityExistsException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -310,7 +311,11 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
}
ResourceTagVO resourceTag = new ResourceTagVO(key, value, accountDomainPair.first(), accountDomainPair.second(), id, resourceType, customer, resourceUuid);
- resourceTag = _resourceTagDao.persist(resourceTag);
+ try {
+ resourceTag = _resourceTagDao.persist(resourceTag);
+ } catch (EntityExistsException e) {
+ throw new CloudRuntimeException(String.format("tag %s already on %s with id %s", resourceTag.getKey(), resourceType.toString(), resourceId),e);
+ }
resourceTags.add(resourceTag);
}
}
diff --git a/test/integration/component/test_tags.py b/test/integration/component/test_tags.py
index ed1aee7..efe8a76 100644
--- a/test/integration/component/test_tags.py
+++ b/test/integration/component/test_tags.py
@@ -2974,3 +2974,83 @@ class TestResourceTags(cloudstackTestCase):
self.fail("User1 has access to create tags for User2.")
return
+
+ @attr(tags=["advanced", "basic"], required_hardware="false")
+ def test_33_duplicate_vm_tag(self):
+ """
+ Test creation of a duplicate tag on UserVM and verify error return.
+ cleanup by deleting
+ """
+ # Validate the following
+ # 1. Create a tag on VM using createTags API
+ # 2. Create the same tag on VM using createTags API
+ # 3. check the return for the right error message
+
+ tag_key = 'scope'
+ tag_value = 'test_33_duplicate_vm_tag'
+
+ self.debug("Creating a tag for user VM")
+ # use vm_2 as vm_1 is deleted in other tests :(
+ tag = Tag.create(
+ self.apiclient,
+ resourceIds=self.vm_2.id,
+ resourceType='userVM',
+ tags={tag_key: tag_value}
+ )
+ self.debug("Tag created: %s" % tag.__dict__)
+
+ self.debug("Trying second tag witgh the same key for user VM")
+ try:
+ erronousTag = Tag.create(
+ self.apiclient,
+ resourceIds=self.vm_2.id,
+ resourceType='userVM',
+ tags={tag_key: tag_value}
+ )
+ except Exception as e:
+ # verify e.message
+ assert "tag scope already on UserVm with id" in e.message, \
+ "neat error message missing from error result"
+ pass
+
+
+ # we should still find the tag
+ vms = VirtualMachine.list(
+ self.apiclient,
+ listall=True,
+ key=tag_key,
+ value=tag_value
+ )
+
+ self.assertEqual(
+ isinstance(vms, list),
+ True,
+ "Tag based VMs listing failed")
+
+ self.debug("Deleting the created tag..")
+ try:
+ Tag.delete(
+ self.apiclient,
+ resourceIds=self.vm_2.id,
+ resourceType='userVM',
+ tags={tag_key: tag_value}
+ )
+ except Exception as e:
+ self.fail("Failed to delete the tag - %s" % e)
+
+ self.debug("Verifying if tag is actually deleted!")
+ tags = Tag.list(
+ self.apiclient,
+ listall=True,
+ resourceType='userVM',
+ account=self.account.name,
+ domainid=self.account.domainid,
+ key=tag_key,
+ value=tag_value
+ )
+ self.assertEqual(
+ tags,
+ None,
+ "List tags should return empty response"
+ )
+ return