From b5d9fe5bfa6a62a47af7ed9354703b6921e12ee1 Mon Sep 17 00:00:00 2001 From: Gregory Haynes Date: Mon, 24 Aug 2015 18:28:09 +0000 Subject: [PATCH] Generate network_info json using a module We currently have a jinja template which generates the network_info json. By using a module we can create the dictionary in python which is much easier to understand and work with. Depends-On: I23e902c8637e142fba23d71467225d48ee265253 Change-Id: I75936fa29ec442b28e8d0ca95332157580daaae4 --- playbooks/library/network_metadata.py | 116 ++++++++++++++++++ .../tasks/main.yml | 10 ++ .../templates/network_info.json.j2 | 80 +----------- 3 files changed, 127 insertions(+), 79 deletions(-) create mode 100644 playbooks/library/network_metadata.py diff --git a/playbooks/library/network_metadata.py b/playbooks/library/network_metadata.py new file mode 100644 index 000000000..355dd79ad --- /dev/null +++ b/playbooks/library/network_metadata.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python +# coding: utf-8 -*- + +# (c) 2015, Hewlett-Packard Development Company, L.P. +# +# This module is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this software. If not, see . + +DOCUMENTATION = ''' +--- +module: network_metadata +short_description: Returns a config-drive network-metadata dictionary +extends_documentation_fragment: openstack +''' + + +def main(): + argument_spec = dict( + ipv4_address=dict(required=False), + ipv4_gateway=dict(required=False), + ipv4_interface_mac=dict(required=False), + ipv4_nameserver=dict(required=False), + ipv4_subnet_mask=dict(required=False), + network_mtu=dict(required=False), + nics=dict(required=False), + node_network_info=dict(required=False) + ) + + module = AnsibleModule(argument_spec) + + network_metadata = module.params['node_network_info'] + if not network_metadata: + links = [] + networks = [] + + if module.params['ipv4_interface_mac']: + links.append({ + 'id': module.params['ipv4_interface_mac'], + 'type': 'phy', + 'ethernet_mac_address': module.params['ipv4_interface_mac'], + 'mtu': module.params['network_mtu'] + }) + + for nic in module.params['nics']: + if nic['mac'] == module.params['ipv4_interface_mac']: + networks.append({ + 'id': 'ipv4-%s' % nic['mac'], + 'link': nic['mac'], + 'type': 'ipv4', + 'ip_address': module.params['ipv4_address'], + 'netmask': module.params['ipv4_subnet_mask'], + 'dns_nameservers': [ + module.params['ipv4_nameserver'] + ], + 'routes': [{ + 'network': '0.0.0.0', + 'netmask': '0.0.0.0', + 'gateway': module.params['ipv4_gateway'] + }] + }) + else: + for i, nic in enumerate(module.params['nics']): + links.append({ + 'id': nic['mac'], + 'type': 'phy', + 'ethernet_mac_address': nic['mac'], + 'mtu': module.params['network_mtu'] + }) + + if i == 0: + networks.append({ + 'id': 'ipv4-%s' % nic['mac'], + 'link': nic['mac'], + 'type': 'ipv4', + 'ip_address': module.params['ipv4_address'], + 'netmask': module.params['ipv4_subnet_mask'], + 'dns_nameservers': [ + module.params['ipv4_nameserver'] + ], + 'routes': [{ + 'network': '0.0.0.0', + 'netmask': '0.0.0.0', + 'gateway': module.params['ipv4_gateway'] + }] + }) + else: + networks.append({ + 'id': 'ipv4-dhcp-%s' % nic['mac'], + 'link': nic['mac'], + 'type': 'ipv4_dhcp', + }) + + network_metadata = { + 'links': links, + 'networks': networks + } + facts = {'network_metadata': network_metadata} + + module.exit_json(changed=False, ansible_facts=facts) + + +# this is magic, see lib/ansible/module_common.py +from ansible.module_utils.basic import * + +if __name__ == '__main__': + main() diff --git a/playbooks/roles/bifrost-configdrives-dynamic/tasks/main.yml b/playbooks/roles/bifrost-configdrives-dynamic/tasks/main.yml index 99cff844d..b2ff3a749 100644 --- a/playbooks/roles/bifrost-configdrives-dynamic/tasks/main.yml +++ b/playbooks/roles/bifrost-configdrives-dynamic/tasks/main.yml @@ -26,6 +26,16 @@ local_action: template src=openstack_meta_data.json.j2 dest={{ variable_configdrive_location.stdout }}/{{ uuid }}/openstack/{{ metadata_version }}/meta_data.json - name: "Place template in each openstack/latest folder" local_action: template src=openstack_meta_data.json.j2 dest={{ variable_configdrive_location.stdout }}/{{ uuid }}/openstack/latest/meta_data.json +- name: "Generate network_info" + network_metadata: + ipv4_address: "{{ ipv4_address }}" + ipv4_gateway: "{{ ipv4_gateway }}" + ipv4_interface_mac: "{{ ipv4_interface_mac | default('') }}" + ipv4_nameserver: "{{ ipv4_nameserver }}" + ipv4_subnet_mask: "{{ ipv4_subnet_mask }}" + network_mtu: "{{ network_mtu }}" + nics: "{{ nics }}" + node_network_info: "{{ node_network_info | default('') }}" - name: "Place network info template in each openstack/latest folder" local_action: template src=network_info.json.j2 dest={{ variable_configdrive_location.stdout }}/{{ uuid }}/openstack/latest/network_info.json when: addressing_mode is undefined and '"dhcp" not in addressing_mode' diff --git a/playbooks/roles/bifrost-configdrives-dynamic/templates/network_info.json.j2 b/playbooks/roles/bifrost-configdrives-dynamic/templates/network_info.json.j2 index 9b40e2f13..82130e22f 100644 --- a/playbooks/roles/bifrost-configdrives-dynamic/templates/network_info.json.j2 +++ b/playbooks/roles/bifrost-configdrives-dynamic/templates/network_info.json.j2 @@ -1,79 +1 @@ -{% if node_network_info is defined %} -{{ node_network_info }} -{% else %} -{ -"links": [ -{% for nic in nics %} - { -{% if ipv4_interface_mac is defined %} - "id": "{{ nic.mac }}", -{% else %} -{% if loop.first %} - "id": "{{ node_default_network_interface }}", -{% else %} - "id": "{{ nic.mac }}", -{% endif %} - "type": "phy", - "ethernet_mac_address": "{{ nic.mac }}", - "mtu":{{network_mtu}} -{% if loop.last %} - } -{% else %} - }, -{% endif %} -{% endif %} -{% endfor %} -], -"networks": [ -{% for nic in nics %} - { - "id": "ipv4-{{ nic.mac }}", -{% if (ipv4_interface_mac is defined) and (nic.mac == ipv4_interface_mac) %} - "link": "{{ nic.mac }}", - "type": "ipv4", - "ip_address": "{{ ipv4_address }}", - "netmask": "{{ipv4_subnet_mask}}", - "dns_nameservers": [ - "{{ipv4_nameserver}}" - ], - "routes": [ - { - "network": "0.0.0.0", - "netmask": "0.0.0.0", - "gateway": "{{ipv4_gateway}}" - } - ] -{% elif loop.first %} - "link": "{{ node_default_network_interface }}", - "type": "ipv4", - "ip_address": "{{ ipv4_address }}", - "netmask": "{{ipv4_subnet_mask}}", - "dns_nameservers": [ - "{{ipv4_nameserver}}" - ], - "routes": [ - { - "network": "0.0.0.0", - "netmask": "0.0.0.0", - "gateway": "{{ipv4_gateway}}" - } - ] -{% else %} - "type": "ipv4_dhcp", - "link": "{{ nic.mac }}" -{% endif %} -{% if loop.last %} - } -{% else %} - }, -{% endif %} -{% endfor %} -], -"services": [ - { - "type": "dns", - "address": "{{ipv4_nameserver}}" - } -] -} -{% endif %} +{{ network_metadata | to_nice_json }}