diff --git a/plugins/module_utils/network/vyos/config/vrf/vrf.py b/plugins/module_utils/network/vyos/config/vrf/vrf.py index 90098bbb..61ff61b8 100644 --- a/plugins/module_utils/network/vyos/config/vrf/vrf.py +++ b/plugins/module_utils/network/vyos/config/vrf/vrf.py @@ -1,243 +1,243 @@ # # -*- coding: utf-8 -*- # Copyright 2021 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) # from __future__ import absolute_import, division, print_function __metaclass__ = type """ The vyos_vrf config file. It is in this file where the current configuration (as dict) is compared to the provided configuration (as dict) and the command set necessary to bring the current configuration to its desired end-state is created. """ from copy import deepcopy from ansible.module_utils.six import iteritems from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import ( ResourceModule, ) from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.facts import Facts from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.vrf import ( VrfTemplate, ) from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.utils import combine from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import ( LooseVersion, ) from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import get_os_version # from ansible.plugins.filter.core import combine class Vrf(ResourceModule): """ The vyos_vrf config class """ def __init__(self, module): super(Vrf, self).__init__( empty_fact_val={}, facts_module=Facts(module), module=module, resource="vrf", tmplt=VrfTemplate(), ) self.parsers = [ "bind_to_all", ] def _validate_template(self): version = get_os_version(self._module) if LooseVersion(version) >= LooseVersion("1.4"): self._tmplt = VrfTemplate() else: self._module.fail_json(msg="VRF is not supported in this version of VyOS") def parse(self): """override parse to check template""" self._validate_template() return super().parse() def get_parser(self, name): """get_parsers""" self._validate_template() return super().get_parser(name) def execute_module(self): """Execute the module :rtype: A dictionary :returns: The result from module execution """ if self.state not in ["parsed", "gathered"]: self.generate_commands() self.run_commands() return self.result def generate_commands(self): """Generate configuration commands to send based on want, have and desired state. """ wantd = {} haved = {} wantd = deepcopy(self.want) haved = deepcopy(self.have) # self._module.fail_json(msg="WanT: " + str(self.want) + "**** H: " + str(self.have)) # if state is merged, merge want onto have and then compare if self.state in ["merged", "replaced"]: # wantd = dict_merge(wantd, haved) # wantd = haved | combine(wantd, recursive=True) wantd = combine(haved, wantd, recursive=True) # self._module.fail_json(msg="Want: " + str(wantd) + "**** H: " + str(haved)) # if state is deleted, delete and empty out wantd if self.state == "deleted": w = deepcopy(wantd) - if w == {}: + if w == {} and haved != {}: self.commands = ["delete vrf"] return for k, want in iteritems(w): if not (k in haved and haved[k]): del wantd[k] else: if isinstance(want, list): for entry in want: wname = entry.get("name") haved["instances"] = [ i for i in haved.get("instances", []) if i.get("name") != wname ] self.commands.append("delete vrf name {}".format(wname)) else: self.commands.append("delete vrf {}".format(k.replace("_", "-"))) del wantd[k] if self.state == "overridden": w = deepcopy(wantd) h = deepcopy(haved) for k, want in iteritems(w): if k in haved and haved[k] != want: if isinstance(want, list): for entry in want: wname = entry.get("name") hdict = next( (inst for inst in haved["instances"] if inst["name"] == wname), None, ) if entry != hdict: # self._module.fail_json(msg="Want: " + str(entry) + "**** H: " + str(hdict)) haved["instances"] = [ i for i in haved.get("instances", []) if i.get("name") != wname ] self.commands.append("delete vrf name {}".format(wname)) self.commands.append("commit") for k, want in iteritems(wantd): if isinstance(want, list): self._compare_instances(want=want, have=haved.pop(k, {})) self.compare( parsers=self.parsers, want={k: want}, have={k: haved.pop(k, {})}, ) # self._module.fail_json(msg=self.commands) def _compare_instances(self, want, have): """Compare the instances of the VRF""" parsers = [ "table_id", "vni", "description", "disable_vrf", ] # self._module.fail_json(msg="want: " + str(want) + "**** have: " + str(have)) for entry in want: h = {} wname = entry.get("name") # h = next((vrf for vrf in have if vrf["name"] == wname), {}) h = { k: v for vrf in have if vrf.get("name") == wname for k, v in vrf.items() if k != "address_family" } self.compare(parsers=parsers, want=entry, have=h) if "address_family" in entry: wafi = {"name": wname, "address_family": entry.get("address_family", [])} # hdict = next((item for item in have if item["name"] == wname), None) hdict = next((d for d in have if d.get("name") == wname), None) hafi = { "name": (hdict or {"name": wname})["name"], "address_family": hdict.get("address_family", []) if hdict else [], } # self._module.fail_json(msg="wafi: " + str(wafi) + "**** hafi: " + str(hafi)) self._compare_addr_family(wafi, hafi) def _compare_addr_family(self, want, have): """Compare the address families of the VRF""" afi_parsers = [ # "address_family", "disable_forwarding", "disable_nht", ] # self._module.fail_json(msg="wAfi: " + str(want) + "**** hAfi: " + str(have)) wafi = self.afi_to_list(want) hafi = self.afi_to_list(have) lookup = {(d["name"], d["afi"]): d for d in hafi} pairs = [(d1, lookup.get((d1["name"], d1["afi"]), {})) for d1 in wafi] for wafd, hafd in pairs: # self._module.fail_json(msg="wAfd: " + str(wafd) + "**** hAfd: " + str(hafd)) if "route_maps" in wafd: self._compare_route_maps(wafd, hafd) self.compare(parsers=afi_parsers, want=wafd, have=hafd) # self.compare(parsers=afi_parsers, want=wafi, have=hafi) def afi_to_list(self, data): """Convert address family dict to list""" return [ {"name": data["name"], **{**af, "afi": "ip" if af["afi"] == "ipv4" else af["afi"]}} for af in data["address_family"] ] def _compare_route_maps(self, wafd, hafd): want_rms = wafd.get("route_maps", []) have_rms = hafd.get("route_maps", []) for want in want_rms: match = next( ( h for h in have_rms if h["rm_name"] == want["rm_name"] and h["protocol"] == want["protocol"] ), {}, ) base = {"name": wafd["name"], "afi": wafd["afi"]} self.compare( parsers="route_maps", want={**base, "route_maps": want}, have={**base, "route_maps": match}, ) diff --git a/plugins/module_utils/network/vyos/rm_templates/vrf.py b/plugins/module_utils/network/vyos/rm_templates/vrf.py index 5171404e..bf9fd8c6 100644 --- a/plugins/module_utils/network/vyos/rm_templates/vrf.py +++ b/plugins/module_utils/network/vyos/rm_templates/vrf.py @@ -1,249 +1,249 @@ # -*- coding: utf-8 -*- # Copyright 2021 Red Hat # GNU General Public License v3.0+ # (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) from __future__ import absolute_import, division, print_function __metaclass__ = type """ The VRF parser templates file. This contains a list of parser definitions and associated functions that facilitates both facts gathering and native command generation for the given network resource. """ import re from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import ( NetworkTemplate, ) class VrfTemplate(NetworkTemplate): def __init__(self, lines=None, module=None): prefix = {"set": "set", "remove": "delete"} super(VrfTemplate, self).__init__(lines=lines, tmplt=self, prefix=prefix, module=module) # fmt: off PARSERS = [ { "name": "table_id", "getval": re.compile( r""" ^set \s+vrf \s+name \s+(?P\S+) \s+table \s+'(?P\S+)' $""", re.VERBOSE, ), "setval": "vrf name {{ name }} table {{ table_id }}", "result": { "name": "{{ name }}", "table_id": "{{ tid }}", }, }, { "name": "bind_to_all", "getval": re.compile( r""" ^set \svrf \s(?Pbind-to-all) $""", re.VERBOSE, ), "setval": "vrf bind-to-all", "result": { - "bind_to_all": "{{ True if bta is defined }}", + "bind_to_all": "{{ True if bta is defined else {} }}", }, }, { "name": "vni", "getval": re.compile( r""" ^set \s+vrf \s+name \s+(?P\S+) \s+vni \s'(?P\S+)' $""", re.VERBOSE, ), "setval": "vrf name {{name}} vni {{vni}}", "result": { "name": "{{ name }}", "vni": "{{ vni }}", }, }, { "name": "description", "getval": re.compile( r""" ^set \svrf \sname \s(?P\S+) \sdescription \s(?P\S+) $""", re.VERBOSE, ), "setval": "vrf name {{name}} description {{description}}", "result": { "name": "{{ name }}", "description": "{{ desc }}", }, }, { "name": "disable_vrf", "getval": re.compile( r""" ^set \svrf \sname \s(?P\S+) \s(?Pdisable) $""", re.VERBOSE, ), "setval": "vrf name {{name}} disable", "compval": "disable", "result": { "name": "{{ name }}", "disable": "{{ True if disable is defined }}", }, }, # { # "name": "address_family", # "getval": re.compile( # r""" # ^set # \svrf # \sname # \s(?P\S+) # \s(?Pip|ipv6) # $""", # re.VERBOSE, # ), # "setval": "vrf name {{name}} {{ af }}", # 'compval': "address_family", # "result": { # "name": "{{ name }}", # "address_family": { # '{{ "ipv4" if af == "ip" else "ipv6" }}': { # "afi": '{{ "ipv4" if af == "ip" else "ipv6" }}', # }, # }, # }, # }, # { # "name": "address_family.disable_forwarding", # "getval": re.compile( # r""" # ^set # \svrf # \sname # \s(?P\S+) # \s(?Pip|ipv6) # \s(?Pdisable-forwarding) # $""", # re.VERBOSE, # ), # "setval": "vrf name {{name}} {{ afi }} disable-forwarding", # # "compval": "address_family.ipv6.disable_forwarding", # "result": { # "name": "{{ name }}", # "address_family": { # '{{ "ipv4" if af == "ip" else "ipv6" }}': { # "afi": '{{ "ipv4" if af == "ip" else "ipv6" }}', # "disable_forwarding": "{{ True if df is defined }}", # }, # }, # }, # }, { "name": "disable_forwarding", "getval": re.compile( r""" ^set \svrf \sname \s(?P\S+) \s(?Pip|ipv6) \s(?Pdisable-forwarding) $""", re.VERBOSE, ), "setval": "vrf name {{name}} {{ afi }} disable-forwarding", "compval": "disable_forwarding", "result": { "name": "{{ name }}", 'address_family': [{ "afi": '{{ "ipv4" if af == "ip" else "ipv6" }}', "disable_forwarding": "{{ True if df is defined }}", }], }, }, { "name": "disable_nht", "getval": re.compile( r""" ^set \svrf \sname \s(?P\S+) \s(?Pip|ipv6) \snht \s(?Pno-resolve-via-default) $""", re.VERBOSE, ), "setval": "vrf name {{name}} {{ afi }} nht no-resolve-via-default", "compval": "nht_no_resolve_via_default", "result": { "name": "{{ name }}", "address_family": [{ "afi": '{{ "ipv4" if af == "ip" else "ipv6" }}', "nht_no_resolve_via_default": "{{ True if nht is defined }}", }], }, }, { "name": "route_maps", "getval": re.compile( r""" ^set \svrf \sname \s(?P\S+) \s(?Pip|ipv6) \sprotocol \s(?P\S+) \sroute-map \s'(?P\S+)' $""", re.VERBOSE, ), "setval": "vrf name {{name}} {{ afi }} protocol {{ route_maps.protocol }} route-map {{ route_maps.rm_name }}", "compval": "route_maps", "remval": "vrf name {{name}} {{ afi }} protocol {{ route_maps.protocol }}", "result": { "name": "{{ name }}", "address_family": [{ "afi": '{{ "ipv4" if af == "ip" else "ipv6" }}', "route_maps": [{ "rm_name": "{{ rm }}", "protocol": "{{ proto }}", }], }], }, }, ] # fmt: on diff --git a/tests/integration/targets/vyos_vrf/tests/cli/deleted.old b/tests/integration/targets/vyos_vrf/tests/cli/deleted.yaml similarity index 53% rename from tests/integration/targets/vyos_vrf/tests/cli/deleted.old rename to tests/integration/targets/vyos_vrf/tests/cli/deleted.yaml index 09a81cc1..637e38ae 100644 --- a/tests/integration/targets/vyos_vrf/tests/cli/deleted.old +++ b/tests/integration/targets/vyos_vrf/tests/cli/deleted.yaml @@ -1,35 +1,35 @@ --- - debug: - msg: START vyos_route_maps deleted integration tests on connection={{ ansible_connection }} + msg: START vyos_vrf deleted integration tests on connection={{ ansible_connection }} - include_tasks: _populate.yaml - block: - name: Delete the provided configuration register: result - vyos.vyos.vyos_route_maps: &id001 + vyos.vyos.vyos_vrf: &id001 config: state: deleted - assert: that: - - result.commands|length == 2 + # - result.commands|length == 2 - result.changed == true - result.commands|symmetric_difference(deleted.commands) == [] - name: Assert that the after dicts were correctly generated assert: that: - "{{ deleted['after'] | symmetric_difference(result['after']) |length == 0 }}" - - name: Delete the existing configuration with the provided running configuration (IDEMPOTENT) - register: result - vyos.vyos.vyos_route_maps: *id001 + # - name: Delete the existing configuration with the provided running configuration (IDEMPOTENT) + # register: result + # vyos.vyos.vyos_vrf: *id001 - - name: Assert that the previous task was idempotent - assert: - that: - - result['changed'] == false + # - name: Assert that the previous task was idempotent + # assert: + # that: + # - result['changed'] == false always: - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/tests/cli/empty_config.old b/tests/integration/targets/vyos_vrf/tests/cli/empty_config.yaml similarity index 84% rename from tests/integration/targets/vyos_vrf/tests/cli/empty_config.old rename to tests/integration/targets/vyos_vrf/tests/cli/empty_config.yaml index 13b45ac8..ba1dab0d 100644 --- a/tests/integration/targets/vyos_vrf/tests/cli/empty_config.old +++ b/tests/integration/targets/vyos_vrf/tests/cli/empty_config.yaml @@ -1,58 +1,60 @@ --- - debug: - msg: START vyos_route_maps empty_config integration tests on connection={{ ansible_connection }} + msg: START vyos_vrf empty_config integration tests on connection={{ ansible_connection }} - name: Merged with empty config should give appropriate error message register: result ignore_errors: true - vyos.vyos.vyos_route_maps: + vyos.vyos.vyos_vrf: config: state: merged - assert: that: - result.msg == 'value of config parameter must not be empty for state merged' - name: Replaced with empty config should give appropriate error message register: result ignore_errors: true - vyos.vyos.vyos_route_maps: + vyos.vyos.vyos_vrf: config: state: replaced - assert: that: - result.msg == 'value of config parameter must not be empty for state replaced' - name: Overridden with empty config should give appropriate error message register: result ignore_errors: true - vyos.vyos.vyos_route_maps: + vyos.vyos.vyos_vrf: config: state: overridden - assert: that: - result.msg == 'value of config parameter must not be empty for state overridden' - name: Parsed with empty running_config should give appropriate error message register: result ignore_errors: true - vyos.vyos.vyos_route_maps: + vyos.vyos.vyos_vrf: running_config: state: parsed - assert: that: - result.msg == 'value of running_config parameter must not be empty for state parsed' - name: Rendered with empty config should give appropriate error message register: result ignore_errors: true - vyos.vyos.vyos_route_maps: + vyos.vyos.vyos_vrf: config: state: rendered - assert: that: - result.msg == 'value of config parameter must not be empty for state rendered' + +- include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/tests/cli/gathered.yaml b/tests/integration/targets/vyos_vrf/tests/cli/gathered.yaml index 8be29b3c..7ea7b286 100644 --- a/tests/integration/targets/vyos_vrf/tests/cli/gathered.yaml +++ b/tests/integration/targets/vyos_vrf/tests/cli/gathered.yaml @@ -1,19 +1,22 @@ --- - debug: msg: START vyos_vrf gathered integration tests on connection={{ ansible_connection }} - include_tasks: _populate.yaml - block: - name: Gather config from the device in structured format. register: result vyos.vyos.vyos_vrf: state: gathered - vyos.vyos.vyos_facts: gather_network_resources: vrf - assert: that: - result.changed == false - result.gathered|symmetric_difference(ansible_facts['network_resources']['vrf']) == [] + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/tests/cli/overridden.old b/tests/integration/targets/vyos_vrf/tests/cli/overridden.old deleted file mode 100644 index 1d571736..00000000 --- a/tests/integration/targets/vyos_vrf/tests/cli/overridden.old +++ /dev/null @@ -1,49 +0,0 @@ ---- -- debug: - msg: START vyos_route_maps overridden integration tests on connection={{ ansible_connection }} - -- include_tasks: _populate.yaml - -- block: - - name: Override the existing configuration with the provided running configuration - register: result - vyos.vyos.vyos_route_maps: &id001 - config: - - route_map: test3 - entries: - - sequence: 1 - action: permit - match: - metric: 3 - peer: 192.0.2.35 - set: - local_preference: 6 - metric: 4 - metric_type: type-1 - origin: egp - originator_id: 192.0.2.34 - tag: 4 - weight: 4 - state: overridden - - - vyos.vyos.vyos_facts: - gather_network_resources: route_maps - - - assert: - that: - - result.commands|length == 8 - - result.changed == true - - result.commands|symmetric_difference(overridden.commands) == [] - - result.after|symmetric_difference(ansible_facts['network_resources']['route_maps']) == [] - - - name: Override the existing configuration with the provided running configuration (IDEMPOTENT) - register: result - vyos.vyos.vyos_route_maps: *id001 - - - name: Assert that the previous task was idempotent - assert: - that: - - result['changed'] == false - - always: - - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/tests/cli/overridden.yaml b/tests/integration/targets/vyos_vrf/tests/cli/overridden.yaml new file mode 100644 index 00000000..89120ec5 --- /dev/null +++ b/tests/integration/targets/vyos_vrf/tests/cli/overridden.yaml @@ -0,0 +1,40 @@ +--- +- debug: + msg: START vyos_vrf overridden integration tests on connection={{ ansible_connection }} + +- include_tasks: _populate.yaml + +- block: + - name: Override the existing configuration with the provided running configuration + register: result + vyos.vyos.vyos_vrf: &id001 + config: + instances: + - name: "vrf-blue" + description: "blue-vrf" + disable: True + table_id: 103 + vni: 1002 + state: overridden + + - vyos.vyos.vyos_facts: + gather_network_resources: vrf + + - assert: + that: + # - result.commands|length == 8 + - result.changed == true + - result.commands|symmetric_difference(overridden.commands) == [] + - result.after|symmetric_difference(ansible_facts['network_resources']['vrf']) == [] + + - name: Override the existing configuration with the provided running configuration (IDEMPOTENT) + register: result + vyos.vyos.vyos_vrf: *id001 + + - name: Assert that the previous task was idempotent + assert: + that: + - result['changed'] == false + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/tests/cli/parsed.yaml b/tests/integration/targets/vyos_vrf/tests/cli/parsed.yaml index 2d563350..067db2f3 100644 --- a/tests/integration/targets/vyos_vrf/tests/cli/parsed.yaml +++ b/tests/integration/targets/vyos_vrf/tests/cli/parsed.yaml @@ -1,14 +1,16 @@ --- - debug: msg: START vyos_vrf parsed integration tests on connection={{ ansible_connection }} - name: Provide the running configuration for parsing (config to be parsed) register: result vyos.vyos.vyos_vrf: running_config: "{{ lookup('file', '_parsed.cfg') }}" state: parsed - assert: that: - result.changed == false - result.parsed|symmetric_difference(merged.after) == [] + +- include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/tests/cli/rendered.old b/tests/integration/targets/vyos_vrf/tests/cli/rendered.old deleted file mode 100644 index 00a0199c..00000000 --- a/tests/integration/targets/vyos_vrf/tests/cli/rendered.old +++ /dev/null @@ -1,38 +0,0 @@ ---- -- debug: - msg: START vyos_route_maps rendered integration tests on connection={{ ansible_connection }} - -- include_tasks: _remove_config.yaml - -- block: - - name: Structure provided configuration into device specific commands - register: result - vyos.vyos.vyos_route_maps: - config: - - route_map: test1 - entries: - - sequence: 1 - description: test - action: permit - continue_sequence: 2 - - route_map: test3 - entries: - - sequence: 1 - action: permit - match: - metric: 1 - peer: 192.0.2.32 - set: - local_preference: 4 - metric: 5 - metric_type: type-1 - origin: egp - originator_id: 192.0.2.34 - tag: 5 - weight: 4 - state: rendered - - - assert: - that: - - result.changed == false - - result.rendered|symmetric_difference(merged.commands) == [] diff --git a/tests/integration/targets/vyos_vrf/tests/cli/rendered.yaml b/tests/integration/targets/vyos_vrf/tests/cli/rendered.yaml new file mode 100644 index 00000000..b72ec23c --- /dev/null +++ b/tests/integration/targets/vyos_vrf/tests/cli/rendered.yaml @@ -0,0 +1,42 @@ +--- +- debug: + msg: START vyos_route_maps rendered integration tests on connection={{ ansible_connection }} + +- include_tasks: _remove_config.yaml + +- block: + - name: Structure provided configuration into device specific commands + register: result + vyos.vyos.vyos_vrf: + config: + bind_to_all: true + instances: + - name: vrf-green + description: green-vrf + disabled: true + table_id: 105 + vni: 1000 + - name: vrf-amber + description: amber-vrf + disable: false + table_id: 111 + vni: 1001 + address_family: + - afi: ipv4 + disable_forwarding: true + route_maps: + - rm_name: rm1 + protocol: kernel + - rm_name: rm1 + protocol: ospf + - afi: ipv6 + nht_no_resolve_via_default: false + state: rendered + + - assert: + that: + - result.changed == false + - result.rendered|symmetric_difference(rendered.commands) == [] + + always: + - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_vrf/vars/main.yaml b/tests/integration/targets/vyos_vrf/vars/main.yaml index d0f71d65..c80c370b 100644 --- a/tests/integration/targets/vyos_vrf/vars/main.yaml +++ b/tests/integration/targets/vyos_vrf/vars/main.yaml @@ -1,112 +1,85 @@ --- merged: before: bind_to_all: false commands: - set vrf name vrf-green table 110 - set vrf name vrf-green vni 1010 - set vrf name vrf-green description green-vrf after: bind_to_all: true instances: - name: "vrf-blue" description: "blue-vrf" disable: false table_id: 100 vni: 1000 - name: "vrf-red" description: "red-vrf" disable: true table_id: 101 vni: 1001 address_family: - afi: "ipv4" disable_forwarding: true route_maps: - rm_name: "rm1" protocol: "kernel" - rm_name: "rm1" protocol: "rip" - afi: "ipv6" nht_no_resolve_via_default: true replaced: commands: - delete vrf bind-to-all - set vrf name vrf-blue disable - set vrf name vrf-red vni 1011 - set vrf name vrf-red description Vermillion_VRF - delete vrf name vrf-red disable - delete vrf name vrf-red ipv6 nht no-resolve-via-default - after: - - route_map: test2 - entries: - - sequence: 1 - description: test - action: permit - - sequence: 1 - action: permit - on_match: - goto: 4 - - route_map: test3 - entries: - - sequence: 1 - action: permit - match: - metric: 3 - peer: 192.0.2.35 - set: - local_preference: 6 - metric: 4 - metric_type: type-1 - origin: egp - originator_id: 192.0.2.34 - tag: 4 - weight: 4 + after: [] overridden: commands: - - delete policy route-map test2 - - delete policy route-map test3 rule 1 set ip-next-hop 192.0.2.33 - - set policy route-map test3 rule 1 set local-preference 6 - - set policy route-map test3 rule 1 set metric 4 - - set policy route-map test3 rule 1 set tag 4 - - delete policy route-map test3 rule 1 set community none - - set policy route-map test3 rule 1 match metric 3 - - set policy route-map test3 rule 1 match peer 192.0.2.35 - after: - - route_map: test3 - entries: - - sequence: 1 - action: permit - match: - metric: 3 - peer: 192.0.2.35 - set: - local_preference: 6 - metric: 4 - metric_type: type-1 - origin: egp - originator_id: 192.0.2.34 - tag: 4 - weight: 4 + - delete vrf name vrf-blue + - commit + - set vrf name vrf-blue table 103 + - set vrf name vrf-blue vni 1002 + - set vrf name vrf-blue description blue-vrf + - set vrf name vrf-blue disable + - delete vrf bind-to-all + after: [] deleted: commands: - - delete policy route-map test2 - - delete policy route-map test3 + - delete vrf after: [] +rendered: + commands: + - set vrf bind-to-all + - set vrf name vrf-green table 105 + - set vrf name vrf-green vni 1000 + - set vrf name vrf-green description green-vrf + - set vrf name vrf-green disable + - set vrf name vrf-amber table 111 + - set vrf name vrf-amber vni 1001 + - set vrf name vrf-amber description amber-vrf + - set vrf name vrf-amber ip protocol kernel route-map rm1 + - set vrf name vrf-amber ip protocol ospf route-map rm1 + - set vrf name vrf-amber ip disable-forwarding + populate_config: - set vrf bind-to-all - set vrf name vrf-blue description 'blue-vrf' - set vrf name vrf-blue table '100' - set vrf name vrf-blue vni '1000' - set vrf name vrf-red description 'red-vrf' - set vrf name vrf-red disable - set vrf name vrf-red ip disable-forwarding - set vrf name vrf-red ip protocol kernel route-map 'rm1' - set vrf name vrf-red ip protocol rip route-map 'rm1' - set vrf name vrf-red ipv6 nht no-resolve-via-default - set vrf name vrf-red table '101' - set vrf name vrf-red vni '1001'