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