Updated Branches: refs/heads/trunk 981611409 -> 91c6281db
LIBCLOUD-514: Add create/delete tag support into the CloudStack driver. New tests and fixtures are also included. Closes #248. Signed-off-by: Tomaz Muraus <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/7d1d1cf6 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/7d1d1cf6 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/7d1d1cf6 Branch: refs/heads/trunk Commit: 7d1d1cf63122ddf503d3c8a5dd018488790060fc Parents: 9816114 Author: Chris DeRamus <[email protected]> Authored: Sat Feb 8 07:56:36 2014 -0500 Committer: Tomaz Muraus <[email protected]> Committed: Sun Feb 9 21:29:29 2014 +0100 ---------------------------------------------------------------------- libcloud/compute/drivers/cloudstack.py | 63 ++++++++++++++++++++ .../fixtures/cloudstack/createTags_default.json | 1 + .../fixtures/cloudstack/deleteTags_default.json | 1 + .../queryAsyncJobResult_createtagsjob.json | 1 + .../queryAsyncJobResult_deletetagsjob.json | 1 + libcloud/test/compute/test_cloudstack.py | 12 ++++ 6 files changed, 79 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/7d1d1cf6/libcloud/compute/drivers/cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/compute/drivers/cloudstack.py b/libcloud/compute/drivers/cloudstack.py index 7bc2516..5d66e8d 100644 --- a/libcloud/compute/drivers/cloudstack.py +++ b/libcloud/compute/drivers/cloudstack.py @@ -1692,6 +1692,69 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): return limits + def ex_create_tags(self, resource_ids, resource_type, tags): + """ + Create tags for a resource (Node/StorageVolume/etc). + A list of resource types can be found at http://goo.gl/6OKphH + + :param resource_ids: Resource IDs to be tagged. The resource IDs must + all be associated with the resource_type. + For example, for virtual machines (UserVm) you + can only specify a list of virtual machine IDs. + :type resource_ids: ``list`` of resource IDs + + :param resource_type: Resource type (eg: UserVm) + :type resource_type: ``str`` + + :param tags: A dictionary or other mapping of strings to strings, + associating tag names with tag values. + :type tags: ``dict`` + + :rtype: ``bool`` + """ + params = {'resourcetype': resource_type, + 'resourceids': ','.join(resource_ids)} + + for i, key in enumerate(tags): + params['tags[%d].key' % i] = key + params['tags[%d].value' % i] = tags[key] + + self._async_request(command='createTags', + params=params, + method='GET') + return True + + def ex_delete_tags(self, resource_ids, resource_type, tag_keys): + """ + Delete tags from a resource. + + :param resource_ids: Resource IDs to be tagged. The resource IDs must + all be associated with the resource_type. + For example, for virtual machines (UserVm) you + can only specify a list of virtual machine IDs. + :type resource_ids: ``list`` of resource IDs + + :param resource_type: Resource type (eg: UserVm) + :type resource_type: ``str`` + + :param tag_keys: A list of keys to delete. CloudStack only requires + the keys from the key/value pair. + :type tag_keys: ``list`` + + :rtype: ``bool`` + """ + params = {'resourcetype': resource_type, + 'resourceids': ','.join(resource_ids)} + + for i, key in enumerate(tag_keys): + params['tags[%s].key' % i] = key + + self._async_request(command='deleteTags', + params=params, + method='GET') + + return True + def _to_node(self, data, public_ips=None): """ :param data: Node data object. http://git-wip-us.apache.org/repos/asf/libcloud/blob/7d1d1cf6/libcloud/test/compute/fixtures/cloudstack/createTags_default.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/cloudstack/createTags_default.json b/libcloud/test/compute/fixtures/cloudstack/createTags_default.json new file mode 100644 index 0000000..aeeb1e0 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/createTags_default.json @@ -0,0 +1 @@ +{ "createtagsresponse" : {"id":"60338035-92fb-4d27-98d4-b60ad4b38b87","jobid":"createtagsjob"} } http://git-wip-us.apache.org/repos/asf/libcloud/blob/7d1d1cf6/libcloud/test/compute/fixtures/cloudstack/deleteTags_default.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/cloudstack/deleteTags_default.json b/libcloud/test/compute/fixtures/cloudstack/deleteTags_default.json new file mode 100644 index 0000000..e136a00 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/deleteTags_default.json @@ -0,0 +1 @@ +{ "deletetagsresponse" : {"id":"60338035-92fb-4d27-98d4-b60ad4b38b87","jobid":"deletetagsjob"} } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/7d1d1cf6/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_createtagsjob.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_createtagsjob.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_createtagsjob.json new file mode 100644 index 0000000..ab6a845 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_createtagsjob.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"dcfd4b83-2ae6-43d1-a2eb-af87066ecbc9","userid":"c3d3cb3c-0f13-429a-b900-5bacc346df32","cmd":"com.cloud.api.commands.CreateTagsCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"success":true},"created":"2014-02-07T20:10:40+0100","jobid":"2a7426a5-e25e-4400-900d-09bca3c0a039"} } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/7d1d1cf6/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_deletetagsjob.json ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_deletetagsjob.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_deletetagsjob.json new file mode 100644 index 0000000..b16cb4d --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_deletetagsjob.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"dcfd4b83-2ae6-43d1-a2eb-af87066ecbc9","userid":"c3d3cb3c-0f13-429a-b900-5bacc346df32","cmd":"com.cloud.api.commands.DeleteTagsCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"success":true},"created":"2014-02-08T13:43:24+0100","jobid":"02425faf-4cf4-44c2-9241-cb8b1eabc957"} } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/libcloud/blob/7d1d1cf6/libcloud/test/compute/test_cloudstack.py ---------------------------------------------------------------------- diff --git a/libcloud/test/compute/test_cloudstack.py b/libcloud/test/compute/test_cloudstack.py index c54d423..fc73116 100644 --- a/libcloud/test/compute/test_cloudstack.py +++ b/libcloud/test/compute/test_cloudstack.py @@ -496,6 +496,18 @@ class CloudStackCommonTestCase(TestCaseMixin): self.assertEqual(limits['max_volumes'], 20) self.assertEqual(limits['max_snapshots'], 20) + def test_ex_create_tags(self): + node = self.driver.list_nodes()[0] + tags = {'Region': 'Canada'} + resp = self.driver.ex_create_tags([node.id], 'UserVm', tags) + self.assertTrue(resp) + + def test_ex_delete_tags(self): + node = self.driver.list_nodes()[0] + tag_keys = ['Region'] + resp = self.driver.ex_delete_tags([node.id], 'UserVm', tag_keys) + self.assertTrue(resp) + class CloudStackTestCase(CloudStackCommonTestCase, unittest.TestCase): def test_driver_instantiation(self):
