diff --git a/lib/ansible/module_utils/cloudstack.py b/lib/ansible/module_utils/cloudstack.py index 9169155d26..57bff1ccab 100644 --- a/lib/ansible/module_utils/cloudstack.py +++ b/lib/ansible/module_utils/cloudstack.py @@ -225,13 +225,25 @@ class AnsibleCloudStack(object): self.fail_json(msg="Something went wrong: %s not found" % key) return my_dict + def query_api(self, command, **args): + try: + res = getattr(self.cs, command)(**args) + + if 'errortext' in res: + self.fail_json(msg="Failed: '%s'" % res['errortext']) + + except CloudStackException as e: + self.fail_json(msg='CloudStackException: %s' % str(e)) + + return res + def get_network_acl(self, key=None): if self.network_acl is None: args = { 'name': self.module.params.get('network_acl'), 'vpcid': self.get_vpc(key='id'), } - network_acls = self.cs.listNetworkACLLists(**args) + network_acls = self.query_api('listNetworkACLLists', **args) if network_acls: self.network_acl = network_acls['networkacllist'][0] self.result['network_acl'] = self.network_acl['name'] @@ -257,7 +269,7 @@ class AnsibleCloudStack(object): 'projectid': self.get_project(key='id'), 'zoneid': self.get_zone(key='id'), } - vpcs = self.cs.listVPCs(**args) + vpcs = self.query_api('listVPCs', **args) if not vpcs: self.fail_json(msg="No VPCs available.") @@ -283,7 +295,7 @@ class AnsibleCloudStack(object): 'projectid': self.get_project(key='id'), 'zoneid': self.get_zone(key='id'), } - vpcs = self.cs.listVPCs(**args) + vpcs = self.query_api('listVPCs', **args) self._vpc_networks_ids = [] if vpcs: for vpc in vpcs['vpc']: @@ -310,7 +322,7 @@ class AnsibleCloudStack(object): 'zoneid': self.get_zone(key='id'), 'vpcid': self.get_vpc(key='id') } - networks = self.cs.listNetworks(**args) + networks = self.query_api('listNetworks', **args) if not networks: self.fail_json(msg="No networks available.") @@ -337,7 +349,7 @@ class AnsibleCloudStack(object): 'account': self.get_account(key='name'), 'domainid': self.get_domain(key='id') } - projects = self.cs.listProjects(**args) + projects = self.query_api('listProjects', **args) if projects: for p in projects['project']: if project.lower() in [p['name'].lower(), p['id']]: @@ -361,7 +373,8 @@ class AnsibleCloudStack(object): 'projectid': self.get_project(key='id'), 'vpcid': self.get_vpc(key='id'), } - ip_addresses = self.cs.listPublicIpAddresses(**args) + + ip_addresses = self.query_api('listPublicIpAddresses', **args) if not ip_addresses: self.fail_json(msg="IP address '%s' not found" % args['ipaddress']) @@ -385,7 +398,7 @@ class AnsibleCloudStack(object): if self.vm_default_nic: return self.vm_default_nic - nics = self.cs.listNics(virtualmachineid=self.get_vm(key='id')) + nics = self.query_api('listNics', virtualmachineid=self.get_vm(key='id')) if nics: for n in nics['nic']: if n['isdefault']: @@ -407,7 +420,7 @@ class AnsibleCloudStack(object): 'projectid': self.get_project(key='id'), 'zoneid': self.get_zone(key='id'), } - vms = self.cs.listVirtualMachines(**args) + vms = self.query_api('listVirtualMachines', **args) if vms: for v in vms['virtualmachine']: if vm.lower() in [v['name'].lower(), v['displayname'].lower(), v['id']]: @@ -422,7 +435,7 @@ class AnsibleCloudStack(object): zone = self.module.params.get('zone') if not zone: zone = os.environ.get('CLOUDSTACK_ZONE') - zones = self.cs.listZones() + zones = self.query_api('listZones') if not zones: self.fail_json(msg="No zones available. Please create a zone first") @@ -449,7 +462,7 @@ class AnsibleCloudStack(object): if not os_type: return None - os_types = self.cs.listOsTypes() + os_types = self.query_api('listOsTypes') if os_types: for o in os_types['ostype']: if os_type in [o['description'], o['id']]: @@ -462,7 +475,7 @@ class AnsibleCloudStack(object): return self.hypervisor hypervisor = self.module.params.get('hypervisor') - hypervisors = self.cs.listHypervisors() + hypervisors = self.query_api('listHypervisors') # use the first hypervisor if no hypervisor param given if not hypervisor: @@ -494,7 +507,7 @@ class AnsibleCloudStack(object): 'domainid': self.get_domain(key='id'), 'listall': True } - accounts = self.cs.listAccounts(**args) + accounts = self.query_api('listAccounts', **args) if accounts: self.account = accounts['account'][0] self.result['account'] = self.account['name'] @@ -514,7 +527,7 @@ class AnsibleCloudStack(object): args = { 'listall': True, } - domains = self.cs.listDomains(**args) + domains = self.query_api('listDomains', **args) if domains: for d in domains['domain']: if d['path'].lower() in [domain.lower(), "root/" + domain.lower(), "root" + domain.lower()]: @@ -528,7 +541,7 @@ class AnsibleCloudStack(object): 'resourceids': resource['id'], 'resourcetype': resource_type, } - tags = self.cs.listTags(**args) + tags = self.query_api('listTags', **args) return self.get_tags(resource=tags, key='tag') def get_tags(self, resource=None, key='tags'): @@ -547,9 +560,9 @@ class AnsibleCloudStack(object): 'tags': tags, } if operation == "create": - response = self.cs.createTags(**args) + response = self.query_api('createTags', **args) else: - response = self.cs.deleteTags(**args) + response = self.query_api('deleteTags', **args) self.poll_job(response) def _tags_that_should_exist_or_be_updated(self, resource, tags): @@ -575,19 +588,22 @@ class AnsibleCloudStack(object): def get_capabilities(self, key=None): if self.capabilities: return self._get_by_key(key, self.capabilities) - capabilities = self.cs.listCapabilities() + capabilities = self.query_api('listCapabilities') self.capabilities = capabilities['capability'] return self._get_by_key(key, self.capabilities) def poll_job(self, job=None, key=None): if 'jobid' in job: while True: - res = self.cs.queryAsyncJobResult(jobid=job['jobid']) + res = self.query_api('queryAsyncJobResult', jobid=job['jobid']) if res['jobstatus'] != 0 and 'jobresult' in res: + if 'errortext' in res['jobresult']: self.fail_json(msg="Failed: '%s'" % res['jobresult']['errortext']) + if key and key in res['jobresult']: job = res['jobresult'][key] + break time.sleep(2) return job