1#!/usr/local/bin/python3.8 2from __future__ import (absolute_import, division, print_function) 3# Copyright 2019-2020 Fortinet, Inc. 4# 5# This program is free software: you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation, either version 3 of the License, or 8# (at your option) any later version. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program. If not, see <https://www.gnu.org/licenses/>. 17 18__metaclass__ = type 19 20ANSIBLE_METADATA = {'status': ['preview'], 21 'supported_by': 'community', 22 'metadata_version': '1.1'} 23 24DOCUMENTATION = ''' 25--- 26module: fortios_router_route_map 27short_description: Configure route maps in Fortinet's FortiOS and FortiGate. 28description: 29 - This module is able to configure a FortiGate or FortiOS (FOS) device by allowing the 30 user to set and modify router feature and route_map category. 31 Examples include all parameters and values need to be adjusted to datasources before usage. 32 Tested with FOS v6.0.0 33version_added: "2.10" 34author: 35 - Link Zheng (@chillancezen) 36 - Jie Xue (@JieX19) 37 - Hongbin Lu (@fgtdev-hblu) 38 - Frank Shen (@frankshen01) 39 - Miguel Angel Munoz (@mamunozgonzalez) 40 - Nicolas Thomas (@thomnico) 41notes: 42 - Legacy fortiosapi has been deprecated, httpapi is the preferred way to run playbooks 43 44requirements: 45 - ansible>=2.9.0 46options: 47 access_token: 48 description: 49 - Token-based authentication. 50 Generated from GUI of Fortigate. 51 type: str 52 required: false 53 enable_log: 54 description: 55 - Enable/Disable logging for task. 56 type: bool 57 required: false 58 default: false 59 vdom: 60 description: 61 - Virtual domain, among those defined previously. A vdom is a 62 virtual instance of the FortiGate that can be configured and 63 used as a different unit. 64 type: str 65 default: root 66 67 state: 68 description: 69 - Indicates whether to create or remove the object. 70 type: str 71 required: true 72 choices: 73 - present 74 - absent 75 router_route_map: 76 description: 77 - Configure route maps. 78 default: null 79 type: dict 80 suboptions: 81 comments: 82 description: 83 - Optional comments. 84 type: str 85 name: 86 description: 87 - Name. 88 required: true 89 type: str 90 rule: 91 description: 92 - Rule. 93 type: list 94 suboptions: 95 action: 96 description: 97 - Action. 98 type: str 99 choices: 100 - permit 101 - deny 102 id: 103 description: 104 - Rule ID. 105 required: true 106 type: int 107 match_as_path: 108 description: 109 - Match BGP AS path list. Source router.aspath-list.name. 110 type: str 111 match_community: 112 description: 113 - Match BGP community list. Source router.community-list.name. 114 type: str 115 match_community_exact: 116 description: 117 - Enable/disable exact matching of communities. 118 type: str 119 choices: 120 - enable 121 - disable 122 match_flags: 123 description: 124 - BGP flag value to match (0 - 65535) 125 type: int 126 match_interface: 127 description: 128 - Match interface configuration. Source system.interface.name. 129 type: str 130 match_ip_address: 131 description: 132 - Match IP address permitted by access-list or prefix-list. Source router.access-list.name router.prefix-list.name. 133 type: str 134 match_ip_nexthop: 135 description: 136 - Match next hop IP address passed by access-list or prefix-list. Source router.access-list.name router.prefix-list.name. 137 type: str 138 match_ip6_address: 139 description: 140 - Match IPv6 address permitted by access-list6 or prefix-list6. Source router.access-list6.name router.prefix-list6.name. 141 type: str 142 match_ip6_nexthop: 143 description: 144 - Match next hop IPv6 address passed by access-list6 or prefix-list6. Source router.access-list6.name router.prefix-list6.name. 145 type: str 146 match_metric: 147 description: 148 - Match metric for redistribute routes. 149 type: int 150 match_origin: 151 description: 152 - Match BGP origin code. 153 type: str 154 choices: 155 - none 156 - egp 157 - igp 158 - incomplete 159 match_route_type: 160 description: 161 - Match route type. 162 type: str 163 choices: 164 - 1 165 - 2 166 - none 167 - external-type1 168 - external-type2 169 match_tag: 170 description: 171 - Match tag. 172 type: int 173 match_vrf: 174 description: 175 - Match VRF ID. 176 type: int 177 set_aggregator_as: 178 description: 179 - BGP aggregator AS. 180 type: int 181 set_aggregator_ip: 182 description: 183 - BGP aggregator IP. 184 type: str 185 set_aspath: 186 description: 187 - Prepend BGP AS path attribute. 188 type: list 189 suboptions: 190 as: 191 description: 192 - 'AS number (0 - 42949672). NOTE: Use quotes for repeating numbers, e.g.: "1 1 2"' 193 required: true 194 type: str 195 set_aspath_action: 196 description: 197 - Specify preferred action of set-aspath. 198 type: str 199 choices: 200 - prepend 201 - replace 202 set_atomic_aggregate: 203 description: 204 - Enable/disable BGP atomic aggregate attribute. 205 type: str 206 choices: 207 - enable 208 - disable 209 set_community: 210 description: 211 - BGP community attribute. 212 type: list 213 suboptions: 214 community: 215 description: 216 - 'Attribute: AA|AA:NN|internet|local-AS|no-advertise|no-export.' 217 required: true 218 type: str 219 set_community_additive: 220 description: 221 - Enable/disable adding set-community to existing community. 222 type: str 223 choices: 224 - enable 225 - disable 226 set_community_delete: 227 description: 228 - Delete communities matching community list. Source router.community-list.name. 229 type: str 230 set_dampening_max_suppress: 231 description: 232 - Maximum duration to suppress a route (1 - 255 min, 0 = unset). 233 type: int 234 set_dampening_reachability_half_life: 235 description: 236 - Reachability half-life time for the penalty (1 - 45 min, 0 = unset). 237 type: int 238 set_dampening_reuse: 239 description: 240 - Value to start reusing a route (1 - 20000, 0 = unset). 241 type: int 242 set_dampening_suppress: 243 description: 244 - Value to start suppressing a route (1 - 20000, 0 = unset). 245 type: int 246 set_dampening_unreachability_half_life: 247 description: 248 - Unreachability Half-life time for the penalty (1 - 45 min, 0 = unset) 249 type: int 250 set_extcommunity_rt: 251 description: 252 - Route Target extended community. 253 type: list 254 suboptions: 255 community: 256 description: 257 - 'AA:NN.' 258 required: true 259 type: str 260 set_extcommunity_soo: 261 description: 262 - Site-of-Origin extended community. 263 type: list 264 suboptions: 265 community: 266 description: 267 - 'AA:NN' 268 required: true 269 type: str 270 set_flags: 271 description: 272 - BGP flags value (0 - 65535) 273 type: int 274 set_ip_nexthop: 275 description: 276 - IP address of next hop. 277 type: str 278 set_ip6_nexthop: 279 description: 280 - IPv6 global address of next hop. 281 type: str 282 set_ip6_nexthop_local: 283 description: 284 - IPv6 local address of next hop. 285 type: str 286 set_local_preference: 287 description: 288 - BGP local preference path attribute. 289 type: int 290 set_metric: 291 description: 292 - Metric value. 293 type: int 294 set_metric_type: 295 description: 296 - Metric type. 297 type: str 298 choices: 299 - 1 300 - 2 301 - none 302 - external-type1 303 - external-type2 304 set_origin: 305 description: 306 - BGP origin code. 307 type: str 308 choices: 309 - none 310 - egp 311 - igp 312 - incomplete 313 set_originator_id: 314 description: 315 - BGP originator ID attribute. 316 type: str 317 set_route_tag: 318 description: 319 - Route tag for routing table. 320 type: int 321 set_tag: 322 description: 323 - Tag value. 324 type: int 325 set_weight: 326 description: 327 - BGP weight for routing table. 328 type: int 329''' 330 331EXAMPLES = ''' 332- hosts: fortigates 333 collections: 334 - fortinet.fortios 335 connection: httpapi 336 vars: 337 vdom: "root" 338 ansible_httpapi_use_ssl: yes 339 ansible_httpapi_validate_certs: no 340 ansible_httpapi_port: 443 341 tasks: 342 - name: Configure route maps. 343 fortios_router_route_map: 344 vdom: "{{ vdom }}" 345 state: "present" 346 access_token: "<your_own_value>" 347 router_route_map: 348 comments: "<your_own_value>" 349 name: "default_name_4" 350 rule: 351 - 352 action: "permit" 353 id: "7" 354 match_as_path: "<your_own_value> (source router.aspath-list.name)" 355 match_community: "<your_own_value> (source router.community-list.name)" 356 match_community_exact: "enable" 357 match_flags: "11" 358 match_interface: "<your_own_value> (source system.interface.name)" 359 match_ip_address: "<your_own_value> (source router.access-list.name router.prefix-list.name)" 360 match_ip_nexthop: "<your_own_value> (source router.access-list.name router.prefix-list.name)" 361 match_ip6_address: "<your_own_value> (source router.access-list6.name router.prefix-list6.name)" 362 match_ip6_nexthop: "<your_own_value> (source router.access-list6.name router.prefix-list6.name)" 363 match_metric: "17" 364 match_origin: "none" 365 match_route_type: "1" 366 match_tag: "20" 367 match_vrf: "21" 368 set_aggregator_as: "22" 369 set_aggregator_ip: "<your_own_value>" 370 set_aspath: 371 - 372 as: "<your_own_value>" 373 set_aspath_action: "prepend" 374 set_atomic_aggregate: "enable" 375 set_community: 376 - 377 community: "<your_own_value>" 378 set_community_additive: "enable" 379 set_community_delete: "<your_own_value> (source router.community-list.name)" 380 set_dampening_max_suppress: "32" 381 set_dampening_reachability_half_life: "33" 382 set_dampening_reuse: "34" 383 set_dampening_suppress: "35" 384 set_dampening_unreachability_half_life: "36" 385 set_extcommunity_rt: 386 - 387 community: "<your_own_value>" 388 set_extcommunity_soo: 389 - 390 community: "<your_own_value>" 391 set_flags: "41" 392 set_ip_nexthop: "<your_own_value>" 393 set_ip6_nexthop: "<your_own_value>" 394 set_ip6_nexthop_local: "<your_own_value>" 395 set_local_preference: "45" 396 set_metric: "46" 397 set_metric_type: "1" 398 set_origin: "none" 399 set_originator_id: "<your_own_value>" 400 set_route_tag: "50" 401 set_tag: "51" 402 set_weight: "52" 403 404''' 405 406RETURN = ''' 407build: 408 description: Build number of the fortigate image 409 returned: always 410 type: str 411 sample: '1547' 412http_method: 413 description: Last method used to provision the content into FortiGate 414 returned: always 415 type: str 416 sample: 'PUT' 417http_status: 418 description: Last result given by FortiGate on last operation applied 419 returned: always 420 type: str 421 sample: "200" 422mkey: 423 description: Master key (id) used in the last call to FortiGate 424 returned: success 425 type: str 426 sample: "id" 427name: 428 description: Name of the table used to fulfill the request 429 returned: always 430 type: str 431 sample: "urlfilter" 432path: 433 description: Path of the table used to fulfill the request 434 returned: always 435 type: str 436 sample: "webfilter" 437revision: 438 description: Internal revision number 439 returned: always 440 type: str 441 sample: "17.0.2.10658" 442serial: 443 description: Serial number of the unit 444 returned: always 445 type: str 446 sample: "FGVMEVYYQT3AB5352" 447status: 448 description: Indication of the operation's result 449 returned: always 450 type: str 451 sample: "success" 452vdom: 453 description: Virtual domain used 454 returned: always 455 type: str 456 sample: "root" 457version: 458 description: Version of the FortiGate 459 returned: always 460 type: str 461 sample: "v5.6.3" 462 463''' 464from ansible.module_utils.basic import AnsibleModule 465from ansible.module_utils.connection import Connection 466from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import FortiOSHandler 467from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_legacy_fortiosapi 468from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import schema_to_module_spec 469from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.fortios import check_schema_versioning 470from ansible_collections.fortinet.fortios.plugins.module_utils.fortimanager.common import FAIL_SOCKET_MSG 471from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import is_same_comparison 472from ansible_collections.fortinet.fortios.plugins.module_utils.fortios.comparison import serialize 473 474 475def filter_router_route_map_data(json): 476 option_list = ['comments', 'name', 'rule'] 477 dictionary = {} 478 479 for attribute in option_list: 480 if attribute in json and json[attribute] is not None: 481 dictionary[attribute] = json[attribute] 482 483 return dictionary 484 485 486def underscore_to_hyphen(data): 487 if isinstance(data, list): 488 for i, elem in enumerate(data): 489 data[i] = underscore_to_hyphen(elem) 490 elif isinstance(data, dict): 491 new_data = {} 492 for k, v in data.items(): 493 new_data[k.replace('_', '-')] = underscore_to_hyphen(v) 494 data = new_data 495 496 return data 497 498 499def router_route_map(data, fos, check_mode=False): 500 501 vdom = data['vdom'] 502 503 state = data['state'] 504 505 router_route_map_data = data['router_route_map'] 506 filtered_data = underscore_to_hyphen(filter_router_route_map_data(router_route_map_data)) 507 508 # check_mode starts from here 509 if check_mode: 510 mkey = fos.get_mkey('system', 'interface', filtered_data, vdom=vdom) 511 current_data = fos.get('system', 'interface', vdom=vdom, mkey=mkey) 512 is_existed = current_data and current_data.get('http_status') == 200 \ 513 and isinstance(current_data.get('results'), list) \ 514 and len(current_data['results']) > 0 515 516 # 2. if it exists and the state is 'present' then compare current settings with desired 517 if state == 'present' or state is True: 518 if mkey is None: 519 return False, True, filtered_data 520 521 # if mkey exists then compare each other 522 # record exits and they're matched or not 523 if is_existed: 524 is_same = is_same_comparison( 525 serialize(current_data['results'][0]), serialize(filtered_data)) 526 return False, not is_same, filtered_data 527 528 # record does not exist 529 return False, True, filtered_data 530 531 if state == 'absent': 532 if mkey is None: 533 return False, False, filtered_data 534 535 if is_existed: 536 return False, True, filtered_data 537 return False, False, filtered_data 538 539 return True, False, {'reason: ': 'Must provide state parameter'} 540 541 if state == "present" or state is True: 542 return fos.set('router', 543 'route-map', 544 data=filtered_data, 545 vdom=vdom) 546 547 elif state == "absent": 548 return fos.delete('router', 549 'route-map', 550 mkey=filtered_data['name'], 551 vdom=vdom) 552 else: 553 fos._module.fail_json(msg='state must be present or absent!') 554 555 556def is_successful_status(status): 557 return status['status'] == "success" or \ 558 status['http_method'] == "DELETE" and status['http_status'] == 404 559 560 561def fortios_router(data, fos, check_mode): 562 563 if data['router_route_map']: 564 resp = router_route_map(data, fos, check_mode) 565 else: 566 fos._module.fail_json(msg='missing task body: %s' % ('router_route_map')) 567 if check_mode: 568 return resp 569 return not is_successful_status(resp), \ 570 resp['status'] == "success" and \ 571 (resp['revision_changed'] if 'revision_changed' in resp else True), \ 572 resp 573 574 575versioned_schema = { 576 "type": "list", 577 "children": { 578 "name": { 579 "type": "string", 580 "revisions": { 581 "v6.0.0": True, 582 "v7.0.0": True, 583 "v6.0.5": True, 584 "v6.4.4": True, 585 "v6.4.0": True, 586 "v6.4.1": True, 587 "v6.2.0": True, 588 "v6.2.3": True, 589 "v6.2.5": True, 590 "v6.2.7": True, 591 "v6.0.11": True 592 } 593 }, 594 "rule": { 595 "type": "list", 596 "children": { 597 "match_interface": { 598 "type": "string", 599 "revisions": { 600 "v6.0.0": True, 601 "v7.0.0": True, 602 "v6.0.5": True, 603 "v6.4.4": True, 604 "v6.4.0": True, 605 "v6.4.1": True, 606 "v6.2.0": True, 607 "v6.2.3": True, 608 "v6.2.5": True, 609 "v6.2.7": True, 610 "v6.0.11": True 611 } 612 }, 613 "set_dampening_suppress": { 614 "type": "integer", 615 "revisions": { 616 "v6.0.0": True, 617 "v7.0.0": True, 618 "v6.0.5": True, 619 "v6.4.4": True, 620 "v6.4.0": True, 621 "v6.4.1": True, 622 "v6.2.0": True, 623 "v6.2.3": True, 624 "v6.2.5": True, 625 "v6.2.7": True, 626 "v6.0.11": True 627 } 628 }, 629 "set_metric_type": { 630 "type": "string", 631 "options": [ 632 { 633 "value": "1", 634 "revisions": { 635 "v6.0.0": True, 636 "v7.0.0": False, 637 "v6.0.5": True, 638 "v6.4.4": True, 639 "v6.4.0": True, 640 "v6.4.1": True, 641 "v6.2.0": True, 642 "v6.2.3": True, 643 "v6.2.5": True, 644 "v6.2.7": True, 645 "v6.0.11": True 646 } 647 }, 648 { 649 "value": "2", 650 "revisions": { 651 "v6.0.0": True, 652 "v7.0.0": False, 653 "v6.0.5": True, 654 "v6.4.4": True, 655 "v6.4.0": True, 656 "v6.4.1": True, 657 "v6.2.0": True, 658 "v6.2.3": True, 659 "v6.2.5": True, 660 "v6.2.7": True, 661 "v6.0.11": True 662 } 663 }, 664 { 665 "value": "none", 666 "revisions": { 667 "v6.0.0": True, 668 "v7.0.0": True, 669 "v6.0.5": True, 670 "v6.4.4": True, 671 "v6.4.0": True, 672 "v6.4.1": True, 673 "v6.2.0": True, 674 "v6.2.3": True, 675 "v6.2.5": True, 676 "v6.2.7": True, 677 "v6.0.11": True 678 } 679 }, 680 { 681 "value": "external-type1", 682 "revisions": { 683 "v7.0.0": True 684 } 685 }, 686 { 687 "value": "external-type2", 688 "revisions": { 689 "v7.0.0": True 690 } 691 } 692 ], 693 "revisions": { 694 "v6.0.0": True, 695 "v7.0.0": True, 696 "v6.0.5": True, 697 "v6.4.4": True, 698 "v6.4.0": True, 699 "v6.4.1": True, 700 "v6.2.0": True, 701 "v6.2.3": True, 702 "v6.2.5": True, 703 "v6.2.7": True, 704 "v6.0.11": True 705 } 706 }, 707 "set_ip6_nexthop_local": { 708 "type": "string", 709 "revisions": { 710 "v6.0.0": True, 711 "v7.0.0": True, 712 "v6.0.5": True, 713 "v6.4.4": True, 714 "v6.4.0": True, 715 "v6.4.1": True, 716 "v6.2.0": True, 717 "v6.2.3": True, 718 "v6.2.5": True, 719 "v6.2.7": True, 720 "v6.0.11": True 721 } 722 }, 723 "set_ip_nexthop": { 724 "type": "string", 725 "revisions": { 726 "v6.0.0": True, 727 "v7.0.0": True, 728 "v6.0.5": True, 729 "v6.4.4": True, 730 "v6.4.0": True, 731 "v6.4.1": True, 732 "v6.2.0": True, 733 "v6.2.3": True, 734 "v6.2.5": True, 735 "v6.2.7": True, 736 "v6.0.11": True 737 } 738 }, 739 "match_origin": { 740 "type": "string", 741 "options": [ 742 { 743 "value": "none", 744 "revisions": { 745 "v6.0.0": True, 746 "v7.0.0": True, 747 "v6.0.5": True, 748 "v6.4.4": True, 749 "v6.4.0": True, 750 "v6.4.1": True, 751 "v6.2.0": True, 752 "v6.2.3": True, 753 "v6.2.5": True, 754 "v6.2.7": True, 755 "v6.0.11": True 756 } 757 }, 758 { 759 "value": "egp", 760 "revisions": { 761 "v6.0.0": True, 762 "v7.0.0": True, 763 "v6.0.5": True, 764 "v6.4.4": True, 765 "v6.4.0": True, 766 "v6.4.1": True, 767 "v6.2.0": True, 768 "v6.2.3": True, 769 "v6.2.5": True, 770 "v6.2.7": True, 771 "v6.0.11": True 772 } 773 }, 774 { 775 "value": "igp", 776 "revisions": { 777 "v6.0.0": True, 778 "v7.0.0": True, 779 "v6.0.5": True, 780 "v6.4.4": True, 781 "v6.4.0": True, 782 "v6.4.1": True, 783 "v6.2.0": True, 784 "v6.2.3": True, 785 "v6.2.5": True, 786 "v6.2.7": True, 787 "v6.0.11": True 788 } 789 }, 790 { 791 "value": "incomplete", 792 "revisions": { 793 "v6.0.0": True, 794 "v7.0.0": True, 795 "v6.0.5": True, 796 "v6.4.4": True, 797 "v6.4.0": True, 798 "v6.4.1": True, 799 "v6.2.0": True, 800 "v6.2.3": True, 801 "v6.2.5": True, 802 "v6.2.7": True, 803 "v6.0.11": True 804 } 805 } 806 ], 807 "revisions": { 808 "v6.0.0": True, 809 "v7.0.0": True, 810 "v6.0.5": True, 811 "v6.4.4": True, 812 "v6.4.0": True, 813 "v6.4.1": True, 814 "v6.2.0": True, 815 "v6.2.3": True, 816 "v6.2.5": True, 817 "v6.2.7": True, 818 "v6.0.11": True 819 } 820 }, 821 "set_dampening_reachability_half_life": { 822 "type": "integer", 823 "revisions": { 824 "v6.0.0": True, 825 "v7.0.0": True, 826 "v6.0.5": True, 827 "v6.4.4": True, 828 "v6.4.0": True, 829 "v6.4.1": True, 830 "v6.2.0": True, 831 "v6.2.3": True, 832 "v6.2.5": True, 833 "v6.2.7": True, 834 "v6.0.11": True 835 } 836 }, 837 "set_community_delete": { 838 "type": "string", 839 "revisions": { 840 "v6.0.0": True, 841 "v7.0.0": True, 842 "v6.0.5": True, 843 "v6.4.4": True, 844 "v6.4.0": True, 845 "v6.4.1": True, 846 "v6.2.0": True, 847 "v6.2.3": True, 848 "v6.2.5": True, 849 "v6.2.7": True, 850 "v6.0.11": True 851 } 852 }, 853 "id": { 854 "type": "integer", 855 "revisions": { 856 "v6.0.0": True, 857 "v7.0.0": True, 858 "v6.0.5": True, 859 "v6.4.4": True, 860 "v6.4.0": True, 861 "v6.4.1": True, 862 "v6.2.0": True, 863 "v6.2.3": True, 864 "v6.2.5": True, 865 "v6.2.7": True, 866 "v6.0.11": True 867 } 868 }, 869 "set_community": { 870 "type": "list", 871 "children": { 872 "community": { 873 "type": "string", 874 "revisions": { 875 "v6.0.0": True, 876 "v7.0.0": True, 877 "v6.0.5": True, 878 "v6.4.4": True, 879 "v6.4.0": True, 880 "v6.4.1": True, 881 "v6.2.0": True, 882 "v6.2.3": True, 883 "v6.2.5": True, 884 "v6.2.7": True, 885 "v6.0.11": True 886 } 887 } 888 }, 889 "revisions": { 890 "v6.0.0": True, 891 "v7.0.0": True, 892 "v6.0.5": True, 893 "v6.4.4": True, 894 "v6.4.0": True, 895 "v6.4.1": True, 896 "v6.2.0": True, 897 "v6.2.3": True, 898 "v6.2.5": True, 899 "v6.2.7": True, 900 "v6.0.11": True 901 } 902 }, 903 "set_extcommunity_rt": { 904 "type": "list", 905 "children": { 906 "community": { 907 "type": "string", 908 "revisions": { 909 "v6.0.0": True, 910 "v7.0.0": True, 911 "v6.0.5": True, 912 "v6.4.4": True, 913 "v6.4.0": True, 914 "v6.4.1": True, 915 "v6.2.0": True, 916 "v6.2.3": True, 917 "v6.2.5": True, 918 "v6.2.7": True, 919 "v6.0.11": True 920 } 921 } 922 }, 923 "revisions": { 924 "v6.0.0": True, 925 "v7.0.0": True, 926 "v6.0.5": True, 927 "v6.4.4": True, 928 "v6.4.0": True, 929 "v6.4.1": True, 930 "v6.2.0": True, 931 "v6.2.3": True, 932 "v6.2.5": True, 933 "v6.2.7": True, 934 "v6.0.11": True 935 } 936 }, 937 "set_dampening_unreachability_half_life": { 938 "type": "integer", 939 "revisions": { 940 "v6.0.0": True, 941 "v7.0.0": True, 942 "v6.0.5": True, 943 "v6.4.4": True, 944 "v6.4.0": True, 945 "v6.4.1": True, 946 "v6.2.0": True, 947 "v6.2.3": True, 948 "v6.2.5": True, 949 "v6.2.7": True, 950 "v6.0.11": True 951 } 952 }, 953 "match_community": { 954 "type": "string", 955 "revisions": { 956 "v6.0.0": True, 957 "v7.0.0": True, 958 "v6.0.5": True, 959 "v6.4.4": True, 960 "v6.4.0": True, 961 "v6.4.1": True, 962 "v6.2.0": True, 963 "v6.2.3": True, 964 "v6.2.5": True, 965 "v6.2.7": True, 966 "v6.0.11": True 967 } 968 }, 969 "set_community_additive": { 970 "type": "string", 971 "options": [ 972 { 973 "value": "enable", 974 "revisions": { 975 "v6.0.0": True, 976 "v7.0.0": True, 977 "v6.0.5": True, 978 "v6.4.4": True, 979 "v6.4.0": True, 980 "v6.4.1": True, 981 "v6.2.0": True, 982 "v6.2.3": True, 983 "v6.2.5": True, 984 "v6.2.7": True, 985 "v6.0.11": True 986 } 987 }, 988 { 989 "value": "disable", 990 "revisions": { 991 "v6.0.0": True, 992 "v7.0.0": True, 993 "v6.0.5": True, 994 "v6.4.4": True, 995 "v6.4.0": True, 996 "v6.4.1": True, 997 "v6.2.0": True, 998 "v6.2.3": True, 999 "v6.2.5": True, 1000 "v6.2.7": True, 1001 "v6.0.11": True 1002 } 1003 } 1004 ], 1005 "revisions": { 1006 "v6.0.0": True, 1007 "v7.0.0": True, 1008 "v6.0.5": True, 1009 "v6.4.4": True, 1010 "v6.4.0": True, 1011 "v6.4.1": True, 1012 "v6.2.0": True, 1013 "v6.2.3": True, 1014 "v6.2.5": True, 1015 "v6.2.7": True, 1016 "v6.0.11": True 1017 } 1018 }, 1019 "set_atomic_aggregate": { 1020 "type": "string", 1021 "options": [ 1022 { 1023 "value": "enable", 1024 "revisions": { 1025 "v6.0.0": True, 1026 "v7.0.0": True, 1027 "v6.0.5": True, 1028 "v6.4.4": True, 1029 "v6.4.0": True, 1030 "v6.4.1": True, 1031 "v6.2.0": True, 1032 "v6.2.3": True, 1033 "v6.2.5": True, 1034 "v6.2.7": True, 1035 "v6.0.11": True 1036 } 1037 }, 1038 { 1039 "value": "disable", 1040 "revisions": { 1041 "v6.0.0": True, 1042 "v7.0.0": True, 1043 "v6.0.5": True, 1044 "v6.4.4": True, 1045 "v6.4.0": True, 1046 "v6.4.1": True, 1047 "v6.2.0": True, 1048 "v6.2.3": True, 1049 "v6.2.5": True, 1050 "v6.2.7": True, 1051 "v6.0.11": True 1052 } 1053 } 1054 ], 1055 "revisions": { 1056 "v6.0.0": True, 1057 "v7.0.0": True, 1058 "v6.0.5": True, 1059 "v6.4.4": True, 1060 "v6.4.0": True, 1061 "v6.4.1": True, 1062 "v6.2.0": True, 1063 "v6.2.3": True, 1064 "v6.2.5": True, 1065 "v6.2.7": True, 1066 "v6.0.11": True 1067 } 1068 }, 1069 "set_weight": { 1070 "type": "integer", 1071 "revisions": { 1072 "v6.0.0": True, 1073 "v7.0.0": True, 1074 "v6.0.5": True, 1075 "v6.4.4": True, 1076 "v6.4.0": True, 1077 "v6.4.1": True, 1078 "v6.2.0": True, 1079 "v6.2.3": True, 1080 "v6.2.5": True, 1081 "v6.2.7": True, 1082 "v6.0.11": True 1083 } 1084 }, 1085 "set_flags": { 1086 "type": "integer", 1087 "revisions": { 1088 "v6.0.0": True, 1089 "v7.0.0": False, 1090 "v6.0.5": True, 1091 "v6.4.4": True, 1092 "v6.4.0": True, 1093 "v6.4.1": True, 1094 "v6.2.0": True, 1095 "v6.2.3": True, 1096 "v6.2.5": True, 1097 "v6.2.7": True, 1098 "v6.0.11": True 1099 } 1100 }, 1101 "set_aggregator_ip": { 1102 "type": "string", 1103 "revisions": { 1104 "v6.0.0": True, 1105 "v7.0.0": True, 1106 "v6.0.5": True, 1107 "v6.4.4": True, 1108 "v6.4.0": True, 1109 "v6.4.1": True, 1110 "v6.2.0": True, 1111 "v6.2.3": True, 1112 "v6.2.5": True, 1113 "v6.2.7": True, 1114 "v6.0.11": True 1115 } 1116 }, 1117 "match_ip_nexthop": { 1118 "type": "string", 1119 "revisions": { 1120 "v6.0.0": True, 1121 "v7.0.0": True, 1122 "v6.0.5": True, 1123 "v6.4.4": True, 1124 "v6.4.0": True, 1125 "v6.4.1": True, 1126 "v6.2.0": True, 1127 "v6.2.3": True, 1128 "v6.2.5": True, 1129 "v6.2.7": True, 1130 "v6.0.11": True 1131 } 1132 }, 1133 "set_metric": { 1134 "type": "integer", 1135 "revisions": { 1136 "v6.0.0": True, 1137 "v7.0.0": True, 1138 "v6.0.5": True, 1139 "v6.4.4": True, 1140 "v6.4.0": True, 1141 "v6.4.1": True, 1142 "v6.2.0": True, 1143 "v6.2.3": True, 1144 "v6.2.5": True, 1145 "v6.2.7": True, 1146 "v6.0.11": True 1147 } 1148 }, 1149 "match_flags": { 1150 "type": "integer", 1151 "revisions": { 1152 "v6.0.0": True, 1153 "v7.0.0": False, 1154 "v6.0.5": True, 1155 "v6.4.4": True, 1156 "v6.4.0": True, 1157 "v6.4.1": True, 1158 "v6.2.0": True, 1159 "v6.2.3": True, 1160 "v6.2.5": True, 1161 "v6.2.7": True, 1162 "v6.0.11": True 1163 } 1164 }, 1165 "set_route_tag": { 1166 "type": "integer", 1167 "revisions": { 1168 "v6.0.0": True, 1169 "v7.0.0": True, 1170 "v6.0.5": True, 1171 "v6.4.4": True, 1172 "v6.4.0": True, 1173 "v6.4.1": True, 1174 "v6.2.0": True, 1175 "v6.2.3": True, 1176 "v6.2.5": True, 1177 "v6.2.7": True, 1178 "v6.0.11": True 1179 } 1180 }, 1181 "set_extcommunity_soo": { 1182 "type": "list", 1183 "children": { 1184 "community": { 1185 "type": "string", 1186 "revisions": { 1187 "v6.0.0": True, 1188 "v7.0.0": True, 1189 "v6.0.5": True, 1190 "v6.4.4": True, 1191 "v6.4.0": True, 1192 "v6.4.1": True, 1193 "v6.2.0": True, 1194 "v6.2.3": True, 1195 "v6.2.5": True, 1196 "v6.2.7": True, 1197 "v6.0.11": True 1198 } 1199 } 1200 }, 1201 "revisions": { 1202 "v6.0.0": True, 1203 "v7.0.0": True, 1204 "v6.0.5": True, 1205 "v6.4.4": True, 1206 "v6.4.0": True, 1207 "v6.4.1": True, 1208 "v6.2.0": True, 1209 "v6.2.3": True, 1210 "v6.2.5": True, 1211 "v6.2.7": True, 1212 "v6.0.11": True 1213 } 1214 }, 1215 "set_aggregator_as": { 1216 "type": "integer", 1217 "revisions": { 1218 "v6.0.0": True, 1219 "v7.0.0": True, 1220 "v6.0.5": True, 1221 "v6.4.4": True, 1222 "v6.4.0": True, 1223 "v6.4.1": True, 1224 "v6.2.0": True, 1225 "v6.2.3": True, 1226 "v6.2.5": True, 1227 "v6.2.7": True, 1228 "v6.0.11": True 1229 } 1230 }, 1231 "match_ip_address": { 1232 "type": "string", 1233 "revisions": { 1234 "v6.0.0": True, 1235 "v7.0.0": True, 1236 "v6.0.5": True, 1237 "v6.4.4": True, 1238 "v6.4.0": True, 1239 "v6.4.1": True, 1240 "v6.2.0": True, 1241 "v6.2.3": True, 1242 "v6.2.5": True, 1243 "v6.2.7": True, 1244 "v6.0.11": True 1245 } 1246 }, 1247 "set_local_preference": { 1248 "type": "integer", 1249 "revisions": { 1250 "v6.0.0": True, 1251 "v7.0.0": True, 1252 "v6.0.5": True, 1253 "v6.4.4": True, 1254 "v6.4.0": True, 1255 "v6.4.1": True, 1256 "v6.2.0": True, 1257 "v6.2.3": True, 1258 "v6.2.5": True, 1259 "v6.2.7": True, 1260 "v6.0.11": True 1261 } 1262 }, 1263 "match_route_type": { 1264 "type": "string", 1265 "options": [ 1266 { 1267 "value": "1", 1268 "revisions": { 1269 "v6.0.0": True, 1270 "v7.0.0": False, 1271 "v6.0.5": True, 1272 "v6.4.4": True, 1273 "v6.4.0": True, 1274 "v6.4.1": True, 1275 "v6.2.0": True, 1276 "v6.2.3": True, 1277 "v6.2.5": True, 1278 "v6.2.7": True, 1279 "v6.0.11": True 1280 } 1281 }, 1282 { 1283 "value": "2", 1284 "revisions": { 1285 "v6.0.0": True, 1286 "v7.0.0": False, 1287 "v6.0.5": True, 1288 "v6.4.4": True, 1289 "v6.4.0": True, 1290 "v6.4.1": True, 1291 "v6.2.0": True, 1292 "v6.2.3": True, 1293 "v6.2.5": True, 1294 "v6.2.7": True, 1295 "v6.0.11": True 1296 } 1297 }, 1298 { 1299 "value": "none", 1300 "revisions": { 1301 "v6.0.0": True, 1302 "v7.0.0": True, 1303 "v6.0.5": True, 1304 "v6.4.4": True, 1305 "v6.4.0": True, 1306 "v6.4.1": True, 1307 "v6.2.0": True, 1308 "v6.2.3": True, 1309 "v6.2.5": True, 1310 "v6.2.7": True, 1311 "v6.0.11": True 1312 } 1313 }, 1314 { 1315 "value": "external-type1", 1316 "revisions": { 1317 "v7.0.0": True 1318 } 1319 }, 1320 { 1321 "value": "external-type2", 1322 "revisions": { 1323 "v7.0.0": True 1324 } 1325 } 1326 ], 1327 "revisions": { 1328 "v6.0.0": True, 1329 "v7.0.0": True, 1330 "v6.0.5": True, 1331 "v6.4.4": True, 1332 "v6.4.0": True, 1333 "v6.4.1": True, 1334 "v6.2.0": True, 1335 "v6.2.3": True, 1336 "v6.2.5": True, 1337 "v6.2.7": True, 1338 "v6.0.11": True 1339 } 1340 }, 1341 "set_dampening_reuse": { 1342 "type": "integer", 1343 "revisions": { 1344 "v6.0.0": True, 1345 "v7.0.0": True, 1346 "v6.0.5": True, 1347 "v6.4.4": True, 1348 "v6.4.0": True, 1349 "v6.4.1": True, 1350 "v6.2.0": True, 1351 "v6.2.3": True, 1352 "v6.2.5": True, 1353 "v6.2.7": True, 1354 "v6.0.11": True 1355 } 1356 }, 1357 "set_aspath": { 1358 "type": "list", 1359 "children": { 1360 "as": { 1361 "type": "string", 1362 "revisions": { 1363 "v6.0.0": True, 1364 "v7.0.0": True, 1365 "v6.0.5": True, 1366 "v6.4.4": True, 1367 "v6.4.0": True, 1368 "v6.4.1": True, 1369 "v6.2.0": True, 1370 "v6.2.3": True, 1371 "v6.2.5": True, 1372 "v6.2.7": True, 1373 "v6.0.11": True 1374 } 1375 } 1376 }, 1377 "revisions": { 1378 "v6.0.0": True, 1379 "v7.0.0": True, 1380 "v6.0.5": True, 1381 "v6.4.4": True, 1382 "v6.4.0": True, 1383 "v6.4.1": True, 1384 "v6.2.0": True, 1385 "v6.2.3": True, 1386 "v6.2.5": True, 1387 "v6.2.7": True, 1388 "v6.0.11": True 1389 } 1390 }, 1391 "set_originator_id": { 1392 "type": "string", 1393 "revisions": { 1394 "v6.0.0": True, 1395 "v7.0.0": True, 1396 "v6.0.5": True, 1397 "v6.4.4": True, 1398 "v6.4.0": True, 1399 "v6.4.1": True, 1400 "v6.2.0": True, 1401 "v6.2.3": True, 1402 "v6.2.5": True, 1403 "v6.2.7": True, 1404 "v6.0.11": True 1405 } 1406 }, 1407 "match_metric": { 1408 "type": "integer", 1409 "revisions": { 1410 "v6.0.0": True, 1411 "v7.0.0": True, 1412 "v6.0.5": True, 1413 "v6.4.4": True, 1414 "v6.4.0": True, 1415 "v6.4.1": True, 1416 "v6.2.0": True, 1417 "v6.2.3": True, 1418 "v6.2.5": True, 1419 "v6.2.7": True, 1420 "v6.0.11": True 1421 } 1422 }, 1423 "set_origin": { 1424 "type": "string", 1425 "options": [ 1426 { 1427 "value": "none", 1428 "revisions": { 1429 "v6.0.0": True, 1430 "v7.0.0": True, 1431 "v6.0.5": True, 1432 "v6.4.4": True, 1433 "v6.4.0": True, 1434 "v6.4.1": True, 1435 "v6.2.0": True, 1436 "v6.2.3": True, 1437 "v6.2.5": True, 1438 "v6.2.7": True, 1439 "v6.0.11": True 1440 } 1441 }, 1442 { 1443 "value": "egp", 1444 "revisions": { 1445 "v6.0.0": True, 1446 "v7.0.0": True, 1447 "v6.0.5": True, 1448 "v6.4.4": True, 1449 "v6.4.0": True, 1450 "v6.4.1": True, 1451 "v6.2.0": True, 1452 "v6.2.3": True, 1453 "v6.2.5": True, 1454 "v6.2.7": True, 1455 "v6.0.11": True 1456 } 1457 }, 1458 { 1459 "value": "igp", 1460 "revisions": { 1461 "v6.0.0": True, 1462 "v7.0.0": True, 1463 "v6.0.5": True, 1464 "v6.4.4": True, 1465 "v6.4.0": True, 1466 "v6.4.1": True, 1467 "v6.2.0": True, 1468 "v6.2.3": True, 1469 "v6.2.5": True, 1470 "v6.2.7": True, 1471 "v6.0.11": True 1472 } 1473 }, 1474 { 1475 "value": "incomplete", 1476 "revisions": { 1477 "v6.0.0": True, 1478 "v7.0.0": True, 1479 "v6.0.5": True, 1480 "v6.4.4": True, 1481 "v6.4.0": True, 1482 "v6.4.1": True, 1483 "v6.2.0": True, 1484 "v6.2.3": True, 1485 "v6.2.5": True, 1486 "v6.2.7": True, 1487 "v6.0.11": True 1488 } 1489 } 1490 ], 1491 "revisions": { 1492 "v6.0.0": True, 1493 "v7.0.0": True, 1494 "v6.0.5": True, 1495 "v6.4.4": True, 1496 "v6.4.0": True, 1497 "v6.4.1": True, 1498 "v6.2.0": True, 1499 "v6.2.3": True, 1500 "v6.2.5": True, 1501 "v6.2.7": True, 1502 "v6.0.11": True 1503 } 1504 }, 1505 "match_as_path": { 1506 "type": "string", 1507 "revisions": { 1508 "v6.0.0": True, 1509 "v7.0.0": True, 1510 "v6.0.5": True, 1511 "v6.4.4": True, 1512 "v6.4.0": True, 1513 "v6.4.1": True, 1514 "v6.2.0": True, 1515 "v6.2.3": True, 1516 "v6.2.5": True, 1517 "v6.2.7": True, 1518 "v6.0.11": True 1519 } 1520 }, 1521 "set_aspath_action": { 1522 "type": "string", 1523 "options": [ 1524 { 1525 "value": "prepend", 1526 "revisions": { 1527 "v6.0.0": True, 1528 "v7.0.0": True, 1529 "v6.0.5": True, 1530 "v6.4.4": True, 1531 "v6.4.0": True, 1532 "v6.4.1": True, 1533 "v6.2.0": True, 1534 "v6.2.3": True, 1535 "v6.2.5": True, 1536 "v6.2.7": True, 1537 "v6.0.11": True 1538 } 1539 }, 1540 { 1541 "value": "replace", 1542 "revisions": { 1543 "v6.0.0": True, 1544 "v7.0.0": True, 1545 "v6.0.5": True, 1546 "v6.4.4": True, 1547 "v6.4.0": True, 1548 "v6.4.1": True, 1549 "v6.2.0": True, 1550 "v6.2.3": True, 1551 "v6.2.5": True, 1552 "v6.2.7": True, 1553 "v6.0.11": True 1554 } 1555 } 1556 ], 1557 "revisions": { 1558 "v6.0.0": True, 1559 "v7.0.0": True, 1560 "v6.0.5": True, 1561 "v6.4.4": True, 1562 "v6.4.0": True, 1563 "v6.4.1": True, 1564 "v6.2.0": True, 1565 "v6.2.3": True, 1566 "v6.2.5": True, 1567 "v6.2.7": True, 1568 "v6.0.11": True 1569 } 1570 }, 1571 "set_dampening_max_suppress": { 1572 "type": "integer", 1573 "revisions": { 1574 "v6.0.0": True, 1575 "v7.0.0": True, 1576 "v6.0.5": True, 1577 "v6.4.4": True, 1578 "v6.4.0": True, 1579 "v6.4.1": True, 1580 "v6.2.0": True, 1581 "v6.2.3": True, 1582 "v6.2.5": True, 1583 "v6.2.7": True, 1584 "v6.0.11": True 1585 } 1586 }, 1587 "set_ip6_nexthop": { 1588 "type": "string", 1589 "revisions": { 1590 "v6.0.0": True, 1591 "v7.0.0": True, 1592 "v6.0.5": True, 1593 "v6.4.4": True, 1594 "v6.4.0": True, 1595 "v6.4.1": True, 1596 "v6.2.0": True, 1597 "v6.2.3": True, 1598 "v6.2.5": True, 1599 "v6.2.7": True, 1600 "v6.0.11": True 1601 } 1602 }, 1603 "set_tag": { 1604 "type": "integer", 1605 "revisions": { 1606 "v6.0.0": True, 1607 "v7.0.0": True, 1608 "v6.0.5": True, 1609 "v6.4.4": True, 1610 "v6.4.0": True, 1611 "v6.4.1": True, 1612 "v6.2.0": True, 1613 "v6.2.3": True, 1614 "v6.2.5": True, 1615 "v6.2.7": True, 1616 "v6.0.11": True 1617 } 1618 }, 1619 "match_ip6_nexthop": { 1620 "type": "string", 1621 "revisions": { 1622 "v6.0.0": True, 1623 "v7.0.0": True, 1624 "v6.0.5": True, 1625 "v6.4.4": True, 1626 "v6.4.0": True, 1627 "v6.4.1": True, 1628 "v6.2.0": True, 1629 "v6.2.3": True, 1630 "v6.2.5": True, 1631 "v6.2.7": True, 1632 "v6.0.11": True 1633 } 1634 }, 1635 "action": { 1636 "type": "string", 1637 "options": [ 1638 { 1639 "value": "permit", 1640 "revisions": { 1641 "v6.0.0": True, 1642 "v7.0.0": True, 1643 "v6.0.5": True, 1644 "v6.4.4": True, 1645 "v6.4.0": True, 1646 "v6.4.1": True, 1647 "v6.2.0": True, 1648 "v6.2.3": True, 1649 "v6.2.5": True, 1650 "v6.2.7": True, 1651 "v6.0.11": True 1652 } 1653 }, 1654 { 1655 "value": "deny", 1656 "revisions": { 1657 "v6.0.0": True, 1658 "v7.0.0": True, 1659 "v6.0.5": True, 1660 "v6.4.4": True, 1661 "v6.4.0": True, 1662 "v6.4.1": True, 1663 "v6.2.0": True, 1664 "v6.2.3": True, 1665 "v6.2.5": True, 1666 "v6.2.7": True, 1667 "v6.0.11": True 1668 } 1669 } 1670 ], 1671 "revisions": { 1672 "v6.0.0": True, 1673 "v7.0.0": True, 1674 "v6.0.5": True, 1675 "v6.4.4": True, 1676 "v6.4.0": True, 1677 "v6.4.1": True, 1678 "v6.2.0": True, 1679 "v6.2.3": True, 1680 "v6.2.5": True, 1681 "v6.2.7": True, 1682 "v6.0.11": True 1683 } 1684 }, 1685 "match_ip6_address": { 1686 "type": "string", 1687 "revisions": { 1688 "v6.0.0": True, 1689 "v7.0.0": True, 1690 "v6.0.5": True, 1691 "v6.4.4": True, 1692 "v6.4.0": True, 1693 "v6.4.1": True, 1694 "v6.2.0": True, 1695 "v6.2.3": True, 1696 "v6.2.5": True, 1697 "v6.2.7": True, 1698 "v6.0.11": True 1699 } 1700 }, 1701 "match_community_exact": { 1702 "type": "string", 1703 "options": [ 1704 { 1705 "value": "enable", 1706 "revisions": { 1707 "v6.0.0": True, 1708 "v7.0.0": True, 1709 "v6.0.5": True, 1710 "v6.4.4": True, 1711 "v6.4.0": True, 1712 "v6.4.1": True, 1713 "v6.2.0": True, 1714 "v6.2.3": True, 1715 "v6.2.5": True, 1716 "v6.2.7": True, 1717 "v6.0.11": True 1718 } 1719 }, 1720 { 1721 "value": "disable", 1722 "revisions": { 1723 "v6.0.0": True, 1724 "v7.0.0": True, 1725 "v6.0.5": True, 1726 "v6.4.4": True, 1727 "v6.4.0": True, 1728 "v6.4.1": True, 1729 "v6.2.0": True, 1730 "v6.2.3": True, 1731 "v6.2.5": True, 1732 "v6.2.7": True, 1733 "v6.0.11": True 1734 } 1735 } 1736 ], 1737 "revisions": { 1738 "v6.0.0": True, 1739 "v7.0.0": True, 1740 "v6.0.5": True, 1741 "v6.4.4": True, 1742 "v6.4.0": True, 1743 "v6.4.1": True, 1744 "v6.2.0": True, 1745 "v6.2.3": True, 1746 "v6.2.5": True, 1747 "v6.2.7": True, 1748 "v6.0.11": True 1749 } 1750 }, 1751 "match_vrf": { 1752 "type": "integer", 1753 "revisions": { 1754 "v6.4.4": True, 1755 "v7.0.0": True, 1756 "v6.4.0": True, 1757 "v6.4.1": True 1758 } 1759 }, 1760 "match_tag": { 1761 "type": "integer", 1762 "revisions": { 1763 "v6.0.0": True, 1764 "v7.0.0": True, 1765 "v6.0.5": True, 1766 "v6.4.4": True, 1767 "v6.4.0": True, 1768 "v6.4.1": True, 1769 "v6.2.0": True, 1770 "v6.2.3": True, 1771 "v6.2.5": True, 1772 "v6.2.7": True, 1773 "v6.0.11": True 1774 } 1775 } 1776 }, 1777 "revisions": { 1778 "v6.0.0": True, 1779 "v7.0.0": True, 1780 "v6.0.5": True, 1781 "v6.4.4": True, 1782 "v6.4.0": True, 1783 "v6.4.1": True, 1784 "v6.2.0": True, 1785 "v6.2.3": True, 1786 "v6.2.5": True, 1787 "v6.2.7": True, 1788 "v6.0.11": True 1789 } 1790 }, 1791 "comments": { 1792 "type": "string", 1793 "revisions": { 1794 "v6.0.0": True, 1795 "v7.0.0": True, 1796 "v6.0.5": True, 1797 "v6.4.4": True, 1798 "v6.4.0": True, 1799 "v6.4.1": True, 1800 "v6.2.0": True, 1801 "v6.2.3": True, 1802 "v6.2.5": True, 1803 "v6.2.7": True, 1804 "v6.0.11": True 1805 } 1806 } 1807 }, 1808 "revisions": { 1809 "v6.0.0": True, 1810 "v7.0.0": True, 1811 "v6.0.5": True, 1812 "v6.4.4": True, 1813 "v6.4.0": True, 1814 "v6.4.1": True, 1815 "v6.2.0": True, 1816 "v6.2.3": True, 1817 "v6.2.5": True, 1818 "v6.2.7": True, 1819 "v6.0.11": True 1820 } 1821} 1822 1823 1824def main(): 1825 module_spec = schema_to_module_spec(versioned_schema) 1826 mkeyname = 'name' 1827 fields = { 1828 "access_token": {"required": False, "type": "str", "no_log": True}, 1829 "enable_log": {"required": False, "type": bool}, 1830 "vdom": {"required": False, "type": "str", "default": "root"}, 1831 "state": {"required": True, "type": "str", 1832 "choices": ["present", "absent"]}, 1833 "router_route_map": { 1834 "required": False, "type": "dict", "default": None, 1835 "options": { 1836 } 1837 } 1838 } 1839 for attribute_name in module_spec['options']: 1840 fields["router_route_map"]['options'][attribute_name] = module_spec['options'][attribute_name] 1841 if mkeyname and mkeyname == attribute_name: 1842 fields["router_route_map"]['options'][attribute_name]['required'] = True 1843 1844 check_legacy_fortiosapi() 1845 module = AnsibleModule(argument_spec=fields, 1846 supports_check_mode=True) 1847 1848 versions_check_result = None 1849 if module._socket_path: 1850 connection = Connection(module._socket_path) 1851 if 'access_token' in module.params: 1852 connection.set_option('access_token', module.params['access_token']) 1853 1854 if 'enable_log' in module.params: 1855 connection.set_option('enable_log', module.params['enable_log']) 1856 else: 1857 connection.set_option('enable_log', False) 1858 fos = FortiOSHandler(connection, module, mkeyname) 1859 versions_check_result = check_schema_versioning(fos, versioned_schema, "router_route_map") 1860 1861 is_error, has_changed, result = fortios_router(module.params, fos, module.check_mode) 1862 1863 else: 1864 module.fail_json(**FAIL_SOCKET_MSG) 1865 1866 if versions_check_result and versions_check_result['matched'] is False: 1867 module.warn("Ansible has detected version mismatch between FortOS system and your playbook, see more details by specifying option -vvv") 1868 1869 if not is_error: 1870 if versions_check_result and versions_check_result['matched'] is False: 1871 module.exit_json(changed=has_changed, version_check_warning=versions_check_result, meta=result) 1872 else: 1873 module.exit_json(changed=has_changed, meta=result) 1874 else: 1875 if versions_check_result and versions_check_result['matched'] is False: 1876 module.fail_json(msg="Error in repo", version_check_warning=versions_check_result, meta=result) 1877 else: 1878 module.fail_json(msg="Error in repo", meta=result) 1879 1880 1881if __name__ == '__main__': 1882 main() 1883