summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoromnom62 <75066712+omnom62@users.noreply.github.com>2024-12-20 05:33:39 +1000
committerGitHub <noreply@github.com>2024-12-20 05:33:39 +1000
commitcae1c6cc42fa786095433692a6d685f029bbde2e (patch)
treeba553267e68b14df2cec4d5c2ce359bab673aa40
parent001ed7481a23874f931e4bfb681e88506a5e6a0d (diff)
downloadvyos.vyos-cae1c6cc42fa786095433692a6d685f029bbde2e.tar.gz
vyos.vyos-cae1c6cc42fa786095433692a6d685f029bbde2e.zip
VyOS v1.4 support for BGP (T6892 & T6888 & T6822) (#367)
* VyOS v1.4 support for BGP (T6892) * WIP: chnages to scanners and facts for BGP on v1.4 * scanners and facts modification to support as_numberless commands * remove optional regex groups * VyOS v1.4 BGP system-as functionality * bgp_af linter * bgp_global mods and testing * bgp_global v.1.4 support * linter fixes * bgp_global and bgp_af fixed 1.3 test cases * unit tests for bgp modules for both versions * obsolete stranzas removed from bgp_global for both versions * some typos removed * bgp_global rst updates * t6829 related draft changes * Draft changes to unit tests fot original set and t6888 updates * changelog * D.R.Y for bgp_global and testmodule names * linter fixes * fixtures for bgp_af options testts * stranzas options processing * T6888 bgp option test func and cases * clean-up draft code and update to rm_templates * v14 system-as change supported in conf and tests * T6822 BGP global passive bugfix * clean-up * T6829: update integration tests * T6829: fix integration tests for global * T6829: fix integration tests for bgp_global * T6829: fix for 1.4 AF integration tests * T6829: fix unit tests after removing obsolete items * T6829: fix sanity test failures * T6829: fix documentation * Lint and comments are addressed * rtt.yaml and fix to integration tests * updated fragments for bgp_global * lint fixes --------- Co-authored-by: Gaige B. Paulsen <gaige@cluetrust.com>
-rw-r--r--changelogs/fragments/bgp_address_family.yaml12
-rw-r--r--changelogs/fragments/bgp_global.yaml10
-rw-r--r--docs/vyos.vyos.vyos_bgp_address_family_module.rst1
-rw-r--r--docs/vyos.vyos.vyos_bgp_global_module.rst791
-rw-r--r--plugins/module_utils/network/vyos/argspec/bgp_global/bgp_global.py113
-rw-r--r--plugins/module_utils/network/vyos/config/bgp_address_family/bgp_address_family.py58
-rw-r--r--plugins/module_utils/network/vyos/config/bgp_global/bgp_global.py98
-rw-r--r--plugins/module_utils/network/vyos/facts/bgp_address_family/bgp_address_family.py16
-rw-r--r--plugins/module_utils/network/vyos/facts/bgp_global/bgp_global.py14
-rw-r--r--plugins/module_utils/network/vyos/rm_templates/bgp_address_family.py169
-rw-r--r--plugins/module_utils/network/vyos/rm_templates/bgp_address_family_14.py1433
-rw-r--r--plugins/module_utils/network/vyos/rm_templates/bgp_global.py159
-rw-r--r--plugins/module_utils/network/vyos/rm_templates/bgp_global_14.py1799
-rw-r--r--plugins/modules/vyos_bgp_address_family.py1
-rw-r--r--plugins/modules/vyos_bgp_global.py373
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/_get_version.yaml28
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config.cfg12
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config_1_3.cfg9
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/_populate.yaml27
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/_preconfig.yaml8
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/_remove_config.yaml2
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/deleted.yaml2
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/merged.yaml4
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/overridden.yaml2
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/parsed.yaml35
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/rendered.yaml2
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/replaced.yaml2
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/tests/cli/rtt.yaml4
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/vars/main.yaml98
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/vars/pre-v1_4.yaml103
-rw-r--r--tests/integration/targets/vyos_bgp_address_family/vars/v1_4.yaml113
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/_get_version.yaml28
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config.cfg43
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config_1_3.cfg19
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/_populate.yaml51
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/_populate_af.yaml23
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/_remove_config.yaml2
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/deleted.yaml2
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/deleted_af.yaml1
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/merged.yaml22
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/parsed.yaml34
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/purged.yaml9
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/rendered.yaml20
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/replaced.yaml14
-rw-r--r--tests/integration/targets/vyos_bgp_global/tests/cli/replaced_af.yaml12
-rw-r--r--tests/integration/targets/vyos_bgp_global/vars/main.yaml149
-rw-r--r--tests/integration/targets/vyos_bgp_global/vars/pre-v1_4.yaml91
-rw-r--r--tests/integration/targets/vyos_bgp_global/vars/v1_4.yaml90
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_bgp_address_family_config_14.cfg8
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config.cfg5
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config_14.cfg6
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config.cfg1
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config_14.cfg5
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config.cfg10
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config_14.cfg14
-rw-r--r--tests/unit/modules/network/vyos/test_vyos_bgp_address_family.py194
-rw-r--r--tests/unit/modules/network/vyos/test_vyos_bgp_address_family14.py1000
-rw-r--r--tests/unit/modules/network/vyos/test_vyos_bgp_global.py199
-rw-r--r--tests/unit/modules/network/vyos/test_vyos_bgp_global14.py495
59 files changed, 6208 insertions, 1837 deletions
diff --git a/changelogs/fragments/bgp_address_family.yaml b/changelogs/fragments/bgp_address_family.yaml
new file mode 100644
index 00000000..266c3d81
--- /dev/null
+++ b/changelogs/fragments/bgp_address_family.yaml
@@ -0,0 +1,12 @@
+---
+major_changes:
+ - Aligned with version 1.3+ configuration - aggregate_address, maximum_paths, network, and redistribute
+ moved from `bgp_global` module. These are now Address-family specific.
+ - Many neighbor attributes also moved from `bgp_global` to `bgp_address_family` module.
+ - Redistribute, network stanza - added support for modifiers (metric, backdoor etc as per T6829)
+ - Support for 1.3+ VyOS only
+
+minor_changes:
+ - as_number - Added support for 1.4+ "system-as. 1.3 embedded as_number is still supported"
+ - fix tests for 1.4+ bgp_address_family
+ - updated documentation
diff --git a/changelogs/fragments/bgp_global.yaml b/changelogs/fragments/bgp_global.yaml
new file mode 100644
index 00000000..e528ab39
--- /dev/null
+++ b/changelogs/fragments/bgp_global.yaml
@@ -0,0 +1,10 @@
+---
+minor_changes:
+ - Added support for `solo` neighbor attribute
+ - as_number - Added support for 1.4+ "system-as. 1.3 embedded as_number is still supported"
+ - Fixed tests for 1.4+ bgp_global
+ - updated documentation
+ - Aligned with version 1.3+ configuration - aggregate_address, maximum_paths, network, and redistribute
+ Removed to `bgp_address_family` module.
+ - Many configuration attributes moved from `bgp_global` to `bgp_address_family` module.
+ - Support for 1.3+ VyOS only
diff --git a/docs/vyos.vyos.vyos_bgp_address_family_module.rst b/docs/vyos.vyos.vyos_bgp_address_family_module.rst
index ec4a6398..e17dfdd7 100644
--- a/docs/vyos.vyos.vyos_bgp_address_family_module.rst
+++ b/docs/vyos.vyos.vyos_bgp_address_family_module.rst
@@ -18,6 +18,7 @@ Version added: 1.0.0
Synopsis
--------
- This module manages BGP address family configuration of interfaces on devices running VYOS.
+- Tested against VYOS 1.3, 1.4
diff --git a/docs/vyos.vyos.vyos_bgp_global_module.rst b/docs/vyos.vyos.vyos_bgp_global_module.rst
index 4479124c..64a1b7e0 100644
--- a/docs/vyos.vyos.vyos_bgp_global_module.rst
+++ b/docs/vyos.vyos.vyos_bgp_global_module.rst
@@ -18,6 +18,7 @@ Version added: 1.0.0
Synopsis
--------
- This module manages BGP global configuration of interfaces on devices running VYOS.
+- Tested against VYOS 1.3, 1.4
@@ -52,83 +53,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="3">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>aggregate_address</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>BGP aggregate network.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>as_set</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>Generate AS-set path information for this aggregate address.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>prefix</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>BGP aggregate network.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>summary_only</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>Announce the aggregate summary network only.</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td colspan="3">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>as_number</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -478,7 +402,8 @@ Parameters
</ul>
</td>
<td>
- <div>Deactivate IPv4 unicast for a peer by default</div>
+ <div>Deactivate IPv4 unicast for a peer by default
+ Deprecated: Unavailable after 1.4</div>
</td>
</tr>
@@ -742,58 +667,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="3">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>maximum_paths</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>BGP multipaths</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>count</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">integer</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>No. of paths.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>path</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>BGP multipaths</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td colspan="3">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>neighbor</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -846,128 +719,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="2">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>allowas_in</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">integer</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Number of occurrences of AS number.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>as_override</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>AS for routes sent to this neighbor to be the local AS.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>attribute_unchanged</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>BGP attributes are sent unchanged.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>as_path</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>as_path</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>med</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>med</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>next_hop</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>next_hop</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>capability</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -1008,20 +759,20 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="1">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>orf</b>
+ <b>extended_nexthop</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
- <span style="color: purple">string</span>
+ <span style="color: purple">boolean</span>
</div>
</td>
<td>
<ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>send</li>
- <li>receive</li>
+ <li>no</li>
+ <li>yes</li>
</ul>
</td>
<td>
- <div>Advertise ORF capability to this neighbor.</div>
+ <div>Advertise extended nexthop capability to this neighbor.</div>
</td>
</tr>
@@ -1127,65 +878,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="2">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>distribute_list</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Access-list to filter route updates to/from this neighbor.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>acl</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">integer</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Access-list number.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>action</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>export</li>
- <li>import</li>
- </ul>
- </td>
- <td>
- <div>Access-list to filter outgoing/incoming route updates to this neighbor</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>ebgp_multihop</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -1203,65 +895,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="2">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>filter_list</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>As-path-list to filter route updates to/from this neighbor.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>action</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>export</li>
- <li>import</li>
- </ul>
- </td>
- <td>
- <div>filter outgoing/incoming route updates</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>path_list</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>As-path-list to filter</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>local_as</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -1279,44 +912,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="2">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>maximum_prefix</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">integer</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Maximum number of prefixes to accept from this neighbor nexthop-self Nexthop for routes sent to this neighbor to be the local router.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>nexthop_self</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>Nexthop for routes sent to this neighbor to be the local router.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>override_capability</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -1431,65 +1026,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="2">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>prefix_list</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Prefix-list to filter route updates to/from this neighbor.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>action</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>export</li>
- <li>import</li>
- </ul>
- </td>
- <td>
- <div>filter outgoing/incoming route updates</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>prefix_list</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Prefix-list to filter</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>remote_as</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -1507,128 +1043,6 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="2">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>remove_private_as</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>Remove private AS numbers from AS path in outbound route updates</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>route_map</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Route-map to filter route updates to/from this neighbor.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>action</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>export</li>
- <li>import</li>
- </ul>
- </td>
- <td>
- <div>filter outgoing/incoming route updates</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="1">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>route_map</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>route-map to filter</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>route_reflector_client</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>Neighbor as a route reflector client</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>route_server_client</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>Neighbor is route server client</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
<b>shutdown</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
@@ -1650,7 +1064,7 @@ Parameters
<td class="elbow-placeholder"></td>
<td colspan="2">
<div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>soft_reconfiguration</b>
+ <b>solo</b>
<a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
<div style="font-size: small">
<span style="color: purple">boolean</span>
@@ -1663,7 +1077,7 @@ Parameters
</ul>
</td>
<td>
- <div>Soft reconfiguration for neighbor</div>
+ <div>Do not send back prefixes learned from the neighbor</div>
</td>
</tr>
<tr>
@@ -1773,24 +1187,7 @@ Parameters
<td>
</td>
<td>
- <div>Ttl security mechanism for this BGP peer</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>unsuppress_map</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Route-map to selectively unsuppress suppressed routes</div>
+ <div>Number of the maximum number of hops to the BGP peer</div>
</td>
</tr>
<tr>
@@ -1810,172 +1207,6 @@ Parameters
<div>Source IP of routing updates</div>
</td>
</tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>weight</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">integer</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Default weight for routes from this neighbor</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td colspan="3">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>network</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>BGP network</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>address</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>BGP network address</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>backdoor</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">boolean</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>no</li>
- <li>yes</li>
- </ul>
- </td>
- <td>
- <div>Network as a backdoor route</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>route_map</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Route-map to modify route attributes</div>
- </td>
- </tr>
-
- <tr>
- <td class="elbow-placeholder"></td>
- <td colspan="3">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>redistribute</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">list</span>
- / <span style="color: purple">elements=dictionary</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Redistribute routes from other protocols into BGP</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>metric</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">integer</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Metric for redistributed routes.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>protocol</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- <ul style="margin: 0; padding: 0"><b>Choices:</b>
- <li>connected</li>
- <li>kernel</li>
- <li>ospf</li>
- <li>rip</li>
- <li>static</li>
- </ul>
- </td>
- <td>
- <div>types of routes to be redistributed.</div>
- </td>
- </tr>
- <tr>
- <td class="elbow-placeholder"></td>
- <td class="elbow-placeholder"></td>
- <td colspan="2">
- <div class="ansibleOptionAnchor" id="parameter-"></div>
- <b>route_map</b>
- <a class="ansibleOptionLink" href="#parameter-" title="Permalink to this option"></a>
- <div style="font-size: small">
- <span style="color: purple">string</span>
- </div>
- </td>
- <td>
- </td>
- <td>
- <div>Route map to filter redistributed routes</div>
- </td>
- </tr>
<tr>
<td class="elbow-placeholder"></td>
diff --git a/plugins/module_utils/network/vyos/argspec/bgp_global/bgp_global.py b/plugins/module_utils/network/vyos/argspec/bgp_global/bgp_global.py
index b647ea91..42fb5abf 100644
--- a/plugins/module_utils/network/vyos/argspec/bgp_global/bgp_global.py
+++ b/plugins/module_utils/network/vyos/argspec/bgp_global/bgp_global.py
@@ -36,44 +36,17 @@ class Bgp_globalArgs(object): # pylint: disable=R0903
"type": "dict",
"options": {
"as_number": {"type": "int"},
- "aggregate_address": {
- "type": "list",
- "elements": "dict",
- "options": {
- "prefix": {"type": "str"},
- "as_set": {"type": "bool"},
- "summary_only": {"type": "bool"},
- },
- },
- "maximum_paths": {
- "type": "list",
- "elements": "dict",
- "options": {"path": {"type": "str"}, "count": {"type": "int"}},
- },
"neighbor": {
"type": "list",
"elements": "dict",
"options": {
"address": {"type": "str"},
"advertisement_interval": {"type": "int"},
- "allowas_in": {"type": "int"},
- "as_override": {"type": "bool"},
- "attribute_unchanged": {
- "type": "dict",
- "options": {
- "as_path": {"type": "bool"},
- "med": {"type": "bool"},
- "next_hop": {"type": "bool"},
- },
- },
"capability": {
"type": "dict",
"options": {
"dynamic": {"type": "bool"},
- "orf": {
- "type": "str",
- "choices": ["send", "receive"],
- },
+ "extended_nexthop": {"type": "bool"},
},
},
"default_originate": {"type": "str"},
@@ -84,71 +57,18 @@ class Bgp_globalArgs(object): # pylint: disable=R0903
"type": "str",
"choices": ["extended", "standard"],
},
- "distribute_list": {
- "type": "list",
- "elements": "dict",
- "options": {
- "action": {
- "type": "str",
- "choices": ["export", "import"],
- },
- "acl": {"type": "int"},
- },
- },
"ebgp_multihop": {"type": "int"},
- "filter_list": {
- "type": "list",
- "elements": "dict",
- "options": {
- "action": {
- "type": "str",
- "choices": ["export", "import"],
- },
- "path_list": {"type": "str"},
- },
- },
"local_as": {"type": "int"},
- "maximum_prefix": {"type": "int"},
- "nexthop_self": {"type": "bool"},
"override_capability": {"type": "bool"},
"passive": {"type": "bool"},
"password": {"type": "str", "no_log": True},
"peer_group_name": {"type": "str"},
"peer_group": {"type": "bool"},
"port": {"type": "int"},
- "prefix_list": {
- "type": "list",
- "elements": "dict",
- "options": {
- "action": {
- "type": "str",
- "choices": ["export", "import"],
- },
- "prefix_list": {"type": "str"},
- },
- },
"remote_as": {"type": "int"},
- "remove_private_as": {"type": "bool"},
- "route_map": {
- "type": "list",
- "elements": "dict",
- "options": {
- "action": {
- "type": "str",
- "choices": ["export", "import"],
- },
- "route_map": {"type": "str"},
- },
- },
- "route_reflector_client": {"type": "bool"},
- "route_server_client": {"type": "bool"},
+ "solo": {"type": "bool"},
"shutdown": {"type": "bool"},
- "soft_reconfiguration": {"type": "bool"},
"strict_capability_match": {"type": "bool"},
- "unsuppress_map": {"type": "str"},
- "update_source": {"type": "str"},
- "weight": {"type": "int"},
- "ttl_security": {"type": "int"},
"timers": {
"type": "dict",
"options": {
@@ -157,33 +77,8 @@ class Bgp_globalArgs(object): # pylint: disable=R0903
"keepalive": {"type": "int"},
},
},
- },
- },
- "network": {
- "type": "list",
- "elements": "dict",
- "options": {
- "address": {"type": "str"},
- "backdoor": {"type": "bool"},
- "route_map": {"type": "str"},
- },
- },
- "redistribute": {
- "type": "list",
- "elements": "dict",
- "options": {
- "protocol": {
- "type": "str",
- "choices": [
- "connected",
- "kernel",
- "ospf",
- "rip",
- "static",
- ],
- },
- "route_map": {"type": "str"},
- "metric": {"type": "int"},
+ "ttl_security": {"type": "int"},
+ "update_source": {"type": "str"},
},
},
"timers": {
diff --git a/plugins/module_utils/network/vyos/config/bgp_address_family/bgp_address_family.py b/plugins/module_utils/network/vyos/config/bgp_address_family/bgp_address_family.py
index 1b075adb..0e6bec81 100644
--- a/plugins/module_utils/network/vyos/config/bgp_address_family/bgp_address_family.py
+++ b/plugins/module_utils/network/vyos/config/bgp_address_family/bgp_address_family.py
@@ -33,6 +33,14 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_template
Bgp_address_familyTemplate,
)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.bgp_address_family_14 import (
+ Bgp_address_familyTemplate14,
+)
+
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import get_os_version
+
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import LooseVersion
+
class Bgp_address_family(ResourceModule):
"""
@@ -49,12 +57,30 @@ class Bgp_address_family(ResourceModule):
)
self.parsers = []
+ def _validate_template(self):
+ version = get_os_version(self._module)
+ if LooseVersion(version) >= LooseVersion("1.4"):
+ self._tmplt = Bgp_address_familyTemplate14()
+ else:
+ self._tmplt = Bgp_address_familyTemplate()
+
+ 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
"""
+ self._validate_template()
if self.state not in ["parsed", "gathered"]:
self.generate_commands()
self.run_commands()
@@ -67,7 +93,9 @@ class Bgp_address_family(ResourceModule):
wantd = {}
haved = {}
- if self.want.get("as_number") == self.have.get("as_number") or not self.have:
+ if (self.want.get("as_number") == self.have.get("as_number") or
+ not self.have or
+ LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4")):
if self.want:
wantd = {self.want["as_number"]: self.want}
if self.have:
@@ -103,6 +131,9 @@ class Bgp_address_family(ResourceModule):
the `want` and `have` data with the `parsers` defined
for the Bgp_address_family network resource.
"""
+ if LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4"):
+ self._compare_asn(want, have)
+
self._compare_af(want, have)
self._compare_neighbors(want, have)
# Do the negation first
@@ -268,13 +299,21 @@ class Bgp_address_family(ResourceModule):
def _compare_lists(self, want, have, as_number, afi):
parsers = [
"aggregate_address",
+ "network",
"network.backdoor",
"network.path_limit",
"network.route_map",
+ "redistribute",
"redistribute.metric",
"redistribute.route_map",
"redistribute.table",
]
+
+ if LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4"):
+ delete_asn = ""
+ else:
+ delete_asn = " " + str(as_number)
+
for attrib in ["redistribute", "networks", "aggregate_address"]:
wdict = want.pop(attrib, {})
hdict = have.pop(attrib, {})
@@ -300,8 +339,8 @@ class Bgp_address_family(ResourceModule):
attrib = re.sub("_", "-", attrib)
attrib = re.sub("networks", "network", attrib)
self.commands.append(
- "delete protocols bgp "
- + str(as_number)
+ "delete protocols bgp"
+ + delete_asn
+ " "
+ "address-family "
+ afi
@@ -318,6 +357,19 @@ class Bgp_address_family(ResourceModule):
"address_family": {"afi": afi, attrib: entry},
},
)
+ # de-duplicate child commands if parent command is present
+ for val in (self.commands):
+ for val2 in self.commands:
+ if val != val2 and val2.startswith(val):
+ self.commands.remove(val2)
+
+ def _compare_asn(self, want, have):
+ if want.get("as_number") and not have.get("as_number"):
+ self.commands.append(
+ "set protocols bgp "
+ + "system-as "
+ + str(want.get("as_number")),
+ )
def _bgp_af_list_to_dict(self, entry):
for name, proc in iteritems(entry):
diff --git a/plugins/module_utils/network/vyos/config/bgp_global/bgp_global.py b/plugins/module_utils/network/vyos/config/bgp_global/bgp_global.py
index c4a85020..91a5af12 100644
--- a/plugins/module_utils/network/vyos/config/bgp_global/bgp_global.py
+++ b/plugins/module_utils/network/vyos/config/bgp_global/bgp_global.py
@@ -17,7 +17,6 @@ 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.
"""
-import re
from ansible.module_utils.six import iteritems
from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import (
@@ -31,6 +30,13 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.facts
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.bgp_global import (
Bgp_globalTemplate,
)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.bgp_global_14 import (
+ Bgp_globalTemplate14,
+)
+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
class Bgp_global(ResourceModule):
@@ -48,12 +54,35 @@ class Bgp_global(ResourceModule):
)
self.parsers = []
+ def _validate_template(self):
+ version = get_os_version(self._module)
+ if LooseVersion(version) >= LooseVersion("1.4"):
+ self._tmplt = Bgp_globalTemplate14()
+ else:
+ self._tmplt = Bgp_globalTemplate()
+
+ 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
"""
+ version = get_os_version(self._module)
+ if LooseVersion(version) >= LooseVersion("1.4"):
+ self._asn_mod = ""
+ else:
+ self._asn_mod = " " + str(self.have.get("as_number"))
+ self._validate_template()
if self.state not in ["parsed", "gathered"]:
self.generate_commands()
self.run_commands()
@@ -66,7 +95,11 @@ class Bgp_global(ResourceModule):
wantd = {}
haved = {}
- if self.want.get("as_number") == self.have.get("as_number") or not self.have:
+ if (
+ self.want.get("as_number") == self.have.get("as_number")
+ or not self.have
+ or LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4")
+ ):
if self.want:
wantd = {self.want["as_number"]: self.want}
if self.have:
@@ -105,9 +138,11 @@ class Bgp_global(ResourceModule):
the `want` and `have` data with the `parsers` defined
for the Bgp_global network resource.
"""
+ if LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4"):
+ self._compare_asn(want, have)
+
parsers = ["maximum_paths", "timers"]
self._compare_neighbor(want, have)
- self._compare_lists(want, have)
self._compare_bgp_params(want, have)
for name, entry in iteritems(want):
if name != "as_number":
@@ -176,12 +211,12 @@ class Bgp_global(ResourceModule):
"neighbor.weight",
"neighbor.ttl_security",
"neighbor.timers",
- "network.backdoor",
- "network.route_map",
]
+
wneigh = want.pop("neighbor", {})
hneigh = have.pop("neighbor", {})
self._compare_neigh_lists(wneigh, hneigh)
+
for name, entry in iteritems(wneigh):
for k, v in entry.items():
if k == "address":
@@ -207,7 +242,7 @@ class Bgp_global(ResourceModule):
self._module.fail_json(msg=msg)
else:
self.commands.append(
- "delete protocols bgp " + str(have["as_number"]) + " neighbor " + name,
+ "delete protocols bgp" + self._asn_mod + " neighbor " + name,
)
continue
for k, v in entry.items():
@@ -243,6 +278,7 @@ class Bgp_global(ResourceModule):
"bgp_params.routerid",
"bgp_params.scan_time",
]
+
wbgp = want.pop("bgp_params", {})
hbgp = have.pop("bgp_params", {})
for name, entry in iteritems(wbgp):
@@ -287,12 +323,12 @@ class Bgp_global(ResourceModule):
},
)
if not wbgp and hbgp:
- self.commands.append("delete protocols bgp " + str(have["as_number"]) + " parameters")
+ self.commands.append("delete protocols bgp" + self._asn_mod + " parameters")
hbgp = {}
for name, entry in iteritems(hbgp):
if name == "confederation":
self.commands.append(
- "delete protocols bgp " + str(have["as_number"]) + " parameters confederation",
+ "delete protocols bgp" + self._asn_mod + " parameters confederation",
)
elif name == "distance":
distance_parsers = [
@@ -317,39 +353,6 @@ class Bgp_global(ResourceModule):
},
)
- def _compare_lists(self, want, have):
- parsers = [
- "network.backdoor",
- "network.route_map",
- "redistribute.metric",
- "redistribute.route_map",
- "aggregate_address",
- ]
- for attrib in ["redistribute", "network", "aggregate_address"]:
- wdict = want.pop(attrib, {})
- hdict = have.pop(attrib, {})
- for key, entry in iteritems(wdict):
- if entry != hdict.get(key, {}):
- self.compare(
- parsers=parsers,
- want={"as_number": want["as_number"], attrib: entry},
- have=hdict.pop(key, {}),
- )
- hdict.pop(key, {})
- # remove remaining items in have for replaced
- if not wdict and hdict:
- attrib = re.sub("_", "-", attrib)
- self.commands.append(
- "delete protocols bgp " + str(have["as_number"]) + " " + attrib,
- )
- hdict = {}
- for key, entry in iteritems(hdict):
- self.compare(
- parsers=parsers,
- want={},
- have={"as_number": have["as_number"], attrib: entry},
- )
-
def _compare_neigh_lists(self, want, have):
for attrib in [
"distribute_list",
@@ -392,16 +395,23 @@ class Bgp_global(ResourceModule):
redis_dict.update({entry["protocol"]: entry})
proc["redistribute"] = redis_dict
+ def _compare_asn(self, want, have):
+ if want.get("as_number") and not have.get("as_number"):
+ self.commands.append(
+ "set protocols bgp " + "system-as" + " " + str(want.get("as_number")),
+ )
+
def _check_af(self, neighbor):
af_present = False
if self._connection:
config_lines = self._get_config(self._connection).splitlines()
for line in config_lines:
- if "address-family" in line:
- af_present = True
+ if neighbor in line:
+ if "address-family" in line:
+ af_present = True
return af_present
def _get_config(self, connection):
return connection.get(
- 'show configuration commands | match "set protocols bgp .* neighbor"',
+ 'show configuration commands | match "set protocols bgp .*neighbor"',
)
diff --git a/plugins/module_utils/network/vyos/facts/bgp_address_family/bgp_address_family.py b/plugins/module_utils/network/vyos/facts/bgp_address_family/bgp_address_family.py
index 629ffc50..3386bd66 100644
--- a/plugins/module_utils/network/vyos/facts/bgp_address_family/bgp_address_family.py
+++ b/plugins/module_utils/network/vyos/facts/bgp_address_family/bgp_address_family.py
@@ -25,6 +25,13 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.bgp
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.bgp_address_family import (
Bgp_address_familyTemplate,
)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.bgp_address_family_14 import (
+ Bgp_address_familyTemplate14,
+)
+
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import get_os_version
+
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import LooseVersion
class Bgp_address_familyFacts(object):
@@ -55,11 +62,14 @@ class Bgp_address_familyFacts(object):
data = self.get_device_data(connection)
for resource in data.splitlines():
- if "address-family" in resource:
+ if "address-family" in resource or "system-as" in resource:
config_lines.append(re.sub("'", "", resource))
- # parse native config using the Bgp_address_family template
- bgp_address_family_parser = Bgp_address_familyTemplate(lines=config_lines)
+ # parse native config using the Bgp_address_family template based on version
+ if LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4"):
+ bgp_address_family_parser = Bgp_address_familyTemplate14(lines=config_lines)
+ else:
+ bgp_address_family_parser = Bgp_address_familyTemplate(lines=config_lines)
objs = bgp_address_family_parser.parse()
if objs:
if "address_family" in objs:
diff --git a/plugins/module_utils/network/vyos/facts/bgp_global/bgp_global.py b/plugins/module_utils/network/vyos/facts/bgp_global/bgp_global.py
index fe341357..dd793681 100644
--- a/plugins/module_utils/network/vyos/facts/bgp_global/bgp_global.py
+++ b/plugins/module_utils/network/vyos/facts/bgp_global/bgp_global.py
@@ -26,6 +26,14 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_template
Bgp_globalTemplate,
)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.bgp_global_14 import (
+ Bgp_globalTemplate14,
+)
+
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import get_os_version
+
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import LooseVersion
+
class Bgp_globalFacts(object):
"""The vyos bgp_global facts class"""
@@ -58,7 +66,11 @@ class Bgp_globalFacts(object):
if "address-family" not in resource:
config_lines.append(re.sub("'", "", resource))
- bgp_global_parser = Bgp_globalTemplate(lines=config_lines, module=self._module)
+ if LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4"):
+ bgp_global_parser = Bgp_globalTemplate14(lines=config_lines, module=self._module)
+ else:
+ bgp_global_parser = Bgp_globalTemplate(lines=config_lines, module=self._module)
+
objs = bgp_global_parser.parse()
if "neighbor" in objs:
diff --git a/plugins/module_utils/network/vyos/rm_templates/bgp_address_family.py b/plugins/module_utils/network/vyos/rm_templates/bgp_address_family.py
index c996a74a..f8f86cd2 100644
--- a/plugins/module_utils/network/vyos/rm_templates/bgp_address_family.py
+++ b/plugins/module_utils/network/vyos/rm_templates/bgp_address_family.py
@@ -37,44 +37,31 @@ def _tmplt_bgp_af_aggregate_address(config_data):
return command
-def _tmplt_bgp_af_redistribute_metric(config_data):
- if config_data["address_family"]["redistribute"].get("metric"):
- afi = config_data["address_family"]["afi"] + "-unicast"
- command = "protocols bgp {as_number} address-family ".format(**config_data)
- if config_data["address_family"]["redistribute"].get("metric"):
- command += afi + " redistribute {protocol} metric {metric}".format(
- **config_data["address_family"]["redistribute"],
- )
- return command
-
-
-def _tmplt_bgp_af_redistribute_route_map(config_data):
- if config_data["address_family"]["redistribute"].get("route_map"):
- afi = config_data["address_family"]["afi"] + "-unicast"
- command = "protocols bgp {as_number} address-family ".format(**config_data)
- if config_data["address_family"]["redistribute"].get("route_map"):
- command += afi + " redistribute {protocol} route-map {route_map}".format(
- **config_data["address_family"]["redistribute"],
- )
- return command
-
-
-def _tmplt_bgp_af_redistribute_table(config_data):
- if config_data["address_family"]["redistribute"].get("table"):
- afi = config_data["address_family"]["afi"] + "-unicast"
- command = "protocols bgp {as_number} address-family ".format(**config_data)
- if config_data["address_family"]["redistribute"].get("table"):
- command += afi + " table {table}".format(
- **config_data["address_family"]["redistribute"],
- )
- return command
+def _tmplt_bgp_af_redistribute(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp {as_number} address-family ".format(**config_data)
+ config_data = config_data["address_family"]["redistribute"]
+ command += afi + " redistribute {protocol}".format(**config_data)
+ if config_data.get("metric"):
+ command += " metric {metric}".format(**config_data)
+ elif config_data.get("route_map"):
+ command += " route-map {route_map}".format(**config_data)
+ elif config_data.get("table"):
+ command += " table {table}".format(**config_data)
+ return command
-def _tmplt_bgp_af_delete_redistribute(config_data):
+def _tmplt_bgp_af_redistribute_delete(config_data):
afi = config_data["address_family"]["afi"] + "-unicast"
command = "protocols bgp {as_number} address-family ".format(**config_data)
- config_data = config_data["address_family"]
- command += afi + " redistribute {protocol}".format(**config_data["redistribute"])
+ config_data = config_data["address_family"]["redistribute"]
+ command += afi + " redistribute {protocol}".format(**config_data)
+ if config_data.get("metric"):
+ command += " metric"
+ elif config_data.get("route_map"):
+ command += " route-map"
+ elif config_data.get("table"):
+ command += " table"
return command
@@ -234,6 +221,30 @@ def _tmplt_bgp_af_neighbor(config_data):
return command
+def _tmplt_bgp_af_network(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp {as_number} address-family ".format(**config_data)
+ config_data = config_data["address_family"]["networks"]
+ command += afi + " network {prefix}".format(**config_data)
+ if config_data.get("backdoor"):
+ command += " backdoor"
+ elif config_data.get("route_map"):
+ command += " route-map {route_map}".format(**config_data)
+ return command
+
+
+def _tmplt_bgp_af_network_delete(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp {as_number} address-family ".format(**config_data)
+ config_data = config_data["address_family"]["networks"]
+ command += afi + " network {prefix}".format(**config_data)
+ if config_data.get("backdoor"):
+ command += " backdoor"
+ elif config_data.get("route_map"):
+ command += " route_map"
+ return command
+
+
class Bgp_address_familyTemplate(NetworkTemplate):
def __init__(self, lines=None, module=None):
prefix = {"set": "set", "remove": "delete"}
@@ -308,6 +319,38 @@ class Bgp_address_familyTemplate(NetworkTemplate):
},
},
{
+ "name": "network",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+(?P<as_num>\d+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+network
+ \s+(?P<address>\S+)
+ $""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_network,
+ "remval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast network {{ address_family.networks.prefix }}",
+ "compval": "address_family.networks.prefix",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "networks": [
+ {
+ "prefix": "{{ address }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
"name": "network.backdoor",
"getval": re.compile(
r"""
@@ -323,8 +366,8 @@ class Bgp_address_familyTemplate(NetworkTemplate):
*$""",
re.VERBOSE,
),
- "setval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast network {{ address_family.networks.prefix }} backdoor",
- "remval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast network {{ address_family.networks.prefix }}",
+ "setval": _tmplt_bgp_af_network,
+ "remval": _tmplt_bgp_af_network_delete,
"compval": "address_family.networks.backdoor",
"result": {
"as_number": "{{ as_num }}",
@@ -358,9 +401,8 @@ class Bgp_address_familyTemplate(NetworkTemplate):
*$""",
re.VERBOSE,
),
- "setval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast network" +
- "{{ address_family.networks.prefix }} path-limit {{ address_family.networks.path_limit }}",
- "remval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast network {{ address_family.networks.address }}",
+ "setval": _tmplt_bgp_af_network,
+ "remval": _tmplt_bgp_af_network_delete,
"compval": "address_family.networks.path_limit",
"result": {
"as_number": "{{ as_num }}",
@@ -394,9 +436,8 @@ class Bgp_address_familyTemplate(NetworkTemplate):
*$""",
re.VERBOSE,
),
- "setval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast network" +
- " {{ address_family.networks.prefix }} route-map {{ address_family.networks.route_map }}",
- "remval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast network {{ address_family.networks.prefix }}",
+ "setval": _tmplt_bgp_af_network,
+ "remval": _tmplt_bgp_af_network_delete,
"compval": "address_family.networks.route_map",
"result": {
"as_number": "{{ as_num }}",
@@ -414,6 +455,38 @@ class Bgp_address_familyTemplate(NetworkTemplate):
},
},
{
+ "name": "redistribute",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+(?P<as_num>\d+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+redistribute
+ \s+(?P<proto>\S+)
+ $""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": "protocols bgp {{ as_number }} address-family {{ address_family.afi }}-unicast redistribute {{ address_family.redistribute.protocol }}",
+ "compval": "address_family.redistribute.protocol",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "redistribute": [
+ {
+ "protocol": "{{ proto }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
"name": "redistribute.metric",
"getval": re.compile(
r"""
@@ -430,8 +503,8 @@ class Bgp_address_familyTemplate(NetworkTemplate):
*$""",
re.VERBOSE,
),
- "setval": _tmplt_bgp_af_redistribute_metric,
- "remval": _tmplt_bgp_af_delete_redistribute,
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": _tmplt_bgp_af_redistribute_delete,
"compval": "address_family.redistribute.metric",
"result": {
"as_number": "{{ as_num }}",
@@ -465,8 +538,8 @@ class Bgp_address_familyTemplate(NetworkTemplate):
*$""",
re.VERBOSE,
),
- "setval": _tmplt_bgp_af_redistribute_route_map,
- "remval": _tmplt_bgp_af_delete_redistribute,
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": _tmplt_bgp_af_redistribute_delete,
"compval": "address_family.redistribute.route_map",
"result": {
"as_number": "{{ as_num }}",
@@ -499,8 +572,8 @@ class Bgp_address_familyTemplate(NetworkTemplate):
*$""",
re.VERBOSE,
),
- "setval": _tmplt_bgp_af_redistribute_table,
- "remval": _tmplt_bgp_af_delete_redistribute,
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": _tmplt_bgp_af_redistribute_delete,
"compval": "address_family.redistribute.table",
"result": {
"as_number": "{{ as_num }}",
diff --git a/plugins/module_utils/network/vyos/rm_templates/bgp_address_family_14.py b/plugins/module_utils/network/vyos/rm_templates/bgp_address_family_14.py
new file mode 100644
index 00000000..fd4c9de9
--- /dev/null
+++ b/plugins/module_utils/network/vyos/rm_templates/bgp_address_family_14.py
@@ -0,0 +1,1433 @@
+# -*- 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 Bgp_address_family 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,
+)
+
+
+def _tmplt_bgp_af_aggregate_address(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp address-family ".format(**config_data)
+ config_data = config_data["address_family"]
+ if config_data["aggregate_address"].get("as_set"):
+ command += afi + " aggregate-address {prefix} as-set".format(
+ **config_data["aggregate_address"],
+ )
+ if config_data["aggregate_address"].get("summary_only"):
+ command += afi + " aggregate-address {prefix} summary-only".format(
+ **config_data["aggregate_address"],
+ )
+ return command
+
+
+def _tmplt_bgp_af_redistribute(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp address-family ".format(**config_data)
+ config_data = config_data["address_family"]["redistribute"]
+ command += afi + " redistribute {protocol}".format(**config_data)
+ if config_data.get("metric"):
+ command += " metric {metric}".format(**config_data)
+ elif config_data.get("route_map"):
+ command += " route-map {route_map}".format(**config_data)
+ elif config_data.get("table"):
+ command += " table {table}".format(**config_data)
+ return command
+
+
+def _tmplt_bgp_af_redistribute_delete(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp address-family ".format(**config_data)
+ config_data = config_data["address_family"]["redistribute"]
+ command += afi + " redistribute {protocol}".format(**config_data)
+ if config_data.get("metric"):
+ command += " metric"
+ elif config_data.get("route_map"):
+ command += " route-map"
+ elif config_data.get("table"):
+ command += " table"
+ return command
+
+
+def _tmplt_bgp_af_neighbor_distribute_list(config_data):
+ command = []
+ afi = config_data["neighbors"]["address_family"]["afi"] + "-unicast"
+ cmd = "protocols bgp neighbor ".format(**config_data)
+ cmd += "{neighbor_address} address-family ".format(**config_data["neighbors"])
+ config_data = config_data["neighbors"]["address_family"]
+ for list_el in config_data["distribute_list"]:
+ command.append(
+ cmd + afi + " distribute-list " + list_el["action"] + " " + str(list_el["acl"]),
+ )
+ return command
+
+
+def _tmplt_bgp_af_neighbor_route_map(config_data):
+ command = []
+ afi = config_data["neighbors"]["address_family"]["afi"] + "-unicast"
+ cmd = "protocols bgp neighbor ".format(**config_data)
+ cmd += "{neighbor_address} address-family ".format(**config_data["neighbors"])
+ config_data = config_data["neighbors"]["address_family"]
+ for list_el in config_data["route_map"]:
+ command.append(
+ cmd + afi + " route-map " + list_el["action"] + " " + str(list_el["route_map"]),
+ )
+ return command
+
+
+def _tmplt_bgp_af_neighbor_prefix_list(config_data):
+ command = []
+ afi = config_data["neighbors"]["address_family"]["afi"] + "-unicast"
+ cmd = "protocols bgp neighbor ".format(**config_data)
+ cmd += "{neighbor_address} address-family ".format(**config_data["neighbors"])
+ config_data = config_data["neighbors"]["address_family"]
+ for list_el in config_data["prefix_list"]:
+ command.append(
+ cmd + afi + " prefix-list " + list_el["action"] + " " + str(list_el["prefix_list"]),
+ )
+ return command
+
+
+def _tmplt_bgp_af_neighbor_filter_list(config_data):
+ command = []
+ afi = config_data["neighbors"]["address_family"]["afi"] + "-unicast"
+ cmd = "protocols bgp neighbor ".format(**config_data)
+ cmd += "{neighbor_address} address-family ".format(**config_data["neighbors"])
+ config_data = config_data["neighbors"]["address_family"]
+ for list_el in config_data["filter_list"]:
+ command.append(
+ cmd + afi + " filter-list " + list_el["action"] + " " + str(list_el["path_list"]),
+ )
+ return command
+
+
+def _tmplt_bgp_af_neighbor_attribute(config_data):
+ command = []
+ afi = config_data["neighbors"]["address_family"]["afi"] + "-unicast"
+ cmd = "protocols bgp neighbor ".format(**config_data)
+ cmd += "{neighbor_address} address-family ".format(**config_data["neighbors"])
+ config_data = config_data["neighbors"]["address_family"]
+ for k in config_data["attribute_unchanged"].keys():
+ if config_data["attribute_unchanged"][k]:
+ k = re.sub("_", "-", k)
+ c = cmd + afi + " attribute-unchanged " + k
+ command.append(c)
+ return command
+
+
+def _tmplt_bgp_af_neighbor_delete(config_data):
+ afi = config_data["neighbors"]["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp ".format(**config_data)
+ command += (
+ "neighbor {neighbor_address} address-family ".format(**config_data["neighbors"]) + afi
+ )
+ config_data = config_data["neighbors"]["address_family"]
+ if config_data.get("allowas_in"):
+ command += " allowas-in"
+ elif config_data.get("as_override"):
+ command += " as-override"
+ elif config_data.get("attribute_unchanged"):
+ command += " attribute-unchanged"
+ elif config_data.get("capability"):
+ command += " capability"
+ elif config_data.get("default_originate"):
+ command += " default-originate"
+ elif config_data.get("maximum_prefix"):
+ command += " maximum-prefix"
+ elif config_data.get("nexthop_local"):
+ command += " nexthop-local"
+ elif config_data.get("nexthop_self"):
+ command += " nexthop-self"
+ elif config_data.get("peer_group"):
+ command += " peer-group"
+ elif config_data.get("remote_private_as"):
+ command += " remote-private-as"
+ elif config_data.get("route_reflector_client"):
+ command += " route-reflector-client"
+ elif config_data.get("route_server_client"):
+ command += " route-server-client"
+ elif config_data.get("soft_reconfiguration"):
+ command += " soft-reconfiguration"
+ elif config_data.get("unsuppress_map"):
+ command += " unsuppress-map"
+ elif config_data.get("weight"):
+ command += " weight"
+ elif config_data.get("filter_list"):
+ command += " filter-list"
+ elif config_data.get("prefix_list"):
+ command += " prefix-list"
+ elif config_data.get("distribute_list"):
+ command += " distribute-list"
+ elif config_data.get("route_map"):
+ command += " route-map"
+ return command
+
+
+def _tmplt_bgp_af_neighbor(config_data):
+ afi = config_data["neighbors"]["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp ".format(**config_data)
+ command += (
+ "neighbor {neighbor_address} address-family ".format(**config_data["neighbors"]) + afi
+ )
+ config_data = config_data["neighbors"]["address_family"]
+ if config_data.get("allowas_in"):
+ command += " allowas-in number {allowas_in}".format(**config_data)
+ elif config_data.get("as_override"):
+ command += " as-override"
+ elif config_data.get("capability"):
+ command += " capability "
+ if config_data["capability"].get("dynamic"):
+ command += "dynamic"
+ elif config_data["capability"].get("orf"):
+ command += " prefix-list {orf}".format(**config_data["capability"])
+ elif config_data.get("default_originate"):
+ command += " default-originate route-map {default_originate}".format(**config_data)
+ elif config_data.get("maximum_prefix"):
+ command += " maximum-prefix {maximum_prefix}".format(**config_data)
+ elif config_data.get("nexthop_local"):
+ command += " nexthop-local"
+ elif config_data.get("nexthop_self"):
+ command += " nexthop-self"
+ elif config_data.get("peer_group"):
+ command += " peer-group {peer_group}".format(**config_data)
+ elif config_data.get("remote_private_as"):
+ command += " remote-private-as"
+ elif config_data.get("route_reflector_client"):
+ command += " route-reflector-client"
+ elif config_data.get("route_server_client"):
+ command += " route-server-client"
+ elif config_data.get("soft_reconfiguration"):
+ command += " soft-reconfiguration inbound"
+ elif config_data.get("unsuppress_map"):
+ command += " unsuppress-map {unsuppress_map}".format(**config_data)
+ elif config_data.get("weight"):
+ command += " weight {weight}".format(**config_data)
+ return command
+
+
+def _tmplt_bgp_af_network(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp address-family ".format(**config_data)
+ config_data = config_data["address_family"]["networks"]
+ command += afi + " network {prefix}".format(**config_data)
+ if config_data.get("backdoor"):
+ command += " backdoor"
+ elif config_data.get("route_map"):
+ command += " route-map {route_map}".format(**config_data)
+ return command
+
+
+def _tmplt_bgp_af_network_delete(config_data):
+ afi = config_data["address_family"]["afi"] + "-unicast"
+ command = "protocols bgp address-family ".format(**config_data)
+ config_data = config_data["address_family"]["networks"]
+ command += afi + " network {prefix}".format(**config_data)
+ if config_data.get("backdoor"):
+ command += " backdoor"
+ elif config_data.get("route_map"):
+ command += " route_map"
+ return command
+
+
+class Bgp_address_familyTemplate14(NetworkTemplate):
+ def __init__(self, lines=None, module=None):
+ prefix = {"set": "set", "remove": "delete"}
+ super(Bgp_address_familyTemplate14, self).__init__(
+ lines=lines,
+ tmplt=self,
+ prefix=prefix,
+ module=module,
+ )
+
+ # fmt: off
+ PARSERS = [
+ {
+ "name": "system_as",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+system-as
+ \s+(?P<as_num>\d+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp system-as {{ as_number }}",
+ "compval": "as_number",
+ "result": {
+ "as_number": "{{ as_num }}",
+ },
+ },
+ {
+ "name": "address_family",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp address-family {{ address_family.afi }}-unicast",
+ "compval": "as_number",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "aggregate_address",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+aggregate-address
+ \s+(?P<address>\S+)
+ \s*(?P<as_set>as-set)*
+ \s*(?P<summary_only>summary-only)*
+ $""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_aggregate_address,
+ "remval": "protocols bgp address-family {{ address_family.afi }}-unicast aggregate-address" +
+ " {{ address_family.aggregate_address.prefix }}",
+ "compval": "address_family.aggregate_address",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "aggregate_address": [
+ {
+ "prefix": "{{ address }}",
+ "as_set": "{{ True if as_set is defined }}",
+ "summary_only": "{{ True if summary_only is defined }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "network",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+network
+ \s+(?P<address>\S+)
+ $""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_network,
+ "remval": "protocols bgp address-family {{ address_family.afi }}-unicast network {{ address_family.networks.prefix }}",
+ "compval": "address_family.networks.prefix",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "networks": [
+ {
+ "prefix": "{{ address }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "network.backdoor",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+network
+ \s+(?P<address>\S+)
+ \s+backdoor
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_network,
+ "remval": _tmplt_bgp_af_network_delete,
+ "compval": "address_family.networks.backdoor",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "networks": [
+ {
+ "prefix": "{{ address }}",
+ "backdoor": "{{ True }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "network.path_limit",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+network
+ \s+(?P<address>\S+)
+ \s+path-limit
+ \s+(?P<limit>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_network,
+ "remval": _tmplt_bgp_af_network_delete,
+ "compval": "address_family.networks.path_limit",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "networks": [
+ {
+ "prefix": "{{ address }}",
+ "path_limit": "{{ limit|int }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "network.route_map",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+network
+ \s+(?P<address>\S+)
+ \s+route-map
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_network,
+ "remval": _tmplt_bgp_af_network_delete,
+ "compval": "address_family.networks.route_map",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "networks": [
+ {
+ "prefix": "{{ address }}",
+ "route_map": "{{ map }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "redistribute",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+redistribute
+ \s+(?P<proto>\S+)
+ $""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": "protocols bgp address-family {{ address_family.afi }}-unicast redistribute {{ address_family.redistribute.protocol }}",
+ "compval": "address_family.redistribute.protocol",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "redistribute": [
+ {
+ "protocol": "{{ proto }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "redistribute.metric",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+redistribute
+ \s+(?P<proto>\S+)
+ \s+metric\s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": _tmplt_bgp_af_redistribute_delete,
+ "compval": "address_family.redistribute.metric",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "redistribute": [
+ {
+ "protocol": "{{ proto }}",
+ "metric": "{{ val }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "redistribute.route_map",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+redistribute
+ \s+(?P<proto>\S+)
+ \s+route-map
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": _tmplt_bgp_af_redistribute_delete,
+ "compval": "address_family.redistribute.route_map",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "redistribute": [
+ {
+ "protocol": "{{ proto }}",
+ "route_map": "{{ map }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "redistribute.table",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+redistribute
+ \s+table
+ \s+(?P<tab>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_redistribute,
+ "remval": _tmplt_bgp_af_redistribute_delete,
+ "compval": "address_family.redistribute.table",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "redistribute": [
+ {
+ "table": "{{ tab }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbors.neighbor_address }} address-family",
+ "compval": "neighbors",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.address_family",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbors.neighbor_address }} address-family {{ neighbors.address_family.afi }}-unicast",
+ "compval": "neighbors",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.allowas_in",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+allowas-in
+ \s+number
+ \s+(?P<num>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.allowas_in",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "allowas_in": "{{ num }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.as_override",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+as-override
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.as_override",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "as_override": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.attribute_unchanged.as_path",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+attribute-unchanged
+ \s+(?P<val>as-path)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor_attribute,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.attribute_unchanged.as_path",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "attribute_unchanged": {
+ "as_path": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.attribute_unchanged.med",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+attribute-unchanged
+ \s+(?P<val>med)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor_attribute,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.attribute_unchanged.med",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "attribute_unchanged": {
+ "med": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.attribute_unchanged.next_hop",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+attribute-unchanged
+ \s+(?P<val>next-hop)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor_attribute,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.attribute_unchanged.next_hop",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "attribute_unchanged": {
+ "next_hop": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.capability_dynamic",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+capability
+ \s+dynamic
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.capability.dynamic",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "capability": {
+ "dynamic": "{{ true }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.capability_orf",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+capability
+ \s+prefix-list
+ \s+(?P<orf>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.capability.orf",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "capability": {
+ "orf": "{{ orf }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.default_originate",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+default-originate
+ \s+route-map
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.default_originate",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "default_originate": "{{ map }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.distribute_list",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+distribute-list
+ \s+(?P<action>export|import)
+ \s+(?P<list>\d+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor_distribute_list,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.distribute_list",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "distribute_list": [
+ {
+ "action": "{{ action }}",
+ "acl": "{{ list }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.prefix_list",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+prefix-list
+ \s+(?P<action>export|import)
+ \s+(?P<list>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor_prefix_list,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.prefix_list",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "prefix_list": [
+ {
+ "action": "{{ action }}",
+ "prefix_list": "{{ list }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.filter_list",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+filter-list
+ \s+(?P<action>export|import)
+ \s+(?P<list>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor_filter_list,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.filter_list",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "filter_list": [
+ {
+ "action": "{{ action }}",
+ "path_list": "{{ list }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.maximum_prefix",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+maximum-prefix
+ \s+(?P<num>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.maximum_prefix",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "maximum_prefix": "{{ num }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.nexthop_local",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+nexthop-local
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.nexthop_local",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "nexthop_local": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.nexthop_self",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+nexthop-self
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.nexthop_self",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "nexthop_self": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.peer_group",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+peer-group
+ \s+(?P<name>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.peer_group",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "peer_group": "{{ name }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.remove_private_as",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+remove-private-as
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.remove_private_as",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "remove_private_as": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.route_map",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+route-map
+ \s+(?P<action>export|import)
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor_route_map,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.route_map",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "route_map": [
+ {
+ "action": "{{ action }}",
+ "route_map": "{{ map }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.route_reflector_client",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+route-reflector-client
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.route_reflector_client",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "route_reflector_client": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.route_server_client",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+route-server-client
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.route_server_client",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "route_server_client": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.soft_reconfiguration",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+soft-reconfiguration
+ \s+inbound
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.soft_reconfiguration",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "soft_reconfiguration": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.unsuppress_map",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+unsuppress-map
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.unsuppress_map",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "unsuppress_map": "{{ map }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbors.weight",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+address-family
+ \s+(?P<afi>\S+)-unicast
+ \s+weight
+ \s+(?P<num>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_af_neighbor,
+ "remval": _tmplt_bgp_af_neighbor_delete,
+ "compval": "neighbors.address_family.weight",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbors": {
+ "{{ address }}": {
+ "neighbor_address": "{{ address }}",
+ "address_family": {
+ "{{ afi }}": {
+ "afi": "{{ afi }}",
+ "weight": "{{ num }}",
+ },
+ },
+ },
+ },
+ },
+ },
+ ]
+ # fmt: on
diff --git a/plugins/module_utils/network/vyos/rm_templates/bgp_global.py b/plugins/module_utils/network/vyos/rm_templates/bgp_global.py
index bd95e082..621f65ea 100644
--- a/plugins/module_utils/network/vyos/rm_templates/bgp_global.py
+++ b/plugins/module_utils/network/vyos/rm_templates/bgp_global.py
@@ -49,15 +49,6 @@ def _tmplt_bgp_maximum_paths(config_data):
return command
-def _tmplt_bgp_aggregate_address(config_data):
- command = "protocols bgp {as_number} aggregate-address".format(**config_data)
- if config_data["aggregate_address"].get("as_set"):
- command += " {prefix} as-set".format(**config_data["aggregate_address"])
- if config_data["aggregate_address"].get("summary_only"):
- command += " {prefix} summary-only".format(**config_data["aggregate_address"])
- return command
-
-
def _tmplt_delete_bgp_maximum_paths(config_data):
command = "protocols bgp {as_number} maximum-paths".format(**config_data)
return command
@@ -72,14 +63,6 @@ def _tmplt_bgp_params_default(config_data):
return command
-def _tmplt_bgp_delete_redistribute(config_data):
- command = (
- "protocols bgp {as_number} redistribute ".format(**config_data)
- + config_data["redistribute"]["protocol"]
- )
- return command
-
-
def _tmplt_bgp_neighbor_timers(config_data):
command = []
for k, v in iteritems(config_data["neighbor"]["timers"]):
@@ -218,35 +201,6 @@ class Bgp_globalTemplate(NetworkTemplate):
},
},
{
- "name": "aggregate_address",
- "getval": re.compile(
- r"""
- ^set
- \s+protocols
- \s+bgp
- \s+(?P<as_num>\d+)
- \s+aggregate-address
- \s+(?P<address>\S+)
- \s*(?P<as_set>as-set)*
- \s*(?P<summary_only>summary-only)*
- $""",
- re.VERBOSE,
- ),
- "setval": _tmplt_bgp_aggregate_address,
- "remval": "protocols bgp {{ as_number }} aggregate-address {{ aggregate_address.prefix }}",
- "compval": "aggregate_address",
- "result": {
- "as_number": "{{ as_num }}",
- "aggregate_address": [
- {
- "prefix": "{{ address }}",
- "as_set": "{{ True if as_set is defined }}",
- "summary_only": "{{ True if summary_only is defined }}",
- },
- ],
- },
- },
- {
"name": "maximum_paths",
"getval": re.compile(
r"""
@@ -850,7 +804,7 @@ class Bgp_globalTemplate(NetworkTemplate):
*$""",
re.VERBOSE,
),
- "setval": "protocols bgp {{ as_number }} neighbor {{ neighbor.address }} nexthop-self",
+ "setval": "protocols bgp {{ as_number }} neighbor {{ neighbor.address }} passive",
"compval": "neighbor.passive",
"result": {
"as_number": "{{ as_num }}",
@@ -1333,117 +1287,6 @@ class Bgp_globalTemplate(NetworkTemplate):
},
},
{
- "name": "network.backdoor",
- "getval": re.compile(
- r"""
- ^set
- \s+protocols
- \s+bgp
- \s+(?P<as_num>\d+)
- \s+network
- \s+(?P<address>\S+)
- \s+backdoor
- *$""",
- re.VERBOSE,
- ),
- "setval": "protocols bgp {{ as_number }} network {{ network.address }} backdoor",
- "remval": "protocols bgp {{ as_number }} network {{ network.address }}",
- "compval": "network.backdoor",
- "result": {
- "as_number": "{{ as_num }}",
- "network": [
- {
- "address": "{{ address }}",
- "backdoor": "{{ True }}",
- },
- ],
- },
- },
- {
- "name": "network.route_map",
- "getval": re.compile(
- r"""
- ^set
- \s+protocols
- \s+bgp
- \s+(?P<as_num>\d+)
- \s+network
- \s+(?P<address>\S+)
- \s+route-map
- \s+(?P<map>\S+)
- *$""",
- re.VERBOSE,
- ),
- "setval": "protocols bgp {{ as_number }} network {{ network.address }} route-map {{ network.route_map }}",
- "remval": "protocols bgp {{ as_number }} network {{ network.address }}",
- "compval": "network.route_map",
- "result": {
- "as_number": "{{ as_num }}",
- "network": [
- {
- "address": "{{ address }}",
- "route_map": "{{ map }}",
- },
- ],
- },
- },
- {
- "name": "redistribute.metric",
- "getval": re.compile(
- r"""
- ^set
- \s+protocols
- \s+bgp
- \s+(?P<as_num>\d+)
- \s+redistribute
- \s+(?P<proto>\S+)
- \s+metric
- \s+(?P<val>\S+)
- *$""",
- re.VERBOSE,
- ),
- "setval": "protocols bgp {{ as_number }} redistribute {{ redistribute.protocol }} metric {{ redistribute.metric }}",
- "remval": _tmplt_bgp_delete_redistribute,
- "compval": "redistribute",
- "result": {
- "as_number": "{{ as_num }}",
- "redistribute": [
- {
- "protocol": "{{ proto }}",
- "metric": "{{ val|int }}",
- },
- ],
- },
- },
- {
- "name": "redistribute.route_map",
- "getval": re.compile(
- r"""
- ^set
- \s+protocols
- \s+bgp
- \s+(?P<as_num>\d+)
- \s+redistribute
- \s+(?P<proto>\S+)
- \s+route-map
- \s+(?P<val>\S+)
- *$""",
- re.VERBOSE,
- ),
- "setval": "protocols bgp {{ as_number }} redistribute {{ redistribute.protocol }} route-map {{ redistribute.route_map }}",
- "remval": _tmplt_bgp_delete_redistribute,
- "compval": "redistribute",
- "result": {
- "as_number": "{{ as_num }}",
- "redistribute": [
- {
- "protocol": "{{ proto }}",
- "route_map": "{{ val }}",
- },
- ],
- },
- },
- {
"name": "timers",
"getval": re.compile(
r"""
diff --git a/plugins/module_utils/network/vyos/rm_templates/bgp_global_14.py b/plugins/module_utils/network/vyos/rm_templates/bgp_global_14.py
new file mode 100644
index 00000000..b8beb923
--- /dev/null
+++ b/plugins/module_utils/network/vyos/rm_templates/bgp_global_14.py
@@ -0,0 +1,1799 @@
+# -*- 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 Bgp_global 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.module_utils.six import iteritems
+from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import (
+ NetworkTemplate,
+)
+
+
+def _tmplt_bgp_params_confederation(config_data):
+ command = []
+ for list_el in config_data["bgp_params"]["confederation"]:
+ for k, v in iteritems(list_el):
+ command.append(
+ "protocols bgp parameters confederation ".format(**config_data)
+ + k
+ + " "
+ + str(v),
+ )
+
+ return command
+
+
+def _tmplt_bgp_maximum_paths(config_data):
+ command = []
+ for list_el in config_data["maximum_paths"]:
+ command.append(
+ "protocols bgp maximum-paths ".format(**config_data)
+ + list_el["path"]
+ + " "
+ + str(list_el["count"]),
+ )
+ return command
+
+
+def _tmplt_delete_bgp_maximum_paths(config_data):
+ command = "protocols bgp maximum-paths".format(**config_data)
+ return command
+
+
+def _tmplt_bgp_params_default(config_data):
+ command = "protocols bgp parameters default".format(**config_data)
+ if config_data["bgp_params"]["default"].get("no_ipv4_unicast"):
+ command += " no-ipv4-unicast"
+ if config_data["bgp_params"]["default"].get("local_pref"):
+ command += " local-pref {local_pref}".format(**config_data["bgp_params"]["default"])
+ return command
+
+
+def _tmplt_bgp_neighbor_timers(config_data):
+ command = []
+ for k, v in iteritems(config_data["neighbor"]["timers"]):
+ command.append(
+ "protocols bgp neighbor ".format(**config_data)
+ + config_data["neighbor"]["address"]
+ + " timers "
+ + k
+ + " "
+ + str(v),
+ )
+
+ return command
+
+
+def _tmplt_bgp_timers(config_data):
+ command = []
+ for k, v in iteritems(config_data["timers"]):
+ command.append(
+ "protocols bgp ".format(**config_data) + "timers " + k + " " + str(v),
+ )
+
+ return command
+
+
+def _tmplt_bgp_neighbor_attribute_unchanged_as_path(config_data):
+ command = "protocols bgp ".format(
+ **config_data,
+ ) + "neighbor {address} attribute-unchanged as-path".format(**config_data["neighbor"])
+ return command
+
+
+def _tmplt_bgp_neighbor_attribute_unchanged_med(config_data):
+ command = "protocols bgp ".format(
+ **config_data,
+ ) + "neighbor {address} attribute-unchanged med".format(**config_data["neighbor"])
+ return command
+
+
+def _tmplt_bgp_neighbor_attribute_unchanged_next_hop(config_data):
+ command = "protocols bgp ".format(
+ **config_data,
+ ) + "neighbor {address} attribute-unchanged next-hop".format(**config_data["neighbor"])
+ return command
+
+
+def _tmplt_bgp_neighbor_distribute_list(config_data):
+ command = []
+ for list_el in config_data["neighbor"]["distribute_list"]:
+ command.append(
+ "protocols bgp ".format(**config_data)
+ + "neighbor {address} distribute-list ".format(**config_data["neighbor"])
+ + list_el["action"]
+ + " "
+ + str(list_el["acl"]),
+ )
+ return command
+
+
+def _tmplt_bgp_neighbor_route_map(config_data):
+ command = []
+ for list_el in config_data["neighbor"]["route_map"]:
+ command.append(
+ "protocols bgp ".format(**config_data)
+ + "neighbor {address} route-map ".format(**config_data["neighbor"])
+ + list_el["action"]
+ + " "
+ + str(list_el["route_map"]),
+ )
+ return command
+
+
+def _tmplt_bgp_neighbor_prefix_list(config_data):
+ command = []
+ for list_el in config_data["neighbor"]["prefix_list"]:
+ command.append(
+ "protocols bgp ".format(**config_data)
+ + "neighbor {address} prefix-list ".format(**config_data["neighbor"])
+ + list_el["action"]
+ + " "
+ + str(list_el["prefix_list"]),
+ )
+ return command
+
+
+def _tmplt_bgp_neighbor_filter_list(config_data):
+ command = []
+ for list_el in config_data["neighbor"]["filter_list"]:
+ command.append(
+ "protocols bgp ".format(**config_data)
+ + "neighbor {address} filter-list ".format(**config_data["neighbor"])
+ + list_el["action"]
+ + " "
+ + str(list_el["path_list"]),
+ )
+ return command
+
+
+def _tmplt_bgp_params_distance(config_data):
+ command = (
+ "protocols bgp parameters distance global ".format(**config_data)
+ + config_data["bgp_params"]["distance"]["type"]
+ + " "
+ + str(config_data["bgp_params"]["distance"]["value"])
+ )
+ return command
+
+
+class Bgp_globalTemplate14(NetworkTemplate):
+ def __init__(self, lines=None, module=None):
+ prefix = {"set": "set", "remove": "delete"}
+ super(Bgp_globalTemplate14, self).__init__(
+ lines=lines,
+ tmplt=self,
+ prefix=prefix,
+ module=module,
+ )
+
+ # fmt: off
+ PARSERS = [
+ {
+ "name": "router",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s*system-as
+ \s+(?P<as_num>\d+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp system-as {{ as_number }}",
+ "remval": "protocols bgp",
+ "compval": "as_number",
+ "result": {
+ "as_number": "{{ as_num }}",
+ },
+ },
+ {
+ "name": "maximum_paths",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+maximum-paths
+ \s+(?P<path>ebgp|ibgp)
+ \s+(?P<count>\d+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_maximum_paths,
+ "remval": _tmplt_delete_bgp_maximum_paths,
+ "compval": "maximum_paths",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "maximum_paths": [
+ {
+ "path": "{{ path }}",
+ "count": "{{ count }}",
+ },
+ ],
+ },
+ },
+ {
+ "name": "neighbor.advertisement_interval",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+advertisement-interval
+ \s+(?P<interval>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} advertisement-interval {{ neighbor.advertisement_interval }}",
+ "remval": "protocols bgp neighbor {{ neighbor.address }} advertisement-interval",
+ "compval": "neighbor.advertisement_interval",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "advertisement_interval": "{{ interval }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.allowas_in",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+allowas-in
+ \s+number
+ \s+(?P<num>\'\d+\')
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} allowas-in number {{ neighbor.allowas_in }}",
+ "compval": "neighbor.allowas_in",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "allowas_in": "{{ count }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.as_override",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+as-override
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} as-override",
+ "compval": "neighbor.as_override",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "as_override": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.attribute_unchanged.as_path",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+attribute-unchanged
+ \s+(?P<val>as-path)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_attribute_unchanged_as_path,
+ "compval": "neighbor.attribute_unchanged",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "attribute_unchanged": {
+ "{{ 'as_path' }}": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.attribute_unchanged.med",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+attribute-unchanged
+ \s+(?P<val>med)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_attribute_unchanged_med,
+ "compval": "neighbor.attribute_unchanged",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "attribute_unchanged": {
+ "{{ 'med' }}": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.attribute_unchanged.next_hop",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+attribute-unchanged
+ \s+(?P<val>next-hop)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_attribute_unchanged_next_hop,
+ "compval": "neighbor.attribute_unchanged",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "attribute_unchanged": {
+ "{{ 'next_hop' }}": "{{ True }}",
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.capability_dynamic",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+capability
+ \s+(?P<dynamic>dynamic)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} capability dynamic",
+ "compval": "neighbor.capability.dynamic",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "capability": {
+ "dynamic": "{{ True if dynamic is defined}}",
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.capability_orf",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+capability
+ \s+orf
+ \s+prefix-list
+ \s+(?P<orf>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} capability orf prefix-list {{ neighbor.capability.orf }}",
+ "compval": "neighbor.capability.orf",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "capability": {
+ "orf": "{{ orf }}",
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.default_originate",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+default-originate
+ \s+route-map
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} default-originate route-map {{ neighbor.default_originate }}",
+ "compval": "neighbor.advertisement_interval",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "default_originate": "{{ map }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.description",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+description
+ \s+(?P<desc>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} description {{ neighbor.description }}",
+ "compval": "neighbor.description",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "description": "{{ desc }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.disable_capability_negotiation",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+disable-capability-negotiation
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} disable-capability-negotiation",
+ "compval": "neighbor.disable_capability_negotiation",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "disable_capability_negotiation": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.disable_connected_check",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+disable-connected-check
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} disable-connected-check",
+ "compval": "neighbor.disable_connected_check",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "disable_connected_check": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.disable_send_community",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+disable-send-community
+ \s+(?P<comm>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} disable-send-community {{ neighbor.disable_send_community }}",
+ "compval": "neighbor.disable_send_community",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "disable_send_community": "{{ comm }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.distribute_list",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+distribute-list
+ \s+(?P<action>export|import)
+ \s+(?P<list>\d+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_distribute_list,
+ "compval": "neighbor.distribute_list",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "distribute_list": [
+ {
+ "action": "{{ action }}",
+ "acl": "{{ list }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.ebgp_multihop",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+ebgp-multihop
+ \s+(?P<hop>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} ebgp-multihop {{ neighbor.ebgp_multihop }}",
+ "compval": "neighbor.ebgp_multihop",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "ebgp_multihop": "{{ hop|int }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.filter_list",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+filter-list
+ \s+(?P<action>export|import)
+ \s+(?P<list>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_filter_list,
+ "compval": "neighbor.filter_list",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "filter_list": [
+ {
+ "action": "{{ action }}",
+ "path_list": "{{ list }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.local_as",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+local-as
+ \s+(?P<as>\S+)
+ \s+no-prepend
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} local-as {{ neighbor.local_as }} no-prepend",
+ "compval": "neighbor.local_as",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "local_as": "{{ as }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.maximum_prefix",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+maximum-prefix
+ \s+(?P<num>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} maximum-prefix {{ neighbor.maximum_prefix }}",
+ "compval": "neighbor.maximum_prefix",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "maximum_prefix": "{{ num }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.nexthop_self",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+nexthop-self
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} nexthop-self",
+ "compval": "neighbor.nexthop_self",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "nexthop_self": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.override_capability",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+override-capability
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} override-capability",
+ "compval": "neighbor.override_capability",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "override_capability": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.passive",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+passive
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} passive",
+ "compval": "neighbor.passive",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "passive": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.password",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+password
+ \s+(?P<pwd>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} password {{ neighbor.password }}",
+ "compval": "neighbor.password",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "password": "{{ pwd }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.peer_group_name",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+peer-group
+ \s+(?P<name>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} peer-group {{ neighbor.peer_group_name }}",
+ "compval": "neighbor.peer_group_name",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "peer_group_name": "{{ name }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.port",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+port
+ \s+(?P<num>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} port {{ neighbor.port }}",
+ "compval": "neighbor.port",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "port": "{{ num|int }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.prefix_list",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+prefix-list
+ \s+(?P<action>export|import)
+ \s+(?P<list>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_prefix_list,
+ "compval": "neighbor.prefix_list",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "prefix_list": [
+ {
+ "action": "{{ action }}",
+ "prefix_list": "{{ list }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.remote_as",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+remote-as
+ \s+(?P<num>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} remote-as {{ neighbor.remote_as }}",
+ "compval": "neighbor.remote_as",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "remote_as": "{{ num|int }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.remove_private_as",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+remote-private-as
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} remote-private-as",
+ "compval": "neighbor.remove_private_as",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "remove_private_as": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.route_map",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+route-map
+ \s+(?P<action>export|import)
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_route_map,
+ "compval": "neighbor.route_map",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "route_map": [
+ {
+ "action": "{{ action }}",
+ "route_map": "{{ map }}",
+ },
+ ],
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.route_reflector_client",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+route-reflector-client
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} router-reflector-client",
+ "compval": "neighbor.route_reflector_client",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "route_reflector_client": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.route_server_client",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+route-server-client
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} route-server-client",
+ "compval": "neighbor.route_server_client",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "route_server_client": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.shutdown",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+shutdown
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} shutdown",
+ "compval": "neighbor.shutdown",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "shutdown": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.soft_reconfiguration",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+soft-reconfiguration
+ \s+inbound
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} soft-reconfiguration",
+ "compval": "neighbor.soft_reconfiguration",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "soft_reconfiguration": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.strict_capability_match",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+strict-capability-match
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} strict-capability-match",
+ "compval": "neighbor.strict_capability_match",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "strict_capability_match": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.unsuppress_map",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+unsuppress-map
+ \s+(?P<map>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} unsuppress-map {{ neighbor.unsuppress_map }}",
+ "compval": "neighbor.unsuppress_map",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "unsuppress_map": "{{ map }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.update_source",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+update-source
+ \s+(?P<src>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} update-source {{ neighbor.update_source }}",
+ "compval": "neighbor.update_source",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "update_source": "{{ src }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.weight",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+weight
+ \s+(?P<num>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} weight {{ neighbor.weight }}",
+ "compval": "neighbor.weight",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "weight": "{{ num }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.ttl_security",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+ttl-security
+ \s+(?P<ttl>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp neighbor {{ neighbor.address }} ttl-security {{ neighbor.ttl_security }}",
+ "compval": "neighbor.ttl_security",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "ttl_security": "{{ ttl|int }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "neighbor.timers",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+neighbor
+ \s+(?P<address>\S+)
+ \s+timers
+ \s+(?P<type>connect|holdtime|keepalive)
+ \s+(?P<sec>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_neighbor_timers,
+ "remval": "protocols bgp neighbor {{ neighbor.address }} timers",
+ "compval": "neighbor.timers",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "neighbor": {
+ "{{ address }}": {
+ "address": "{{ address }}",
+ "timers": {
+ "{{ type }}": "{{ sec }}",
+ },
+ },
+ },
+ },
+ },
+ {
+ "name": "timers",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+timers
+ \s+(?P<type>\S+)
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_timers,
+ "remval": "protocols bgp timers",
+ "compval": "timers",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "timers": {
+ "{{ type }}": "{{ val }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.always_compare_med",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+always-compare-med
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters always-compare-med",
+ "compval": "bgp_params.always_compare_med",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "always_compare_med": "{{ True }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.bestpath.as_path",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+bestpath
+ \s+as-path
+ \s+(?P<path>confed|ignore)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters bestpath as-path {{ bgp_params.bestpath.as_path }}",
+ "compval": "bgp_params.bestpath.as_path",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "bestpath": {
+ "as_path": "{{ path }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.bestpath.compare_routerid",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+bestpath
+ \s+compare-routerid
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters bestpath compare-routerid",
+ "compval": "bgp_params.bestpath.compare_routerid",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "bestpath": {
+ "compare_routerid": "{{ True }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.bestpath.med",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+bestpath
+ \s+med
+ \s+(?P<path>confed|missing-as-worst)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters bestpath med {{ bestpath.med }}",
+ "compval": "bgp_params.bestpath.med",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "bestpath": {
+ "med": "{{ path }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.cluster_id",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+cluster-id
+ \s+(?P<id>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters cluster-id {{ bgp_params.cluster_id }}",
+ "compval": "bgp_params.cluster_id",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "cluster_id": "{{ id }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.confederation",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+confederation
+ \s+(?P<type>identifier|peers)
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_params_confederation,
+ "compval": "bgp_params.always_compare_med",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "confederation": [
+ {
+ "peers": "{{ val if type == 'peers' }}",
+ "identifier": "{{ val if type == 'identifier' }}",
+ },
+ ],
+ },
+ },
+ },
+ {
+ "name": "bgp_params.dampening_half_life",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+dampening
+ \s+half-life
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters dampening half-life {{ bgp_params.dampening.half_life}}",
+ "compval": "bgp_params.dampening.half_life",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "dampening": {
+ "half_life": "{{ val }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.dampening_max_suppress_time",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+dampening
+ \s+max-suppress-time
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters dampening max-suppress-time {{ bgp_params.dampening.max_suppress_time}}",
+ "compval": "bgp_params.dampening.max_suppress_time",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "dampening": {
+ "max_suppress_time": "{{ val }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.dampening_re_use",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+dampening
+ \s+re-use
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters dampening re-use {{ bgp_params.dampening.re_use}}",
+ "compval": "bgp_params.dampening.re_use",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "dampening": {
+ "re_use": "{{ val }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.dampening_start_suppress_time",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+dampening
+ \s+start-suppress-time
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters dampening start-suppress-time {{ bgp_params.dampening.start_suppress_time}}",
+ "compval": "bgp_params.dampening.start_suppress_time",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "dampening": {
+ "start_suppress_time": "{{ val }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.default",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+default
+ \s*(?P<no_ipv4_unicast>no-ipv4-unicast)*
+ \s*(?P<local_pref>local-pref\s\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_params_default,
+ "remval": "protocols bgp parameters default",
+ "compval": "bgp_params.default",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "default": {
+ "no_ipv4_unicast": "{{ True if no_ipv4_unicast is defined }}",
+ "local_pref": "{{ local_pref.split(" " )[1] if local_pref is defined }}",
+ },
+ },
+ },
+ },
+ {
+ "name": "bgp_params.deterministic_med",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+deterministic-med
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters deterministic-med",
+ "compval": "bgp_params.deterministic_med",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "deterministic_med": "{{ True }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.disbale_network_import_check",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+disable-network-import-check
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters disable-network-import-check",
+ "compval": "bgp_params.disable_network_import_check",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "disable_network_import_check": "{{ True }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.distance.prefix",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+distance\sprefix
+ \s+(?P<prefix>\S+)
+ \s+distance
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters distance prefix {{ bgp_params.distance.prefix }} distance {{ bgp_params.distance.value }}",
+ "compval": "bgp_params.distance.prefix",
+ "remval": "protocols bgp parameters distance prefix",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "distance": [
+ {
+ "prefix": "{{ prefix }}",
+ "value": "{{ val }}",
+ },
+ ],
+ },
+ },
+ },
+ {
+ "name": "bgp_params.distance.global",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+distance\sglobal
+ \s+(?P<type>\S+)
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": _tmplt_bgp_params_distance,
+ "remval": "protocols bgp parameters distance global",
+ "compval": "bgp_params.distance",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "distance": [
+ {
+ "type": "{{ type }}",
+ "value": "{{ val }}",
+ },
+ ],
+ },
+ },
+ },
+ {
+ "name": "bgp_params.enforce_first_as",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+enforce-first-as
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters enforce-first-as",
+ "compval": "bgp_params.enforce_first_as",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "enforce_first_as": "{{ True }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.graceful_restart",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+graceful-restart\s+stalepath-time
+ \s+(?P<val>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters graceful-restart stalepath-time {{ bgp_params.graceful_restart }}",
+ "compval": "bgp_params.graceful_restart",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "graceful_restart": "{{ val }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.log_neighbor_changes",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+log-neighbor-changes
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters log-neighbor-changes",
+ "compval": "bgp_params.log_neighbor_changes",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "log_neighbor_changes": "{{ True }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.no_client_to_client_reflection",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+no-client-to-client-reflection
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters no-client-to-client-reflection",
+ "compval": "bgp_params.log_neighbor_changes",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "no_client_to_client_reflection": "{{ True }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.no_fast_external_failover",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+no-fast-external-failover
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters no-fast-external-failover",
+ "compval": "bgp_params.no_fast_external_failover",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "no_fast_external_failover": "{{ True }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.routerid",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+router-id
+ \s+(?P<id>\S+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters router-id {{ bgp_params.router_id }}",
+ "compval": "bgp_params.router_id",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "router_id": "{{ id }}",
+ },
+ },
+ },
+ {
+ "name": "bgp_params.scan_time",
+ "getval": re.compile(
+ r"""
+ ^set
+ \s+protocols
+ \s+bgp
+ \s+parameters
+ \s+scan-time
+ \s+(?P<sec>\d+)
+ *$""",
+ re.VERBOSE,
+ ),
+ "setval": "protocols bgp parameters scan-time {{ bgp_params.scan_time }}",
+ "compval": "bgp_params.scan_time",
+ "result": {
+ "as_number": "{{ as_num }}",
+ "bgp_params": {
+ "scan_time": "{{ val }}",
+ },
+ },
+ },
+ ]
+ # fmt: on
diff --git a/plugins/modules/vyos_bgp_address_family.py b/plugins/modules/vyos_bgp_address_family.py
index b3756e2e..14c3605d 100644
--- a/plugins/modules/vyos_bgp_address_family.py
+++ b/plugins/modules/vyos_bgp_address_family.py
@@ -19,6 +19,7 @@ version_added: 1.0.0
short_description: BGP Address Family resource module
description:
- This module manages BGP address family configuration of interfaces on devices running VYOS.
+- Tested against VYOS 1.3, 1.4
author: Gomathi Selvi Srinivasan (@GomathiselviS)
options:
config:
diff --git a/plugins/modules/vyos_bgp_global.py b/plugins/modules/vyos_bgp_global.py
index 7d47e4ad..4d7db472 100644
--- a/plugins/modules/vyos_bgp_global.py
+++ b/plugins/modules/vyos_bgp_global.py
@@ -19,6 +19,7 @@ version_added: 1.0.0
short_description: BGP global resource module
description:
- This module manages BGP global configuration of interfaces on devices running VYOS.
+- Tested against VYOS 1.3, 1.4
author:
- Gomathi Selvi Srinivasan (@GomathiselviS)
options:
@@ -30,35 +31,35 @@ options:
description:
- AS number.
type: int
- aggregate_address:
- description:
- - BGP aggregate network.
- type: list
- elements: dict
- suboptions:
- prefix:
- description:
- - BGP aggregate network.
- type: str
- as_set:
- description:
- - Generate AS-set path information for this aggregate address.
- type: bool
- summary_only:
- description:
- - Announce the aggregate summary network only.
- type: bool
- maximum_paths:
- description: BGP multipaths
- type: list
- elements: dict
- suboptions:
- path:
- description: BGP multipaths
- type: str
- count:
- description: No. of paths.
- type: int
+ # aggregate_address:
+ # description:
+ # - BGP aggregate network.
+ # type: list
+ # elements: dict
+ # suboptions:
+ # prefix:
+ # description:
+ # - BGP aggregate network.
+ # type: str
+ # as_set:
+ # description:
+ # - Generate AS-set path information for this aggregate address.
+ # type: bool
+ # summary_only:
+ # description:
+ # - Announce the aggregate summary network only.
+ # type: bool
+ #maximum_paths: --> moved to address-family before 1.3
+ # description: BGP multipaths
+ # type: list
+ # elements: dict
+ # suboptions:
+ # path:
+ # description: BGP multipaths
+ # type: str
+ # count:
+ # description: No. of paths.
+ # type: int
neighbor:
description: BGP neighbor
type: list
@@ -72,28 +73,37 @@ options:
description:
- Minimum interval for sending routing updates.
type: int
- allowas_in:
- description:
- - Number of occurrences of AS number.
- type: int
- as_override:
- description:
- - AS for routes sent to this neighbor to be the local AS.
- type: bool
- attribute_unchanged:
- description:
- - BGP attributes are sent unchanged.
- type: dict
- suboptions:
- as_path:
- description: as_path
- type: bool
- med:
- description: med
- type: bool
- next_hop:
- description: next_hop
- type: bool
+ # bfd: # <-- added in 1.3
+ # description: Enable Bidirectional Forwarding Detection (BFD) support
+ # type: dict
+ # suboptions:
+ # check-control-plane-failure:
+ # description:
+ # - Allow to write CBIT independence in BFD outgoing packets
+ # and read both C-BIT value of BFD and lookup BGP peer status
+ # type: bool
+ # allowas_in: --> Moved to address-family before 1.3
+ # description:
+ # - Number of occurrences of AS number.
+ # type: int
+ # as_override: --> Moved to address-family before 1.3
+ # description:
+ # - AS for routes sent to this neighbor to be the local AS.
+ # type: bool
+ # attribute_unchanged: --> Moved to address-family before 1.3
+ # description:
+ # - BGP attributes are sent unchanged.
+ # type: dict
+ # suboptions:
+ # as_path:
+ # description: as_path
+ # type: bool
+ # med:
+ # description: med
+ # type: bool
+ # next_hop:
+ # description: next_hop
+ # type: bool
capability:
description:
- Advertise capabilities to this neighbor.
@@ -103,13 +113,17 @@ options:
description:
- Advertise dynamic capability to this neighbor.
type: bool
- orf:
+ extended_nexthop:
description:
- - Advertise ORF capability to this neighbor.
- type: str
- choices:
- - send
- - receive
+ - Advertise extended nexthop capability to this neighbor.
+ type: bool
+ # orf: --> Removed before 1.3
+ # description:
+ # - Advertise ORF capability to this neighbor.
+ # type: str
+ # choices:
+ # - send
+ # - receive
default_originate:
description:
- Send default route to this neighbor
@@ -131,45 +145,70 @@ options:
- Disable sending community attributes to this neighbor.
type: str
choices: ['extended', 'standard']
- distribute_list:
- description: Access-list to filter route updates to/from this neighbor.
- type: list
- elements: dict
- suboptions:
- action:
- description: Access-list to filter outgoing/incoming route updates to this neighbor
- type: str
- choices: ['export', 'import']
- acl:
- description: Access-list number.
- type: int
+ # distribute_list: --> Moved to address-family before 1.3
+ # description: Access-list to filter route updates to/from this neighbor.
+ # type: list
+ # elements: dict
+ # suboptions:
+ # action:
+ # description: Access-list to filter outgoing/incoming route updates to this neighbor
+ # type: str
+ # choices: ['export', 'import']
+ # acl:
+ # description: Access-list number.
+ # type: int
ebgp_multihop:
description:
- Allow this EBGP neighbor to not be on a directly connected network. Specify
the number hops.
type: int
- filter_list:
- description: As-path-list to filter route updates to/from this neighbor.
- type: list
- elements: dict
- suboptions:
- action:
- description: filter outgoing/incoming route updates
- type: str
- choices: ['export', 'import']
- path_list:
- description: As-path-list to filter
- type: str
+ # interface: # <-- added in 1.3
+ # description: interface parameters
+ # type: dict
+ # suboptions:
+ # peer_group:
+ # description: Peer group for this neighbor
+ # type: str
+ # remote_as:
+ # description:
+ # - Remote AS number
+ # - Or 'external' for any number except this AS number
+ # - or 'internal' for this AS number
+ # type: str
+ # v6only:
+ # description: Enable BGP with v6 link-local only
+ # type: dict
+ # suboptions:
+ # peer_group:
+ # description: Peer group for this neighbor
+ # type: str
+ # remote_as:
+ # description:
+ # - Remote AS number
+ # - Or 'external' for any number except this AS number
+ # - or 'internal' for this AS number
+ # filter_list: --> Moved to address-family before 1.3
+ # description: As-path-list to filter route updates to/from this neighbor.
+ # type: list
+ # elements: dict
+ # suboptions:
+ # action:
+ # description: filter outgoing/incoming route updates
+ # type: str
+ # choices: ['export', 'import']
+ # path_list:
+ # description: As-path-list to filter
+ # type: str
local_as:
description: local as number not to be prepended to updates from EBGP peers
type: int
- maximum_prefix:
- description: Maximum number of prefixes to accept from this neighbor
- nexthop-self Nexthop for routes sent to this neighbor to be the local router.
- type: int
- nexthop_self:
- description: Nexthop for routes sent to this neighbor to be the local router.
- type: bool
+ # maximum_prefix: --> Moved to address-family before 1.3
+ # description: Maximum number of prefixes to accept from this neighbor
+ # nexthop-self Nexthop for routes sent to this neighbor to be the local router.
+ # type: int
+ # nexthop_self: --> Moved to address-family before 1.3
+ # description: Nexthop for routes sent to this neighbor to be the local router.
+ # type: bool
override_capability:
description: Ignore capability negotiation with specified neighbor.
type: bool
@@ -188,63 +227,61 @@ options:
port:
description: Neighbor's BGP port
type: int
- prefix_list:
- description: Prefix-list to filter route updates to/from this neighbor.
- type: list
- elements: dict
- suboptions:
- action:
- description: filter outgoing/incoming route updates
- type: str
- choices: ['export', 'import']
- prefix_list:
- description: Prefix-list to filter
- type: str
+ # prefix_list: --> Moved to address-family before 1.3
+ # description: Prefix-list to filter route updates to/from this neighbor.
+ # type: list
+ # elements: dict
+ # suboptions:
+ # action:
+ # description: filter outgoing/incoming route updates
+ # type: str
+ # choices: ['export', 'import']
+ # prefix_list:
+ # description: Prefix-list to filter
+ # type: str
remote_as:
description: Neighbor BGP AS number
type: int
- remove_private_as:
- description: Remove private AS numbers from AS path in outbound route updates
- type: bool
- route_map:
- description: Route-map to filter route updates to/from this neighbor.
- type: list
- elements: dict
- suboptions:
- action:
- description: filter outgoing/incoming route updates
- type: str
- choices: ['export', 'import']
- route_map:
- description: route-map to filter
- type: str
- route_reflector_client:
- description: Neighbor as a route reflector client
- type: bool
- route_server_client:
- description: Neighbor is route server client
- type: bool
+ # remove_private_as: --> Moved to address-family before 1.3
+ # description: Remove private AS numbers from AS path in outbound route updates
+ # type: bool
+ # route_map: --> Moved to address-family before 1.3
+ # description: Route-map to filter route updates to/from this neighbor.
+ # type: list
+ # elements: dict
+ # suboptions:
+ # action:
+ # description: filter outgoing/incoming route updates
+ # type: str
+ # choices: ['export', 'import']
+ # route_map:
+ # description: route-map to filter
+ # type: str
+ # route_reflector_client: --> Moved to address-family before 1.3
+ # description: Neighbor as a route reflector client
+ # type: bool
+ # route_server_client: --> Removed prior to 1.3
+ # description: Neighbor is route server client
+ # type: bool
shutdown:
description: Administratively shut down neighbor
type: bool
- soft_reconfiguration:
- description: Soft reconfiguration for neighbor
+ # soft_reconfiguration: --> Moved to address-family before 1.3
+ # description: Soft reconfiguration for neighbor
+ # type: bool
+ solo: # <-- added in 1.3
+ description: Do not send back prefixes learned from the neighbor
type: bool
strict_capability_match:
description: Enable strict capability negotiation
type: bool
- unsuppress_map:
- description: Route-map to selectively unsuppress suppressed routes
- type: str
- update_source:
- description: Source IP of routing updates
- type: str
- weight:
- description: Default weight for routes from this neighbor
- type: int
- ttl_security:
- description: Ttl security mechanism for this BGP peer
- type: int
+ # unsuppress_map: --> Moved to address-family before 1.3
+ # description: Route-map to selectively unsuppress suppressed routes
+ # type: str
+
+ # weight: --> Moved to address-family before 1.3
+ # description: Default weight for routes from this neighbor
+ # type: int
timers:
description: Neighbor timers
type: dict
@@ -258,35 +295,41 @@ options:
keepalive:
description: BGP keepalive interval for this neighbor
type: int
- network:
- description: BGP network
- type: list
- elements: dict
- suboptions:
- address:
- description: BGP network address
- type: str
- backdoor:
- description: Network as a backdoor route
- type: bool
- route_map:
- description: Route-map to modify route attributes
- type: str
- redistribute:
- description: Redistribute routes from other protocols into BGP
- type: list
- elements: dict
- suboptions:
- protocol:
- description: types of routes to be redistributed.
- type: str
- choices: ['connected', 'kernel', 'ospf', 'rip', 'static']
- route_map:
- description: Route map to filter redistributed routes
- type: str
- metric:
- description: Metric for redistributed routes.
+ ttl_security:
+ description: Number of the maximum number of hops to the BGP peer
type: int
+ update_source:
+ description: Source IP of routing updates
+ type: str
+ # network:
+ # description: BGP network
+ # type: list
+ # elements: dict
+ # suboptions:
+ # address:
+ # description: BGP network address
+ # type: str
+ # backdoor:
+ # description: Network as a backdoor route
+ # type: bool
+ # route_map:
+ # description: Route-map to modify route attributes
+ # type: str
+ # redistribute:
+ # description: Redistribute routes from other protocols into BGP
+ # type: list
+ # elements: dict
+ # suboptions:
+ # protocol:
+ # description: types of routes to be redistributed.
+ # type: str
+ # choices: ['connected', 'kernel', 'ospf', 'rip', 'static']
+ # route_map:
+ # description: Route map to filter redistributed routes
+ # type: str
+ # metric:
+ # description: Metric for redistributed routes.
+ # type: int
timers:
description: BGP protocol timers
type: dict
@@ -357,7 +400,9 @@ options:
description: Default local preference
type: int
no_ipv4_unicast:
- description: Deactivate IPv4 unicast for a peer by default
+ description: |
+ Deactivate IPv4 unicast for a peer by default
+ Deprecated: Unavailable after 1.4
type: bool
deterministic_med:
description: Compare MEDs between different peers in the same AS
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_get_version.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_get_version.yaml
new file mode 100644
index 00000000..2588b194
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_get_version.yaml
@@ -0,0 +1,28 @@
+- name: make sure to get facts
+ vyos.vyos.vyos_facts:
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
+ register: vyos_facts
+ when: vyos_version is not defined
+
+- name: debug vyos_facts
+ debug:
+ var: vyos_facts
+
+- name: pull version from facts
+ set_fact:
+ vyos_version: "{{ vyos_facts.ansible_facts.ansible_net_version.split('-')[0].split(' ')[-1] }}"
+ when: vyos_version is not defined
+
+- name: fix '.0' versions
+ set_fact:
+ vyos_version: "{{ vyos_version }}.0"
+ when: vyos_version.count('.') == 1
+
+- name: include correct vars
+ include_vars: pre-v1_4.yaml
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+- name: include correct vars
+ include_vars: v1_4.yaml
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config.cfg b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config.cfg
index 2aecc805..afb0987a 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config.cfg
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config.cfg
@@ -1,9 +1,9 @@
set policy access-list 20 description 'acl20'
set policy access-list 40 description 'acl40'
set policy route-map map01 description 'map01'
-set protocols bgp 65536 address-family ipv6-unicast aggregate-address 5000:1:1::/64 summary-only
-set protocols bgp 65536 address-family ipv6-unicast network 21e0:1:1::/64 route-map 'map01'
-set protocols bgp 65536 address-family ipv6-unicast redistribute ripng metric '20'
-set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast route-map export 'map01'
-set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast soft-reconfiguration inbound
-set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop
+set protocols bgp address-family ipv6-unicast aggregate-address 5000:1:1::/64 summary-only
+set protocols bgp address-family ipv6-unicast network 21e0:1:1::/64 route-map 'map01'
+set protocols bgp address-family ipv6-unicast redistribute ripng metric '20'
+set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast route-map export 'map01'
+set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast soft-reconfiguration inbound
+set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config_1_3.cfg b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config_1_3.cfg
new file mode 100644
index 00000000..2aecc805
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_parsed_config_1_3.cfg
@@ -0,0 +1,9 @@
+set policy access-list 20 description 'acl20'
+set policy access-list 40 description 'acl40'
+set policy route-map map01 description 'map01'
+set protocols bgp 65536 address-family ipv6-unicast aggregate-address 5000:1:1::/64 summary-only
+set protocols bgp 65536 address-family ipv6-unicast network 21e0:1:1::/64 route-map 'map01'
+set protocols bgp 65536 address-family ipv6-unicast redistribute ripng metric '20'
+set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast route-map export 'map01'
+set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast soft-reconfiguration inbound
+set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_populate.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_populate.yaml
index ecbcc70d..4158a65d 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_populate.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_populate.yaml
@@ -1,7 +1,10 @@
---
- ansible.builtin.include_tasks: _remove_config.yaml
-- name: Setup
+- name: ensure facts
+ include_tasks: _get_version.yaml
+
+- name: Setup (Pre 1.4)
vyos.vyos.vyos_config:
lines:
- set policy access-list 20 description 'acl20'
@@ -17,3 +20,25 @@
ignore_errors: true
vars:
ansible_connection: ansible.netcommon.network_cli
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+- name: Setup (1.4+)
+ vyos.vyos.vyos_config:
+ lines:
+ - set policy access-list 20 description 'acl20'
+ - set policy access-list 40 description 'acl40'
+ - set policy access-list6 10 description 'acl10'
+ - set policy route-map map01 description 'map01'
+ - set protocols bgp system-as 65536
+ - set protocols bgp address-family ipv6-unicast aggregate-address 5000:1:1::/64 summary-only
+ - set protocols bgp address-family ipv6-unicast network 21e0:1:1::/64 route-map 'map01'
+ - set protocols bgp address-family ipv6-unicast redistribute ripng metric '20'
+ - set protocols bgp neighbor 192.0.2.25 remote-as 65535
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast route-map export 'map01'
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast soft-reconfiguration inbound
+ - set protocols bgp neighbor 203.0.113.5 remote-as 65534
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop
+ ignore_errors: true
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_preconfig.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_preconfig.yaml
index 5024a70f..65adbb40 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_preconfig.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_preconfig.yaml
@@ -9,3 +9,11 @@
ignore_errors: true
vars:
ansible_connection: ansible.netcommon.network_cli
+
+- name: setup for 1.4+
+ vyos.vyos.vyos_config:
+ lines:
+ - set protocols bgp system-as 65536
+ - set protocols bgp neighbor 203.0.113.5 remote-as 65534
+ - set protocols bgp neighbor 192.0.2.25 remote-as 65534
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_remove_config.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_remove_config.yaml
index 39d8bd02..36600e24 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/_remove_config.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/_remove_config.yaml
@@ -2,7 +2,7 @@
- name: Remove pre-existing bgp processes
vyos.vyos.vyos_config:
lines:
- - delete protocols bgp 65536
+ - delete protocols bgp
- delete policy access-list 20
- delete policy access-list 40
- delete policy access-list6 10
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/deleted.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/deleted.yaml
index 15bfe845..2a760069 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/deleted.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/deleted.yaml
@@ -24,7 +24,7 @@
- assert:
that:
- - result.commands|length == 3
+ - result.commands|length == deleted.commands|length
- result.changed == true
- result.commands|symmetric_difference(deleted.commands) == []
- result.after == ansible_facts['network_resources']['bgp_address_family']
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/merged.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/merged.yaml
index 4e66a78a..acfae74d 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/merged.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/merged.yaml
@@ -45,11 +45,11 @@
- assert:
that:
- - result.commands|length == 9
+ - result.commands|length == merged.commands|length
- result.changed == true
- result.commands|symmetric_difference(merged.commands) == []
- result.after == ansible_facts['network_resources']['bgp_address_family']
- - result.before == {}
+ - result.before == merged.before
- result.after == merged.after
- name: Merge the provided configuration with the existing running configuration (IDEMPOTENT)
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/overridden.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/overridden.yaml
index 90b40dea..ec0b6164 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/overridden.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/overridden.yaml
@@ -33,7 +33,7 @@
- assert:
that:
- - result.commands|length == 10
+ - result.commands|length == overridden.commands|length
- result.changed == true
- result.commands|symmetric_difference(overridden.commands) == []
- result.after == ansible_facts['network_resources']['bgp_address_family']
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/parsed.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/parsed.yaml
index da9c1417..65e9b1b1 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/parsed.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/parsed.yaml
@@ -2,13 +2,34 @@
- debug:
msg: START vyos_bgp_address_family parsed integration tests on connection={{ ansible_connection }}
-- name: Provide the running configuration for parsing (config to be parsed)
- register: result
- vyos.vyos.vyos_bgp_address_family:
- running_config: "{{ lookup('file', '_parsed_config.cfg') }}"
- state: parsed
+- name: ensure facts
+ include_tasks: _get_version.yaml
+
+- name: version 1.3
+ block:
+ - name: Provide the running configuration for parsing (config to be parsed)
+ register: result
+ vyos.vyos.vyos_bgp_address_family:
+ running_config: "{{ lookup('file', '_parsed_config_1_3.cfg') }}"
+ state: parsed
+ - name: set result
+ set_fact:
+ parsed_result: "{{ result }}"
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+- name: version 1.4+
+ block:
+ - name: Provide the running configuration for parsing (config to be parsed)
+ register: result
+ vyos.vyos.vyos_bgp_address_family:
+ running_config: "{{ lookup('file', '_parsed_config.cfg') }}"
+ state: parsed
+ - name: set result
+ set_fact:
+ parsed_result: "{{ result }}"
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
- assert:
that:
- - result.changed == false
- - result.parsed == populate.config
+ - parsed_result.changed == false
+ - parsed_result.parsed == populate.config
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/rendered.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/rendered.yaml
index 0ef116e8..151f896a 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/rendered.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/rendered.yaml
@@ -39,4 +39,4 @@
- assert:
that:
- result.changed == false
- - result.rendered|symmetric_difference(merged.commands) == []
+ - result.rendered|symmetric_difference(rendered.commands) == []
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/replaced.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/replaced.yaml
index 9b6f3303..15e45be3 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/replaced.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/replaced.yaml
@@ -33,7 +33,7 @@
- assert:
that:
- - result.commands|length == 9
+ - result.commands|length == replaced.commands|length
- result.changed == true
- result.commands|symmetric_difference(replaced.commands) == []
- result.after == ansible_facts['network_resources']['bgp_address_family']
diff --git a/tests/integration/targets/vyos_bgp_address_family/tests/cli/rtt.yaml b/tests/integration/targets/vyos_bgp_address_family/tests/cli/rtt.yaml
index baab61b0..49aeba78 100644
--- a/tests/integration/targets/vyos_bgp_address_family/tests/cli/rtt.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/tests/cli/rtt.yaml
@@ -2,6 +2,8 @@
- debug:
msg: START vyos_bgp_address_family rtt integration tests on connection={{ ansible_connection }}
+- include_tasks: _get_version.yaml
+
- include_tasks: _remove_config.yaml
- include_tasks: _preconfig.yaml
@@ -45,7 +47,7 @@
- assert:
that:
- - baseconfig.commands|length == 9
+ - baseconfig.commands|length == merged.commands|length
- baseconfig.changed == true
- baseconfig.commands|symmetric_difference(merged.commands) == []
- baseconfig.after == ansible_facts['network_resources']['bgp_address_family']
diff --git a/tests/integration/targets/vyos_bgp_address_family/vars/main.yaml b/tests/integration/targets/vyos_bgp_address_family/vars/main.yaml
index 448918af..ed97d539 100644
--- a/tests/integration/targets/vyos_bgp_address_family/vars/main.yaml
+++ b/tests/integration/targets/vyos_bgp_address_family/vars/main.yaml
@@ -1,99 +1 @@
---
-merged:
- commands:
- - set protocols bgp 65536 address-family ipv6-unicast redistribute static metric 50
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
- - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast maximum-prefix 45
- - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast nexthop-self
- - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast route-map export map01
- - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast route-map import map01
- after:
- address_family:
- - afi: ipv6
- redistribute:
- - metric: 50
- protocol: static
- as_number: 65536
- neighbors:
- - address_family:
- - afi: ipv6
- maximum_prefix: 45
- nexthop_self: true
- route_map:
- - action: export
- route_map: map01
- - action: import
- route_map: map01
- neighbor_address: 192.0.2.25
- - address_family:
- - afi: ipv6
- allowas_in: 4
- attribute_unchanged:
- med: true
- default_originate: map01
- distribute_list:
- - acl: 10
- action: export
- neighbor_address: 203.0.113.5
-
-replaced:
- commands:
- - delete protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged
- - delete protocols bgp 65536 address-family ipv6 aggregate-address
- - delete protocols bgp 65536 address-family ipv6 network
- - delete protocols bgp 65536 address-family ipv6-unicast redistribute ripng
- - set protocols bgp 65536 address-family ipv6-unicast redistribute static metric 50
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
-
-overridden:
- commands:
- - delete protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged
- - delete protocols bgp 65536 neighbor 192.0.2.25 address-family
- - delete protocols bgp 65536 address-family ipv6-unicast redistribute ripng
- - delete protocols bgp 65536 address-family ipv6 aggregate-address
- - delete protocols bgp 65536 address-family ipv6 network
- - set protocols bgp 65536 address-family ipv6-unicast redistribute static metric 50
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
- - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
-
-deleted:
- commands:
- - delete protocols bgp 65536 address-family ipv6-unicast
- - delete protocols bgp 65536 neighbor 203.0.113.5 address-family
- - delete protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast
-
-populate:
- config:
- address_family:
- - afi: ipv6
- aggregate_address:
- - summary_only: true
- prefix: 5000:1:1::/64
- networks:
- - prefix: 21e0:1:1::/64
- route_map: map01
- redistribute:
- - metric: 20
- protocol: ripng
- as_number: 65536
- neighbors:
- - address_family:
- - afi: ipv6
- route_map:
- - action: export
- route_map: map01
- soft_reconfiguration: true
- neighbor_address: 192.0.2.25
- - address_family:
- - afi: ipv6
- attribute_unchanged:
- next_hop: true
- neighbor_address: 203.0.113.5
diff --git a/tests/integration/targets/vyos_bgp_address_family/vars/pre-v1_4.yaml b/tests/integration/targets/vyos_bgp_address_family/vars/pre-v1_4.yaml
new file mode 100644
index 00000000..c50db90a
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_address_family/vars/pre-v1_4.yaml
@@ -0,0 +1,103 @@
+---
+rendered:
+ commands: "{{ merged.commands }}"
+
+merged:
+ commands:
+ - set protocols bgp 65536 address-family ipv6-unicast redistribute static metric 50
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
+ - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast maximum-prefix 45
+ - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast nexthop-self
+ - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast route-map export map01
+ - set protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast route-map import map01
+ before: {}
+ after:
+ address_family:
+ - afi: ipv6
+ redistribute:
+ - metric: 50
+ protocol: static
+ as_number: 65536
+ neighbors:
+ - address_family:
+ - afi: ipv6
+ maximum_prefix: 45
+ nexthop_self: true
+ route_map:
+ - action: export
+ route_map: map01
+ - action: import
+ route_map: map01
+ neighbor_address: 192.0.2.25
+ - address_family:
+ - afi: ipv6
+ allowas_in: 4
+ attribute_unchanged:
+ med: true
+ default_originate: map01
+ distribute_list:
+ - acl: 10
+ action: export
+ neighbor_address: 203.0.113.5
+
+replaced:
+ commands:
+ - delete protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged
+ - delete protocols bgp 65536 address-family ipv6 aggregate-address
+ - delete protocols bgp 65536 address-family ipv6 network
+ - delete protocols bgp 65536 address-family ipv6-unicast redistribute ripng
+ - set protocols bgp 65536 address-family ipv6-unicast redistribute static metric 50
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
+
+overridden:
+ commands:
+ - delete protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged
+ - delete protocols bgp 65536 neighbor 192.0.2.25 address-family
+ - delete protocols bgp 65536 address-family ipv6-unicast redistribute ripng
+ - delete protocols bgp 65536 address-family ipv6 aggregate-address
+ - delete protocols bgp 65536 address-family ipv6 network
+ - set protocols bgp 65536 address-family ipv6-unicast redistribute static metric 50
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
+ - set protocols bgp 65536 neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
+
+deleted:
+ commands:
+ - delete protocols bgp 65536 address-family ipv6-unicast
+ - delete protocols bgp 65536 neighbor 203.0.113.5 address-family
+ - delete protocols bgp 65536 neighbor 192.0.2.25 address-family ipv6-unicast
+
+populate:
+ config:
+ address_family:
+ - afi: ipv6
+ aggregate_address:
+ - summary_only: true
+ prefix: 5000:1:1::/64
+ networks:
+ - prefix: 21e0:1:1::/64
+ route_map: map01
+ redistribute:
+ - metric: 20
+ protocol: ripng
+ as_number: 65536
+ neighbors:
+ - address_family:
+ - afi: ipv6
+ route_map:
+ - action: export
+ route_map: map01
+ soft_reconfiguration: true
+ neighbor_address: 192.0.2.25
+ - address_family:
+ - afi: ipv6
+ attribute_unchanged:
+ next_hop: true
+ neighbor_address: 203.0.113.5
diff --git a/tests/integration/targets/vyos_bgp_address_family/vars/v1_4.yaml b/tests/integration/targets/vyos_bgp_address_family/vars/v1_4.yaml
new file mode 100644
index 00000000..a56e9ebf
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_address_family/vars/v1_4.yaml
@@ -0,0 +1,113 @@
+---
+rendered:
+ commands:
+ - set protocols bgp system-as 65536
+ - set protocols bgp address-family ipv6-unicast redistribute static metric 50
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast maximum-prefix 45
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast nexthop-self
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast route-map export map01
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast route-map import map01
+
+merged:
+ commands:
+ - set protocols bgp address-family ipv6-unicast redistribute static metric 50
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast maximum-prefix 45
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast nexthop-self
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast route-map export map01
+ - set protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast route-map import map01
+ before:
+ as_number: 65536
+ after:
+ address_family:
+ - afi: ipv6
+ redistribute:
+ - metric: 50
+ protocol: static
+ as_number: 65536
+ neighbors:
+ - address_family:
+ - afi: ipv6
+ maximum_prefix: 45
+ nexthop_self: true
+ route_map:
+ - action: export
+ route_map: map01
+ - action: import
+ route_map: map01
+ neighbor_address: 192.0.2.25
+ - address_family:
+ - afi: ipv6
+ allowas_in: 4
+ attribute_unchanged:
+ med: true
+ default_originate: map01
+ distribute_list:
+ - acl: 10
+ action: export
+ neighbor_address: 203.0.113.5
+
+replaced:
+ commands:
+ - delete protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged
+ - delete protocols bgp address-family ipv6 aggregate-address
+ - delete protocols bgp address-family ipv6 network
+ - delete protocols bgp address-family ipv6-unicast redistribute ripng
+ - set protocols bgp address-family ipv6-unicast redistribute static metric 50
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
+
+overridden:
+ commands:
+ - delete protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged
+ - delete protocols bgp neighbor 192.0.2.25 address-family
+ - delete protocols bgp address-family ipv6-unicast redistribute ripng
+ - delete protocols bgp address-family ipv6 aggregate-address
+ - delete protocols bgp address-family ipv6 network
+ - set protocols bgp address-family ipv6-unicast redistribute static metric 50
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast allowas-in number 4
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged med
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast default-originate route-map map01
+ - set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast distribute-list export 10
+
+deleted:
+ commands:
+ - delete protocols bgp address-family ipv6-unicast
+ - delete protocols bgp neighbor 203.0.113.5 address-family
+ - delete protocols bgp neighbor 192.0.2.25 address-family ipv6-unicast
+
+populate:
+ config:
+ address_family:
+ - afi: ipv6
+ aggregate_address:
+ - summary_only: true
+ prefix: 5000:1:1::/64
+ networks:
+ - prefix: 21e0:1:1::/64
+ route_map: map01
+ redistribute:
+ - metric: 20
+ protocol: ripng
+ neighbors:
+ - address_family:
+ - afi: ipv6
+ route_map:
+ - action: export
+ route_map: map01
+ soft_reconfiguration: true
+ neighbor_address: 192.0.2.25
+ - address_family:
+ - afi: ipv6
+ attribute_unchanged:
+ next_hop: true
+ neighbor_address: 203.0.113.5
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/_get_version.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/_get_version.yaml
new file mode 100644
index 00000000..2588b194
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/_get_version.yaml
@@ -0,0 +1,28 @@
+- name: make sure to get facts
+ vyos.vyos.vyos_facts:
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
+ register: vyos_facts
+ when: vyos_version is not defined
+
+- name: debug vyos_facts
+ debug:
+ var: vyos_facts
+
+- name: pull version from facts
+ set_fact:
+ vyos_version: "{{ vyos_facts.ansible_facts.ansible_net_version.split('-')[0].split(' ')[-1] }}"
+ when: vyos_version is not defined
+
+- name: fix '.0' versions
+ set_fact:
+ vyos_version: "{{ vyos_version }}.0"
+ when: vyos_version.count('.') == 1
+
+- name: include correct vars
+ include_vars: pre-v1_4.yaml
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+- name: include correct vars
+ include_vars: v1_4.yaml
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config.cfg b/tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config.cfg
index 2338b03c..e8f78814 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config.cfg
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config.cfg
@@ -1,30 +1,19 @@
set policy access-list 20 description 'acl20'
set policy access-list 40 description 'acl40'
set policy route-map map01 description 'map01'
-set protocols bgp 65536 aggregate-address 192.0.2.0/24 'summary-only'
-set protocols bgp 65536 aggregate-address 203.0.113.0/24 'as-set'
-set protocols bgp 65536 maximum-paths ebgp '20'
-set protocols bgp 65536 maximum-paths ibgp '55'
-set protocols bgp 65536 neighbor 192.0.2.25 'disable-connected-check'
-set protocols bgp 65536 neighbor 192.0.2.25 timers holdtime '30'
-set protocols bgp 65536 neighbor 192.0.2.25 timers keepalive '10'
-set protocols bgp 65536 neighbor 203.0.113.5 attribute-unchanged 'as-path'
-set protocols bgp 65536 neighbor 203.0.113.5 attribute-unchanged 'med'
-set protocols bgp 65536 neighbor 203.0.113.5 attribute-unchanged 'next-hop'
-set protocols bgp 65536 neighbor 203.0.113.5 ebgp-multihop '2'
-set protocols bgp 65536 neighbor 203.0.113.5 remote-as '101'
-set protocols bgp 65536 neighbor 203.0.113.5 update-source '192.0.2.25'
-set protocols bgp 65536 neighbor 5001::64 distribute-list export '20'
-set protocols bgp 65536 neighbor 5001::64 distribute-list import '40'
-set protocols bgp 65536 neighbor 5001::64 maximum-prefix '34'
-set protocols bgp 65536 network 192.1.13.0/24 'backdoor'
-set protocols bgp 65536 parameters bestpath as-path 'confed'
-set protocols bgp 65536 parameters bestpath 'compare-routerid'
-set protocols bgp 65536 parameters confederation identifier '66'
-set protocols bgp 65536 parameters confederation peers '20'
-set protocols bgp 65536 parameters confederation peers '55'
-set protocols bgp 65536 parameters default 'no-ipv4-unicast'
-set protocols bgp 65536 parameters router-id '192.1.2.9'
-set protocols bgp 65536 redistribute connected route-map 'map01'
-set protocols bgp 65536 redistribute kernel metric '45'
-set protocols bgp 65536 timers keepalive '35'
+set protocols bgp system-as '65536'
+set protocols bgp neighbor 192.0.2.25 'disable-connected-check'
+set protocols bgp neighbor 192.0.2.25 timers holdtime '30'
+set protocols bgp neighbor 192.0.2.25 timers keepalive '10'
+set protocols bgp neighbor 192.0.2.25 remote-as '102'
+set protocols bgp neighbor 203.0.113.5 ebgp-multihop '2'
+set protocols bgp neighbor 203.0.113.5 remote-as '101'
+set protocols bgp neighbor 203.0.113.5 update-source '192.0.2.25'
+set protocols bgp neighbor 5001::64 remote-as '103'
+set protocols bgp parameters bestpath as-path 'confed'
+set protocols bgp parameters bestpath 'compare-routerid'
+set protocols bgp parameters confederation identifier '66'
+set protocols bgp parameters confederation peers '20'
+set protocols bgp parameters confederation peers '55'
+set protocols bgp parameters router-id '192.1.2.9'
+set protocols bgp timers keepalive '35'
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config_1_3.cfg b/tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config_1_3.cfg
new file mode 100644
index 00000000..fbf23261
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/_parsed_config_1_3.cfg
@@ -0,0 +1,19 @@
+set policy access-list 20 description 'acl20'
+set policy access-list 40 description 'acl40'
+set policy route-map map01 description 'map01'
+set protocols bgp 65536 neighbor 192.0.2.25 'disable-connected-check'
+set protocols bgp 65536 neighbor 192.0.2.25 timers holdtime '30'
+set protocols bgp 65536 neighbor 192.0.2.25 timers keepalive '10'
+set protocols bgp 65536 neighbor 192.0.2.25 remote-as '102'
+set protocols bgp 65536 neighbor 203.0.113.5 ebgp-multihop '2'
+set protocols bgp 65536 neighbor 203.0.113.5 remote-as '101'
+set protocols bgp 65536 neighbor 203.0.113.5 update-source '192.0.2.25'
+set protocols bgp 65536 neighbor 5001::64 remote-as '103'
+set protocols bgp 65536 parameters bestpath as-path 'confed'
+set protocols bgp 65536 parameters bestpath 'compare-routerid'
+set protocols bgp 65536 parameters confederation identifier '66'
+set protocols bgp 65536 parameters confederation peers '20'
+set protocols bgp 65536 parameters confederation peers '55'
+set protocols bgp 65536 parameters default local-pref 100
+set protocols bgp 65536 parameters router-id '192.1.2.9'
+set protocols bgp 65536 timers keepalive '35'
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/_populate.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/_populate.yaml
index 0f281c94..17fa22b1 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/_populate.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/_populate.yaml
@@ -1,39 +1,60 @@
---
- ansible.builtin.include_tasks: _remove_config.yaml
-- name: Setup
+- name: ensure facts
+ include_tasks: _get_version.yaml
+
+- name: Setup 1.3-
vyos.vyos.vyos_config:
lines:
- set policy access-list 20 description 'acl20'
- set policy access-list 40 description 'acl40'
- set policy route-map map01 description 'map01'
- - set protocols bgp 65536 aggregate-address 192.0.2.0/24 'summary-only'
- - set protocols bgp 65536 aggregate-address 203.0.113.0/24 'as-set'
- - set protocols bgp 65536 maximum-paths ebgp '20'
- - set protocols bgp 65536 maximum-paths ibgp '55'
- set protocols bgp 65536 neighbor 192.0.2.25 'disable-connected-check'
- set protocols bgp 65536 neighbor 192.0.2.25 timers holdtime '30'
- set protocols bgp 65536 neighbor 192.0.2.25 timers keepalive '10'
- - set protocols bgp 65536 neighbor 203.0.113.5 attribute-unchanged 'as-path'
- - set protocols bgp 65536 neighbor 203.0.113.5 attribute-unchanged 'med'
- - set protocols bgp 65536 neighbor 203.0.113.5 attribute-unchanged 'next-hop'
+ - set protocols bgp 65536 neighbor 192.0.2.25 remote-as '102'
- set protocols bgp 65536 neighbor 203.0.113.5 ebgp-multihop '2'
- set protocols bgp 65536 neighbor 203.0.113.5 remote-as '101'
- set protocols bgp 65536 neighbor 203.0.113.5 update-source '192.0.2.25'
- - set protocols bgp 65536 neighbor 5001::64 distribute-list export '20'
- - set protocols bgp 65536 neighbor 5001::64 distribute-list import '40'
- - set protocols bgp 65536 neighbor 5001::64 maximum-prefix '34'
- - set protocols bgp 65536 network 192.1.13.0/24 'backdoor'
+ - set protocols bgp 65536 neighbor 5001::64 remote-as '103'
- set protocols bgp 65536 parameters bestpath as-path 'confed'
- set protocols bgp 65536 parameters bestpath 'compare-routerid'
- set protocols bgp 65536 parameters confederation identifier '66'
- set protocols bgp 65536 parameters confederation peers '20'
- set protocols bgp 65536 parameters confederation peers '55'
- - set protocols bgp 65536 parameters default 'no-ipv4-unicast'
+ - set protocols bgp 65536 parameters default local-pref 100
- set protocols bgp 65536 parameters router-id '192.1.2.9'
- - set protocols bgp 65536 redistribute connected route-map 'map01'
- - set protocols bgp 65536 redistribute kernel metric '45'
- set protocols bgp 65536 timers keepalive '35'
ignore_errors: true
vars:
ansible_connection: ansible.netcommon.network_cli
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+- name: Setup 1.4+
+ vyos.vyos.vyos_config:
+ lines:
+ - set policy access-list 20 description 'acl20'
+ - set policy access-list 40 description 'acl40'
+ - set policy route-map map01 description 'map01'
+ - set protocols bgp system-as 65536
+ - set protocols bgp neighbor 192.0.2.25 'disable-connected-check'
+ - set protocols bgp neighbor 192.0.2.25 timers holdtime '30'
+ - set protocols bgp neighbor 192.0.2.25 timers keepalive '10'
+ - set protocols bgp neighbor 192.0.2.25 remote-as '102'
+ - set protocols bgp neighbor 203.0.113.5 ebgp-multihop '2'
+ - set protocols bgp neighbor 203.0.113.5 remote-as '101'
+ - set protocols bgp neighbor 203.0.113.5 update-source '192.0.2.25'
+ - set protocols bgp neighbor 5001::64 remote-as '103'
+ - set protocols bgp parameters bestpath as-path 'confed'
+ - set protocols bgp parameters bestpath 'compare-routerid'
+ - set protocols bgp parameters confederation identifier '66'
+ - set protocols bgp parameters confederation peers '20'
+ - set protocols bgp parameters confederation peers '55'
+ - set protocols bgp parameters default local-pref 100
+ - set protocols bgp parameters router-id '192.1.2.9'
+ - set protocols bgp timers keepalive '35'
+ ignore_errors: true
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/_populate_af.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/_populate_af.yaml
index 59f3d925..0a06aeb3 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/_populate_af.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/_populate_af.yaml
@@ -1,12 +1,29 @@
---
-- name: setup
+- name: ensure facts
+ include_tasks: _get_version.yaml
+
+- name: setup 1.3- AF
vyos.vyos.vyos_config:
lines:
- set protocols bgp 65536 neighbor 5001::64 address-family 'ipv6-unicast'
- set protocols bgp 65536 neighbor 5001::64 ebgp-multihop '2'
- - set protocols bgp 65536 neighbor 5001::64 maximum-prefix '34'
- - set protocols bgp 65536 neighbor 5001::64 remote-as '65535'
+ - set protocols bgp 65536 neighbor 5001::64 remote-as '103'
- set protocols bgp 65536 neighbor 5001::64 update-source '2001:db8::1'
+
ignore_errors: true
vars:
ansible_connection: ansible.netcommon.network_cli
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+- name: setup 1.4+ AF
+ vyos.vyos.vyos_config:
+ lines:
+ - set protocols bgp system-as 65536
+ - set protocols bgp neighbor 5001::64 address-family 'ipv6-unicast'
+ - set protocols bgp neighbor 5001::64 ebgp-multihop '2'
+ - set protocols bgp neighbor 5001::64 remote-as '103'
+ - set protocols bgp neighbor 5001::64 update-source '2001:db8::1'
+ ignore_errors: true
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/_remove_config.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/_remove_config.yaml
index 07d4aa47..9ccdb093 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/_remove_config.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/_remove_config.yaml
@@ -2,7 +2,7 @@
- name: Remove pre-existing bgp processes
vyos.vyos.vyos_config:
lines:
- - delete protocols bgp 65536
+ - delete protocols bgp
- delete policy access-list 20
- delete policy access-list 40
- delete policy route-map map01
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/deleted.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/deleted.yaml
index 5920c8f0..e652e127 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/deleted.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/deleted.yaml
@@ -17,7 +17,7 @@
- assert:
that:
- - result.commands|length == 9
+ - result.commands|length == deleted.commands | length
- result.changed == true
- result.commands|symmetric_difference(deleted.commands) == []
- result.after == ansible_facts['network_resources']['bgp_global']
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/deleted_af.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/deleted_af.yaml
index 88e6be09..d67d312b 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/deleted_af.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/deleted_af.yaml
@@ -18,6 +18,5 @@
- assert:
that:
- result.msg == 'Use the _bgp_address_family module to delete the address_family under neighbor 5001::64, before replacing/deleting the neighbor.'
-
always:
- include_tasks: _remove_config.yaml
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/merged.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/merged.yaml
index 388bbccd..e11cd1ef 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/merged.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/merged.yaml
@@ -12,24 +12,6 @@
vyos.vyos.vyos_bgp_global: &id001
config:
as_number: "65536"
- aggregate_address:
- - prefix: 203.0.113.0/24
- as_set: true
- - prefix: 192.0.2.0/24
- summary_only: true
- network:
- - address: 192.1.13.0/24
- backdoor: true
- redistribute:
- - protocol: kernel
- metric: 45
- - protocol: connected
- route_map: map01
- maximum_paths:
- - path: ebgp
- count: 20
- - path: ibgp
- count: 55
timers:
keepalive: 35
bgp_params:
@@ -37,7 +19,7 @@
as_path: confed
compare_routerid: true
default:
- no_ipv4_unicast: true
+ local_pref: 100
router_id: 192.1.2.9
state: merged
@@ -46,7 +28,7 @@
- assert:
that:
- - result.commands|length == 12
+ - result.commands|length == merged.commands | length
- result.changed == true
- result.commands|symmetric_difference(merged.commands) == []
- result.after == ansible_facts['network_resources']['bgp_global']
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/parsed.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/parsed.yaml
index eca85ce0..293c204c 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/parsed.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/parsed.yaml
@@ -2,13 +2,33 @@
- debug:
msg: START vyos_bgp_global parsed integration tests on connection={{ ansible_connection }}
-- name: Provide the running configuration for parsing (config to be parsed)
- register: result
- vyos.vyos.vyos_bgp_global:
- running_config: "{{ lookup('file', '_parsed_config.cfg') }}"
- state: parsed
+- name: ensure facts
+ include_tasks: _get_version.yaml
+- name: version 1.3
+ block:
+ - name: Provide the running configuration for parsing (config to be parsed)
+ register: result
+ vyos.vyos.vyos_bgp_global:
+ running_config: "{{ lookup('file', '_parsed_config_1_3.cfg') }}"
+ state: parsed
+ - name: set result
+ set_fact:
+ parsed_result: "{{ result }}"
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+- name: version 1.4+
+ block:
+ - name: Provide the running configuration for parsing (config to be parsed)
+ register: result
+ vyos.vyos.vyos_bgp_global:
+ running_config: "{{ lookup('file', '_parsed_config.cfg') }}"
+ state: parsed
+ - name: set result
+ set_fact:
+ parsed_result: "{{ result }}"
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
- assert:
that:
- - result.changed == false
- - result.parsed == populate.global
+ - parsed_result.changed == false
+ - parsed_result.parsed == populate.global
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/purged.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/purged.yaml
index 71748f5c..dfc2e435 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/purged.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/purged.yaml
@@ -21,6 +21,15 @@
- result.changed == true
- "'delete protocols bgp 65536' in result.commands"
- ansible_facts.network_resources.bgp_global == []
+ when: vyos_version is version('1.4.0', '<', version_type='semver')
+
+ - assert:
+ that:
+ - result.commands|length == 1
+ - result.changed == true
+ - "'delete protocols bgp' in result.commands"
+ - ansible_facts.network_resources.bgp_global == []
+ when: vyos_version is version('1.4.0', '>=', version_type='semver')
always:
- include_tasks: _remove_config.yaml
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/rendered.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/rendered.yaml
index f37ef882..39fc12a8 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/rendered.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/rendered.yaml
@@ -8,24 +8,6 @@
vyos.vyos.vyos_bgp_global:
config:
as_number: "65536"
- aggregate_address:
- - prefix: 203.0.113.0/24
- as_set: true
- - prefix: 192.0.2.0/24
- summary_only: true
- network:
- - address: 192.1.13.0/24
- backdoor: true
- redistribute:
- - protocol: kernel
- metric: 45
- - protocol: connected
- route_map: map01
- maximum_paths:
- - path: ebgp
- count: 20
- - path: ibgp
- count: 55
timers:
keepalive: 35
bgp_params:
@@ -33,7 +15,7 @@
as_path: confed
compare_routerid: true
default:
- no_ipv4_unicast: true
+ local_pref: 100
router_id: 192.1.2.9
state: rendered
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/replaced.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/replaced.yaml
index ae2c5c75..22323c3d 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/replaced.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/replaced.yaml
@@ -10,12 +10,6 @@
vyos.vyos.vyos_bgp_global: &id001
config:
as_number: "65536"
- network:
- - address: 203.0.113.0/24
- route_map: map01
- redistribute:
- - protocol: static
- route_map: map01
bgp_params:
always_compare_med: true
dampening:
@@ -26,8 +20,6 @@
bestpath:
as_path: confed
compare_routerid: true
- default:
- no_ipv4_unicast: true
neighbor:
- address: 192.0.2.43
disable_connected_check: true
@@ -37,9 +29,11 @@
timers:
holdtime: 30
keepalive: 10
+ remote_as: 102
- address: 203.0.113.0
capability:
- orf: receive
+ dynamic: true
+ remote_as: 102
state: replaced
- vyos.vyos.vyos_facts:
@@ -47,7 +41,7 @@
- assert:
that:
- - result.commands|length == 24
+ - result.commands|length == replaced.commands|length
- result.changed == true
- result.commands|symmetric_difference(replaced.commands) == []
- result.after == ansible_facts['network_resources']['bgp_global']
diff --git a/tests/integration/targets/vyos_bgp_global/tests/cli/replaced_af.yaml b/tests/integration/targets/vyos_bgp_global/tests/cli/replaced_af.yaml
index c9b23193..3054ea1f 100644
--- a/tests/integration/targets/vyos_bgp_global/tests/cli/replaced_af.yaml
+++ b/tests/integration/targets/vyos_bgp_global/tests/cli/replaced_af.yaml
@@ -13,12 +13,6 @@
vyos.vyos.vyos_bgp_global:
config:
as_number: "65536"
- network:
- - address: 203.0.113.0/24
- route_map: map01
- redistribute:
- - protocol: static
- route_map: map01
bgp_params:
always_compare_med: true
dampening:
@@ -29,8 +23,6 @@
bestpath:
as_path: confed
compare_routerid: true
- default:
- no_ipv4_unicast: true
neighbor:
- address: 192.0.2.43
disable_connected_check: true
@@ -40,9 +32,11 @@
timers:
holdtime: 30
keepalive: 10
+ remote_as: 102
- address: 203.0.113.0
capability:
- orf: receive
+ dynamic: true
+ remote_as: 102
state: replaced
- assert:
diff --git a/tests/integration/targets/vyos_bgp_global/vars/main.yaml b/tests/integration/targets/vyos_bgp_global/vars/main.yaml
index e195c2d7..ed97d539 100644
--- a/tests/integration/targets/vyos_bgp_global/vars/main.yaml
+++ b/tests/integration/targets/vyos_bgp_global/vars/main.yaml
@@ -1,150 +1 @@
---
-merged:
- commands:
- - set protocols bgp 65536 redistribute kernel metric 45
- - set protocols bgp 65536 redistribute connected route-map map01
- - set protocols bgp 65536 network 192.1.13.0/24 backdoor
- - set protocols bgp 65536 aggregate-address 203.0.113.0/24 as-set
- - set protocols bgp 65536 aggregate-address 192.0.2.0/24 summary-only
- - set protocols bgp 65536 parameters bestpath as-path confed
- - set protocols bgp 65536 parameters bestpath compare-routerid
- - set protocols bgp 65536 parameters default no-ipv4-unicast
- - set protocols bgp 65536 parameters router-id 192.1.2.9
- - set protocols bgp 65536 maximum-paths ebgp 20
- - set protocols bgp 65536 maximum-paths ibgp 55
- - set protocols bgp 65536 timers keepalive 35
- after:
- aggregate_address:
- - prefix: 192.0.2.0/24
- summary_only: true
- - prefix: 203.0.113.0/24
- as_set: true
- as_number: 65536
- bgp_params:
- bestpath:
- as_path: confed
- compare_routerid: true
- default:
- no_ipv4_unicast: true
- router_id: 192.1.2.9
- maximum_paths:
- - count: 20
- path: ebgp
- - count: 55
- path: ibgp
- network:
- - address: 192.1.13.0/24
- backdoor: true
- redistribute:
- - protocol: connected
- route_map: map01
- - metric: 45
- protocol: kernel
- timers:
- keepalive: 35
-
-replaced:
- commands:
- - delete protocols bgp 65536 timers
- - delete protocols bgp 65536 maximum-paths
- - delete protocols bgp 65536 parameters router-id 192.1.2.9
- - delete protocols bgp 65536 parameters confederation
- - delete protocols bgp 65536 aggregate-address
- - delete protocols bgp 65536 network 192.1.13.0/24
- - delete protocols bgp 65536 redistribute kernel
- - delete protocols bgp 65536 redistribute connected
- - delete protocols bgp 65536 neighbor 5001::64
- - delete protocols bgp 65536 neighbor 203.0.113.5
- - delete protocols bgp 65536 neighbor 192.0.2.25
- - set protocols bgp 65536 neighbor 192.0.2.43 disable-connected-check
- - set protocols bgp 65536 neighbor 192.0.2.43 advertisement-interval 72
- - set protocols bgp 65536 neighbor 192.0.2.43 capability dynamic
- - set protocols bgp 65536 neighbor 192.0.2.43 timers holdtime 30
- - set protocols bgp 65536 neighbor 192.0.2.43 timers keepalive 10
- - set protocols bgp 65536 neighbor 203.0.113.0 capability orf prefix-list receive
- - set protocols bgp 65536 redistribute static route-map map01
- - set protocols bgp 65536 network 203.0.113.0/24 route-map map01
- - set protocols bgp 65536 parameters always-compare-med
- - set protocols bgp 65536 parameters dampening half-life 33
- - set protocols bgp 65536 parameters dampening max-suppress-time 20
- - set protocols bgp 65536 parameters dampening re-use 60
- - set protocols bgp 65536 parameters dampening start-suppress-time 5
-
-deleted:
- commands:
- - delete protocols bgp 65536 timers
- - delete protocols bgp 65536 maximum-paths
- - delete protocols bgp 65536 parameters
- - delete protocols bgp 65536 aggregate-address
- - delete protocols bgp 65536 network
- - delete protocols bgp 65536 redistribute
- - delete protocols bgp 65536 neighbor 5001::64
- - delete protocols bgp 65536 neighbor 203.0.113.5
- - delete protocols bgp 65536 neighbor 192.0.2.25
-
-rendered:
- commands:
- - set interfaces ethernet eth1 firewall in name 'INBOUND'
- - set interfaces ethernet eth1 firewall out name 'OUTBOUND'
- - set interfaces ethernet eth1 firewall local name 'LOCAL'
- - set interfaces ethernet eth1 firewall local ipv6-name 'V6-LOCAL'
- - set interfaces ethernet eth2 firewall in name 'INBOUND'
- - set interfaces ethernet eth2 firewall out name 'OUTBOUND'
- - set interfaces ethernet eth2 firewall local name 'LOCAL'
- - set interfaces ethernet eth2 firewall local ipv6-name 'V6-LOCAL'
-
-populate:
- global:
- aggregate_address:
- - prefix: 192.0.2.0/24
- summary_only: true
- - prefix: 203.0.113.0/24
- as_set: true
- as_number: 65536
- bgp_params:
- bestpath:
- as_path: confed
- compare_routerid: true
- confederation:
- - identifier: 66
- - peers: 20
- - peers: 55
- default:
- no_ipv4_unicast: true
- router_id: 192.1.2.9
- maximum_paths:
- - count: 20
- path: ebgp
- - count: 55
- path: ibgp
- neighbor:
- - address: 192.0.2.25
- disable_connected_check: true
- timers:
- holdtime: 30
- keepalive: 10
- - address: 203.0.113.5
- attribute_unchanged:
- as_path: true
- med: true
- next_hop: true
- ebgp_multihop: 2
- remote_as: 101
- update_source: 192.0.2.25
- - address: 5001::64
- distribute_list:
- - acl: 20
- action: export
- - acl: 40
- action: import
- maximum_prefix: 34
- network:
- - address: 192.1.13.0/24
- backdoor: true
- redistribute:
- - protocol: connected
- route_map: map01
- - metric: 45
- protocol: kernel
- timers:
- keepalive: 35
diff --git a/tests/integration/targets/vyos_bgp_global/vars/pre-v1_4.yaml b/tests/integration/targets/vyos_bgp_global/vars/pre-v1_4.yaml
new file mode 100644
index 00000000..efac1b98
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_global/vars/pre-v1_4.yaml
@@ -0,0 +1,91 @@
+---
+merged:
+ commands:
+ - set protocols bgp 65536 parameters bestpath as-path confed
+ - set protocols bgp 65536 parameters bestpath compare-routerid
+ - set protocols bgp 65536 parameters default local-pref 100
+ - set protocols bgp 65536 parameters router-id 192.1.2.9
+ - set protocols bgp 65536 timers keepalive 35
+ after:
+ as_number: 65536
+ bgp_params:
+ bestpath:
+ as_path: confed
+ compare_routerid: true
+ default:
+ local_pref: 100
+ router_id: 192.1.2.9
+ timers:
+ keepalive: 35
+
+replaced:
+ commands:
+ - delete protocols bgp 65536 timers
+ - delete protocols bgp 65536 parameters router-id 192.1.2.9
+ - delete protocols bgp 65536 parameters default
+ - delete protocols bgp 65536 parameters confederation
+ - delete protocols bgp 65536 neighbor 5001::64
+ - delete protocols bgp 65536 neighbor 203.0.113.5
+ - delete protocols bgp 65536 neighbor 192.0.2.25
+ - set protocols bgp 65536 neighbor 192.0.2.43 disable-connected-check
+ - set protocols bgp 65536 neighbor 192.0.2.43 advertisement-interval 72
+ - set protocols bgp 65536 neighbor 192.0.2.43 capability dynamic
+ - set protocols bgp 65536 neighbor 192.0.2.43 timers holdtime 30
+ - set protocols bgp 65536 neighbor 192.0.2.43 timers keepalive 10
+ - set protocols bgp 65536 neighbor 192.0.2.43 remote-as 102
+ - set protocols bgp 65536 neighbor 203.0.113.0 capability dynamic
+ - set protocols bgp 65536 neighbor 203.0.113.0 remote-as 102
+ - set protocols bgp 65536 parameters always-compare-med
+ - set protocols bgp 65536 parameters dampening half-life 33
+ - set protocols bgp 65536 parameters dampening max-suppress-time 20
+ - set protocols bgp 65536 parameters dampening re-use 60
+ - set protocols bgp 65536 parameters dampening start-suppress-time 5
+
+deleted:
+ commands:
+ - delete protocols bgp 65536 timers
+ - delete protocols bgp 65536 parameters
+ - delete protocols bgp 65536 neighbor 5001::64
+ - delete protocols bgp 65536 neighbor 203.0.113.5
+ - delete protocols bgp 65536 neighbor 192.0.2.25
+
+rendered:
+ commands:
+ - set interfaces ethernet eth1 firewall in name 'INBOUND'
+ - set interfaces ethernet eth1 firewall out name 'OUTBOUND'
+ - set interfaces ethernet eth1 firewall local name 'LOCAL'
+ - set interfaces ethernet eth1 firewall local ipv6-name 'V6-LOCAL'
+ - set interfaces ethernet eth2 firewall in name 'INBOUND'
+ - set interfaces ethernet eth2 firewall out name 'OUTBOUND'
+ - set interfaces ethernet eth2 firewall local name 'LOCAL'
+ - set interfaces ethernet eth2 firewall local ipv6-name 'V6-LOCAL'
+
+populate:
+ global:
+ as_number: 65536
+ bgp_params:
+ bestpath:
+ as_path: confed
+ compare_routerid: true
+ confederation:
+ - identifier: 66
+ - peers: 20
+ - peers: 55
+ default:
+ local_pref: 100
+ router_id: 192.1.2.9
+ neighbor:
+ - address: 192.0.2.25
+ disable_connected_check: true
+ timers:
+ holdtime: 30
+ keepalive: 10
+ remote_as: 102
+ - address: 203.0.113.5
+ ebgp_multihop: 2
+ remote_as: 101
+ update_source: 192.0.2.25
+ - address: 5001::64
+ remote_as: 103
+ timers:
+ keepalive: 35
diff --git a/tests/integration/targets/vyos_bgp_global/vars/v1_4.yaml b/tests/integration/targets/vyos_bgp_global/vars/v1_4.yaml
new file mode 100644
index 00000000..1dd462b1
--- /dev/null
+++ b/tests/integration/targets/vyos_bgp_global/vars/v1_4.yaml
@@ -0,0 +1,90 @@
+---
+merged:
+ commands:
+ - set protocols bgp system-as 65536
+ - set protocols bgp parameters bestpath as-path confed
+ - set protocols bgp parameters bestpath compare-routerid
+ - set protocols bgp parameters default local-pref 100
+ - set protocols bgp parameters router-id 192.1.2.9
+ - set protocols bgp timers keepalive 35
+ after:
+ as_number: 65536
+ bgp_params:
+ bestpath:
+ as_path: confed
+ compare_routerid: true
+ default:
+ local_pref: 100
+ router_id: 192.1.2.9
+ timers:
+ keepalive: 35
+
+replaced:
+ commands:
+ - delete protocols bgp timers
+ - delete protocols bgp parameters router-id 192.1.2.9
+ - delete protocols bgp parameters default
+ - delete protocols bgp parameters confederation
+ - delete protocols bgp neighbor 5001::64
+ - delete protocols bgp neighbor 203.0.113.5
+ - delete protocols bgp neighbor 192.0.2.25
+ - set protocols bgp neighbor 192.0.2.43 disable-connected-check
+ - set protocols bgp neighbor 192.0.2.43 advertisement-interval 72
+ - set protocols bgp neighbor 192.0.2.43 capability dynamic
+ - set protocols bgp neighbor 192.0.2.43 timers holdtime 30
+ - set protocols bgp neighbor 192.0.2.43 timers keepalive 10
+ - set protocols bgp neighbor 192.0.2.43 remote-as 102
+ - set protocols bgp neighbor 203.0.113.0 capability dynamic
+ - set protocols bgp neighbor 203.0.113.0 remote-as 102
+ - set protocols bgp parameters always-compare-med
+ - set protocols bgp parameters dampening half-life 33
+ - set protocols bgp parameters dampening max-suppress-time 20
+ - set protocols bgp parameters dampening re-use 60
+ - set protocols bgp parameters dampening start-suppress-time 5
+
+deleted:
+ commands:
+ - delete protocols bgp timers
+ - delete protocols bgp parameters
+ - delete protocols bgp neighbor 5001::64
+ - delete protocols bgp neighbor 203.0.113.5
+ - delete protocols bgp neighbor 192.0.2.25
+
+rendered:
+ commands:
+ - set interfaces ethernet eth1 firewall in name 'INBOUND'
+ - set interfaces ethernet eth1 firewall out name 'OUTBOUND'
+ - set interfaces ethernet eth1 firewall local name 'LOCAL'
+ - set interfaces ethernet eth1 firewall local ipv6-name 'V6-LOCAL'
+ - set interfaces ethernet eth2 firewall in name 'INBOUND'
+ - set interfaces ethernet eth2 firewall out name 'OUTBOUND'
+ - set interfaces ethernet eth2 firewall local name 'LOCAL'
+ - set interfaces ethernet eth2 firewall local ipv6-name 'V6-LOCAL'
+
+populate:
+ global:
+ as_number: 65536
+ bgp_params:
+ bestpath:
+ as_path: confed
+ compare_routerid: true
+ confederation:
+ - identifier: 66
+ - peers: 20
+ - peers: 55
+ router_id: 192.1.2.9
+ neighbor:
+ - address: 192.0.2.25
+ disable_connected_check: true
+ timers:
+ holdtime: 30
+ keepalive: 10
+ remote_as: 102
+ - address: 203.0.113.5
+ ebgp_multihop: 2
+ remote_as: 101
+ update_source: 192.0.2.25
+ - address: 5001::64
+ remote_as: 103
+ timers:
+ keepalive: 35
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_address_family_config_14.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_address_family_config_14.cfg
new file mode 100644
index 00000000..20b8ee28
--- /dev/null
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_address_family_config_14.cfg
@@ -0,0 +1,8 @@
+set protocols bgp system-as 65536
+set protocols bgp address-family ipv4-unicast aggregate-address 192.0.2.0/24 as-set
+set protocols bgp address-family ipv4-unicast network 192.1.13.0/24 route-map 'map01'
+set protocols bgp address-family ipv4-unicast network 192.2.13.0/24 backdoor
+set protocols bgp address-family ipv6-unicast redistribute ripng metric '20'
+set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast route-map export 'map01'
+set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast soft-reconfiguration inbound
+set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config.cfg
new file mode 100644
index 00000000..bc2704aa
--- /dev/null
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config.cfg
@@ -0,0 +1,5 @@
+set protocols bgp 65536 address-family ipv4-unicast network 192.1.13.0/24
+set protocols bgp 65536 address-family ipv4-unicast network 192.2.13.0/24 backdoor
+set protocols bgp 65536 address-family ipv6-unicast redistribute ripng metric '20'
+set protocols bgp 65536 address-family ipv4-unicast redistribute rip metric '15'
+set protocols bgp 65536 address-family ipv4-unicast redistribute ospf \ No newline at end of file
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config_14.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config_14.cfg
new file mode 100644
index 00000000..b09da39d
--- /dev/null
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_af_ops_config_14.cfg
@@ -0,0 +1,6 @@
+set protocols bgp system-as '65536'
+set protocols bgp address-family ipv4-unicast network 192.1.13.0/24
+set protocols bgp address-family ipv4-unicast network 192.2.13.0/24 backdoor
+set protocols bgp address-family ipv6-unicast redistribute ripng metric '20'
+set protocols bgp address-family ipv4-unicast redistribute rip metric '15'
+set protocols bgp address-family ipv4-unicast redistribute ospf \ No newline at end of file
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config.cfg
index 7d990d6b..7f6b1698 100644
--- a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config.cfg
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config.cfg
@@ -1,5 +1,4 @@
set protocols bgp 65536 neighbor 5001::64 address-family 'ipv6-unicast'
set protocols bgp 65536 neighbor 5001::64 ebgp-multihop '2'
-set protocols bgp 65536 neighbor 5001::64 maximum-prefix '34'
set protocols bgp 65536 neighbor 5001::64 remote-as '65535'
set protocols bgp 65536 neighbor 5001::64 update-source '2001:db8::1'
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config_14.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config_14.cfg
new file mode 100644
index 00000000..385ed1ec
--- /dev/null
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_af_config_14.cfg
@@ -0,0 +1,5 @@
+set protocols bgp system-as 65536
+set protocols bgp neighbor 5001::64 address-family 'ipv6-unicast'
+set protocols bgp neighbor 5001::64 ebgp-multihop '2'
+set protocols bgp neighbor 5001::64 remote-as '65535'
+set protocols bgp neighbor 5001::64 update-source '2001:db8::1'
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config.cfg
index 00c615fd..0142ccef 100644
--- a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config.cfg
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config.cfg
@@ -1,23 +1,13 @@
set protocols bgp 65536 neighbor 10.0.0.4 'disable-connected-check'
set protocols bgp 65536 neighbor 10.0.0.4 timers holdtime '30'
set protocols bgp 65536 neighbor 10.0.0.4 timers keepalive '10'
-set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged 'as-path'
-set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged 'med'
set protocols bgp 65536 neighbor 192.168.0.2 ebgp-multihop '2'
set protocols bgp 65536 neighbor 192.168.0.2 remote-as '65535'
-set protocols bgp 65536 neighbor 192.168.0.2 soft-reconfiguration 'inbound'
set protocols bgp 65536 neighbor 192.168.0.2 update-source '192.168.0.1'
set protocols bgp 65536 neighbor 2001:db8::2 ebgp-multihop '2'
-set protocols bgp 65536 neighbor 2001:db8::2 maximum-prefix '34'
set protocols bgp 65536 neighbor 2001:db8::2 remote-as '65535'
set protocols bgp 65536 neighbor 2001:db8::2 update-source '2001:db8::1'
-set protocols bgp 65536 network 172.16.42.32/27 'backdoor'
-set protocols bgp 65536 network 172.16.42.251/32 route-map 'map01'
set protocols bgp 65536 parameters bestpath as-path 'confed'
set protocols bgp 65536 parameters bestpath 'compare-routerid'
set protocols bgp 65536 parameters default 'no-ipv4-unicast'
set protocols bgp 65536 parameters router-id '10.1.1.1'
-set protocols bgp 65536 neighbor 10.0.0.4 capability orf prefix-list 'receive'
-set protocols bgp 65536 redistribute kernel route-map 'map01'
-set protocols bgp 65536 redistribute static metric '20'
-set protocols bgp 65536 redistribute static route-map 'map01'
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config_14.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config_14.cfg
new file mode 100644
index 00000000..f6674ecd
--- /dev/null
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_bgp_global_config_14.cfg
@@ -0,0 +1,14 @@
+set protocols bgp system-as 65536
+set protocols bgp neighbor 10.0.0.4 'disable-connected-check'
+set protocols bgp neighbor 10.0.0.4 timers holdtime '30'
+set protocols bgp neighbor 10.0.0.4 timers keepalive '10'
+set protocols bgp neighbor 192.168.0.2 ebgp-multihop '2'
+set protocols bgp neighbor 192.168.0.2 remote-as '65535'
+set protocols bgp neighbor 192.168.0.2 update-source '192.168.0.1'
+set protocols bgp neighbor 2001:db8::2 ebgp-multihop '2'
+set protocols bgp neighbor 2001:db8::2 remote-as '65535'
+set protocols bgp neighbor 2001:db8::2 update-source '2001:db8::1'
+set protocols bgp parameters bestpath as-path 'confed'
+set protocols bgp parameters bestpath 'compare-routerid'
+set protocols bgp parameters default 'no-ipv4-unicast'
+set protocols bgp parameters router-id '10.1.1.1'
diff --git a/tests/unit/modules/network/vyos/test_vyos_bgp_address_family.py b/tests/unit/modules/network/vyos/test_vyos_bgp_address_family.py
index 87b3ad9d..7ea9b2cd 100644
--- a/tests/unit/modules/network/vyos/test_vyos_bgp_address_family.py
+++ b/tests/unit/modules/network/vyos/test_vyos_bgp_address_family.py
@@ -29,11 +29,11 @@ from ansible_collections.vyos.vyos.tests.unit.modules.utils import set_module_ar
from .vyos_module import TestVyosModule, load_fixture
-class TestVyosBgpafModule(TestVyosModule):
+class TestVyosBgpafModule13(TestVyosModule):
module = vyos_bgp_address_family
def setUp(self):
- super(TestVyosBgpafModule, self).setUp()
+ super(TestVyosBgpafModule13, self).setUp()
self.mock_get_resource_connection_config = patch(
"ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base.get_resource_connection",
)
@@ -44,11 +44,25 @@ class TestVyosBgpafModule(TestVyosModule):
+ "bgp_address_family.bgp_address_family.Bgp_address_familyFacts.get_device_data",
)
self.execute_show_command = self.mock_execute_show_command.start()
+ self.mock_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.test_version = "1.2"
+ self.get_os_version = self.mock_get_os_version.start()
+ self.get_os_version.return_value = self.test_version
+ self.mock_facts_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.get_facts_os_version = self.mock_facts_get_os_version.start()
+ self.get_facts_os_version.return_value = self.test_version
+ self.maxDiff = None
def tearDown(self):
- super(TestVyosBgpafModule, self).tearDown()
+ super(TestVyosBgpafModule13, self).tearDown()
self.mock_get_resource_connection_config.stop()
self.mock_execute_show_command.stop()
+ self.mock_get_os_version.stop()
+ self.mock_facts_get_os_version.stop()
def load_fixtures(self, commands=None, filename=None):
if filename is None:
@@ -600,3 +614,177 @@ class TestVyosBgpafModule(TestVyosModule):
],
}
self.assertEqual(sorted(gather_list), sorted(result["gathered"]))
+
+
+class TestVyosBgpafOpsModule13(TestVyosModule):
+ module = vyos_bgp_address_family
+
+ def setUp(self):
+ super(TestVyosBgpafOpsModule13, self).setUp()
+ self.mock_get_resource_connection_config = patch(
+ "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base.get_resource_connection",
+ )
+ self.get_resource_connection_config = self.mock_get_resource_connection_config.start()
+
+ self.mock_execute_show_command = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts."
+ + "bgp_address_family.bgp_address_family.Bgp_address_familyFacts.get_device_data",
+ )
+ self.execute_show_command = self.mock_execute_show_command.start()
+ self.mock_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.test_version = "1.2"
+ self.get_os_version = self.mock_get_os_version.start()
+ self.get_os_version.return_value = self.test_version
+ self.mock_facts_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.get_facts_os_version = self.mock_facts_get_os_version.start()
+ self.get_facts_os_version.return_value = self.test_version
+ self.maxDiff = None
+
+ def tearDown(self):
+ super(TestVyosBgpafOpsModule13, self).tearDown()
+ self.mock_get_resource_connection_config.stop()
+ self.mock_execute_show_command.stop()
+ self.mock_get_os_version.stop()
+ self.mock_facts_get_os_version.stop()
+
+ def load_fixtures(self, commands=None, filename=None):
+ if filename is None:
+ filename = "vyos_bgp_af_ops_config.cfg"
+
+ def load_from_file(*args, **kwargs):
+ output = load_fixture(filename)
+ return output
+
+ self.execute_show_command.side_effect = load_from_file
+
+ def test_vyos_bgp_address_family_merged(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.3.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ospfv3", metric=20)],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "set protocols bgp 65536 address-family ipv4-unicast network 192.3.13.0/24 backdoor",
+ "set protocols bgp 65536 address-family ipv6-unicast redistribute ospfv3 metric 20",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_replaced(self):
+ set_module_args(
+ dict(
+ state="replaced",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.1.13.0/24", backdoor=True),
+ ],
+ redistribute=[
+ dict(protocol="ospf", metric=25),
+ ]
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[
+ dict(protocol="ospfv3", metric=20),
+ dict(protocol="ripng")
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp 65536 address-family ipv6-unicast redistribute ripng metric",
+ "delete protocols bgp 65536 address-family ipv4-unicast network 192.2.13.0/24",
+ "delete protocols bgp 65536 address-family ipv4-unicast redistribute rip",
+ "set protocols bgp 65536 address-family ipv4-unicast redistribute ospf metric 25",
+ "set protocols bgp 65536 address-family ipv4-unicast network 192.1.13.0/24 backdoor",
+ "set protocols bgp 65536 address-family ipv6-unicast redistribute ospfv3 metric 20",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_overridden(self):
+ set_module_args(
+ dict(
+ state="overridden",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.1.13.0/24", backdoor=True),
+ ],
+ redistribute=[
+ dict(protocol="ospf", metric=25),
+ ]
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[
+ dict(protocol="ospfv3", metric=20),
+ dict(protocol="ripng")
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp 65536 address-family ipv6-unicast redistribute ripng metric",
+ "delete protocols bgp 65536 address-family ipv4-unicast network 192.2.13.0/24",
+ "delete protocols bgp 65536 address-family ipv4-unicast redistribute rip",
+ "set protocols bgp 65536 address-family ipv4-unicast redistribute ospf metric 25",
+ "set protocols bgp 65536 address-family ipv4-unicast network 192.1.13.0/24 backdoor",
+ "set protocols bgp 65536 address-family ipv6-unicast redistribute ospfv3 metric 20",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_deleted(self):
+ set_module_args(
+ dict(
+ state="deleted",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.2.13.0/24"),
+ ]
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng")],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp 65536 address-family ipv4-unicast",
+ "delete protocols bgp 65536 address-family ipv6-unicast",
+ ]
+
+ self.execute_module(changed=True, commands=commands)
diff --git a/tests/unit/modules/network/vyos/test_vyos_bgp_address_family14.py b/tests/unit/modules/network/vyos/test_vyos_bgp_address_family14.py
new file mode 100644
index 00000000..9e615ff0
--- /dev/null
+++ b/tests/unit/modules/network/vyos/test_vyos_bgp_address_family14.py
@@ -0,0 +1,1000 @@
+# (c) 2016 Red Hat Inc.
+#
+# This file is part of Ansible
+#
+# Ansible is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Ansible is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
+
+# Make coding more python3-ish
+from __future__ import absolute_import, division, print_function
+
+
+__metaclass__ = type
+
+from unittest.mock import patch
+
+from ansible_collections.vyos.vyos.plugins.modules import vyos_bgp_address_family
+from ansible_collections.vyos.vyos.tests.unit.modules.utils import set_module_args
+
+from .vyos_module import TestVyosModule, load_fixture
+
+
+class TestVyosBgpafModule14(TestVyosModule):
+ module = vyos_bgp_address_family
+
+ def setUp(self):
+ super(TestVyosBgpafModule14, self).setUp()
+ self.mock_get_resource_connection_config = patch(
+ "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base.get_resource_connection",
+ )
+ self.get_resource_connection_config = self.mock_get_resource_connection_config.start()
+
+ self.mock_execute_show_command = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts."
+ + "bgp_address_family.bgp_address_family.Bgp_address_familyFacts.get_device_data",
+ )
+ self.execute_show_command = self.mock_execute_show_command.start()
+ self.mock_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.test_version = "1.4"
+ self.get_os_version = self.mock_get_os_version.start()
+ self.get_os_version.return_value = self.test_version
+ self.mock_facts_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.get_facts_os_version = self.mock_facts_get_os_version.start()
+ self.get_facts_os_version.return_value = self.test_version
+ self.maxDiff = None
+
+ def tearDown(self):
+ super(TestVyosBgpafModule14, self).tearDown()
+ self.mock_get_resource_connection_config.stop()
+ self.mock_execute_show_command.stop()
+ self.mock_get_os_version.stop()
+ self.mock_facts_get_os_version.stop()
+
+ def load_fixtures(self, commands=None, filename=None):
+ if filename is None:
+ filename = "vyos_bgp_address_family_config_14.cfg"
+
+ def load_from_file(*args, **kwargs):
+ output = load_fixture(filename)
+ return output
+
+ self.execute_show_command.side_effect = load_from_file
+
+ def test_vyos_bgp_address_family_merged_idempotent(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_vyos_bgp_address_family_merged(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", summary_only=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ospfv3", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.10.21.25",
+ address_family=[
+ dict(
+ afi="ipv6",
+ distribute_list=[dict(action="export", acl=10)],
+ route_server_client=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv4",
+ filter_list=[
+ dict(action="export", path_list="list01"),
+ ],
+ capability=dict(orf="send"),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "set protocols bgp address-family ipv4-unicast aggregate-address 192.0.2.0/24 as-setipv4-unicast aggregate-address 192.0.2.0/24 summary-only",
+ "set protocols bgp address-family ipv6-unicast redistribute ospfv3 metric 20",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv4-unicast filter-list export list01",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv4-unicast capability prefix-list send",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv6-unicast distribute-list export 10",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv6-unicast route-server-client",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_replaced_idempotent(self):
+ set_module_args(
+ dict(
+ state="replaced",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_vyos_bgp_address_family_replaced(self):
+ set_module_args(
+ dict(
+ state="replaced",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", summary_only=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ospfv3", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.10.21.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="import", route_map="map01")],
+ ),
+ dict(
+ afi="ipv6",
+ distribute_list=[dict(action="export", acl=10)],
+ route_server_client=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv4",
+ filter_list=[
+ dict(action="export", path_list="list01"),
+ ],
+ capability=dict(orf="send"),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged",
+ "delete protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast soft-reconfiguration",
+ "delete protocols bgp address-family ipv6-unicast redistribute ripng",
+ "delete protocols bgp address-family ipv4-unicast network 192.2.13.0/24",
+ "set protocols bgp address-family ipv4-unicast aggregate-address 192.0.2.0/24 summary-only",
+ "set protocols bgp address-family ipv6-unicast redistribute ospfv3 metric 20",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv4-unicast route-map import map01",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv6-unicast distribute-list export 10",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv6-unicast route-server-client",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv4-unicast filter-list export list01",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv4-unicast capability prefix-list send",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_overridden_idempotent(self):
+ set_module_args(
+ dict(
+ state="overridden",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_vyos_bgp_address_family_overridden(self):
+ set_module_args(
+ dict(
+ state="overridden",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ospfv3", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.10.21.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="import", route_map="map01")],
+ ),
+ dict(
+ afi="ipv6",
+ distribute_list=[dict(action="export", acl=10)],
+ route_server_client=True,
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp neighbor 203.0.113.5 address-family",
+ "delete protocols bgp neighbor 192.0.2.25 address-family",
+ "delete protocols bgp address-family ipv6-unicast redistribute ripng",
+ "delete protocols bgp address-family ipv4 aggregate-address",
+ "delete protocols bgp address-family ipv4-unicast network 192.2.13.0/24",
+ "set protocols bgp address-family ipv6-unicast redistribute ospfv3 metric 20",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv4-unicast route-map import map01",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv6-unicast distribute-list export 10",
+ "set protocols bgp neighbor 192.10.21.25 address-family ipv6-unicast route-server-client",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_deleted(self):
+ set_module_args(
+ dict(
+ state="deleted",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp address-family ipv4-unicast",
+ "delete protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast",
+ "delete protocols bgp neighbor 203.0.113.5 address-family",
+ ]
+
+ self.execute_module(changed=True, commands=commands)
+
+ # def test_vyos_bgp_address_family_incorrect_instance(self):
+ # set_module_args(
+ # dict(
+ # state="overridden",
+ # config=dict(
+ # as_number=100,
+ # address_family=[
+ # dict(
+ # afi="ipv4",
+ # networks=[
+ # dict(prefix="192.1.13.0/24", route_map="map01"),
+ # ],
+ # ),
+ # dict(
+ # afi="ipv6",
+ # redistribute=[dict(protocol="ospfv3", metric=20)],
+ # ),
+ # ],
+ # neighbors=[
+ # dict(
+ # neighbor_address="192.10.21.25",
+ # address_family=[
+ # dict(
+ # afi="ipv4",
+ # route_map=[dict(action="import", route_map="map01")],
+ # ),
+ # dict(
+ # afi="ipv6",
+ # distribute_list=[dict(action="export", acl=10)],
+ # route_server_client=True,
+ # ),
+ # ],
+ # ),
+ # ],
+ # ),
+ # ),
+ # )
+ # result = self.execute_module(failed=True)
+ # self.assertIn("Only one bgp instance is allowed per device", result["msg"])
+
+ def test_vyos_bgp_address_family_rendered(self):
+ set_module_args(
+ dict(
+ state="rendered",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ rendered_cmds = [
+ "set protocols bgp system-as 65536",
+ "set protocols bgp address-family ipv4-unicast network 192.1.13.0/24 route-map map01",
+ "set protocols bgp address-family ipv4-unicast network 192.2.13.0/24 backdoor",
+ "set protocols bgp address-family ipv4-unicast aggregate-address 192.0.2.0/24 as-set",
+ "set protocols bgp address-family ipv6-unicast redistribute ripng metric 20",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast route-map export map01",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast soft-reconfiguration inbound",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop",
+ ]
+ result = self.execute_module(changed=False)
+ self.assertEqual(
+ sorted(result["rendered"]),
+ sorted(rendered_cmds),
+ result["rendered"],
+ )
+
+ def test_vyos_bgp_address_family_parsed(self):
+ commands = [
+ "set protocols bgp system-as 65536",
+ "set protocols bgp address-family ipv4-unicast network 192.1.13.0/24 route-map map01",
+ "set protocols bgp address-family ipv4-unicast network 192.2.13.0/24 backdoor",
+ "set protocols bgp address-family ipv4-unicast aggregate-address 192.0.2.0/24 as-set",
+ "set protocols bgp address-family ipv6-unicast redistribute ripng metric 20",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast route-map export map01",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast soft-reconfiguration inbound",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop",
+ ]
+
+ parsed_str = "\n".join(commands)
+ set_module_args(dict(running_config=parsed_str, state="parsed"))
+ result = self.execute_module(changed=False)
+ parsed_list = {
+ "as_number": 65536,
+ "address_family": [
+ {
+ "afi": "ipv4",
+ "networks": [
+ {"prefix": "192.1.13.0/24", "route_map": "map01"},
+ {"prefix": "192.2.13.0/24", "backdoor": True},
+ ],
+ "aggregate_address": [{"prefix": "192.0.2.0/24", "as_set": True}],
+ },
+ {
+ "afi": "ipv6",
+ "redistribute": [{"protocol": "ripng", "metric": 20}],
+ },
+ ],
+ "neighbors": [
+ {
+ "neighbor_address": "192.0.2.25",
+ "address_family": [
+ {"afi": "ipv4", "soft_reconfiguration": True},
+ ],
+ },
+ {
+ "neighbor_address": "203.0.113.5",
+ "address_family": [
+ {
+ "afi": "ipv6",
+ "attribute_unchanged": {"next_hop": True},
+ },
+ ],
+ },
+ ],
+ }
+ self.assertEqual(sorted(parsed_list), sorted(result["parsed"]))
+
+ def test_vyos_bgp_address_family_gathered(self):
+ set_module_args(dict(state="gathered"))
+ result = self.execute_module(changed=False)
+ gather_list = {
+ "as_number": 65536,
+ "address_family": [
+ {
+ "afi": "ipv4",
+ "networks": [
+ {"prefix": "192.1.13.0/24", "route_map": "map01"},
+ {"prefix": "192.2.13.0/24", "backdoor": True},
+ ],
+ "aggregate_address": [{"prefix": "192.0.2.0/24", "as_set": True}],
+ },
+ {
+ "afi": "ipv6",
+ "redistribute": [{"protocol": "ripng", "metric": 20}],
+ },
+ ],
+ "neighbors": [
+ {
+ "neighbor_address": "192.0.2.25",
+ "address_family": [
+ {"afi": "ipv4", "soft_reconfiguration": True},
+ ],
+ },
+ {
+ "neighbor_address": "203.0.113.5",
+ "address_family": [
+ {
+ "afi": "ipv6",
+ "attribute_unchanged": {"next_hop": True},
+ },
+ ],
+ },
+ ],
+ }
+ self.assertEqual(sorted(gather_list), sorted(result["gathered"]))
+
+ def test_vyos_bgp_address_family_replaced_asn(self):
+ set_module_args(
+ dict(
+ state="replaced",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_vyos_bgp_address_family_overridden_asn(self):
+ set_module_args(
+ dict(
+ state="overridden",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_vyos_bgp_address_family_replaced_asn(self):
+ set_module_args(
+ dict(
+ state="replaced",
+ config=dict(
+ as_number=65540,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "set protocols bgp system-as 65540",
+ "set protocols bgp address-family ipv4-unicast aggregate-address 192.0.2.0/24 as-set",
+ "set protocols bgp address-family ipv4-unicast network 192.1.13.0/24 route-map map01",
+ "set protocols bgp address-family ipv4-unicast network 192.2.13.0/24 backdoor",
+ "set protocols bgp address-family ipv6-unicast redistribute ripng metric 20",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast route-map export map01",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast soft-reconfiguration inbound",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_overridden_asn(self):
+ set_module_args(
+ dict(
+ state="overridden",
+ config=dict(
+ as_number=65540,
+ address_family=[
+ dict(
+ afi="ipv4",
+ aggregate_address=[dict(prefix="192.0.2.0/24", as_set=True)],
+ networks=[
+ dict(prefix="192.1.13.0/24", route_map="map01"),
+ dict(prefix="192.2.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng", metric=20)],
+ ),
+ ],
+ neighbors=[
+ dict(
+ neighbor_address="192.0.2.25",
+ address_family=[
+ dict(
+ afi="ipv4",
+ route_map=[dict(action="export", route_map="map01")],
+ soft_reconfiguration=True,
+ ),
+ ],
+ ),
+ dict(
+ neighbor_address="203.0.113.5",
+ address_family=[
+ dict(
+ afi="ipv6",
+ attribute_unchanged=dict(next_hop=True),
+ ),
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp address-family ipv4 aggregate-address",
+ "delete protocols bgp address-family ipv4 network",
+ "delete protocols bgp address-family ipv6 redistribute",
+ "delete protocols bgp neighbor 192.0.2.25 address-family",
+ "delete protocols bgp neighbor 203.0.113.5 address-family",
+ "set protocols bgp system-as 65540",
+ "set protocols bgp address-family ipv4-unicast aggregate-address 192.0.2.0/24 as-set",
+ "set protocols bgp address-family ipv4-unicast network 192.1.13.0/24 route-map map01",
+ "set protocols bgp address-family ipv4-unicast network 192.2.13.0/24 backdoor",
+ "set protocols bgp address-family ipv6-unicast redistribute ripng metric 20",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast route-map export map01",
+ "set protocols bgp neighbor 192.0.2.25 address-family ipv4-unicast soft-reconfiguration inbound",
+ "set protocols bgp neighbor 203.0.113.5 address-family ipv6-unicast attribute-unchanged next-hop",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+
+class TestVyosBgpafOpsModule14(TestVyosModule):
+ module = vyos_bgp_address_family
+
+ def setUp(self):
+ super(TestVyosBgpafOpsModule14, self).setUp()
+ self.mock_get_resource_connection_config = patch(
+ "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base.get_resource_connection",
+ )
+ self.get_resource_connection_config = self.mock_get_resource_connection_config.start()
+
+ self.mock_execute_show_command = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts."
+ + "bgp_address_family.bgp_address_family.Bgp_address_familyFacts.get_device_data",
+ )
+ self.execute_show_command = self.mock_execute_show_command.start()
+ self.mock_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.test_version = "1.4"
+ self.get_os_version = self.mock_get_os_version.start()
+ self.get_os_version.return_value = self.test_version
+ self.mock_facts_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.bgp_address_family.bgp_address_family.get_os_version"
+ )
+ self.get_facts_os_version = self.mock_facts_get_os_version.start()
+ self.get_facts_os_version.return_value = self.test_version
+ self.maxDiff = None
+
+ def tearDown(self):
+ super(TestVyosBgpafOpsModule14, self).tearDown()
+ self.mock_get_resource_connection_config.stop()
+ self.mock_execute_show_command.stop()
+ self.mock_get_os_version.stop()
+ self.mock_facts_get_os_version.stop()
+
+ def load_fixtures(self, commands=None, filename=None):
+ if filename is None:
+ filename = "vyos_bgp_af_ops_config_14.cfg"
+
+ def load_from_file(*args, **kwargs):
+ output = load_fixture(filename)
+ return output
+
+ self.execute_show_command.side_effect = load_from_file
+
+ def test_vyos_bgp_address_family_merged(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.3.13.0/24", backdoor=True),
+ ],
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ospfv3", metric=20)],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "set protocols bgp address-family ipv4-unicast network 192.3.13.0/24 backdoor",
+ "set protocols bgp address-family ipv6-unicast redistribute ospfv3 metric 20",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_replaced(self):
+ set_module_args(
+ dict(
+ state="replaced",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.1.13.0/24", backdoor=True),
+ ],
+ redistribute=[
+ dict(protocol="ospf", metric=25),
+ ]
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[
+ dict(protocol="ospfv3", metric=20),
+ dict(protocol="ripng")
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp address-family ipv6-unicast redistribute ripng metric",
+ "delete protocols bgp address-family ipv4-unicast network 192.2.13.0/24",
+ "delete protocols bgp address-family ipv4-unicast redistribute rip",
+ "set protocols bgp address-family ipv4-unicast redistribute ospf metric 25",
+ "set protocols bgp address-family ipv4-unicast network 192.1.13.0/24 backdoor",
+ "set protocols bgp address-family ipv6-unicast redistribute ospfv3 metric 20",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_overridden(self):
+ set_module_args(
+ dict(
+ state="overridden",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.1.13.0/24", backdoor=True),
+ ],
+ redistribute=[
+ dict(protocol="ospf", metric=25),
+ ]
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[
+ dict(protocol="ospfv3", metric=20),
+ dict(protocol="ripng")
+ ],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp address-family ipv6-unicast redistribute ripng metric",
+ "delete protocols bgp address-family ipv4-unicast network 192.2.13.0/24",
+ "delete protocols bgp address-family ipv4-unicast redistribute rip",
+ "set protocols bgp address-family ipv4-unicast redistribute ospf metric 25",
+ "set protocols bgp address-family ipv4-unicast network 192.1.13.0/24 backdoor",
+ "set protocols bgp address-family ipv6-unicast redistribute ospfv3 metric 20",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_address_family_deleted(self):
+ set_module_args(
+ dict(
+ state="deleted",
+ config=dict(
+ as_number=65536,
+ address_family=[
+ dict(
+ afi="ipv4",
+ networks=[
+ dict(prefix="192.2.13.0/24"),
+ ]
+ ),
+ dict(
+ afi="ipv6",
+ redistribute=[dict(protocol="ripng")],
+ ),
+ ],
+ ),
+ ),
+ )
+ commands = [
+ "delete protocols bgp address-family ipv4-unicast",
+ "delete protocols bgp address-family ipv6-unicast",
+ ]
+
+ self.execute_module(changed=True, commands=commands)
diff --git a/tests/unit/modules/network/vyos/test_vyos_bgp_global.py b/tests/unit/modules/network/vyos/test_vyos_bgp_global.py
index 99d17ce5..e363f77b 100644
--- a/tests/unit/modules/network/vyos/test_vyos_bgp_global.py
+++ b/tests/unit/modules/network/vyos/test_vyos_bgp_global.py
@@ -55,6 +55,18 @@ class TestVyosBgpglobalModule(TestVyosModule):
)
self.execute_show_command = self.mock_execute_show_command.start()
+ self.mock_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.bgp_global.bgp_global.get_os_version",
+ )
+ self.test_version = "1.2"
+ self.get_os_version = self.mock_get_os_version.start()
+ self.get_os_version.return_value = self.test_version
+ self.mock_facts_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.bgp_global.bgp_global.get_os_version",
+ )
+ self.get_facts_os_version = self.mock_facts_get_os_version.start()
+ self.get_facts_os_version.return_value = self.test_version
+ self.maxDiff = None
def tearDown(self):
super(TestVyosBgpglobalModule, self).tearDown()
@@ -62,6 +74,8 @@ class TestVyosBgpglobalModule(TestVyosModule):
self.mock_get_resource_connection_facts.stop()
self.mock_execute_show_command.stop()
self.mock_execute_show_command_config.stop()
+ self.mock_get_os_version.stop()
+ self.mock_facts_get_os_version.stop()
def load_fixtures(self, commands=None, filename=None):
if filename is None:
@@ -84,38 +98,34 @@ class TestVyosBgpglobalModule(TestVyosModule):
address="10.0.0.4",
disable_connected_check=True,
timers=dict(holdtime=30, keepalive=10),
- capability=dict(orf="receive"),
),
dict(
address="192.168.0.2",
- attribute_unchanged=dict(as_path=True, med=True),
ebgp_multihop=2,
remote_as="65535",
- soft_reconfiguration=True,
update_source="192.168.0.1",
),
dict(
address="2001:db8::2",
ebgp_multihop=2,
remote_as="65535",
- maximum_prefix=34,
update_source="2001:db8::1",
),
],
- network=[
- dict(address="172.16.42.32/27", backdoor=True),
- dict(address="172.16.42.251/32", route_map="map01"),
- ],
+ # network=[
+ # dict(address="172.16.42.32/27", backdoor=True),
+ # dict(address="172.16.42.251/32", route_map="map01"),
+ # ],
bgp_params=dict(
bestpath=dict(as_path="confed", compare_routerid=True),
default=dict(no_ipv4_unicast=True),
router_id="10.1.1.1",
),
- redistribute=[
- dict(protocol="kernel", route_map="map01"),
- dict(protocol="static", metric=20),
- dict(protocol="static", route_map="map01"),
- ],
+ # redistribute=[
+ # dict(protocol="kernel", route_map="map01"),
+ # dict(protocol="static", metric=20),
+ # dict(protocol="static", route_map="map01"),
+ # ],
),
state="merged",
),
@@ -127,21 +137,12 @@ class TestVyosBgpglobalModule(TestVyosModule):
dict(
config=dict(
as_number="65536",
- maximum_paths=[
- dict(path="ebgp", count=20),
- dict(path="ibgp", count=45),
- ],
neighbor=[
dict(
address="2001:db8::2",
ebgp_multihop=2,
remote_as="65535",
- maximum_prefix=34,
update_source="2001:db8::1",
- distribute_list=[
- dict(action="export", acl=31),
- dict(action="import", acl=9),
- ],
),
],
bgp_params=dict(
@@ -153,12 +154,8 @@ class TestVyosBgpglobalModule(TestVyosModule):
),
)
commands = [
- "set protocols bgp 65536 neighbor 2001:db8::2 distribute-list export 31",
- "set protocols bgp 65536 neighbor 2001:db8::2 distribute-list import 9",
"set protocols bgp 65536 parameters confederation peers 20",
"set protocols bgp 65536 parameters confederation identifier 66",
- "set protocols bgp 65536 maximum-paths ebgp 20",
- "set protocols bgp 65536 maximum-paths ibgp 45",
]
self.execute_module(changed=True, commands=commands)
@@ -172,38 +169,34 @@ class TestVyosBgpglobalModule(TestVyosModule):
address="10.0.0.4",
disable_connected_check=True,
timers=dict(holdtime=30, keepalive=10),
- capability=dict(orf="receive"),
),
dict(
address="192.168.0.2",
- attribute_unchanged=dict(as_path=True, med=True),
ebgp_multihop=2,
remote_as="65535",
- soft_reconfiguration=True,
update_source="192.168.0.1",
),
dict(
address="2001:db8::2",
ebgp_multihop=2,
remote_as="65535",
- maximum_prefix=34,
update_source="2001:db8::1",
),
],
- network=[
- dict(address="172.16.42.32/27", backdoor=True),
- dict(address="172.16.42.251/32", route_map="map01"),
- ],
+ # network=[
+ # dict(address="172.16.42.32/27", backdoor=True),
+ # dict(address="172.16.42.251/32", route_map="map01"),
+ # ],
bgp_params=dict(
bestpath=dict(as_path="confed", compare_routerid=True),
default=dict(no_ipv4_unicast=True),
router_id="10.1.1.1",
),
- redistribute=[
- dict(protocol="kernel", route_map="map01"),
- dict(protocol="static", metric=20),
- dict(protocol="static", route_map="map01"),
- ],
+ # redistribute=[
+ # dict(protocol="kernel", route_map="map01"),
+ # dict(protocol="static", metric=20),
+ # dict(protocol="static", route_map="map01"),
+ # ],
),
state="replaced",
),
@@ -220,19 +213,11 @@ class TestVyosBgpglobalModule(TestVyosModule):
neighbor=[
dict(
address="200.11.155.3",
- prefix_list=[
- dict(action="export", prefix_list=10),
- ],
- allowas_in=10,
),
dict(
address="2001:db8::2",
remote_as="65535",
- as_override=True,
default_originate="map01",
- route_map=[
- dict(action="export", route_map="map01"),
- ],
),
],
bgp_params=dict(
@@ -249,17 +234,12 @@ class TestVyosBgpglobalModule(TestVyosModule):
"delete protocols bgp 65536 parameters default",
"delete protocols bgp 65536 parameters bestpath compare-routerid",
"delete protocols bgp 65536 parameters bestpath as-path confed",
- "delete protocols bgp 65536 network",
- "delete protocols bgp 65536 redistribute",
+ # "delete protocols bgp 65536 network",
+ # "delete protocols bgp 65536 redistribute",
"delete protocols bgp 65536 neighbor 2001:db8::2 update-source 2001:db8::1",
- "delete protocols bgp 65536 neighbor 2001:db8::2 maximum-prefix 34",
"delete protocols bgp 65536 neighbor 2001:db8::2 ebgp-multihop 2",
"delete protocols bgp 65536 neighbor 192.168.0.2",
"delete protocols bgp 65536 neighbor 10.0.0.4",
- "set protocols bgp 65536 neighbor 200.11.155.3 prefix-list export 10",
- "set protocols bgp 65536 neighbor 200.11.155.3 allowas-in number 10",
- "set protocols bgp 65536 neighbor 2001:db8::2 as-override",
- "set protocols bgp 65536 neighbor 2001:db8::2 route-map export map01",
"set protocols bgp 65536 parameters log-neighbor-changes",
"set protocols bgp 65536 parameters no-client-to-client-reflection",
"set protocols bgp 65536 parameters confederation peers 20",
@@ -286,19 +266,11 @@ class TestVyosBgpglobalModule(TestVyosModule):
neighbor=[
dict(
address="200.11.155.3",
- prefix_list=[
- dict(action="export", prefix_list=10),
- ],
- allowas_in=10,
),
dict(
address="2001:db8::2",
remote_as="65535",
- as_override=True,
default_originate="map01",
- route_map=[
- dict(action="export", route_map="map01"),
- ],
),
],
bgp_params=dict(
@@ -323,19 +295,11 @@ class TestVyosBgpglobalModule(TestVyosModule):
neighbor=[
dict(
address="200.11.155.3",
- prefix_list=[
- dict(action="export", prefix_list=10),
- ],
- allowas_in=10,
),
dict(
address="2001:db8::2",
remote_as="65535",
- as_override=True,
default_originate="map01",
- route_map=[
- dict(action="export", route_map="map01"),
- ],
),
],
bgp_params=dict(
@@ -364,38 +328,34 @@ class TestVyosBgpglobalModule(TestVyosModule):
address="10.0.0.4",
disable_connected_check=True,
timers=dict(holdtime=30, keepalive=10),
- capability=dict(orf="receive"),
),
dict(
address="192.168.0.2",
- attribute_unchanged=dict(as_path=True, med=True),
ebgp_multihop=2,
remote_as="65535",
- soft_reconfiguration=True,
update_source="192.168.0.1",
),
dict(
address="2001:db8::2",
ebgp_multihop=2,
remote_as="65535",
- maximum_prefix=34,
update_source="2001:db8::1",
),
],
- network=[
- dict(address="172.16.42.32/27", backdoor=True),
- dict(address="172.16.42.251/32", route_map="map01"),
- ],
+ # network=[
+ # dict(address="172.16.42.32/27", backdoor=True),
+ # dict(address="172.16.42.251/32", route_map="map01"),
+ # ],
bgp_params=dict(
bestpath=dict(as_path="confed", compare_routerid=True),
default=dict(no_ipv4_unicast=True),
router_id="10.1.1.1",
),
- redistribute=[
- dict(protocol="kernel", route_map="map01"),
- dict(protocol="static", metric=20),
- dict(protocol="static", route_map="map01"),
- ],
+ # redistribute=[
+ # dict(protocol="kernel", route_map="map01"),
+ # dict(protocol="static", metric=20),
+ # dict(protocol="static", route_map="map01"),
+ # ],
),
state="rendered",
),
@@ -404,22 +364,16 @@ class TestVyosBgpglobalModule(TestVyosModule):
"set protocols bgp 65536 neighbor 10.0.0.4 disable-connected-check",
"set protocols bgp 65536 neighbor 10.0.0.4 timers holdtime 30",
"set protocols bgp 65536 neighbor 10.0.0.4 timers keepalive 10",
- "set protocols bgp 65536 neighbor 10.0.0.4 capability orf prefix-list receive",
- "set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged as-path",
- "set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged med",
- "set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged next-hop",
"set protocols bgp 65536 neighbor 192.168.0.2 ebgp-multihop 2",
"set protocols bgp 65536 neighbor 192.168.0.2 remote-as 65535",
- "set protocols bgp 65536 neighbor 192.168.0.2 soft-reconfiguration",
"set protocols bgp 65536 neighbor 192.168.0.2 update-source 192.168.0.1",
"set protocols bgp 65536 neighbor 2001:db8::2 ebgp-multihop 2",
"set protocols bgp 65536 neighbor 2001:db8::2 remote-as 65535",
- "set protocols bgp 65536 neighbor 2001:db8::2 maximum-prefix 34",
"set protocols bgp 65536 neighbor 2001:db8::2 update-source 2001:db8::1",
- "set protocols bgp 65536 redistribute kernel route-map map01",
- "set protocols bgp 65536 redistribute static route-map map01",
- "set protocols bgp 65536 network 172.16.42.32/27 backdoor",
- "set protocols bgp 65536 network 172.16.42.251/32 route-map map01",
+ # "set protocols bgp 65536 redistribute kernel route-map map01",
+ # "set protocols bgp 65536 redistribute static route-map map01",
+ # "set protocols bgp 65536 network 172.16.42.32/27 backdoor",
+ # "set protocols bgp 65536 network 172.16.42.251/32 route-map map01",
"set protocols bgp 65536 parameters bestpath as-path confed",
"set protocols bgp 65536 parameters bestpath compare-routerid",
"set protocols bgp 65536 parameters default no-ipv4-unicast",
@@ -437,22 +391,16 @@ class TestVyosBgpglobalModule(TestVyosModule):
"set protocols bgp 65536 neighbor 10.0.0.4 disable-connected-check",
"set protocols bgp 65536 neighbor 10.0.0.4 timers holdtime 30",
"set protocols bgp 65536 neighbor 10.0.0.4 timers keepalive 10",
- "set protocols bgp 65536 neighbor 10.0.0.4 capability orf prefix-list receive",
- "set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged as-path",
- "set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged med",
- "set protocols bgp 65536 neighbor 192.168.0.2 attribute-unchanged next-hop",
"set protocols bgp 65536 neighbor 192.168.0.2 ebgp-multihop 2",
"set protocols bgp 65536 neighbor 192.168.0.2 remote-as 65535",
- "set protocols bgp 65536 neighbor 192.168.0.2 soft-reconfiguration",
"set protocols bgp 65536 neighbor 192.168.0.2 update-source 192.168.0.1",
"set protocols bgp 65536 neighbor 2001:db8::2 ebgp-multihop 2",
"set protocols bgp 65536 neighbor 2001:db8::2 remote-as 65535",
- "set protocols bgp 65536 neighbor 2001:db8::2 maximum-prefix 34",
"set protocols bgp 65536 neighbor 2001:db8::2 update-source 2001:db8::1",
- "set protocols bgp 65536 redistribute kernel route-map map01",
- "set protocols bgp 65536 redistribute static route-map map01",
- "set protocols bgp 65536 network 172.16.42.32/27 backdoor",
- "set protocols bgp 65536 network 172.16.42.251/32 route-map map01",
+ # "set protocols bgp 65536 redistribute kernel route-map map01",
+ # "set protocols bgp 65536 redistribute static route-map map01",
+ # "set protocols bgp 65536 network 172.16.42.32/27 backdoor",
+ # "set protocols bgp 65536 network 172.16.42.251/32 route-map map01",
"set protocols bgp 65536 parameters bestpath as-path confed",
"set protocols bgp 65536 parameters bestpath compare-routerid",
"set protocols bgp 65536 parameters default no-ipv4-unicast",
@@ -471,17 +419,11 @@ class TestVyosBgpglobalModule(TestVyosModule):
"neighbor": [
{
"address": "10.0.0.4",
- "capability": {"orf": "receive"},
"disable_connected_check": True,
"timers": {"holdtime": 30, "keepalive": 10},
},
{
"address": "192.168.0.2",
- "attribute_unchanged": {
- "as_path": True,
- "med": True,
- "next_hop": True,
- },
"ebgp_multihop": 2,
"remote_as": 65535,
"update_source": "192.168.0.1",
@@ -489,19 +431,18 @@ class TestVyosBgpglobalModule(TestVyosModule):
{
"address": "2001:db8::2",
"ebgp_multihop": 2,
- "maximum_prefix": 34,
"remote_as": 65535,
"update_source": "2001:db8::1",
},
],
- "network": [
- {"address": "172.16.42.32/27", "backdoor": True},
- {"address": "172.16.42.251/32", "route_map": "map01"},
- ],
- "redistribute": [
- {"protocol": "kernel", "route_map": "map01"},
- {"protocol": "static", "route_map": "map01"},
- ],
+ # "network": [
+ # {"address": "172.16.42.32/27", "backdoor": True},
+ # {"address": "172.16.42.251/32", "route_map": "map01"},
+ # ],
+ # "redistribute": [
+ # {"protocol": "kernel", "route_map": "map01"},
+ # {"protocol": "static", "route_map": "map01"},
+ # ],
}
self.assertEqual(sorted(parsed_list), sorted(result["parsed"]))
@@ -518,34 +459,30 @@ class TestVyosBgpglobalModule(TestVyosModule):
"neighbor": [
{
"address": "10.0.0.4",
- "capability": {"orf": "receive"},
"disable_connected_check": True,
"timers": {"holdtime": 30, "keepalive": 10},
},
{
"address": "192.168.0.2",
- "attribute_unchanged": {"as_path": True, "med": True},
"ebgp_multihop": 2,
"remote_as": 65535,
- "soft_reconfiguration": True,
"update_source": "192.168.0.1",
},
{
"address": "2001:db8::2",
"ebgp_multihop": 2,
- "maximum_prefix": 34,
"remote_as": 65535,
"update_source": "2001:db8::1",
},
],
- "network": [
- {"address": "172.16.42.32/27", "backdoor": True},
- {"address": "172.16.42.251/32", "route_map": "map01"},
- ],
- "redistribute": [
- {"protocol": "kernel", "route_map": "map01"},
- {"metric": 20, "protocol": "static"},
- {"protocol": "static", "route_map": "map01"},
- ],
+ # "network": [
+ # {"address": "172.16.42.32/27", "backdoor": True},
+ # {"address": "172.16.42.251/32", "route_map": "map01"},
+ # ],
+ # "redistribute": [
+ # {"protocol": "kernel", "route_map": "map01"},
+ # {"metric": 20, "protocol": "static"},
+ # {"protocol": "static", "route_map": "map01"},
+ # ],
}
self.assertEqual(sorted(gather_list), sorted(result["gathered"]))
diff --git a/tests/unit/modules/network/vyos/test_vyos_bgp_global14.py b/tests/unit/modules/network/vyos/test_vyos_bgp_global14.py
new file mode 100644
index 00000000..ee647616
--- /dev/null
+++ b/tests/unit/modules/network/vyos/test_vyos_bgp_global14.py
@@ -0,0 +1,495 @@
+# (c) 2016 Red Hat Inc.
+#
+# This file is part of Ansible
+#
+# Ansible is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Ansible is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
+
+# Make coding more python3-ish
+from __future__ import absolute_import, division, print_function
+
+
+__metaclass__ = type
+
+from unittest.mock import patch
+
+from ansible_collections.vyos.vyos.plugins.modules import vyos_bgp_global
+from ansible_collections.vyos.vyos.tests.unit.modules.utils import set_module_args
+
+from .vyos_module import TestVyosModule, load_fixture
+
+
+class TestVyosBgpglobalModule(TestVyosModule):
+ module = vyos_bgp_global
+
+ def setUp(self):
+ super(TestVyosBgpglobalModule, self).setUp()
+
+ self.mock_get_resource_connection_config = patch(
+ "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module_base.get_resource_connection",
+ )
+ self.get_resource_connection_config = self.mock_get_resource_connection_config.start()
+
+ self.mock_execute_show_command_config = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.bgp_global.bgp_global.Bgp_global._get_config",
+ )
+ self.execute_show_command_config = self.mock_execute_show_command_config.start()
+
+ self.mock_get_resource_connection_facts = patch(
+ "ansible_collections.ansible.netcommon.plugins.module_utils.network.common.facts.facts.get_resource_connection",
+ )
+ self.get_resource_connection_facts = self.mock_get_resource_connection_facts.start()
+
+ self.mock_execute_show_command = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.bgp_global.bgp_global.Bgp_globalFacts.get_device_data",
+ )
+
+ self.execute_show_command = self.mock_execute_show_command.start()
+ self.mock_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.bgp_global.bgp_global.get_os_version",
+ )
+ self.test_version = "1.4"
+ self.get_os_version = self.mock_get_os_version.start()
+ self.get_os_version.return_value = self.test_version
+ self.mock_facts_get_os_version = patch(
+ "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.bgp_global.bgp_global.get_os_version",
+ )
+ self.get_facts_os_version = self.mock_facts_get_os_version.start()
+ self.get_facts_os_version.return_value = self.test_version
+ self.maxDiff = None
+
+ def tearDown(self):
+ super(TestVyosBgpglobalModule, self).tearDown()
+ self.mock_get_resource_connection_config.stop()
+ self.mock_get_resource_connection_facts.stop()
+ self.mock_execute_show_command.stop()
+ self.mock_execute_show_command_config.stop()
+ self.mock_get_os_version.stop()
+ self.mock_facts_get_os_version.stop()
+
+ def load_fixtures(self, commands=None, filename=None):
+ if filename is None:
+ filename = "vyos_bgp_global_config_14.cfg"
+
+ def load_from_file(*args, **kwargs):
+ output = load_fixture(filename)
+ return output
+
+ self.execute_show_command.side_effect = load_from_file
+ self.execute_show_command_config.side_effect = load_from_file
+
+ def test_vyos_bgp_global_merged_idempotent(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number="65536",
+ neighbor=[
+ dict(
+ address="10.0.0.4",
+ disable_connected_check=True,
+ timers=dict(holdtime=30, keepalive=10),
+ ),
+ dict(
+ address="192.168.0.2",
+ ebgp_multihop=2,
+ remote_as="65535",
+ update_source="192.168.0.1",
+ ),
+ dict(
+ address="2001:db8::2",
+ ebgp_multihop=2,
+ remote_as="65535",
+ update_source="2001:db8::1",
+ ),
+ ],
+ # network=[
+ # dict(address="172.16.42.32/27", backdoor=True),
+ # dict(address="172.16.42.251/32", route_map="map01"),
+ # ],
+ bgp_params=dict(
+ bestpath=dict(as_path="confed", compare_routerid=True),
+ default=dict(no_ipv4_unicast=True),
+ router_id="10.1.1.1",
+ ),
+ # redistribute=[
+ # dict(protocol="kernel", route_map="map01"),
+ # dict(protocol="static", metric=20),
+ # dict(protocol="static", route_map="map01"),
+ # ],
+ ),
+ state="merged",
+ ),
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_vyos_bgp_global_merged(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number="65536",
+ neighbor=[
+ dict(
+ address="2001:db8::2",
+ ebgp_multihop=2,
+ remote_as="65535",
+ update_source="2001:db8::1",
+ ),
+ ],
+ bgp_params=dict(
+ confederation=[dict(peers=20), dict(identifier=66)],
+ router_id="10.1.1.1",
+ ),
+ ),
+ state="merged",
+ ),
+ )
+ commands = [
+ "set protocols bgp parameters confederation peers 20",
+ "set protocols bgp parameters confederation identifier 66",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_vyos_bgp_global_replaced_idempotent(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number="65536",
+ neighbor=[
+ dict(
+ address="10.0.0.4",
+ disable_connected_check=True,
+ timers=dict(holdtime=30, keepalive=10),
+ ),
+ dict(
+ address="192.168.0.2",
+ ebgp_multihop=2,
+ remote_as="65535",
+ update_source="192.168.0.1",
+ ),
+ dict(
+ address="2001:db8::2",
+ ebgp_multihop=2,
+ remote_as="65535",
+ update_source="2001:db8::1",
+ ),
+ ],
+ # network=[
+ # dict(address="172.16.42.32/27", backdoor=True),
+ # dict(address="172.16.42.251/32", route_map="map01"),
+ # ],
+ bgp_params=dict(
+ bestpath=dict(as_path="confed", compare_routerid=True),
+ default=dict(no_ipv4_unicast=True),
+ router_id="10.1.1.1",
+ ),
+ # redistribute=[
+ # dict(protocol="kernel", route_map="map01"),
+ # dict(protocol="static", metric=20),
+ # dict(protocol="static", route_map="map01"),
+ # ],
+ ),
+ state="replaced",
+ ),
+ )
+ self.execute_module(changed=False, commands=[])
+
+ #
+ def test_vyos_bgp_global_replaced(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number="65536",
+ timers=dict(holdtime=30, keepalive=10),
+ neighbor=[
+ dict(
+ address="200.11.155.3",
+ ),
+ dict(
+ address="2001:db8::2",
+ remote_as="65535",
+ default_originate="map01",
+ ),
+ ],
+ bgp_params=dict(
+ log_neighbor_changes=True,
+ no_client_to_client_reflection=True,
+ confederation=[dict(peers=20), dict(identifier=66)],
+ router_id="10.1.1.1",
+ ),
+ ),
+ state="replaced",
+ ),
+ )
+ commands = [
+ "delete protocols bgp parameters default",
+ "delete protocols bgp parameters bestpath compare-routerid",
+ "delete protocols bgp parameters bestpath as-path confed",
+ # "delete protocols bgp network",
+ # "delete protocols bgp redistribute",
+ "delete protocols bgp neighbor 2001:db8::2 update-source 2001:db8::1",
+ "delete protocols bgp neighbor 2001:db8::2 ebgp-multihop 2",
+ "delete protocols bgp neighbor 192.168.0.2",
+ "delete protocols bgp neighbor 10.0.0.4",
+ "set protocols bgp parameters log-neighbor-changes",
+ "set protocols bgp parameters no-client-to-client-reflection",
+ "set protocols bgp parameters confederation peers 20",
+ "set protocols bgp parameters confederation identifier 66",
+ "set protocols bgp timers holdtime 30",
+ "set protocols bgp timers keepalive 10",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ #
+ def test_vyos_bgp_global_purged(self):
+ set_module_args(dict(config=dict(as_number="65536"), state="purged"))
+ #
+ commands = ["delete protocols bgp"]
+ self.execute_module(changed=True, commands=commands)
+
+ #
+ # def test_vyos_bgp_global_incorrect_instance(self):
+ # set_module_args(
+ # dict(
+ # config=dict(
+ # as_number="100",
+ # timers=dict(holdtime=30, keepalive=10),
+ # neighbor=[
+ # dict(
+ # address="200.11.155.3",
+ # allowas_in=10,
+ # ),
+ # dict(
+ # address="2001:db8::2",
+ # remote_as="65535",
+ # as_override=True,
+ # default_originate="map01",
+ # route_map=[
+ # dict(action="export", route_map="map01"),
+ # ],
+ # ),
+ # ],
+ # bgp_params=dict(
+ # log_neighbor_changes=True,
+ # no_client_to_client_reflection=True,
+ # confederation=[dict(peers=20), dict(identifier=66)],
+ # router_id="10.1.1.1",
+ # ),
+ # ),
+ # state="replaced",
+ # ),
+ # )
+ # result = self.execute_module(failed=True)
+ # self.assertIn("Only one bgp instance is allowed per device", result["msg"])
+
+ def test_vyos_bgp_global_replaced_af(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number="65536",
+ timers=dict(holdtime=30, keepalive=10),
+ neighbor=[
+ dict(
+ address="200.11.155.3",
+ ),
+ dict(
+ address="2001:db8::2",
+ remote_as="65535",
+ default_originate="map01",
+ ),
+ ],
+ bgp_params=dict(
+ log_neighbor_changes=True,
+ no_client_to_client_reflection=True,
+ confederation=[dict(peers=20), dict(identifier=66)],
+ router_id="10.1.1.1",
+ ),
+ ),
+ state="replaced",
+ ),
+ )
+ result = self.execute_module(failed=True, filename="vyos_bgp_global_af_config_14.cfg")
+ self.assertIn(
+ "Use the _bgp_address_family module to delete the address_family under neighbor 5001::64, before replacing/deleting the neighbor.",
+ result["msg"],
+ )
+
+ def test_vyos_bgp_global_rendered(self):
+ set_module_args(
+ dict(
+ config=dict(
+ as_number="65536",
+ neighbor=[
+ dict(
+ address="10.0.0.4",
+ disable_connected_check=True,
+ timers=dict(holdtime=30, keepalive=10),
+ ),
+ dict(
+ address="192.168.0.2",
+ ebgp_multihop=2,
+ remote_as="65535",
+ update_source="192.168.0.1",
+ ),
+ dict(
+ address="2001:db8::2",
+ ebgp_multihop=2,
+ remote_as="65535",
+ update_source="2001:db8::1",
+ ),
+ ],
+ # network=[
+ # dict(address="172.16.42.32/27", backdoor=True),
+ # dict(address="172.16.42.251/32", route_map="map01"),
+ # ],
+ bgp_params=dict(
+ bestpath=dict(as_path="confed", compare_routerid=True),
+ default=dict(no_ipv4_unicast=True),
+ router_id="10.1.1.1",
+ ),
+ # redistribute=[
+ # dict(protocol="kernel", route_map="map01"),
+ # dict(protocol="static", metric=20),
+ # dict(protocol="static", route_map="map01"),
+ # ],
+ ),
+ state="rendered",
+ ),
+ )
+ rendered_cmds = [
+ "set protocols bgp system-as 65536",
+ "set protocols bgp neighbor 10.0.0.4 disable-connected-check",
+ "set protocols bgp neighbor 10.0.0.4 timers holdtime 30",
+ "set protocols bgp neighbor 10.0.0.4 timers keepalive 10",
+ "set protocols bgp neighbor 192.168.0.2 ebgp-multihop 2",
+ "set protocols bgp neighbor 192.168.0.2 remote-as 65535",
+ "set protocols bgp neighbor 192.168.0.2 update-source 192.168.0.1",
+ "set protocols bgp neighbor 2001:db8::2 ebgp-multihop 2",
+ "set protocols bgp neighbor 2001:db8::2 remote-as 65535",
+ "set protocols bgp neighbor 2001:db8::2 update-source 2001:db8::1",
+ # "set protocols bgp redistribute kernel route-map map01",
+ # "set protocols bgp redistribute static route-map map01",
+ # "set protocols bgp network 172.16.42.32/27 backdoor",
+ # "set protocols bgp network 172.16.42.251/32 route-map map01",
+ "set protocols bgp parameters bestpath as-path confed",
+ "set protocols bgp parameters bestpath compare-routerid",
+ "set protocols bgp parameters default no-ipv4-unicast",
+ "set protocols bgp parameters router-id 10.1.1.1",
+ ]
+ result = self.execute_module(changed=False)
+ self.assertEqual(
+ sorted(result["rendered"]),
+ sorted(rendered_cmds),
+ result["rendered"],
+ )
+
+ def test_vyos_bgp_global_parsed(self):
+ commands = [
+ "set protocols bgp system-as 65536",
+ "set protocols bgp neighbor 10.0.0.4 disable-connected-check",
+ "set protocols bgp neighbor 10.0.0.4 timers holdtime 30",
+ "set protocols bgp neighbor 10.0.0.4 timers keepalive 10",
+ "set protocols bgp neighbor 192.168.0.2 ebgp-multihop 2",
+ "set protocols bgp neighbor 192.168.0.2 remote-as 65535",
+ "set protocols bgp neighbor 192.168.0.2 update-source 192.168.0.1",
+ "set protocols bgp neighbor 2001:db8::2 ebgp-multihop 2",
+ "set protocols bgp neighbor 2001:db8::2 remote-as 65535",
+ "set protocols bgp neighbor 2001:db8::2 update-source 2001:db8::1",
+ # "set protocols bgp redistribute kernel route-map map01",
+ # "set protocols bgp redistribute static route-map map01",
+ # "set protocols bgp network 172.16.42.32/27 backdoor",
+ # "set protocols bgp network 172.16.42.251/32 route-map map01",
+ "set protocols bgp parameters bestpath as-path confed",
+ "set protocols bgp parameters bestpath compare-routerid",
+ "set protocols bgp parameters default no-ipv4-unicast",
+ "set protocols bgp parameters router-id 10.1.1.1",
+ ]
+ parsed_str = "\n".join(commands)
+ set_module_args(dict(running_config=parsed_str, state="parsed"))
+ result = self.execute_module(changed=False)
+ parsed_list = {
+ "as_number": 65536,
+ "bgp_params": {
+ "bestpath": {"as_path": "confed", "compare_routerid": True},
+ "default": {"no_ipv4_unicast": True},
+ "router_id": "10.1.1.1",
+ },
+ "neighbor": [
+ {
+ "address": "10.0.0.4",
+ "disable_connected_check": True,
+ "timers": {"holdtime": 30, "keepalive": 10},
+ },
+ {
+ "address": "192.168.0.2",
+ "ebgp_multihop": 2,
+ "remote_as": 65535,
+ "update_source": "192.168.0.1",
+ },
+ {
+ "address": "2001:db8::2",
+ "ebgp_multihop": 2,
+ "remote_as": 65535,
+ "update_source": "2001:db8::1",
+ },
+ ],
+ # "network": [
+ # {"address": "172.16.42.32/27", "backdoor": True},
+ # {"address": "172.16.42.251/32", "route_map": "map01"},
+ # ],
+ # "redistribute": [
+ # {"protocol": "kernel", "route_map": "map01"},
+ # {"protocol": "static", "route_map": "map01"},
+ # ],
+ }
+ self.assertEqual(sorted(parsed_list), sorted(result["parsed"]))
+
+ def test_vyos_bgp_global_gathered(self):
+ set_module_args(dict(state="gathered"))
+ result = self.execute_module(changed=False)
+ gather_list = {
+ "as_number": 65536,
+ "bgp_params": {
+ "bestpath": {"as_path": "confed", "compare_routerid": True},
+ "default": {"no_ipv4_unicast": True},
+ "router_id": "10.1.1.1",
+ },
+ "neighbor": [
+ {
+ "address": "10.0.0.4",
+ "disable_connected_check": True,
+ "timers": {"holdtime": 30, "keepalive": 10},
+ },
+ {
+ "address": "192.168.0.2",
+ "ebgp_multihop": 2,
+ "remote_as": 65535,
+ "update_source": "192.168.0.1",
+ },
+ {
+ "address": "2001:db8::2",
+ "ebgp_multihop": 2,
+ "remote_as": 65535,
+ "update_source": "2001:db8::1",
+ },
+ ],
+ # "network": [
+ # {"address": "172.16.42.32/27", "backdoor": True},
+ # {"address": "172.16.42.251/32", "route_map": "map01"},
+ # ],
+ # "redistribute": [
+ # {"protocol": "kernel", "route_map": "map01"},
+ # {"metric": 20, "protocol": "static"},
+ # {"protocol": "static", "route_map": "map01"},
+ # ],
+ }
+ self.assertEqual(sorted(gather_list), sorted(result["gathered"]))