lib/ansible/modules/cloud/alicloud/_alicloud_route_entry.py (144 lines of code) (raw):

#!/usr/bin/python # Copyright (c) 2017-present Alibaba Group Holding Limited. He Guimin <heguimin36@163.com.com> # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # # 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 http://www.gnu.org/licenses/. ANSIBLE_METADATA = {'metadata_version': '1.1', 'status': ['deprecated'], 'supported_by': 'community'} DOCUMENTATION = """ --- module: alicloud_route_entry version_added: "1.0.9" short_description: Manage route entry for Alicloud virtual private cloud, description: - Manage route entry for Alicloud virtual private cloud. Create or Delete route entry in one route table. deprecated: removed_in: "1.5.0" why: Alibaba Cloud module name prefix "ali" will be more concise. alternative: Use M(ali_route_entry) instead. options: state: description: - Whether or not to create, delete route entry. choices: ['present', 'absent'] default: 'present' router_id: description: - The ID of virtual router to which route entry belongs. required: true destination_cidrblock: description: - The destination CIDR or Ip address of route entry. Such as:192.168.0.0/24 or 192.168.0.1. There is not the same destination cidr_block in the same route table. It is required when creating route entry. aliases: ['dest_cidrblock', 'cidr_block'] nexthop_id: description: - The next hop ID of route entry. It is required when creating a route entry. aliases: ['hop_id'] nexthop_type: description: - The next hop type of route entry. default: 'Instance' choices: ['Instance', 'Tunnel', 'HaVip', 'RouterInterface', 'VpnGateway'] aliases: ['hop_type'] notes: - The max items of route entry no more than 48 in the same route table. - The destination_cidrblock can't have the same cidr block as vswitch and can't belong to its in the same vpc. - The destination_cidrblock can't be 100.64.0.0/10 and can't belong to it. - When state is 'list', the parameters 'route_table_id', 'destination_cidrblock' and 'nexthop_id' are optional. requirements: - "python >= 2.6" - "footmark >= 1.1.16" extends_documentation_fragment: - alicloud author: - "He Guimin (@xiaozhu36)" """ EXAMPLES = """ # basic provisioning example to create custom route - name: create route entry hosts: localhost connection: local vars: alicloud_region: cn-hongkong state: present cidr_block: '192.168.4.0/24' nexthop_id: 'xxxxxxxxxx' router_id: 'XXXXXXXX' tasks: - name: create route entry alicloud_route_entry: alicloud_region: '{{ alicloud_region }}' state: '{{ state }}' destination_cidrblock: '{{ cidr_block }}' nexthop_id: '{{ nexthop_id }}' router_id: 'XXXXXXXX' register: result - debug: var=result # basic provisioning example to delete custom route - name: delete route entry hosts: localhost connection: local vars: alicloud_region: cn-hongkong destination_cidrblock: "192.168.4.0/24" next_hop_id: "xxxxxxxxxx" router_id: 'XXXXXXXX' state: present tasks: - name: delete route alicloud_route_entry: alicloud_region: '{{ alicloud_region }}' destination_cidrblock: '{{ cidr_block }}' nexthop_id: '{{ nexthop_id }}' router_id: 'XXXXXXXX' state: '{{ state }}' register: result - debug: var=result # basic provisioning example to querying route entries - name: get route entry list hosts: localhost connection: local vars: alicloud_region: cn-hongkong router_id: xxxxxxxxxx state: list tasks: - name: get vrouter list alicloud_route_entry: alicloud_region: '{{ alicloud_region }}' router_id: '{{ router_id }}' state: '{{ state }}' register: result - debug: var=result """ RETURN = ''' destination_cidrblock: description: the destination CIDR block of route entry returned: on present and absent type: string sample: "10.0.14.0/24" route_entry: description: Details about the ecs route entry that was created. returned: on present type: dict sample: { "destination_cidrblock": "10.0.14.0/24", "nexthop_id": "i-2zejbnp5zv525per4g84", "nexthop_type": "Instance", "route_table_id": "vtb-2zeeokge820zn0kqawmi9", "status": "Available", "type": "Custom" } destination_cidrblocks: description: the list destination CIDR blocks of route entries in one route table returned: on list type: list sample: ["10.0.14.0/24", "10.0.13.0/24", "100.64.0.0/10"] "route_entries": description: Details about the ecs route entries that were retrieved in one route table. returned: on list type: list sample: [ { "destination_cidrblock": "10.0.14.0/24", "nexthop_id": "i-2zejbnp5zv525per4g84", "nexthop_type": "Instance", "route_table_id": "vtb-2zeeokge820zn0kqawmi9", "status": "Available", "type": "Custom" }, { "destination_cidrblock": "10.0.13.0/24", "nexthop_id": "", "nexthop_type": "local", "route_table_id": "vtb-2zeeokge820zn0kqawmi9", "status": "Available", "type": "System" } ] route_table_id: description: the ID of route table to which route entry belongs returned: on present and absent type: string sample: "vtb-2zemlj5nscgoicjnxes7h" total: description: The number of all route entries after retrieving route entry. returned: on list type: int sample: 3 ''' # import module snippets from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.alicloud_ecs import ecs_argument_spec, vpc_connect HAS_FOOTMARK = False try: from footmark.exception import VPCResponseError HAS_FOOTMARK = True except ImportError: HAS_FOOTMARK = False def get_route_entry_basic(entry): """ Format vpc result and returns it as a dictionary """ return {'route_table_id': entry.route_table_id, 'destination_cidrblock': entry.destination_cidrblock} def get_route_entry_detail(entry): """ Format vpc result and returns it as a dictionary """ return {'route_table_id': entry.route_table_id, 'destination_cidrblock': entry.destination_cidrblock, 'type': entry.type, "nexthop_type": entry.nexthop_type, 'nexthop_id': entry.nexthop_id, 'status': entry.status} def create_route_entry(module, vpc, route_table_id): """ Create VSwitch :param module: Ansible module object :param vpc: Authenticated vpc connection object :return: Return details of created VSwitch """ destination_cidrblock = module.params['destination_cidrblock'] nexthop_type = module.params['nexthop_type'] nexthop_id = module.params['nexthop_id'] if not nexthop_id: module.fail_json(msg='nexthop_id is required for creating a route entry.') if not destination_cidrblock: module.fail_json(msg='destination_cidrblock is required for creating a route entry.') try: route_entry = vpc.create_route_entry(route_table_id=route_table_id, destination_cidrblock=destination_cidrblock, nexthop_type=nexthop_type, nexthop_id=nexthop_id) return True, route_entry except VPCResponseError as e: module.fail_json(msg='Unable to create route entry, error: {0}'.format(e)) return False, None def main(): argument_spec = ecs_argument_spec() argument_spec.update(dict( state=dict(default='present', choices=['present', 'absent']), destination_cidrblock=dict(type='str', aliases=['dest_cidrblock', 'cidr_block']), nexthop_type=dict(default='Instance', aliases=['hop_type'], choices=['Instance', 'Tunnel', 'HaVip', 'RouterInterface']), nexthop_id=dict(aliases=['hop_id']), router_id=dict(type='str', required=True), )) module = AnsibleModule(argument_spec=argument_spec) if HAS_FOOTMARK is False: module.fail_json(msg='footmark required for the module alicloud_route_entry.') vpc = vpc_connect(module) # Get values of variable state = module.params['state'] destination_cidrblock = module.params['destination_cidrblock'] router_id = module.params['router_id'] nexthop_id = module.params['nexthop_id'] route_table_id = None changed = False route_entries = [] route_entries_basic = [] route_entry = None try: page = 1 pagesize = 50 while True: entries = vpc.get_all_route_entries(router_id=router_id, router_type='VRouter', pagenumber=page, pagesize=pagesize) if entries and len(entries) > 0: for entry in entries: route_table_id = entry.route_table_id route_entries.append(entry) route_entries_basic.append(get_route_entry_basic(entry)) if destination_cidrblock and entry.destination_cidrblock == destination_cidrblock: route_entry = entry if not entries or len(entries) < pagesize: break page += 1 except VPCResponseError as e: module.fail_json(msg='Unable to retrieve route entries, error: {0}'.format(e)) if state == 'present': if not route_entry: changed, route_entry = create_route_entry(module, vpc, route_table_id) module.exit_json(changed=changed, route_table_id=route_table_id, route_entry=get_route_entry_detail(route_entry), destination_cidrblock=route_entry.destination_cidrblock) else: if route_entry: try: changed = vpc.delete_route_entry(route_table_id, destination_cidrblock=destination_cidrblock, nexthop_id=nexthop_id) except VPCResponseError as e: module.fail_json(msg='Unable to delete route entry, error: {0}'.format(e)) module.exit_json(changed=changed, route_table_id=route_table_id, destination_cidrblock=destination_cidrblock) module.exit_json(changed=changed, msg="Please specify a route entry by using 'destination_cidrblock'," "and expected vpcs: {0}".format(route_entries_basic)) if __name__ == '__main__': main()