From 0200e4fcb9cb31315b1f1155d06a636ac731f8bf Mon Sep 17 00:00:00 2001 From: Damien Date: Fri, 17 Feb 2017 17:22:16 -0800 Subject: [PATCH] New Module : aos_blueprint_virtnet as part of network/aos (#21432) * Initial version of aos_blueprint_virtnet * Fix indentation in EXAMPLES --- .../network/aos/aos_blueprint_virtnet.py | 215 ++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 lib/ansible/modules/network/aos/aos_blueprint_virtnet.py diff --git a/lib/ansible/modules/network/aos/aos_blueprint_virtnet.py b/lib/ansible/modules/network/aos/aos_blueprint_virtnet.py new file mode 100644 index 0000000000..3c8ad4f146 --- /dev/null +++ b/lib/ansible/modules/network/aos/aos_blueprint_virtnet.py @@ -0,0 +1,215 @@ +#!/usr/bin/python +# +# (c) 2017 Apstra Inc, +# +# This file is part of Ansible +# +# Ansible 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. +# +# Ansible 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 Ansible. If not, see . +# + +ANSIBLE_METADATA = {'status': ['preview'], + 'supported_by': 'community', + 'version': '1.0'} + +DOCUMENTATION = ''' +--- +module: aos_blueprint_virtnet +author: Damien Garros (@dgarros) +version_added: "2.3" +short_description: Manage AOS blueprint parameter values +description: + - Apstra AOS Blueprint Virtual Network module let you manage your Virtual Network easily. + You can create access, define and delete Virtual Network by name or by using a JSON / Yaml file. + This module is idempotent and support the I(check) mode. It's using the AOS REST API. +requirements: + - "aos-pyez >= 0.6.0" +options: + session: + description: + - An existing AOS session as obtained by aos_login module. + required: true + blueprint: + description: + - Blueprint Name or Id as defined in AOS. + required: True + name: + description: + - Name of Virtual Network as part of the Blueprint. + content: + description: + - Datastructure of the Virtual Network to manage. The data can be in YAML / JSON or + directly a variable. It's the same datastructure that is returned on success in I(value). + state: + description: + - Indicate what is the expected state of the Virtual Network (present or not). + default: present + choices: ['present', 'absent'] +''' + +EXAMPLES = ''' + +- name: "Access Existing Virtual Network" + aos_blueprint_virtnet: + session: "{{ session_ok }}" + blueprint: "my-blueprint-l2" + name: "my-virtual-network" + state: present + +- name: "Delete Virtual Network with JSON File" + aos_blueprint_virtnet: + session: "{{ session_ok }}" + blueprint: "my-blueprint-l2" + content: "{{ lookup('file', 'resources/virtual-network-02.json') }}" + state: absent + +- name: "Create Virtual Network" + aos_blueprint_virtnet: + session: "{{ session_ok }}" + blueprint: "my-blueprint-l2" + content: "{{ lookup('file', 'resources/virtual-network-02.json') }}" + state: present +''' + +import json + +from ansible.module_utils.pycompat24 import get_exception +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.aos import get_aos_session, find_collection_item, do_load_resource, check_aos_version, content_to_dict + +def ensure_present(module, aos, blueprint, virtnet): + + # if exist already return tru + if virtnet.exists: + module.exit_json(changed=False, + blueprint=blueprint.name, + name=virtnet.name, + id=virtnet.id, + value=virtnet.value) + + else: + if not module.check_mode: + try: + virtnet.create(module.params['content']) + except: + e = get_exception() + module.fail_json(msg="unable to create virtual-network : %r" % e ) + + module.exit_json(changed=True, + blueprint=blueprint.name, + name=virtnet.name, + id=virtnet.id, + value=virtnet.value) + + +def ensure_absent(module, aos, blueprint, virtnet): + + if virtnet.exists: + if not module.check_mode: + try: + virtnet.delete() + except: + e = get_exception() + module.fail_json(msg="unable to delete virtual-network %s : %r" % (virtnet.name, e) ) + + module.exit_json(changed=True, + blueprint=blueprint.name) + + else: + module.exit_json(changed=False, + blueprint=blueprint.name) + +def blueprint_virtnet(module): + + margs = module.params + + # -------------------------------------------------------------------- + # Get AOS session object based on Session Info + # -------------------------------------------------------------------- + try: + aos = get_aos_session(module, margs['session']) + except: + module.fail_json(msg="Unable to login to the AOS server") + + # -------------------------------------------------------------------- + # Get the blueprint Object based on either name or ID + # -------------------------------------------------------------------- + try: + blueprint = find_collection_item(aos.Blueprints, + item_name=margs['blueprint'], + item_id=margs['blueprint']) + except: + module.fail_json(msg="Unable to find the Blueprint based on name or ID, something went wrong") + + if blueprint.exists is False: + module.fail_json(msg='Blueprint %s does not exist.\n' + 'known blueprints are [%s]'% + (margs['blueprint'],','.join(aos.Blueprints.names))) + + # -------------------------------------------------------------------- + # Convert "content" to dict and extract name + # -------------------------------------------------------------------- + if margs['content'] is not None: + + content = content_to_dict(module, margs['content'] ) + + if 'display_name' in content.keys(): + item_name = content['display_name'] + else: + module.fail_json(msg="Unable to extract 'display_name' from 'content'") + + elif margs['name'] is not None: + item_name = margs['name'] + + # -------------------------------------------------------------------- + # Try to find VirtualNetwork object + # -------------------------------------------------------------------- + try: + virtnet = blueprint.VirtualNetworks[item_name] + except: + module.fail_json(msg="Something went wrong while trying to find Virtual Network %s in blueprint %s" + % ( item_name, blueprint.name )) + + # -------------------------------------------------------------------- + # Proceed based on State value + # -------------------------------------------------------------------- + if margs['state'] == 'absent': + + ensure_absent(module, aos, blueprint, virtnet) + + elif margs['state'] == 'present': + + ensure_present(module, aos, blueprint, virtnet) + + +def main(): + module = AnsibleModule( + argument_spec=dict( + session=dict(required=True, type="dict"), + blueprint=dict(required=True), + name=dict(required=False ), + content=dict(required=False, type="json"), + state=dict(choices=['present', 'absent'], default='present') + ), + mutually_exclusive = [('name', 'content')], + required_one_of=[('name', 'content')], + supports_check_mode=True + ) + + # Check if aos-pyez is present and match the minimum version + check_aos_version(module, '0.6.0') + + blueprint_virtnet(module) + +if __name__ == '__main__': + main()