| import json |
| import yaml |
| import io |
| import copy |
| from hashlib import md5 |
| from paramiko import RSAKey |
| from paramiko.ssh_exception import PasswordRequiredException |
| |
| |
| class HEATUtils: |
| """ Utilities useful for constructing OpenStack HEAT requests """ |
| |
| def get_yaml(self, template_file): |
| """Template Yaml To Json reads a YAML Heat template file returns a JSON string that can be used included in an Openstack Add Stack Request""" |
| if isinstance(template_file, str) or isinstance(template_file, unicode): |
| fin = open(template_file, 'r') |
| yamlobj = yaml.load(fin) |
| return yamlobj |
| return None |
| |
| def template_yaml_to_json(self, template_file): |
| """Template Yaml To Json reads a YAML Heat template file returns a JSON string that can be used included in an Openstack Add Stack Request""" |
| contents = None |
| if isinstance(template_file, str) or isinstance(template_file, unicode): |
| fin = open(template_file, 'r') |
| yamlobj = yaml.load(fin) |
| fin.close() |
| if 'heat_template_version' in yamlobj: |
| datetime = yamlobj['heat_template_version'] |
| yamlobj['heat_template_version'] = str(datetime) |
| fout = io.BytesIO() |
| json.dump(yamlobj, fout) |
| contents = fout.getvalue() |
| fout.close() |
| return contents |
| |
| def env_yaml_to_json(self, template_file): |
| """Env Yaml To JSon reads a YAML Heat env file and returns a JSON string that can be used included in an Openstack Add Stack Request""" |
| if isinstance(template_file, str) or isinstance(template_file, unicode): |
| fin = open(template_file, 'r') |
| yamlobj = yaml.load(fin) |
| fin.close() |
| if 'parameters' in yamlobj: |
| fout = io.BytesIO() |
| json.dump(yamlobj['parameters'], fout) |
| contents = fout.getvalue() |
| fout.close() |
| return contents |
| return None |
| |
| def stack_info_parse(self, stack_info): |
| """ returns a flattened version of the Openstack Find Stack results """ |
| d = {} |
| if isinstance(stack_info, dict): |
| s = stack_info['stack'] |
| p = s['parameters'] |
| d = copy.deepcopy(p) |
| d['id'] = s['id'] |
| d['name'] = s['stack_name'] |
| d['stack_status'] = s['stack_status'] |
| return d |
| |
| def match_fingerprint(self, pvt_file, pw, fingerprint): |
| try: |
| sshKey = RSAKey.from_private_key_file(pvt_file, pw) |
| keybytes = md5(sshKey.asbytes()).hexdigest() |
| printableFingerprint = ':'.join(a + b for a, b in zip(keybytes[::2], keybytes[1::2])) |
| return printableFingerprint == fingerprint.__str__() |
| except PasswordRequiredException: |
| return False |
| |
| def match_private_key_file_to_keypair(self, files, keypair): |
| for keyfile in files: |
| if (self.match_fingerprint(keyfile, None, keypair['keypair']['fingerprint'])): |
| return keyfile |
| return None |
| |
| def get_openstack_server_ip(self, server, network_name="public", ipversion=4): |
| ipaddr = None |
| try: |
| versions = server['addresses'][network_name] |
| for version in versions: |
| if version['version'] == ipversion: |
| ipaddr = version['addr'] |
| break; |
| except ValueError: |
| return ipaddr |
| return ipaddr |