cloudstack: utils: reduce cs lib dependency in modules (#26848)

Also improves error handling and reduces code duplication
This commit is contained in:
René Moser 2017-07-15 18:25:27 +02:00 committed by GitHub
parent dc408f9035
commit 8320071e81

View file

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