From 8ec66713d9056f4fd0a8d584bc7ddb418b01efcc Mon Sep 17 00:00:00 2001 From: Rene Moser Date: Thu, 3 Dec 2015 01:12:34 +0100 Subject: [PATCH] cloudstack: fixes and improvements - cs_affinitygroup: add project support Project support in CloudStack for affinity groups is going to be fixed/implemented in the near future, this module should already support. - cs_affinitygroup: fix missing returns in doc - cs_volume: fix disk offering not found - cs_volume: fix volume not found if created with display_volume=no - cs_firewall: argument zone is missing, default zone is always used. credits for reporting and fixing to @atsaki closes #1320 - cs_instance: fix user_data base64 encoding fails if not a string --- cloud/cloudstack/cs_affinitygroup.py | 24 ++++++++++++++++++++++++ cloud/cloudstack/cs_firewall.py | 7 +++++++ cloud/cloudstack/cs_instance.py | 2 +- cloud/cloudstack/cs_volume.py | 7 +++---- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/cloud/cloudstack/cs_affinitygroup.py b/cloud/cloudstack/cs_affinitygroup.py index 5a7cb5f9714..b1dc075c434 100644 --- a/cloud/cloudstack/cs_affinitygroup.py +++ b/cloud/cloudstack/cs_affinitygroup.py @@ -57,6 +57,11 @@ options: - Account the affinity group is related to. required: false default: null + project: + description: + - Name of the project the affinity group is related to. + required: false + default: null poll_async: description: - Poll async jobs until job has finished. @@ -101,6 +106,21 @@ affinity_type: returned: success type: string sample: host anti-affinity +project: + description: Name of project the affinity group is related to. + returned: success + type: string + sample: Production +domain: + description: Domain the affinity group is related to. + returned: success + type: string + sample: example domain +account: + description: Account the affinity group is related to. + returned: success + type: string + sample: example account ''' try: @@ -128,6 +148,7 @@ class AnsibleCloudStackAffinityGroup(AnsibleCloudStack): affinity_group = self.module.params.get('name') args = {} + args['projectid'] = self.get_project(key='id') args['account'] = self.get_account('name') args['domainid'] = self.get_domain('id') @@ -163,6 +184,7 @@ class AnsibleCloudStackAffinityGroup(AnsibleCloudStack): args['name'] = self.module.params.get('name') args['type'] = self.get_affinity_type() args['description'] = self.module.params.get('description') + args['projectid'] = self.get_project(key='id') args['account'] = self.get_account('name') args['domainid'] = self.get_domain('id') @@ -185,6 +207,7 @@ class AnsibleCloudStackAffinityGroup(AnsibleCloudStack): args = {} args['name'] = self.module.params.get('name') + args['projectid'] = self.get_project(key='id') args['account'] = self.get_account('name') args['domainid'] = self.get_domain('id') @@ -209,6 +232,7 @@ def main(): state = dict(choices=['present', 'absent'], default='present'), domain = dict(default=None), account = dict(default=None), + project = dict(default=None), poll_async = dict(choices=BOOLEANS, default=True), )) diff --git a/cloud/cloudstack/cs_firewall.py b/cloud/cloudstack/cs_firewall.py index 4f4c1e7895a..9834dd6713a 100644 --- a/cloud/cloudstack/cs_firewall.py +++ b/cloud/cloudstack/cs_firewall.py @@ -99,6 +99,12 @@ options: - Name of the project the firewall rule is related to. required: false default: null + zone: + description: + - Name of the zone in which the virtual machine is in. + - If not set, default zone is used. + required: false + default: null poll_async: description: - Poll async jobs until job has finished. @@ -404,6 +410,7 @@ def main(): start_port = dict(type='int', aliases=['port'], default=None), end_port = dict(type='int', default=None), state = dict(choices=['present', 'absent'], default='present'), + zone = dict(default=None), domain = dict(default=None), account = dict(default=None), project = dict(default=None), diff --git a/cloud/cloudstack/cs_instance.py b/cloud/cloudstack/cs_instance.py index 8cf0672e85a..2b662a2084e 100644 --- a/cloud/cloudstack/cs_instance.py +++ b/cloud/cloudstack/cs_instance.py @@ -558,7 +558,7 @@ class AnsibleCloudStackInstance(AnsibleCloudStack): def get_user_data(self): user_data = self.module.params.get('user_data') if user_data: - user_data = base64.b64encode(user_data) + user_data = base64.b64encode(str(user_data)) return user_data def get_details(self): diff --git a/cloud/cloudstack/cs_volume.py b/cloud/cloudstack/cs_volume.py index 30548555587..ebc5bd28891 100644 --- a/cloud/cloudstack/cs_volume.py +++ b/cloud/cloudstack/cs_volume.py @@ -255,10 +255,8 @@ class AnsibleCloudStackVolume(AnsibleCloudStack): if not disk_offering: return None - args = {} - args['domainid'] = self.get_domain(key='id') - - disk_offerings = self.cs.listDiskOfferings(**args) + # Do not add domain filter for disk offering listing. + disk_offerings = self.cs.listDiskOfferings() if disk_offerings: for d in disk_offerings['diskoffering']: if disk_offering in [d['displaytext'], d['name'], d['id']]: @@ -272,6 +270,7 @@ class AnsibleCloudStackVolume(AnsibleCloudStack): args['account'] = self.get_account(key='name') args['domainid'] = self.get_domain(key='id') args['projectid'] = self.get_project(key='id') + args['displayvolume'] = self.module.params.get('display_volume') args['type'] = 'DATADISK' volumes = self.cs.listVolumes(**args)