summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYVarshitha <63169351+YVarshitha@users.noreply.github.com>2021-10-02 13:28:30 -0400
committerGitHub <noreply@github.com>2021-10-02 17:28:30 +0000
commit85ea49f10a6167dea4c08e71a1e8e5a62cb57395 (patch)
tree0bfd9aa0bc06c1d342944fef3bc18f7c3d7ec047
parent88689227265b7f6b272b695a275f4a47735ddcc2 (diff)
downloadvyos-ansible-old-85ea49f10a6167dea4c08e71a1e8e5a62cb57395.tar.gz
vyos-ansible-old-85ea49f10a6167dea4c08e71a1e8e5a62cb57395.zip
Add vyos_ntp resource module (#175)
Add vyos_ntp resource module SUMMARY Resource module vyos_ntp ISSUE TYPE New Module Pull Request COMPONENT NAME vyos_ntp ADDITIONAL INFORMATION Reviewed-by: GomathiselviS <None> Reviewed-by: Nilashish Chakraborty <nilashishchakraborty8@gmail.com> Reviewed-by: None <None>
-rw-r--r--README.md1
-rw-r--r--changelogs/fragments/vyos_ntp.yml4
-rw-r--r--docs/vyos.vyos.vyos_ntp_global_module.rst974
-rw-r--r--meta/runtime.yml6
-rw-r--r--plugins/module_utils/network/vyos/argspec/ntp_global/__init__.py0
-rw-r--r--plugins/module_utils/network/vyos/argspec/ntp_global/ntp_global.py72
-rw-r--r--plugins/module_utils/network/vyos/config/ntp_global/__init__.py0
-rw-r--r--plugins/module_utils/network/vyos/config/ntp_global/ntp_global.py197
-rw-r--r--plugins/module_utils/network/vyos/facts/facts.py4
-rw-r--r--plugins/module_utils/network/vyos/facts/ntp_global/__init__.py0
-rw-r--r--plugins/module_utils/network/vyos/facts/ntp_global/ntp_global.py99
-rw-r--r--plugins/module_utils/network/vyos/rm_templates/ntp_global.py129
-rw-r--r--plugins/modules/vyos_ntp_global.py812
-rw-r--r--tests/integration/targets/vyos_ntp_global/defaults/main.yaml3
-rw-r--r--tests/integration/targets/vyos_ntp_global/tasks/cli.yaml19
-rw-r--r--tests/integration/targets/vyos_ntp_global/tasks/main.yaml4
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/_parsed.cfg5
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/_populate_config.yaml13
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/_remove_config.yaml8
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/deleted.yaml40
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/empty_config.yaml60
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/gathered.yaml24
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/merged.yaml58
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/overridden.yaml53
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/parsed.yaml17
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/rendered.yaml33
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/replaced.yaml42
-rw-r--r--tests/integration/targets/vyos_ntp_global/tests/cli/rtt.yaml70
-rw-r--r--tests/integration/targets/vyos_ntp_global/vars/main.yaml108
-rw-r--r--tests/sanity/ignore-2.13.txt11
-rw-r--r--tests/unit/modules/network/vyos/fixtures/vyos_ntp_config.cfg10
-rw-r--r--tests/unit/modules/network/vyos/test_vyos_ntp_global.py364
32 files changed, 3229 insertions, 11 deletions
diff --git a/README.md b/README.md
index 6f28eb5..67e7a3b 100644
--- a/README.md
+++ b/README.md
@@ -53,6 +53,7 @@ Name | Description
[vyos.vyos.vyos_lldp_interfaces](https://github.com/ansible-collections/vyos.vyos/blob/main/docs/vyos.vyos.vyos_lldp_interfaces_module.rst)|LLDP interfaces resource module
[vyos.vyos.vyos_logging](https://github.com/ansible-collections/vyos.vyos/blob/main/docs/vyos.vyos.vyos_logging_module.rst)|Manage logging on network devices
[vyos.vyos.vyos_logging_global](https://github.com/ansible-collections/vyos.vyos/blob/main/docs/vyos.vyos.vyos_logging_global_module.rst)|Logging resource module
+[vyos.vyos.vyos_ntp_global](https://github.com/ansible-collections/vyos.vyos/blob/main/docs/vyos.vyos.vyos_ntp_global_module.rst)|Manages ntp modules of Vyos network devices
[vyos.vyos.vyos_ospf_interfaces](https://github.com/ansible-collections/vyos.vyos/blob/main/docs/vyos.vyos.vyos_ospf_interfaces_module.rst)|OSPF Interfaces Resource Module.
[vyos.vyos.vyos_ospfv2](https://github.com/ansible-collections/vyos.vyos/blob/main/docs/vyos.vyos.vyos_ospfv2_module.rst)|OSPFv2 resource module
[vyos.vyos.vyos_ospfv3](https://github.com/ansible-collections/vyos.vyos/blob/main/docs/vyos.vyos.vyos_ospfv3_module.rst)|OSPFV3 resource module
diff --git a/changelogs/fragments/vyos_ntp.yml b/changelogs/fragments/vyos_ntp.yml
new file mode 100644
index 0000000..7682906
--- /dev/null
+++ b/changelogs/fragments/vyos_ntp.yml
@@ -0,0 +1,4 @@
+---
+
+minor_changes:
+ - Add vyos_ntp Resource Module
diff --git a/docs/vyos.vyos.vyos_ntp_global_module.rst b/docs/vyos.vyos.vyos_ntp_global_module.rst
new file mode 100644
index 0000000..7f27493
--- /dev/null
+++ b/docs/vyos.vyos.vyos_ntp_global_module.rst
@@ -0,0 +1,974 @@
+.. _vyos.vyos.vyos_ntp_global_module:
+
+
+*************************
+vyos.vyos.vyos_ntp_global
+*************************
+
+**Manages ntp modules of Vyos network devices**
+
+
+Version added: 2.4.0
+
+.. contents::
+ :local:
+ :depth: 1
+
+
+Synopsis
+--------
+- This module manages ntp configuration on devices running Vyos
+
+
+
+
+Parameters
+----------
+
+.. raw:: html
+
+ <table border=0 cellpadding=0 class="documentation-table">
+ <tr>
+ <th colspan="3">Parameter</th>
+ <th>Choices/<font color="blue">Defaults</font></th>
+ <th width="100%">Comments</th>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>config</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>List of configurations for ntp module</div>
+ </td>
+ </tr>
+ <tr>
+ <td class="elbow-placeholder"></td>
+ <td colspan="2">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>allow_clients</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=string</span>
+ </div>
+ </td>
+ <td>
+ </td>
+ <td>
+ <div>Network Time Protocol (NTP) server options</div>
+ </td>
+ </tr>
+ <tr>
+ <td class="elbow-placeholder"></td>
+ <td colspan="2">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>listen_addresses</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=string</span>
+ </div>
+ </td>
+ <td>
+ </td>
+ <td>
+ <div>local IP addresses for service to listen on</div>
+ </td>
+ </tr>
+ <tr>
+ <td class="elbow-placeholder"></td>
+ <td colspan="2">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>servers</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>Network Time Protocol (NTP) server</div>
+ </td>
+ </tr>
+ <tr>
+ <td class="elbow-placeholder"></td>
+ <td class="elbow-placeholder"></td>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>options</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=string</span>
+ </div>
+ </td>
+ <td>
+ <ul style="margin: 0; padding: 0"><b>Choices:</b>
+ <li>noselect</li>
+ <li>dynamic</li>
+ <li>preempt</li>
+ <li>prefer</li>
+ </ul>
+ </td>
+ <td>
+ <div>server options for NTP</div>
+ </td>
+ </tr>
+ <tr>
+ <td class="elbow-placeholder"></td>
+ <td class="elbow-placeholder"></td>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>server</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>server name for NTP</div>
+ </td>
+ </tr>
+
+
+ <tr>
+ <td colspan="3">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>running_config</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>This option is used only with state <em>parsed</em>.</div>
+ <div>The value of this option should be the output received from the VYOS device by executing the command <b>show configuration commands | grep ntp</b>.</div>
+ <div>The states <em>replaced</em> and <em>overridden</em> have identical behaviour for this module.</div>
+ <div>The state <em>parsed</em> reads the configuration from <code>show configuration commands | grep ntp</code> option and transforms it into Ansible structured data as per the resource module&#x27;s argspec and the value is then returned in the <em>parsed</em> key within the result.</div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <div class="ansibleOptionAnchor" id="parameter-"></div>
+ <b>state</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>deleted</li>
+ <li><div style="color: blue"><b>merged</b>&nbsp;&larr;</div></li>
+ <li>overridden</li>
+ <li>replaced</li>
+ <li>gathered</li>
+ <li>rendered</li>
+ <li>parsed</li>
+ </ul>
+ </td>
+ <td>
+ <div>The state the configuration should be left in.</div>
+ </td>
+ </tr>
+ </table>
+ <br/>
+
+
+Notes
+-----
+
+.. note::
+ - Tested against vyos 1.3
+ - This module works with connection ``network_cli``.
+
+
+
+Examples
+--------
+
+.. code-block:: yaml
+
+ # # -------------------
+ # # 1. Using merged
+ # # -------------------
+
+ # # Before state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+ # # Task
+ # # -------------
+ - name: Replace the existing ntp config with the new config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.6.6.0/24
+ listen_addresses:
+ - 10.1.3.1
+ servers:
+ - server: 203.0.113.0
+ options:
+ - prefer
+
+
+ # # Task output:
+ # # -------------
+ # "after": {
+ # "allow_clients": [
+ # "10.6.6.0/24"
+ # ],
+ # "listen_addresses": [
+ # "10.1.3.1"
+ # ],
+ # "servers": [
+ # {
+ # "server": "ser",
+ # "options": [
+ # "prefer"
+ # ]
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # },
+ # "before": {
+ # },
+ # "changed": true,
+ # "commands": [
+ # "set system ntp allow-clients address 10.6.6.0/24",
+ # "set system ntp listen-address 10.1.3.1",
+ # "set system ntp server 203.0.113.0 prefer"
+ # ]
+
+ # After state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.6.6.0/24'
+ # set system ntp listen-address '10.1.3.1'
+ # set system ntp server 203.0.113.0 prefer,
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+
+ # # -------------------
+ # # 2. Using replaced
+ # # -------------------
+
+ # # Before state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.4.9.0/24'
+ # set system ntp allow-clients address '10.4.7.0/24'
+ # set system ntp allow-clients address '10.1.2.0/24'
+ # set system ntp allow-clients address '10.2.3.0/24'
+ # set system ntp listen-address '10.1.9.16'
+ # set system ntp listen-address '10.5.3.2'
+ # set system ntp listen-address '10.7.9.21'
+ # set system ntp listen-address '10.8.9.4'
+ # set system ntp listen-address '10.4.5.1'
+ # set system ntp server 10.3.6.5 noselect
+ # set system ntp server 10.3.6.5 dynamic
+ # set system ntp server 10.3.6.5 preempt
+ # set system ntp server 10.3.6.5 prefer
+ # set system ntp server server4 noselect
+ # set system ntp server server4 dynamic
+ # set system ntp server server5
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+ # # Task
+ # # -------------
+ - name: Replace the existing ntp config with the new config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.6.6.0/24
+ listen_addresses:
+ - 10.1.3.1
+ servers:
+ - server: 203.0.113.0
+ options:
+ - prefer
+ state: replaced
+
+
+ # # Task output:
+ # # -------------
+ # "after": {
+ # "allow_clients": [
+ # "10.6.6.0/24"
+ # ],
+ # "listen_addresses": [
+ # "10.1.3.1"
+ # ],
+ # "servers": [
+ # {
+ # "server": "ser",
+ # "options": [
+ # "prefer"
+ # ]
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # },
+ # "before": {
+ # "allow_clients": [
+ # "10.4.7.0/24",
+ # "10.2.3.0/24",
+ # "10.1.2.0/24",
+ # "10.4.9.0/24"
+ # ],
+ # "listen_addresses": [
+ # "10.7.9.21",
+ # "10.4.5.1",
+ # "10.5.3.2",
+ # "10.8.9.4",
+ # "10.1.9.16"
+ # ],
+ # "servers": [
+ # {
+ # "server": "10.3.6.5",
+ # "options": [
+ # "noselect",
+ # "dynamic",
+ # "preempt",
+ # "prefer"
+ # ]
+ # },
+ # {
+ # "server": "server4",
+ # "options": [
+ # "noselect",
+ # "dynamic"
+ # ]
+ # },
+ # {
+ # "server": "server5"
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # },
+ # "changed": true,
+ # "commands": [
+ # "delete system ntp allow-clients address 10.4.7.0/24",
+ # "delete system ntp allow-clients address 10.2.3.0/24",
+ # "delete system ntp allow-clients address 10.1.2.0/24",
+ # "delete system ntp allow-clients address 10.4.9.0/24",
+ # "delete system ntp listen-address 10.7.9.21",
+ # "delete system ntp listen-address 10.4.5.1",
+ # "delete system ntp listen-address 10.5.3.2",
+ # "delete system ntp listen-address 10.8.9.4",
+ # "delete system ntp listen-address 10.1.9.16",
+ # "delete system ntp server 10.3.6.5",
+ # "delete system ntp server server4",
+ # "delete system ntp server server5",
+ # "set system ntp allow-clients address 10.6.6.0/24",
+ # "set system ntp listen-address 10.1.3.1",
+ # "set system ntp server 203.0.113.0 prefer"
+ # ]
+
+ # After state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.6.6.0/24'
+ # set system ntp listen-address '10.1.3.1'
+ # set system ntp server 203.0.113.0 prefer,
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+
+
+ # # -------------------
+ # # 3. Using overridden
+ # # -------------------
+
+ # # Before state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.6.6.0/24'
+ # set system ntp listen-address '10.1.3.1'
+ # set system ntp server 203.0.113.0 prefer,
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+ # # Task
+ # # -------------
+ - name: Override ntp config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.3.3.0/24
+ listen_addresses:
+ - 10.7.8.1
+ servers:
+ - server: server1
+ options:
+ - dynamic
+ - prefer
+
+ - server: server2
+ options:
+ - noselect
+ - preempt
+
+ - server: serv
+ state: overridden
+
+
+
+ # # Task output:
+ # # -------------
+ # "after": {
+ # "allow_clients": [
+ # "10.3.3.0/24"
+ # ],
+ # "listen_addresses": [
+ # "10.7.8.1"
+ # ],
+ # "servers": [
+ # {
+ # "server": "serv"
+ # },
+ # {
+ # "server": "server1",
+ # "options": [
+ # "dynamic",
+ # "prefer"
+ # ]
+ # },
+ # {
+ # "server": "server2",
+ # "options": [
+ # "noselect",
+ # "preempt"
+ # ]
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # },
+ # "before": {
+ # "allow_clients": [
+ # "10.6.6.0/24"
+ # ],
+ # "listen_addresses": [
+ # "10.1.3.1"
+ # ],
+ # "servers": [
+ # {
+ # "server": "ser",
+ # "options": [
+ # "prefer"
+ # ]
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # },
+ # "changed": true,
+ # "commands": [
+ # "delete system ntp allow-clients address 10.6.6.0/24",
+ # "delete system ntp listen-address 10.1.3.1",
+ # "delete system ntp server ser",
+ # "set system ntp allow-clients address 10.3.3.0/24",
+ # "set system ntp listen-address 10.7.8.1",
+ # "set system ntp server server1 dynamic",
+ # "set system ntp server server1 prefer",
+ # "set system ntp server server2 noselect",
+ # "set system ntp server server2 preempt",
+ # "set system ntp server serv"
+ # ]
+
+ # After state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.3.3.0/24'
+ # set system ntp listen-address '10.7.8.1'
+ # set system ntp server serv
+ # set system ntp server server1 dynamic
+ # set system ntp server server1 prefer
+ # set system ntp server server2 noselect
+ # set system ntp server server2 preempt
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+
+
+ # # -------------------
+ # # 4. Using gathered
+ # # -------------------
+
+ # # Before state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.3.3.0/24'
+ # set system ntp listen-address '10.7.8.1'
+ # set system ntp server serv
+ # set system ntp server server1 dynamic
+ # set system ntp server server1 prefer
+ # set system ntp server server2 noselect
+ # set system ntp server server2 preempt
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+ # # Task
+ # # -------------
+ - name: Gather ntp config
+ vyos.vyos.vyos_ntp_global:
+ state: gathered
+
+ # # Task output:
+ # # -------------
+ # "gathered": {
+ # "allow_clients": [
+ # "10.3.3.0/24"
+ # ],
+ # "listen_addresses": [
+ # "10.7.8.1"
+ # ],
+ # "servers": [
+ # {
+ # "server": "serv"
+ # },
+ # {
+ # "server": "server1",
+ # "options": [
+ # "dynamic",
+ # "prefer"
+ # ]
+ # },
+ # {
+ # "server": "server2",
+ # "options": [
+ # "noselect",
+ # "preempt"
+ # ]
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # }
+
+ # After state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.3.3.0/24'
+ # set system ntp listen-address '10.7.8.1'
+ # set system ntp server serv
+ # set system ntp server server1 dynamic
+ # set system ntp server server1 prefer
+ # set system ntp server server2 noselect
+ # set system ntp server server2 preempt
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+
+ # # -------------------
+ # # 5. Using deleted
+ # # -------------------
+
+ # # Before state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp allow-clients address '10.3.3.0/24'
+ # set system ntp listen-address '10.7.8.1'
+ # set system ntp server serv
+ # set system ntp server server1 dynamic
+ # set system ntp server server1 prefer
+ # set system ntp server server2 noselect
+ # set system ntp server server2 preempt
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+ # # Task
+ # # -------------
+ - name: Delete ntp config
+ vyos.vyos.vyos_ntp_global:
+ state: deleted
+
+
+ # # Task output:
+ # # -------------
+ # "after": {
+ # "servers": [
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # },
+ # "before": {
+ # "allow_clients": [
+ # "10.3.3.0/24"
+ # ],
+ # "listen_addresses": [
+ # "10.7.8.1"
+ # ],
+ # "servers": [
+ # {
+ # "server": "serv"
+ # },
+ # {
+ # "server": "server1",
+ # "options": [
+ # "dynamic",
+ # "prefer"
+ # ]
+ # },
+ # {
+ # "server": "server2",
+ # "options": [
+ # "noselect",
+ # "preempt"
+ # ]
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ # ]
+ # },
+ # "changed": true,
+ # "commands": [
+ # "delete system ntp allow-clients",
+ # "delete system ntp listen-address",
+ # "delete system ntp server serv",
+ # "delete system ntp server server1",
+ # "delete system ntp server server2"
+ #
+ # ]
+
+ # After state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+
+ # # -------------------
+ # # 6. Using rendered
+ # # -------------------
+
+ # # Before state:
+ # # -------------
+ # vyos@vyos:~$ show configuration commands | grep ntp
+ # set system ntp server time1.vyos.net
+ # set system ntp server time2.vyos.net
+ # set system ntp server time3.vyos.net
+ # vyos@vyos:~$
+
+ # # Task
+ # # -------------
+ - name: Gather ntp config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.7.7.0/24
+ - 10.8.8.0/24
+ listen_addresses:
+ - 10.7.9.1
+ servers:
+ - server: server7
+
+ - server: server45
+ options:
+ - noselect
+ - prefer
+ - server: time1.vyos.net
+
+ - server: time2.vyos.net
+
+ - server: time3.vyos.net
+
+ state: rendered
+
+
+ # # Task output:
+ # # -------------
+ # "rendered": [
+ # "set system ntp allow-clients address 10.7.7.0/24",
+ # "set system ntp allow-clients address 10.8.8.0/24",
+ # "set system ntp listen-address 10.7.9.1",
+ # "set system ntp server server7",
+ # "set system ntp server server45 noselect",
+ # "set system ntp server server45 prefer",
+ # "set system ntp server time1.vyos.net",
+ # "set system ntp server time2.vyos.net",
+ # "set system ntp server time3.vyos.net"
+ # ]
+
+
+ # # -------------------
+ # # 7. Using parsed
+ # # -------------------
+
+ # # sample_config.cfg:
+ # # -------------
+ # "set system ntp allow-clients address 10.7.7.0/24",
+ # "set system ntp listen-address 10.7.9.1",
+ # "set system ntp server server45 noselect",
+ # "set system ntp allow-clients addres 10.8.6.0/24",
+ # "set system ntp listen-address 10.5.4.1",
+ # "set system ntp server server45 dynamic",
+ # "set system ntp server time1.vyos.net",
+ # "set system ntp server time2.vyos.net",
+ # "set system ntp server time3.vyos.net"
+
+ # # Task:
+ # # -------------
+ - name: Parse externally provided ntp configuration
+ vyos.vyos.vyos_ntp_global:
+ running_config: "{{ lookup('file', './sample_config.cfg') }}"
+ state: parsed
+
+ # # Task output:
+ # # -------------
+ # parsed = {
+ # "allow_clients": [
+ # "10.7.7.0/24",
+ # "10.8.6.0/24
+ # ],
+ # "listen_addresses": [
+ # "10.5.4.1",
+ # "10.7.9.1"
+ # ],
+ # "servers": [
+ # {
+ # "server": "server45",
+ # "options": [
+ # "noselect",
+ # "dynamic"
+ #
+ # ]
+ # },
+ # {
+ # "server": "time1.vyos.net"
+ # },
+ # {
+ # "server": "time2.vyos.net"
+ # },
+ # {
+ # "server": "time3.vyos.net"
+ # }
+ #
+ # ]
+ # }
+
+
+
+Return Values
+-------------
+Common return values are documented `here <https://docs.ansible.com/ansible/latest/reference_appendices/common_return_values.html#common-return-values>`_, the following are the fields unique to this module:
+
+.. raw:: html
+
+ <table border=0 cellpadding=0 class="documentation-table">
+ <tr>
+ <th colspan="1">Key</th>
+ <th>Returned</th>
+ <th width="100%">Description</th>
+ </tr>
+ <tr>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="return-"></div>
+ <b>after</b>
+ <a class="ansibleOptionLink" href="#return-" title="Permalink to this return value"></a>
+ <div style="font-size: small">
+ <span style="color: purple">dictionary</span>
+ </div>
+ </td>
+ <td>when changed</td>
+ <td>
+ <div>The resulting configuration after module execution.</div>
+ <br/>
+ <div style="font-size: smaller"><b>Sample:</b></div>
+ <div style="font-size: smaller; color: blue; word-wrap: break-word; word-break: break-all;">This output will always be in the same format as the module argspec.</div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="return-"></div>
+ <b>before</b>
+ <a class="ansibleOptionLink" href="#return-" title="Permalink to this return value"></a>
+ <div style="font-size: small">
+ <span style="color: purple">dictionary</span>
+ </div>
+ </td>
+ <td>when <em>state</em> is <code>merged</code>, <code>replaced</code>, <code>overridden</code>, <code>deleted</code> or <code>purged</code></td>
+ <td>
+ <div>The configuration prior to the module execution.</div>
+ <br/>
+ <div style="font-size: smaller"><b>Sample:</b></div>
+ <div style="font-size: smaller; color: blue; word-wrap: break-word; word-break: break-all;">This output will always be in the same format as the module argspec.</div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="return-"></div>
+ <b>commands</b>
+ <a class="ansibleOptionLink" href="#return-" title="Permalink to this return value"></a>
+ <div style="font-size: small">
+ <span style="color: purple">list</span>
+ </div>
+ </td>
+ <td>when <em>state</em> is <code>merged</code>, <code>replaced</code>, <code>overridden</code>, <code>deleted</code> or <code>purged</code></td>
+ <td>
+ <div>The set of commands pushed to the remote device.</div>
+ <br/>
+ <div style="font-size: smaller"><b>Sample:</b></div>
+ <div style="font-size: smaller; color: blue; word-wrap: break-word; word-break: break-all;">[&#x27;set system ntp server server1 dynamic&#x27;, &#x27;set system ntp server server1 prefer&#x27;, &#x27;set system ntp server server2 noselect&#x27;, &#x27;set system ntp server server2 preempt&#x27;, &#x27;set system ntp server server_add preempt&#x27;]</div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="return-"></div>
+ <b>gathered</b>
+ <a class="ansibleOptionLink" href="#return-" title="Permalink to this return value"></a>
+ <div style="font-size: small">
+ <span style="color: purple">list</span>
+ </div>
+ </td>
+ <td>when <em>state</em> is <code>gathered</code></td>
+ <td>
+ <div>Facts about the network resource gathered from the remote device as structured data.</div>
+ <br/>
+ <div style="font-size: smaller"><b>Sample:</b></div>
+ <div style="font-size: smaller; color: blue; word-wrap: break-word; word-break: break-all;">This output will always be in the same format as the module argspec.</div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="return-"></div>
+ <b>parsed</b>
+ <a class="ansibleOptionLink" href="#return-" title="Permalink to this return value"></a>
+ <div style="font-size: small">
+ <span style="color: purple">list</span>
+ </div>
+ </td>
+ <td>when <em>state</em> is <code>parsed</code></td>
+ <td>
+ <div>The device native config provided in <em>running_config</em> option parsed into structured data as per module argspec.</div>
+ <br/>
+ <div style="font-size: smaller"><b>Sample:</b></div>
+ <div style="font-size: smaller; color: blue; word-wrap: break-word; word-break: break-all;">This output will always be in the same format as the module argspec.</div>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="1">
+ <div class="ansibleOptionAnchor" id="return-"></div>
+ <b>rendered</b>
+ <a class="ansibleOptionLink" href="#return-" title="Permalink to this return value"></a>
+ <div style="font-size: small">
+ <span style="color: purple">list</span>
+ </div>
+ </td>
+ <td>when <em>state</em> is <code>rendered</code></td>
+ <td>
+ <div>The provided configuration in the task rendered in device-native format (offline).</div>
+ <br/>
+ <div style="font-size: smaller"><b>Sample:</b></div>
+ <div style="font-size: smaller; color: blue; word-wrap: break-word; word-break: break-all;">[&#x27;set system ntp server server1 dynamic&#x27;, &#x27;set system ntp server server1 prefer&#x27;, &#x27;set system ntp server server2 noselect&#x27;, &#x27;set system ntp server server2 preempt&#x27;, &#x27;set system ntp server server_add preempt&#x27;]</div>
+ </td>
+ </tr>
+ </table>
+ <br/><br/>
+
+
+Status
+------
+
+
+Authors
+~~~~~~~
+
+- Varshitha Yataluru (@YVarshitha)
diff --git a/meta/runtime.yml b/meta/runtime.yml
index 92cb260..35dbf50 100644
--- a/meta/runtime.yml
+++ b/meta/runtime.yml
@@ -86,6 +86,10 @@ plugin_routing:
redirect: vyos.vyos.vyos
logging:
redirect: vyos.vyos.vyos
+ vyos_ntp_global:
+ redirect: vyos.vyos.vyos
+ ntp_global:
+ redirect: vyos.vyos.vyos
vyos_ospfv2:
redirect: vyos.vyos.vyos
ospfv2:
@@ -211,6 +215,8 @@ plugin_routing:
warning_text: See the plugin documentation for more details
logging_global:
redirect: vyos.vyos.vyos_logging_global
+ ntp_global:
+ redirect: vyos.vyos.vyos_ntp_global
ospfv2:
redirect: vyos.vyos.vyos_ospfv2
ospfv3:
diff --git a/plugins/module_utils/network/vyos/argspec/ntp_global/__init__.py b/plugins/module_utils/network/vyos/argspec/ntp_global/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/module_utils/network/vyos/argspec/ntp_global/__init__.py
diff --git a/plugins/module_utils/network/vyos/argspec/ntp_global/ntp_global.py b/plugins/module_utils/network/vyos/argspec/ntp_global/ntp_global.py
new file mode 100644
index 0000000..6326215
--- /dev/null
+++ b/plugins/module_utils/network/vyos/argspec/ntp_global/ntp_global.py
@@ -0,0 +1,72 @@
+# -*- 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
+
+#############################################
+# WARNING #
+#############################################
+#
+# This file is auto generated by the
+# cli_rm_builder.
+#
+# Manually editing this file is not advised.
+#
+# To update the argspec make the desired changes
+# in the module docstring and re-run
+# cli_rm_builder.
+#
+#############################################
+
+"""
+The arg spec for the vyos_ntp module
+"""
+
+
+class Ntp_globalArgs(object): # pylint: disable=R0903
+ """The arg spec for the vyos_ntp module"""
+
+ argument_spec = {
+ "config": {
+ "type": "dict",
+ "options": {
+ "allow_clients": {"type": "list", "elements": "str"},
+ "listen_addresses": {"type": "list", "elements": "str"},
+ "servers": {
+ "type": "list",
+ "elements": "dict",
+ "options": {
+ "server": {"type": "str"},
+ "options": {
+ "type": "list",
+ "elements": "str",
+ "choices": [
+ "noselect",
+ "dynamic",
+ "preempt",
+ "prefer",
+ ],
+ },
+ },
+ },
+ },
+ },
+ "running_config": {"type": "str"},
+ "state": {
+ "type": "str",
+ "choices": [
+ "deleted",
+ "merged",
+ "overridden",
+ "replaced",
+ "gathered",
+ "rendered",
+ "parsed",
+ ],
+ "default": "merged",
+ },
+ } # pylint: disable=C0301
diff --git a/plugins/module_utils/network/vyos/config/ntp_global/__init__.py b/plugins/module_utils/network/vyos/config/ntp_global/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/module_utils/network/vyos/config/ntp_global/__init__.py
diff --git a/plugins/module_utils/network/vyos/config/ntp_global/ntp_global.py b/plugins/module_utils/network/vyos/config/ntp_global/ntp_global.py
new file mode 100644
index 0000000..0a0e389
--- /dev/null
+++ b/plugins/module_utils/network/vyos/config/ntp_global/ntp_global.py
@@ -0,0 +1,197 @@
+#
+# -*- coding: utf-8 -*-
+# Copyright 2021 Red Hat
+# GNU General Public License v3.0+
+# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+"""
+The vyos_ntp config file.
+It is in this file where the current configuration (as dict)
+is compared to the provided configuration (as dict) and the command set
+necessary to bring the current configuration to its desired end-state is
+created.
+"""
+
+from ansible.module_utils.six import iteritems
+from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import (
+ dict_merge,
+)
+from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.resource_module import (
+ ResourceModule,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.facts import (
+ Facts,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.ntp_global import (
+ NtpTemplate,
+)
+
+
+class Ntp_global(ResourceModule):
+ """
+ The vyos_ntp config class
+ """
+
+ def __init__(self, module):
+ super(Ntp_global, self).__init__(
+ empty_fact_val={},
+ facts_module=Facts(module),
+ module=module,
+ resource="ntp_global",
+ tmplt=NtpTemplate(),
+ )
+ self.parsers = [
+ "allow_clients",
+ "listen_addresses",
+ "server",
+ "options",
+ "allow_clients_delete",
+ "listen_addresses_delete",
+ ]
+
+ def execute_module(self):
+ """Execute the module
+
+ :rtype: A dictionary
+ :returns: The result from module execution
+ """
+ if self.state not in ["parsed", "gathered"]:
+ self.generate_commands()
+ self.run_commands()
+ return self.result
+
+ def generate_commands(self):
+ """Generate configuration commands to send based on
+ want, have and desired state.
+ """
+
+ wantd = self._ntp_list_to_dict(self.want)
+ haved = self._ntp_list_to_dict(self.have)
+
+ # if state is merged, merge want onto have and then compare
+ if self.state == "merged":
+ wantd = dict_merge(haved, wantd)
+
+ # if state is deleted, empty out wantd and set haved to wantd
+ if self.state == "deleted":
+ haved = {
+ k: v for k, v in iteritems(haved) if k in wantd or not wantd
+ }
+ wantd = {}
+
+ commandlist = self._commandlist(haved)
+ servernames = self._servernames(haved)
+ # removing the servername and commandlist from the list after deleting it from haved
+ for k, have in iteritems(haved):
+ if k not in wantd:
+ for hk, hval in iteritems(have):
+ if hk == "allow_clients" and hk in commandlist:
+ self.commands.append(
+ self._tmplt.render(
+ {"": hk}, "allow_clients_delete", True
+ )
+ )
+ commandlist.remove(hk)
+ elif hk == "listen_addresses" and hk in commandlist:
+ self.commands.append(
+ self._tmplt.render(
+ {"": hk}, "listen_addresses_delete", True
+ )
+ )
+ commandlist.remove(hk)
+ elif hk == "server" and have["server"] in servernames:
+ self._compareoverride(want={}, have=have)
+ servernames.remove(have["server"])
+
+ # remove existing config for overridden,replaced and deleted
+ # Getting the list of the server names from haved
+ # to avoid the duplication of overridding/replacing the servers
+ if self.state in ["overridden", "replaced"]:
+
+ commandlist = self._commandlist(haved)
+ servernames = self._servernames(haved)
+
+ for k, have in iteritems(haved):
+ if k not in wantd and "server" not in have:
+ self._compareoverride(want={}, have=have)
+ # removing the servername from the list after deleting it from haved
+ elif k not in wantd and have["server"] in servernames:
+ self._compareoverride(want={}, have=have)
+ servernames.remove(have["server"])
+
+ for k, want in iteritems(wantd):
+ self._compare(want=want, have=haved.pop(k, {}))
+
+ def _compare(self, want, have):
+ """Leverages the base class `compare()` method and
+ populates the list of commands to be run by comparing
+ the `want` and `have` data with the `parsers` defined
+ for the Ntp network resource.
+ """
+ if "options" in want:
+ self.compare(parsers="options", want=want, have=have)
+ else:
+ self.compare(parsers=self.parsers, want=want, have=have)
+
+ def _compareoverride(self, want, have):
+ # do not delete configuration with options level
+ for i, val in iteritems(have):
+ if i == "options":
+ pass
+ else:
+ self.compare(parsers=i, want={}, have=have)
+
+ def _ntp_list_to_dict(self, entry):
+ servers_dict = {}
+ for k, data in iteritems(entry):
+ if k == "servers":
+ for value in data:
+ if "options" in value:
+ result = self._serveroptions_list_to_dict(value)
+ for res, resvalue in iteritems(result):
+ servers_dict.update({res: resvalue})
+ else:
+ servers_dict.update({value["server"]: value})
+ else:
+ for value in data:
+ servers_dict.update({"ip_" + value: {k: value}})
+ return servers_dict
+
+ def _serveroptions_list_to_dict(self, entry):
+ serveroptions_dict = {}
+ for Opk, Op in iteritems(entry):
+ if Opk == "options":
+ for val in Op:
+ dict = {}
+ dict.update({"server": entry["server"]})
+ dict.update({Opk: val})
+ serveroptions_dict.update(
+ {entry["server"] + "_" + val: dict}
+ )
+ return serveroptions_dict
+
+ def _commandlist(self, haved):
+ commandlist = []
+ for k, have in iteritems(haved):
+ for ck, cval in iteritems(have):
+ if ck != "options" and ck not in commandlist:
+ commandlist.append(ck)
+ return commandlist
+
+ def _servernames(self, haved):
+ servernames = []
+ for k, have in iteritems(haved):
+ for sk, sval in iteritems(have):
+ if sk == "server" and sval not in [
+ "0.pool.ntp.org",
+ "1.pool.ntp.org",
+ "2.pool.ntp.org",
+ ]:
+ if sval not in servernames:
+ servernames.append(sval)
+ return servernames
diff --git a/plugins/module_utils/network/vyos/facts/facts.py b/plugins/module_utils/network/vyos/facts/facts.py
index ab074b0..e560a48 100644
--- a/plugins/module_utils/network/vyos/facts/facts.py
+++ b/plugins/module_utils/network/vyos/facts/facts.py
@@ -64,6 +64,9 @@ from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.prefi
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.logging_global.logging_global import (
Logging_globalFacts,
)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.ntp_global.ntp_global import (
+ Ntp_globalFacts,
+)
from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.facts.legacy.base import (
Default,
Neighbors,
@@ -90,6 +93,7 @@ FACT_RESOURCE_SUBSETS = dict(
route_maps=Route_mapsFacts,
prefix_lists=Prefix_listsFacts,
logging_global=Logging_globalFacts,
+ ntp_global=Ntp_globalFacts,
)
diff --git a/plugins/module_utils/network/vyos/facts/ntp_global/__init__.py b/plugins/module_utils/network/vyos/facts/ntp_global/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/module_utils/network/vyos/facts/ntp_global/__init__.py
diff --git a/plugins/module_utils/network/vyos/facts/ntp_global/ntp_global.py b/plugins/module_utils/network/vyos/facts/ntp_global/ntp_global.py
new file mode 100644
index 0000000..bb20e2d
--- /dev/null
+++ b/plugins/module_utils/network/vyos/facts/ntp_global/ntp_global.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+# Copyright 2021 Red Hat
+# GNU General Public License v3.0+
+# (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import absolute_import, division, print_function
+
+
+__metaclass__ = type
+
+"""
+The vyos ntp fact class
+It is in this file the configuration is collected from the device
+for a given resource, parsed, and the facts tree is populated
+based on the configuration.
+"""
+
+import re
+
+from ansible_collections.ansible.netcommon.plugins.module_utils.network.common import (
+ utils,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.rm_templates.ntp_global import (
+ NtpTemplate,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.ntp_global.ntp_global import (
+ Ntp_globalArgs,
+)
+
+
+class Ntp_globalFacts(object):
+ """The vyos ntp facts class"""
+
+ def __init__(self, module, subspec="config", options="options"):
+ self._module = module
+ self.argument_spec = Ntp_globalArgs.argument_spec
+
+ def get_config(self, connection):
+ return connection.get("show configuration commands | grep ntp")
+
+ def populate_facts(self, connection, ansible_facts, data=None):
+ """Populate the facts for Ntp network resource
+
+ :param connection: the device connection
+ :param ansible_facts: Facts dictionary
+ :param data: previously collected conf
+
+ :rtype: dictionary
+ :returns: facts
+ """
+ facts = {}
+ objs = []
+ config_lines = []
+
+ if not data:
+ data = self.get_config(connection)
+
+ for resource in data.splitlines():
+ config_lines.append(re.sub("'", "", resource))
+ # parse native config using the Ntp template
+ ntp_parser = NtpTemplate(lines=config_lines, module=self._module)
+
+ objs = ntp_parser.parse()
+
+ if objs:
+ if "allow_clients" in objs:
+ objs["allow_clients"] = sorted(list(objs["allow_clients"]))
+
+ if "listen_addresses" in objs:
+ objs["listen_addresses"] = sorted(
+ list(objs["listen_addresses"])
+ )
+
+ """ if "options" in objs["servers"].values():
+ val = objs["servers"].values()
+ val["options"] = sorted(val["options"]) """
+
+ if "servers" in objs:
+ objs["servers"] = list(objs["servers"].values())
+ objs["servers"] = sorted(
+ objs["servers"], key=lambda k: k["server"]
+ )
+ for i in objs["servers"]:
+ if "options" in i:
+ i["options"] = sorted(list(i["options"]))
+
+ ansible_facts["ansible_network_resources"].pop("ntp_global", None)
+
+ params = utils.remove_empties(
+ ntp_parser.validate_config(
+ self.argument_spec, {"config": objs}, redact=True
+ )
+ )
+
+ if params.get("config"):
+ facts["ntp_global"] = params["config"]
+ ansible_facts["ansible_network_resources"].update(facts)
+
+ return ansible_facts
diff --git a/plugins/module_utils/network/vyos/rm_templates/ntp_global.py b/plugins/module_utils/network/vyos/rm_templates/ntp_global.py
new file mode 100644
index 0000000..ac0bcbb
--- /dev/null
+++ b/plugins/module_utils/network/vyos/rm_templates/ntp_global.py
@@ -0,0 +1,129 @@
+# -*- 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 Ntp parser templates file. This contains
+a list of parser definitions and associated functions that
+facilitates both facts gathering and native command generation for
+the given network resource.
+"""
+
+import re
+from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.rm_base.network_template import (
+ NetworkTemplate,
+)
+
+
+class NtpTemplate(NetworkTemplate):
+ def __init__(self, lines=None, module=None):
+ prefix = {"set": "set", "remove": "delete"}
+ super(NtpTemplate, self).__init__(
+ lines=lines, tmplt=self, prefix=prefix, module=module
+ )
+
+ # fmt: off
+ PARSERS = [
+
+ # set system ntp allow_clients address <address>
+ {
+ "name": "allow_clients",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\sntp\sallow-clients\saddress (\s(?P<ipaddress>\S+))?
+ $""",
+ re.VERBOSE),
+ "setval": "system ntp allow-clients address {{allow_clients}}",
+ "result": {
+ "allow_clients": ["{{ipaddress}}"]
+ }
+ },
+
+ # set system ntp allow_clients
+ {
+ "name": "allow_clients_delete",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\sntp\sallow-clients
+ $""",
+ re.VERBOSE),
+ "setval": "system ntp allow-clients",
+ "result": {
+
+ }
+
+ },
+
+ # set system ntp listen_address <address>
+ {
+ "name": "listen_addresses",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\sntp\slisten-address (\s(?P<ip_address>\S+))?
+ $""",
+ re.VERBOSE),
+ "setval": "system ntp listen-address {{listen_addresses}}",
+ "result": {
+ "listen_addresses": ["{{ip_address}}"]
+ }
+ },
+
+ # set system ntp listen_address
+ {
+ "name": "listen_addresses_delete",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\sntp\slisten-address
+ $""",
+ re.VERBOSE),
+ "setval": "system ntp listen-address",
+ "result": {
+ }
+ },
+
+ # set system ntp server <name>
+ {
+ "name": "server",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\sntp\sserver (\s(?P<name>\S+))?
+ $""",
+ re.VERBOSE),
+ "setval": "system ntp server {{server}}",
+ "result": {
+ "servers": {
+ "{{name}}": {
+ "server": "{{name}}"
+ }
+ }
+
+ }
+ },
+
+ # set system ntp server <name> <options>
+ {
+ "name": "options",
+ "getval": re.compile(
+ r"""
+ ^set\ssystem\sntp\sserver
+ \s(?P<name>\S+)
+ \s(?P<options>noselect|dynamic|preempt|prefer)?
+ $""",
+ re.VERBOSE),
+ "setval": "system ntp server {{server}} {{options}}",
+ "result": {
+ "servers": {
+ "{{name}}": {
+ "server": "{{name}}",
+ "options": ["{{options}}"]
+ }
+ }
+ }
+ }
+ ]
+ # fmt: on
diff --git a/plugins/modules/vyos_ntp_global.py b/plugins/modules/vyos_ntp_global.py
new file mode 100644
index 0000000..6686aa4
--- /dev/null
+++ b/plugins/modules/vyos_ntp_global.py
@@ -0,0 +1,812 @@
+#!/usr/bin/python
+# -*- 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)
+
+"""
+The module file for vyos_ntp_global
+"""
+
+from __future__ import absolute_import, division, print_function
+
+__metaclass__ = type
+
+
+DOCUMENTATION = """
+ module: vyos_ntp_global
+ version_added: 2.4.0
+ short_description: Manages ntp modules of Vyos network devices
+ description:
+ - This module manages ntp configuration on devices running Vyos
+ author: Varshitha Yataluru (@YVarshitha)
+ notes:
+ - Tested against vyos 1.3
+ - This module works with connection C(network_cli).
+ options:
+ config:
+ description: List of configurations for ntp module
+ type: dict
+ suboptions:
+ allow_clients:
+ description: Network Time Protocol (NTP) server options
+ type: list
+ elements: str
+ listen_addresses:
+ description: local IP addresses for service to listen on
+ type: list
+ elements: str
+ servers:
+ description: Network Time Protocol (NTP) server
+ type: list
+ elements: dict
+ suboptions:
+ server:
+ description: server name for NTP
+ type: str
+ options:
+ description: server options for NTP
+ type: list
+ elements: str
+ choices:
+ - noselect
+ - dynamic
+ - preempt
+ - prefer
+ running_config:
+ description:
+ - This option is used only with state I(parsed).
+ - The value of this option should be the output received from the VYOS device by
+ executing the command B(show configuration commands | grep ntp).
+ - The states I(replaced) and I(overridden) have identical
+ behaviour for this module.
+ - The state I(parsed) reads the configuration from C(show configuration commands | grep ntp) option and
+ transforms it into Ansible structured data as per the resource module's argspec
+ and the value is then returned in the I(parsed) key within the result.
+ type: str
+ state:
+ description:
+ - The state the configuration should be left in.
+ type: str
+ choices:
+ - deleted
+ - merged
+ - overridden
+ - replaced
+ - gathered
+ - rendered
+ - parsed
+ default: merged
+"""
+EXAMPLES = """
+
+# # -------------------
+# # 1. Using merged
+# # -------------------
+
+# # Before state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+# # Task
+# # -------------
+- name: Replace the existing ntp config with the new config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.6.6.0/24
+ listen_addresses:
+ - 10.1.3.1
+ servers:
+ - server: 203.0.113.0
+ options:
+ - prefer
+
+
+# # Task output:
+# # -------------
+# "after": {
+# "allow_clients": [
+# "10.6.6.0/24"
+# ],
+# "listen_addresses": [
+# "10.1.3.1"
+# ],
+# "servers": [
+# {
+# "server": "ser",
+# "options": [
+# "prefer"
+# ]
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# },
+# "before": {
+# },
+# "changed": true,
+# "commands": [
+# "set system ntp allow-clients address 10.6.6.0/24",
+# "set system ntp listen-address 10.1.3.1",
+# "set system ntp server 203.0.113.0 prefer"
+# ]
+
+# After state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.6.6.0/24'
+# set system ntp listen-address '10.1.3.1'
+# set system ntp server 203.0.113.0 prefer,
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+
+# # -------------------
+# # 2. Using replaced
+# # -------------------
+
+# # Before state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.4.9.0/24'
+# set system ntp allow-clients address '10.4.7.0/24'
+# set system ntp allow-clients address '10.1.2.0/24'
+# set system ntp allow-clients address '10.2.3.0/24'
+# set system ntp listen-address '10.1.9.16'
+# set system ntp listen-address '10.5.3.2'
+# set system ntp listen-address '10.7.9.21'
+# set system ntp listen-address '10.8.9.4'
+# set system ntp listen-address '10.4.5.1'
+# set system ntp server 10.3.6.5 noselect
+# set system ntp server 10.3.6.5 dynamic
+# set system ntp server 10.3.6.5 preempt
+# set system ntp server 10.3.6.5 prefer
+# set system ntp server server4 noselect
+# set system ntp server server4 dynamic
+# set system ntp server server5
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+# # Task
+# # -------------
+- name: Replace the existing ntp config with the new config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.6.6.0/24
+ listen_addresses:
+ - 10.1.3.1
+ servers:
+ - server: 203.0.113.0
+ options:
+ - prefer
+ state: replaced
+
+
+# # Task output:
+# # -------------
+# "after": {
+# "allow_clients": [
+# "10.6.6.0/24"
+# ],
+# "listen_addresses": [
+# "10.1.3.1"
+# ],
+# "servers": [
+# {
+# "server": "ser",
+# "options": [
+# "prefer"
+# ]
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# },
+# "before": {
+# "allow_clients": [
+# "10.4.7.0/24",
+# "10.2.3.0/24",
+# "10.1.2.0/24",
+# "10.4.9.0/24"
+# ],
+# "listen_addresses": [
+# "10.7.9.21",
+# "10.4.5.1",
+# "10.5.3.2",
+# "10.8.9.4",
+# "10.1.9.16"
+# ],
+# "servers": [
+# {
+# "server": "10.3.6.5",
+# "options": [
+# "noselect",
+# "dynamic",
+# "preempt",
+# "prefer"
+# ]
+# },
+# {
+# "server": "server4",
+# "options": [
+# "noselect",
+# "dynamic"
+# ]
+# },
+# {
+# "server": "server5"
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# },
+# "changed": true,
+# "commands": [
+# "delete system ntp allow-clients address 10.4.7.0/24",
+# "delete system ntp allow-clients address 10.2.3.0/24",
+# "delete system ntp allow-clients address 10.1.2.0/24",
+# "delete system ntp allow-clients address 10.4.9.0/24",
+# "delete system ntp listen-address 10.7.9.21",
+# "delete system ntp listen-address 10.4.5.1",
+# "delete system ntp listen-address 10.5.3.2",
+# "delete system ntp listen-address 10.8.9.4",
+# "delete system ntp listen-address 10.1.9.16",
+# "delete system ntp server 10.3.6.5",
+# "delete system ntp server server4",
+# "delete system ntp server server5",
+# "set system ntp allow-clients address 10.6.6.0/24",
+# "set system ntp listen-address 10.1.3.1",
+# "set system ntp server 203.0.113.0 prefer"
+# ]
+
+# After state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.6.6.0/24'
+# set system ntp listen-address '10.1.3.1'
+# set system ntp server 203.0.113.0 prefer,
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+
+
+# # -------------------
+# # 3. Using overridden
+# # -------------------
+
+# # Before state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.6.6.0/24'
+# set system ntp listen-address '10.1.3.1'
+# set system ntp server 203.0.113.0 prefer,
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+# # Task
+# # -------------
+- name: Override ntp config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.3.3.0/24
+ listen_addresses:
+ - 10.7.8.1
+ servers:
+ - server: server1
+ options:
+ - dynamic
+ - prefer
+
+ - server: server2
+ options:
+ - noselect
+ - preempt
+
+ - server: serv
+ state: overridden
+
+
+
+# # Task output:
+# # -------------
+# "after": {
+# "allow_clients": [
+# "10.3.3.0/24"
+# ],
+# "listen_addresses": [
+# "10.7.8.1"
+# ],
+# "servers": [
+# {
+# "server": "serv"
+# },
+# {
+# "server": "server1",
+# "options": [
+# "dynamic",
+# "prefer"
+# ]
+# },
+# {
+# "server": "server2",
+# "options": [
+# "noselect",
+# "preempt"
+# ]
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# },
+# "before": {
+# "allow_clients": [
+# "10.6.6.0/24"
+# ],
+# "listen_addresses": [
+# "10.1.3.1"
+# ],
+# "servers": [
+# {
+# "server": "ser",
+# "options": [
+# "prefer"
+# ]
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# },
+# "changed": true,
+# "commands": [
+# "delete system ntp allow-clients address 10.6.6.0/24",
+# "delete system ntp listen-address 10.1.3.1",
+# "delete system ntp server ser",
+# "set system ntp allow-clients address 10.3.3.0/24",
+# "set system ntp listen-address 10.7.8.1",
+# "set system ntp server server1 dynamic",
+# "set system ntp server server1 prefer",
+# "set system ntp server server2 noselect",
+# "set system ntp server server2 preempt",
+# "set system ntp server serv"
+# ]
+
+# After state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.3.3.0/24'
+# set system ntp listen-address '10.7.8.1'
+# set system ntp server serv
+# set system ntp server server1 dynamic
+# set system ntp server server1 prefer
+# set system ntp server server2 noselect
+# set system ntp server server2 preempt
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+
+
+# # -------------------
+# # 4. Using gathered
+# # -------------------
+
+# # Before state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.3.3.0/24'
+# set system ntp listen-address '10.7.8.1'
+# set system ntp server serv
+# set system ntp server server1 dynamic
+# set system ntp server server1 prefer
+# set system ntp server server2 noselect
+# set system ntp server server2 preempt
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+# # Task
+# # -------------
+- name: Gather ntp config
+ vyos.vyos.vyos_ntp_global:
+ state: gathered
+
+# # Task output:
+# # -------------
+# "gathered": {
+# "allow_clients": [
+# "10.3.3.0/24"
+# ],
+# "listen_addresses": [
+# "10.7.8.1"
+# ],
+# "servers": [
+# {
+# "server": "serv"
+# },
+# {
+# "server": "server1",
+# "options": [
+# "dynamic",
+# "prefer"
+# ]
+# },
+# {
+# "server": "server2",
+# "options": [
+# "noselect",
+# "preempt"
+# ]
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# }
+
+# After state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.3.3.0/24'
+# set system ntp listen-address '10.7.8.1'
+# set system ntp server serv
+# set system ntp server server1 dynamic
+# set system ntp server server1 prefer
+# set system ntp server server2 noselect
+# set system ntp server server2 preempt
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+
+# # -------------------
+# # 5. Using deleted
+# # -------------------
+
+# # Before state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp allow-clients address '10.3.3.0/24'
+# set system ntp listen-address '10.7.8.1'
+# set system ntp server serv
+# set system ntp server server1 dynamic
+# set system ntp server server1 prefer
+# set system ntp server server2 noselect
+# set system ntp server server2 preempt
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+# # Task
+# # -------------
+- name: Delete ntp config
+ vyos.vyos.vyos_ntp_global:
+ state: deleted
+
+
+# # Task output:
+# # -------------
+# "after": {
+# "servers": [
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# },
+# "before": {
+# "allow_clients": [
+# "10.3.3.0/24"
+# ],
+# "listen_addresses": [
+# "10.7.8.1"
+# ],
+# "servers": [
+# {
+# "server": "serv"
+# },
+# {
+# "server": "server1",
+# "options": [
+# "dynamic",
+# "prefer"
+# ]
+# },
+# {
+# "server": "server2",
+# "options": [
+# "noselect",
+# "preempt"
+# ]
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+# ]
+# },
+# "changed": true,
+# "commands": [
+# "delete system ntp allow-clients",
+# "delete system ntp listen-address",
+# "delete system ntp server serv",
+# "delete system ntp server server1",
+# "delete system ntp server server2"
+#
+# ]
+
+# After state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+
+# # -------------------
+# # 6. Using rendered
+# # -------------------
+
+# # Before state:
+# # -------------
+# vyos@vyos:~$ show configuration commands | grep ntp
+# set system ntp server time1.vyos.net
+# set system ntp server time2.vyos.net
+# set system ntp server time3.vyos.net
+# vyos@vyos:~$
+
+# # Task
+# # -------------
+- name: Gather ntp config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ allow_clients:
+ - 10.7.7.0/24
+ - 10.8.8.0/24
+ listen_addresses:
+ - 10.7.9.1
+ servers:
+ - server: server7
+
+ - server: server45
+ options:
+ - noselect
+ - prefer
+ - server: time1.vyos.net
+
+ - server: time2.vyos.net
+
+ - server: time3.vyos.net
+
+ state: rendered
+
+
+# # Task output:
+# # -------------
+# "rendered": [
+# "set system ntp allow-clients address 10.7.7.0/24",
+# "set system ntp allow-clients address 10.8.8.0/24",
+# "set system ntp listen-address 10.7.9.1",
+# "set system ntp server server7",
+# "set system ntp server server45 noselect",
+# "set system ntp server server45 prefer",
+# "set system ntp server time1.vyos.net",
+# "set system ntp server time2.vyos.net",
+# "set system ntp server time3.vyos.net"
+# ]
+
+
+# # -------------------
+# # 7. Using parsed
+# # -------------------
+
+# # sample_config.cfg:
+# # -------------
+# "set system ntp allow-clients address 10.7.7.0/24",
+# "set system ntp listen-address 10.7.9.1",
+# "set system ntp server server45 noselect",
+# "set system ntp allow-clients addres 10.8.6.0/24",
+# "set system ntp listen-address 10.5.4.1",
+# "set system ntp server server45 dynamic",
+# "set system ntp server time1.vyos.net",
+# "set system ntp server time2.vyos.net",
+# "set system ntp server time3.vyos.net"
+
+# # Task:
+# # -------------
+- name: Parse externally provided ntp configuration
+ vyos.vyos.vyos_ntp_global:
+ running_config: "{{ lookup('file', './sample_config.cfg') }}"
+ state: parsed
+
+# # Task output:
+# # -------------
+# parsed = {
+# "allow_clients": [
+# "10.7.7.0/24",
+# "10.8.6.0/24
+# ],
+# "listen_addresses": [
+# "10.5.4.1",
+# "10.7.9.1"
+# ],
+# "servers": [
+# {
+# "server": "server45",
+# "options": [
+# "noselect",
+# "dynamic"
+#
+# ]
+# },
+# {
+# "server": "time1.vyos.net"
+# },
+# {
+# "server": "time2.vyos.net"
+# },
+# {
+# "server": "time3.vyos.net"
+# }
+#
+# ]
+# }
+
+"""
+RETURN = """
+before:
+ description: The configuration prior to the module execution.
+ returned: when I(state) is C(merged), C(replaced), C(overridden), C(deleted) or C(purged)
+ type: dict
+ sample: >
+ This output will always be in the same format as the
+ module argspec.
+after:
+ description: The resulting configuration after module execution.
+ returned: when changed
+ type: dict
+ sample: >
+ This output will always be in the same format as the
+ module argspec.
+commands:
+ description: The set of commands pushed to the remote device.
+ returned: when I(state) is C(merged), C(replaced), C(overridden), C(deleted) or C(purged)
+ type: list
+ sample:
+ - set system ntp server server1 dynamic
+ - set system ntp server server1 prefer
+ - set system ntp server server2 noselect
+ - set system ntp server server2 preempt
+ - set system ntp server server_add preempt
+rendered:
+ description: The provided configuration in the task rendered in device-native format (offline).
+ returned: when I(state) is C(rendered)
+ type: list
+ sample:
+ - set system ntp server server1 dynamic
+ - set system ntp server server1 prefer
+ - set system ntp server server2 noselect
+ - set system ntp server server2 preempt
+ - set system ntp server server_add preempt
+
+gathered:
+ description: Facts about the network resource gathered from the remote device as structured data.
+ returned: when I(state) is C(gathered)
+ type: list
+ sample: >
+ This output will always be in the same format as the
+ module argspec.
+parsed:
+ description: The device native config provided in I(running_config) option parsed into structured data as per module argspec.
+ returned: when I(state) is C(parsed)
+ type: list
+ sample: >
+ This output will always be in the same format as the
+ module argspec.
+"""
+
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.argspec.ntp_global.ntp_global import (
+ Ntp_globalArgs,
+)
+from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.ntp_global.ntp_global import (
+ Ntp_global,
+)
+
+
+def main():
+ """
+ Main entry point for module execution
+
+ :returns: the result form module invocation
+ """
+ module = AnsibleModule(
+ argument_spec=Ntp_globalArgs.argument_spec,
+ mutually_exclusive=[["config", "running_config"]],
+ required_if=[
+ ["state", "merged", ["config"]],
+ ["state", "replaced", ["config"]],
+ ["state", "overridden", ["config"]],
+ ["state", "rendered", ["config"]],
+ ["state", "parsed", ["running_config"]],
+ ],
+ supports_check_mode=True,
+ )
+
+ result = Ntp_global(module).execute_module()
+ module.exit_json(**result)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tests/integration/targets/vyos_ntp_global/defaults/main.yaml b/tests/integration/targets/vyos_ntp_global/defaults/main.yaml
new file mode 100644
index 0000000..852a6be
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/defaults/main.yaml
@@ -0,0 +1,3 @@
+---
+testcase: '[^_].*'
+test_items: []
diff --git a/tests/integration/targets/vyos_ntp_global/tasks/cli.yaml b/tests/integration/targets/vyos_ntp_global/tasks/cli.yaml
new file mode 100644
index 0000000..93eb2fe
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tasks/cli.yaml
@@ -0,0 +1,19 @@
+---
+- name: Collect all cli test cases
+ find:
+ paths: '{{ role_path }}/tests/cli'
+ patterns: '{{ testcase }}.yaml'
+ use_regex: true
+ register: test_cases
+ delegate_to: localhost
+
+- name: Set test_items
+ set_fact: test_items="{{ test_cases.files | map(attribute='path') | list }}"
+
+- name: Run test case (connection=ansible.netcommon.network_cli)
+ include: '{{ test_case_to_run }}'
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
+ with_items: '{{ test_items }}'
+ loop_control:
+ loop_var: test_case_to_run
diff --git a/tests/integration/targets/vyos_ntp_global/tasks/main.yaml b/tests/integration/targets/vyos_ntp_global/tasks/main.yaml
new file mode 100644
index 0000000..b957d2f
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tasks/main.yaml
@@ -0,0 +1,4 @@
+---
+- include: cli.yaml
+ tags:
+ - network_cli
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/_parsed.cfg b/tests/integration/targets/vyos_ntp_global/tests/cli/_parsed.cfg
new file mode 100644
index 0000000..0608aef
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/_parsed.cfg
@@ -0,0 +1,5 @@
+set system ntp server 10.3.6.5 noselect
+set system ntp server 10.3.6.5 dynamic
+set system ntp server 0.pool.ntp.org
+set system ntp server 1.pool.ntp.org
+set system ntp server 2.pool.ntp.org
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/_populate_config.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/_populate_config.yaml
new file mode 100644
index 0000000..035fcba
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/_populate_config.yaml
@@ -0,0 +1,13 @@
+---
+- name: setup
+ vyos.vyos.vyos_config:
+ lines:
+ - set system ntp server server4 dynamic
+ - set system ntp server server5 preempt
+ - set system ntp server 10.3.6.5 noselect
+ - set system ntp server 10.3.6.5 preempt
+ - set system ntp server server4 noselect
+ - set system ntp server 10.3.6.5 prefer
+ ignore_errors: true
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/_remove_config.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/_remove_config.yaml
new file mode 100644
index 0000000..6017bdb
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/_remove_config.yaml
@@ -0,0 +1,8 @@
+---
+- name: Remove pre-existing ntp_global config
+ vyos.vyos.vyos_ntp_global:
+ config:
+ state: deleted
+ ignore_errors: true
+ vars:
+ ansible_connection: ansible.netcommon.network_cli
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/deleted.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/deleted.yaml
new file mode 100644
index 0000000..530e2ad
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/deleted.yaml
@@ -0,0 +1,40 @@
+---
+- debug:
+ msg: START vyos_ntp_global deleted integration tests on connection={{ansible_connection }}
+
+- include_tasks: _remove_config.yaml
+
+- include_tasks: _populate_config.yaml
+
+- block:
+
+ - name: Delete the provided configuration
+ register: result
+ vyos.vyos.vyos_ntp_global: &id001
+ config:
+ state: deleted
+
+ - name: Assert that before dicts were correctly generated
+ assert:
+ that:
+ - result.changed == true
+ - result.commands == deleted.commands
+
+ - name: Assert that the after dicts were correctly generated
+ assert:
+ that:
+ - result.after == populate.config
+
+ - name: Delete the existing configuration with the provided running configuration
+ (IDEMPOTENT)
+ register: result
+ vyos.vyos.vyos_ntp_global: *id001
+
+ - name: Assert that the previous task was idempotent
+ assert:
+ that:
+ - result['changed'] == false
+
+ always:
+
+ - include_tasks: _remove_config.yaml
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/empty_config.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/empty_config.yaml
new file mode 100644
index 0000000..ec29f16
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/empty_config.yaml
@@ -0,0 +1,60 @@
+---
+- debug:
+ msg: START vyos_ntp_global empty_config integration tests on connection={{
+ ansible_connection }}
+
+- name: Merged with empty config should give appropriate error message
+ register: result
+ ignore_errors: true
+ vyos.vyos.vyos_ntp_global:
+ config:
+ state: merged
+
+- assert:
+ that:
+ - result.msg == 'value of config parameter must not be empty for state merged'
+
+- name: Replaced with empty config should give appropriate error message
+ register: result
+ ignore_errors: true
+ vyos.vyos.vyos_ntp_global:
+ config:
+ state: replaced
+
+- assert:
+ that:
+ - result.msg == 'value of config parameter must not be empty for state replaced'
+
+- name: Overridden with empty config should give appropriate error message
+ register: result
+ ignore_errors: true
+ vyos.vyos.vyos_ntp_global:
+ config:
+ state: overridden
+
+- assert:
+ that:
+ - result.msg == 'value of config parameter must not be empty for state overridden'
+
+- name: Parsed with empty running_config should give appropriate error message
+ register: result
+ ignore_errors: true
+ vyos.vyos.vyos_ntp_global:
+ running_config:
+ state: parsed
+
+- assert:
+ that:
+ - result.msg == 'value of running_config parameter must not be empty for state
+ parsed'
+
+- name: Rendered with empty config should give appropriate error message
+ register: result
+ ignore_errors: true
+ vyos.vyos.vyos_ntp_global:
+ config:
+ state: rendered
+
+- assert:
+ that:
+ - result.msg == 'value of config parameter must not be empty for state rendered'
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/gathered.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/gathered.yaml
new file mode 100644
index 0000000..5ac350d
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/gathered.yaml
@@ -0,0 +1,24 @@
+---
+- debug:
+ msg: START vyos_ntp_global gathered integration tests on connection={{
+ ansible_connection }}
+
+- include_tasks: _remove_config.yaml
+
+- include_tasks: _populate_config.yaml
+
+- block:
+
+ - name: Gather config from the device in structured format.
+ register: result
+ vyos.vyos.vyos_ntp_global:
+ state: gathered
+
+ - vyos.vyos.vyos_facts:
+ gather_network_resources: ntp_global
+
+ - name: Assert that facts are correctly generated
+ assert:
+ that:
+ - result.changed == false
+ - result.gathered == ansible_facts['network_resources']['ntp_global']
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/merged.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/merged.yaml
new file mode 100644
index 0000000..2a22ad8
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/merged.yaml
@@ -0,0 +1,58 @@
+---
+- debug:
+ msg: START vyos_ntp_global merged integration tests on connection={{
+ ansible_connection }}
+
+- include_tasks: _remove_config.yaml
+
+- block:
+ - name: Merge the provided configuration with the existing running configuration
+ register: result
+ vyos.vyos.vyos_ntp_global: &id001
+ config:
+ servers:
+ - server: server5
+
+ - server: server4
+ options:
+ - noselect
+ - dynamic
+
+ - server: 10.3.6.5
+ options:
+ - noselect
+ - preempt
+ - dynamic
+ - prefer
+ state: merged
+
+ - vyos.vyos.vyos_facts:
+ gather_network_resources: ntp_global
+
+ - assert:
+ that:
+ - result.commands|length == 7
+ - result.changed == true
+ - result.commands|symmetric_difference(merged.commands) == []
+ - result.after == ansible_facts['network_resources']['ntp_global']
+ - result.after == merged.after
+
+
+ - name: Assert that before dicts were correctly generated
+ assert:
+ that:
+ - result.before == populate.config
+
+ - name:
+ Merge the provided configuration with the existing running configuration
+ (IDEMPOTENT)
+ register: result
+ vyos.vyos.vyos_ntp_global: *id001
+
+ - name: Assert that the previous task was idempotent
+ assert:
+ that:
+ - result['changed'] == false
+
+ always:
+ - include_tasks: _remove_config.yaml
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/overridden.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/overridden.yaml
new file mode 100644
index 0000000..2269e74
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/overridden.yaml
@@ -0,0 +1,53 @@
+---
+- debug:
+ msg: START vyos_ntp_global overridden integration tests on connection={{
+ ansible_connection }}
+
+- include_tasks: _remove_config.yaml
+
+- include_tasks: _populate_config.yaml
+
+- block:
+
+ - name: Override the existing configuration with the provided running configuration
+ register: result
+ vyos.vyos.vyos_ntp_global: &id001
+ config:
+ servers:
+ - server: server1
+ options:
+ - dynamic
+ - prefer
+
+ - server: server2
+ options:
+ - noselect
+ - preempt
+
+ - server: server_add
+ options:
+ - preempt
+ state: overridden
+
+ - vyos.vyos.vyos_facts:
+ gather_network_resources: ntp_global
+
+ - assert:
+ that:
+ - result.changed == true
+ - result.after == ansible_facts['network_resources']['ntp_global']
+ - result.after == overridden.after
+
+ - name: Override the existing configuration with the provided running configuration
+ (IDEMPOTENT)
+ register: result
+ vyos.vyos.vyos_ntp_global: *id001
+
+ - name: Assert that the previous task was idempotent
+ assert:
+ that:
+ - result['changed'] == false
+
+ always:
+
+ - include_tasks: _remove_config.yaml
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/parsed.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/parsed.yaml
new file mode 100644
index 0000000..c660ac4
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/parsed.yaml
@@ -0,0 +1,17 @@
+---
+- debug:
+ msg: START vyos_ntp_global parsed integration tests on connection={{ ansible_connection
+ }}
+
+- name: Provide the running configuration for parsing (config to be parsed)
+ register: result
+ vyos.vyos.vyos_ntp_global:
+ running_config: "{{ lookup('file', '_parsed.cfg') }}"
+ state: parsed
+
+
+- name: Assert that config was correctly parsed
+ assert:
+ that:
+ - result.changed == false
+ - result.parsed == parsed.after
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/rendered.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/rendered.yaml
new file mode 100644
index 0000000..1c1edd7
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/rendered.yaml
@@ -0,0 +1,33 @@
+---
+- debug:
+ msg: START vyos_ntp_global rendered integration tests on connection={{
+ ansible_connection }}
+
+- include_tasks: _remove_config.yaml
+
+- block:
+
+ - name: Structure provided configuration into device specific commands
+ register: result
+ vyos.vyos.vyos_ntp_global: &id001
+ config:
+ servers:
+ - server: server5
+
+ - server: server4
+ options:
+ - noselect
+ - dynamic
+
+ - server: 10.3.6.5
+ options:
+ - noselect
+ - preempt
+ - dynamic
+ - prefer
+ state: rendered
+
+ - assert:
+ that:
+ - result.changed == false
+ - result.rendered|symmetric_difference(merged.commands) == []
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/replaced.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/replaced.yaml
new file mode 100644
index 0000000..8d1241b
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/replaced.yaml
@@ -0,0 +1,42 @@
+---
+- debug:
+ msg: START vyos_ntp_global replaced integration tests on connection={{
+ ansible_connection }}
+
+- include_tasks: _remove_config.yaml
+
+- include_tasks: _populate_config.yaml
+
+- block:
+ - name: Replace the provided configuration with the existing running configuration
+ register: result
+ vyos.vyos.vyos_ntp_global: &id001
+ config:
+ servers:
+ - server: server_new
+ options:
+ - prefer
+ state: replaced
+
+ - vyos.vyos.vyos_facts:
+ gather_network_resources: ntp_global
+
+ - assert:
+ that:
+ - result.changed == true
+ - result.after == ansible_facts['network_resources']['ntp_global']
+ - result.after == replaced.after
+
+ - name:
+ Replace the provided configuration with the existing running configuration
+ (IDEMPOTENT)
+ register: result
+ vyos.vyos.vyos_ntp_global: *id001
+
+ - name: Assert that the previous task was idempotent
+ assert:
+ that:
+ - result['changed'] == false
+
+ always:
+ - include_tasks: _remove_config.yaml
diff --git a/tests/integration/targets/vyos_ntp_global/tests/cli/rtt.yaml b/tests/integration/targets/vyos_ntp_global/tests/cli/rtt.yaml
new file mode 100644
index 0000000..86f75f4
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/tests/cli/rtt.yaml
@@ -0,0 +1,70 @@
+---
+- debug:
+ msg: START vyos_ntp_global rtt integration tests on connection={{
+ ansible_connection }}
+
+- include_tasks: _remove_config.yaml
+
+- block:
+ - name: Merge the provided configuration with the existing running configuration
+ register: baseconfig
+ vyos.vyos.vyos_ntp_global:
+ config:
+ servers:
+ - server: 10.3.6.5
+ options:
+ - noselect
+ - dynamic
+ - preempt
+ - prefer
+
+ - server: server4
+ options:
+ - noselect
+ - dynamic
+
+ - server: 0.pool.ntp.org
+
+ - server: 1.pool.ntp.org
+
+ - server: 2.pool.ntp.org
+
+ state: merged
+
+ - vyos.vyos.vyos_facts:
+ gather_network_resources: ntp_global
+
+ - assert:
+ that:
+ - baseconfig.commands|length == 6
+ - baseconfig.changed == true
+ - baseconfig.commands|symmetric_difference(rtt.commands) == []
+ - baseconfig.after == ansible_facts['network_resources']['ntp_global']
+
+ - name: Merge the existing configuration with the provided running configuration
+ register: result
+ vyos.vyos.vyos_ntp_global:
+ config:
+ servers:
+ - server: server1
+ options:
+ - dynamic
+ - prefer
+
+ - server: server2
+ options:
+ - noselect
+ - preempt
+
+ - name: Revert back to base config using facts round trip
+ register: revert
+ vyos.vyos.vyos_ntp_global:
+ config: "{{ ansible_facts['network_resources']['ntp_global'] }}"
+ state: overridden
+
+ - name: Assert that config was reverted
+ assert:
+ that: baseconfig.after == revert.after
+
+ always:
+ - include_tasks: _remove_config.yaml
diff --git a/tests/integration/targets/vyos_ntp_global/vars/main.yaml b/tests/integration/targets/vyos_ntp_global/vars/main.yaml
new file mode 100644
index 0000000..3b4dbc4
--- /dev/null
+++ b/tests/integration/targets/vyos_ntp_global/vars/main.yaml
@@ -0,0 +1,108 @@
+---
+rtt:
+ commands:
+ - set system ntp server server4 dynamic
+ - set system ntp server 10.3.6.5 noselect
+ - set system ntp server 10.3.6.5 dynamic
+ - set system ntp server 10.3.6.5 preempt
+ - set system ntp server server4 noselect
+ - set system ntp server 10.3.6.5 prefer
+
+merged:
+ commands:
+ - set system ntp server server5
+ - set system ntp server server4 dynamic
+ - set system ntp server 10.3.6.5 noselect
+ - set system ntp server 10.3.6.5 dynamic
+ - set system ntp server 10.3.6.5 preempt
+ - set system ntp server server4 noselect
+ - set system ntp server 10.3.6.5 prefer
+
+ after:
+ servers:
+ - server: 0.pool.ntp.org
+ - server: 1.pool.ntp.org
+ - server: 10.3.6.5
+ options:
+ - dynamic
+ - noselect
+ - preempt
+ - prefer
+ - server: 2.pool.ntp.org
+
+ - server: server4
+ options:
+ - dynamic
+ - noselect
+
+ - server: server5
+
+replaced:
+ commands:
+ - delete system ntp server 10.3.6.5
+ - delete system ntp server server4
+ - delete system ntp server server5
+ - set system ntp server server_new prefer
+
+ after:
+ servers:
+ - server: 0.pool.ntp.org
+ - server: 1.pool.ntp.org
+ - server: 2.pool.ntp.org
+ - options:
+ - prefer
+ server: server_new
+
+overridden:
+ commands:
+ - delete system ntp server server_new
+ - set system ntp server server1 dynamic
+ - set system ntp server server1 prefer
+ - set system ntp server server2 noselect
+ - set system ntp server server2 preempt
+ - set system ntp server server_add preempt
+
+
+ after:
+ servers:
+ - server: 0.pool.ntp.org
+ - server: 1.pool.ntp.org
+ - server: 2.pool.ntp.org
+ - server: server1
+ options:
+ - dynamic
+ - prefer
+
+ - server: server2
+ options:
+ - noselect
+ - preempt
+ - server: server_add
+ options:
+ - preempt
+
+deleted:
+ commands:
+ - delete system ntp server 10.3.6.5
+ - delete system ntp server server4
+ - delete system ntp server server5
+
+parsed:
+ after:
+ servers:
+ - server: 0.pool.ntp.org
+
+ - server: 1.pool.ntp.org
+ - server: 10.3.6.5
+ options:
+ - dynamic
+ - noselect
+ - server: 2.pool.ntp.org
+
+populate:
+ config:
+ servers:
+ - server: 0.pool.ntp.org
+
+ - server: 1.pool.ntp.org
+ - server: 2.pool.ntp.org
diff --git a/tests/sanity/ignore-2.13.txt b/tests/sanity/ignore-2.13.txt
index 496cf86..c835eef 100644
--- a/tests/sanity/ignore-2.13.txt
+++ b/tests/sanity/ignore-2.13.txt
@@ -1,12 +1 @@
plugins/action/vyos.py action-plugin-docs # base class for deprecated network platform modules using `connection: local`
-plugins/module_utils/network/vyos/config/ospf_interfaces/ospf_interfaces.py compile-2.6!skip
-plugins/module_utils/network/vyos/config/ospf_interfaces/ospf_interfaces.py import-2.6!skip
-plugins/module_utils/network/vyos/config/route_maps/route_maps.py compile-2.6!skip
-plugins/module_utils/network/vyos/config/route_maps/route_maps.py import-2.6!skip
-plugins/modules/vyos_route_maps.py import-2.6!skip
-plugins/modules/vyos_prefix_lists.py import-2.6!skip
-plugins/module_utils/network/vyos/config/prefix_lists/prefix_lists.py import-2.6!skip
-plugins/module_utils/network/vyos/config/prefix_lists/prefix_lists.py compile-2.6!skip
-plugins/modules/vyos_logging_global.py import-2.6!skip
-plugins/module_utils/network/vyos/config/logging_global/logging_global.py import-2.6!skip
-plugins/module_utils/network/vyos/config/logging_global/logging_global.py compile-2.6!skip
diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_ntp_config.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_ntp_config.cfg
new file mode 100644
index 0000000..ec9bd7f
--- /dev/null
+++ b/tests/unit/modules/network/vyos/fixtures/vyos_ntp_config.cfg
@@ -0,0 +1,10 @@
+set system ntp allow-clients address '10.1.1.0/24'
+set system ntp allow-clients address '10.1.2.0/24'
+set system ntp listen-address '10.2.3.1'
+set system ntp listen-address '10.4.3.1'
+set system ntp server server1
+set system ntp server server3 noselect
+set system ntp server server3 dynamic
+set system ntp server time1.vyos.net
+set system ntp server time2.vyos.net
+set system ntp server time3.vyos.net
diff --git a/tests/unit/modules/network/vyos/test_vyos_ntp_global.py b/tests/unit/modules/network/vyos/test_vyos_ntp_global.py
new file mode 100644
index 0000000..c27704f
--- /dev/null
+++ b/tests/unit/modules/network/vyos/test_vyos_ntp_global.py
@@ -0,0 +1,364 @@
+# (c) 2021 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 ansible_collections.vyos.vyos.tests.unit.compat.mock import patch
+from ansible_collections.vyos.vyos.plugins.modules import vyos_ntp_global
+from ansible_collections.vyos.vyos.tests.unit.modules.utils import (
+ set_module_args,
+)
+from .vyos_module import TestVyosModule, load_fixture
+
+
+class TestVyosNTPModule(TestVyosModule):
+
+ module = vyos_ntp_global
+
+ def setUp(self):
+ super(TestVyosNTPModule, 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_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.ntp_global.ntp_global.Ntp_globalFacts.get_config"
+ )
+
+ self.execute_show_command = self.mock_execute_show_command.start()
+
+ def tearDown(self):
+ super(TestVyosNTPModule, self).tearDown()
+ self.mock_get_resource_connection_config.stop()
+ self.mock_get_resource_connection_facts.stop()
+ self.mock_execute_show_command.stop()
+
+ def load_fixtures(self, commands=None, transport="cli", filename=None):
+ if filename is None:
+ filename = "vyos_ntp_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_ntp_merged_idempotent(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.1.1.0/24", "10.1.2.0/24"],
+ listen_addresses=["10.2.3.1", "10.4.3.1"],
+ servers=[
+ dict(server="server1"),
+ dict(
+ server="server3", options=["noselect", "dynamic"]
+ ),
+ dict(server="time1.vyos.net"),
+ dict(server="time2.vyos.net"),
+ dict(server="time3.vyos.net"),
+ ],
+ ),
+ state="merged",
+ )
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_ntp_merged(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.2.2.0/24", "10.3.3.0/24"],
+ listen_addresses=["10.3.4.1", "10.4.5.1"],
+ servers=[
+ dict(server="server4", options=["dynamic", "preempt"]),
+ dict(
+ server="server5",
+ options=[
+ "noselect",
+ "dynamic",
+ "preempt",
+ "prefer",
+ ],
+ ),
+ ],
+ ),
+ state="merged",
+ )
+ )
+
+ commands = [
+ "set system ntp allow-clients address 10.2.2.0/24",
+ "set system ntp allow-clients address 10.3.3.0/24",
+ "set system ntp listen-address 10.3.4.1",
+ "set system ntp listen-address 10.4.5.1",
+ "set system ntp server server4 dynamic",
+ "set system ntp server server4 preempt",
+ "set system ntp server server5 dynamic",
+ "set system ntp server server5 noselect",
+ "set system ntp server server5 preempt",
+ "set system ntp server server5 prefer",
+ ]
+
+ self.execute_module(changed=True, commands=commands)
+
+ def test_ntp_replaced(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.3.4.0/24", "10.4.5.0/24"],
+ listen_addresses=["10.3.3.1", "10.4.4.1"],
+ servers=[
+ dict(server="server4", options=["noselect", "prefer"]),
+ dict(
+ server="server6",
+ options=[
+ "noselect",
+ "dynamic",
+ "prefer",
+ "preempt",
+ ],
+ ),
+ dict(server="time1.vyos.net"),
+ dict(server="time2.vyos.net"),
+ dict(server="time3.vyos.net"),
+ ],
+ ),
+ state="replaced",
+ )
+ )
+ commands = [
+ "delete system ntp allow-clients address 10.1.1.0/24",
+ "delete system ntp allow-clients address 10.1.2.0/24",
+ "delete system ntp listen-address 10.2.3.1",
+ "delete system ntp listen-address 10.4.3.1",
+ "delete system ntp server server1",
+ "delete system ntp server server3",
+ "set system ntp allow-clients address 10.3.4.0/24",
+ "set system ntp allow-clients address 10.4.5.0/24",
+ "set system ntp listen-address 10.3.3.1",
+ "set system ntp listen-address 10.4.4.1",
+ "set system ntp server server4 noselect",
+ "set system ntp server server4 prefer",
+ "set system ntp server server6 noselect",
+ "set system ntp server server6 dynamic",
+ "set system ntp server server6 prefer",
+ "set system ntp server server6 preempt",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_ntp_replaced_idempotent(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.1.1.0/24", "10.1.2.0/24"],
+ listen_addresses=["10.2.3.1", "10.4.3.1"],
+ servers=[
+ dict(server="server1"),
+ dict(
+ server="server3", options=["noselect", "dynamic"]
+ ),
+ dict(server="time1.vyos.net"),
+ dict(server="time2.vyos.net"),
+ dict(server="time3.vyos.net"),
+ ],
+ ),
+ state="replaced",
+ )
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_ntp_overridden(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.9.9.0/24"],
+ listen_addresses=["10.9.9.1"],
+ servers=[
+ dict(server="server9"),
+ dict(
+ server="server6", options=["noselect", "dynamic"]
+ ),
+ dict(server="time1.vyos.net"),
+ dict(server="time2.vyos.net"),
+ dict(server="time3.vyos.net"),
+ ],
+ ),
+ state="overridden",
+ )
+ )
+ commands = [
+ "delete system ntp allow-clients address 10.1.1.0/24",
+ "delete system ntp allow-clients address 10.1.2.0/24",
+ "delete system ntp listen-address 10.2.3.1",
+ "delete system ntp listen-address 10.4.3.1",
+ "delete system ntp server server1",
+ "delete system ntp server server3",
+ "set system ntp allow-clients address 10.9.9.0/24",
+ "set system ntp listen-address 10.9.9.1",
+ "set system ntp server server9",
+ "set system ntp server server6 noselect",
+ "set system ntp server server6 dynamic",
+ ]
+ self.execute_module(changed=True, commands=commands)
+
+ def test_ntp_overridden_idempotent(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.1.1.0/24", "10.1.2.0/24"],
+ listen_addresses=["10.2.3.1", "10.4.3.1"],
+ servers=[
+ dict(server="server1"),
+ dict(
+ server="server3", options=["noselect", "dynamic"]
+ ),
+ dict(server="time1.vyos.net"),
+ dict(server="time2.vyos.net"),
+ dict(server="time3.vyos.net"),
+ ],
+ ),
+ state="overridden",
+ )
+ )
+ self.execute_module(changed=False, commands=[])
+
+ def test_ntp_rendered(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.7.7.0/24", "10.8.8.0/24"],
+ listen_addresses=["10.7.9.1"],
+ servers=[
+ dict(server="server79"),
+ dict(
+ server="server46", options=["noselect", "dynamic"]
+ ),
+ dict(server="time1.vyos.net"),
+ dict(server="time2.vyos.net"),
+ dict(server="time3.vyos.net"),
+ ],
+ ),
+ state="rendered",
+ )
+ )
+ rendered_commands = [
+ "set system ntp allow-clients address 10.7.7.0/24",
+ "set system ntp allow-clients address 10.8.8.0/24",
+ "set system ntp listen-address 10.7.9.1",
+ "set system ntp server server79",
+ "set system ntp server server46 noselect",
+ "set system ntp server server46 dynamic",
+ "set system ntp server time1.vyos.net",
+ "set system ntp server time2.vyos.net",
+ "set system ntp server time3.vyos.net",
+ ]
+ result = self.execute_module(changed=False)
+ self.assertEqual(
+ sorted(result["rendered"]),
+ sorted(rendered_commands),
+ result["rendered"],
+ )
+
+ def test_ntp_parsed(self):
+
+ commands = (
+ "set system ntp allow-clients address 10.7.7.0/24",
+ "set system ntp allow-clients address 10.6.7.0/24",
+ "set system ntp listen-address 10.7.9.1",
+ "set system ntp listen-address 10.7.7.1",
+ "set system ntp server check",
+ "set system ntp server server46 noselect",
+ "set system ntp server server46 prefer",
+ "set system ntp server time1.vyos.net",
+ "set system ntp server time2.vyos.net",
+ "set system ntp server time3.vyos.net",
+ )
+ parsed_str = "\n".join(commands)
+ set_module_args(dict(running_config=parsed_str, state="parsed"))
+ result = self.execute_module(changed=False)
+ parsed_list = {
+ "allow_clients": ["10.6.7.0/24", "10.7.7.0/24"],
+ "listen_addresses": ["10.7.7.1", "10.7.9.1"],
+ "servers": [
+ {"server": "check"},
+ {"server": "server46", "options": ["noselect", "prefer"]},
+ {"server": "time1.vyos.net"},
+ {"server": "time2.vyos.net"},
+ {"server": "time3.vyos.net"},
+ ],
+ }
+ self.assertEqual(parsed_list, result["parsed"])
+
+ def test_ntp_gathered(self):
+ set_module_args(dict(state="gathered"))
+ result = self.execute_module(changed=False)
+ gathered_list = {
+ "allow_clients": ["10.1.1.0/24", "10.1.2.0/24"],
+ "listen_addresses": ["10.2.3.1", "10.4.3.1"],
+ "servers": [
+ {"server": "server1"},
+ {"server": "server3", "options": ["dynamic", "noselect"]},
+ {"server": "time1.vyos.net"},
+ {"server": "time2.vyos.net"},
+ {"server": "time3.vyos.net"},
+ ],
+ }
+
+ self.assertEqual(gathered_list, result["gathered"])
+
+ def test_ntp_deleted(self):
+ set_module_args(
+ dict(
+ config=dict(
+ allow_clients=["10.1.1.0/24"],
+ listen_addresses=["10.2.3.1"],
+ servers=[
+ dict(server="server1"),
+ dict(server="server3", options=["noselect"]),
+ dict(server="time1.vyos.net"),
+ dict(server="time2.vyos.net"),
+ dict(server="time3.vyos.net"),
+ ],
+ ),
+ state="deleted",
+ )
+ )
+ commands = [
+ "delete system ntp allow-clients",
+ "delete system ntp listen-address",
+ "delete system ntp server server1",
+ "delete system ntp server server3",
+ "delete system ntp server time1.vyos.net",
+ "delete system ntp server time2.vyos.net",
+ "delete system ntp server time3.vyos.net",
+ ]
+ self.execute_module(changed=True, commands=commands)