From f13eb871c71e4559ba558326da5f3581ea45f816 Mon Sep 17 00:00:00 2001 From: Darren Worrall Date: Mon, 10 Aug 2015 16:32:13 +0100 Subject: [PATCH] Fix imports, override get_network and get_ip_address --- cloud/cloudstack/cs_ip_address.py | 197 +----------------------------- 1 file changed, 4 insertions(+), 193 deletions(-) diff --git a/cloud/cloudstack/cs_ip_address.py b/cloud/cloudstack/cs_ip_address.py index a992b5d95f7..c77681697b0 100644 --- a/cloud/cloudstack/cs_ip_address.py +++ b/cloud/cloudstack/cs_ip_address.py @@ -120,113 +120,12 @@ except ImportError: has_lib_cs = False # import cloudstack common -class AnsibleCloudStack: - - def __init__(self, module): - 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() - - self.domain = None - self.account = None - self.project = None - self.ip_address = None - self.zone = None - self.vm = None - self.os_type = None - self.hypervisor = None - self.capabilities = None - - - def _connect(self): - api_key = self.module.params.get('api_key') - api_secret = self.module.params.get('secret_key') - api_url = self.module.params.get('api_url') - api_http_method = self.module.params.get('api_http_method') - api_timeout = self.module.params.get('api_timeout') - - if api_key and api_secret and api_url: - self.cs = CloudStack( - endpoint=api_url, - key=api_key, - secret=api_secret, - timeout=api_timeout, - method=api_http_method - ) - else: - self.cs = CloudStack(**read_config()) - - - def get_or_fallback(self, key=None, fallback_key=None): - value = self.module.params.get(key) - if not value: - value = self.module.params.get(fallback_key) - return value - - - # TODO: for backward compatibility only, remove if not used anymore - def _has_changed(self, want_dict, current_dict, only_keys=None): - return self.has_changed(want_dict=want_dict, current_dict=current_dict, only_keys=only_keys) - - - def has_changed(self, want_dict, current_dict, only_keys=None): - for key, value in want_dict.iteritems(): - - # Optionally limit by a list of keys - if only_keys and key not in only_keys: - continue; - - # Skip None values - if value is None: - continue; - - if key in current_dict: - - # API returns string for int in some cases, just to make sure - if isinstance(value, int): - current_dict[key] = int(current_dict[key]) - elif isinstance(value, str): - current_dict[key] = str(current_dict[key]) - - # Only need to detect a singe change, not every item - if value != current_dict[key]: - return True - return False +from ansible.module_utils.cloudstack import * - def _get_by_key(self, key=None, my_dict={}): - if key: - if key in my_dict: - return my_dict[key] - self.module.fail_json(msg="Something went wrong: %s not found" % key) - return my_dict - - - def get_project(self, key=None): - if self.project: - return self._get_by_key(key, self.project) - - project = self.module.params.get('project') - if not project: - return None - args = {} - args['account'] = self.get_account(key='name') - args['domainid'] = self.get_domain(key='id') - projects = self.cs.listProjects(**args) - if projects: - for p in projects['project']: - if project.lower() in [ p['name'].lower(), p['id'] ]: - self.project = p - return self._get_by_key(key, self.project) - self.module.fail_json(msg="project '%s' not found" % project) - +class AnsibleCloudStackIPAddress(AnsibleCloudStack): + #TODO: Add to parent class, duplicated in cs_network def get_network(self, key=None, network=None): if not network: network = self.module.params.get('network') @@ -250,7 +149,7 @@ class AnsibleCloudStack: break self.module.fail_json(msg="Network '%s' not found" % network) - + #TODO: Merge changes here with parent class def get_ip_address(self, key=None): if self.ip_address: return self._get_by_key(key, self.ip_address) @@ -271,94 +170,6 @@ class AnsibleCloudStack: self.ip_address = ip_addresses['publicipaddress'][0] return self._get_by_key(key, self.ip_address) - - def get_zone(self, key=None): - if self.zone: - return self._get_by_key(key, self.zone) - - zone = self.module.params.get('zone') - zones = self.cs.listZones() - - # use the first zone if no zone param given - if not zone: - self.zone = zones['zone'][0] - return self._get_by_key(key, self.zone) - - if zones: - for z in zones['zone']: - if zone in [ z['name'], z['id'] ]: - self.zone = z - return self._get_by_key(key, self.zone) - self.module.fail_json(msg="zone '%s' not found" % zone) - - - def get_account(self, key=None): - if self.account: - return self._get_by_key(key, self.account) - - account = self.module.params.get('account') - if not account: - return None - - domain = self.module.params.get('domain') - if not domain: - self.module.fail_json(msg="Account must be specified with Domain") - - args = {} - args['name'] = account - args['domainid'] = self.get_domain(key='id') - args['listall'] = True - accounts = self.cs.listAccounts(**args) - if accounts: - self.account = accounts['account'][0] - return self._get_by_key(key, self.account) - self.module.fail_json(msg="Account '%s' not found" % account) - - - def get_domain(self, key=None): - if self.domain: - return self._get_by_key(key, self.domain) - - domain = self.module.params.get('domain') - if not domain: - return None - - args = {} - args['listall'] = True - domains = self.cs.listDomains(**args) - if domains: - for d in domains['domain']: - if d['path'].lower() in [ domain.lower(), "root/" + domain.lower(), "root" + domain.lower() ] : - self.domain = d - return self._get_by_key(key, self.domain) - self.module.fail_json(msg="Domain '%s' not found" % domain) - - - # TODO: for backward compatibility only, remove if not used anymore - def _poll_job(self, job=None, key=None): - return self.poll_job(job=job, key=key) - - - def poll_job(self, job=None, key=None): - if 'jobid' in job: - while True: - res = self.cs.queryAsyncJobResult(jobid=job['jobid']) - if res['jobstatus'] != 0 and 'jobresult' in res: - if 'errortext' in res['jobresult']: - self.module.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 - - -class AnsibleCloudStackIPAddress(AnsibleCloudStack): - - def __init__(self, module): - AnsibleCloudStack.__init__(self, module) - self.vm_default_nic = None - def associate_ip_address(self): self.result['changed'] = True args = {}