summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRene Moser <mail@renemoser.net>2015-04-29 21:06:58 +0200
committerRene Moser <mail@renemoser.net>2015-04-29 21:06:58 +0200
commitb11cd73df1ac11b4718c882f4db3f8180f3121bf (patch)
tree4f31fa526e39ffa827e64bf81d4da096f37df749
parent2f255f5b967ac4d8ddba53af21adf192f2330a53 (diff)
downloadansible-b11cd73df1ac11b4718c882f4db3f8180f3121bf.tar.gz
cloudstack: add tag support in utils
-rw-r--r--lib/ansible/module_utils/cloudstack.py61
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/ansible/module_utils/cloudstack.py b/lib/ansible/module_utils/cloudstack.py
index 0c7da28e2a..518ef7a732 100644
--- a/lib/ansible/module_utils/cloudstack.py
+++ b/lib/ansible/module_utils/cloudstack.py
@@ -41,6 +41,10 @@ class AnsibleCloudStack:
if not has_lib_cs:
module.fail_json(msg="python library cs required: pip install cs")
+ self.result = {
+ 'changed': False,
+ }
+
self.module = module
self._connect()
@@ -237,6 +241,63 @@ class AnsibleCloudStack:
self.module.fail_json(msg="Hypervisor '%s' not found" % hypervisor)
+ def get_tags(self, resource=None):
+ existing_tags = self.cs.listTags(resourceid=resource['id'])
+ if existing_tags:
+ return existing_tags['tag']
+ return []
+
+
+ def _delete_tags(self, resource, resource_type, tags):
+ existing_tags = resource['tags']
+ tags_to_delete = []
+ for existing_tag in existing_tags:
+ if existing_tag['key'] in tags:
+ if existing_tag['value'] != tags[key]:
+ tags_to_delete.append(existing_tag)
+ else:
+ tags_to_delete.append(existing_tag)
+ if tags_to_delete:
+ self.result['changed'] = True
+ if not self.module.check_mode:
+ args = {}
+ args['resourceids'] = resource['id']
+ args['resourcetype'] = resource_type
+ args['tags'] = tags_to_delete
+ self.cs.deleteTags(**args)
+
+
+ def _create_tags(self, resource, resource_type, tags):
+ tags_to_create = []
+ for i, tag_entry in enumerate(tags):
+ tag = {
+ 'key': tag_entry['key'],
+ 'value': tag_entry['value'],
+ }
+ tags_to_create.append(tag)
+ if tags_to_create:
+ self.result['changed'] = True
+ if not self.module.check_mode:
+ args = {}
+ args['resourceids'] = resource['id']
+ args['resourcetype'] = resource_type
+ args['tags'] = tags_to_create
+ self.cs.createTags(**args)
+
+
+ def ensure_tags(self, resource, resource_type=None):
+ if not resource_type or not resource:
+ self.module.fail_json(msg="Error: Missing resource or resource_type for tags.")
+
+ if 'tags' in resource:
+ tags = self.module.params.get('tags')
+ if tags is not None:
+ self._delete_tags(resource, resource_type, tags)
+ self._create_tags(resource, resource_type, tags)
+ resource['tags'] = self.get_tags(resource)
+ return resource
+
+
def get_capabilities(self, key=None):
if self.capabilities:
return self._get_by_key(key, self.capabilities)