cloudstack: cs_instance: fix KeyError: 'sshkeypair'
This commit is contained in:
parent
5fafe4c672
commit
37b22673fb
1 changed files with 31 additions and 18 deletions
|
@ -561,37 +561,50 @@ class AnsibleCloudStackInstance(AnsibleCloudStack):
|
||||||
res.append({'networkid': ids[i], 'ip': data['ip']})
|
res.append({'networkid': ids[i], 'ip': data['ip']})
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def get_ssh_keypair(self, key=None, name=None, fail_on_missing=True):
|
||||||
|
ssh_key_name = name or self.module.params.get('ssh_key')
|
||||||
|
if ssh_key_name is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
args = {
|
||||||
|
'domainid': self.get_domain('id'),
|
||||||
|
'account': self.get_account('name'),
|
||||||
|
'projectid': self.get_project('id'),
|
||||||
|
'name': ssh_key_name,
|
||||||
|
}
|
||||||
|
ssh_key_pairs = self.cs.listSSHKeyPairs(**args)
|
||||||
|
if 'errortext' in ssh_key_pairs:
|
||||||
|
self.module.fail_json(msg="Failed: '%s'" % ssh_key_pairs['errortext'])
|
||||||
|
|
||||||
|
elif 'sshkeypair' in ssh_key_pairs:
|
||||||
|
return self._get_by_key(key=key, my_dict=ssh_key_pairs['sshkeypair'][0])
|
||||||
|
|
||||||
|
elif fail_on_missing:
|
||||||
|
self.module.fail_json(msg="SSH key not found: %s" % ssh_key_name)
|
||||||
|
|
||||||
def ssh_key_has_changed(self):
|
def ssh_key_has_changed(self):
|
||||||
ssh_key_name = self.module.params.get('ssh_key')
|
ssh_key_name = self.module.params.get('ssh_key')
|
||||||
if ssh_key_name is None:
|
if ssh_key_name is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
# Fails if keypair for param is inexistent
|
||||||
|
param_ssh_key_fp = self.get_ssh_keypair(key='fingerprint')
|
||||||
|
|
||||||
|
# CloudStack 4.5 does return keypair on instance for a non existent key.
|
||||||
instance_ssh_key_name = self.instance.get('keypair')
|
instance_ssh_key_name = self.instance.get('keypair')
|
||||||
if instance_ssh_key_name is None:
|
if instance_ssh_key_name is None:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if ssh_key_name == instance_ssh_key_name:
|
# Get fingerprint for keypair of instance but do not fail if inexistent.
|
||||||
return False
|
instance_ssh_key_fp = self.get_ssh_keypair(key='fingerprint', name=instance_ssh_key_name, fail_on_missing=False)
|
||||||
|
if not instance_ssh_key_fp:
|
||||||
|
return True
|
||||||
|
|
||||||
args = {
|
# Compare fingerprints to ensure the keypair changed
|
||||||
'domainid': self.get_domain('id'),
|
if instance_ssh_key_fp != param_ssh_key_fp:
|
||||||
'account': self.get_account('name'),
|
|
||||||
'projectid': self.get_project('id')
|
|
||||||
}
|
|
||||||
|
|
||||||
args['name'] = instance_ssh_key_name
|
|
||||||
res = self.cs.listSSHKeyPairs(**args)
|
|
||||||
instance_ssh_key = res['sshkeypair'][0]
|
|
||||||
|
|
||||||
args['name'] = ssh_key_name
|
|
||||||
res = self.cs.listSSHKeyPairs(**args)
|
|
||||||
param_ssh_key = res['sshkeypair'][0]
|
|
||||||
if param_ssh_key['fingerprint'] != instance_ssh_key['fingerprint']:
|
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def security_groups_has_changed(self):
|
def security_groups_has_changed(self):
|
||||||
security_groups = self.module.params.get('security_groups')
|
security_groups = self.module.params.get('security_groups')
|
||||||
if security_groups is None:
|
if security_groups is None:
|
||||||
|
@ -710,7 +723,7 @@ class AnsibleCloudStackInstance(AnsibleCloudStack):
|
||||||
args['name'] = self.module.params.get('name')
|
args['name'] = self.module.params.get('name')
|
||||||
args['displayname'] = self.get_or_fallback('display_name', 'name')
|
args['displayname'] = self.get_or_fallback('display_name', 'name')
|
||||||
args['group'] = self.module.params.get('group')
|
args['group'] = self.module.params.get('group')
|
||||||
args['keypair'] = self.module.params.get('ssh_key')
|
args['keypair'] = self.get_ssh_keypair(key='name')
|
||||||
args['size'] = self.module.params.get('disk_size')
|
args['size'] = self.module.params.get('disk_size')
|
||||||
args['startvm'] = start_vm
|
args['startvm'] = start_vm
|
||||||
args['rootdisksize'] = self.module.params.get('root_disk_size')
|
args['rootdisksize'] = self.module.params.get('root_disk_size')
|
||||||
|
|
Loading…
Reference in a new issue