diff --git a/changelogs/fragments/ntp_global.yaml b/changelogs/fragments/ntp_global.yaml new file mode 100644 index 00000000..bab9b556 --- /dev/null +++ b/changelogs/fragments/ntp_global.yaml @@ -0,0 +1,5 @@ +--- +minor_changes: + - Added support for VyOS 1.4+ (chronyd vs ntpd) + - Fixed syntax for allow_client in 1.4+ + - Added test suite for ntp_global and 1.4+ diff --git a/docs/vyos.vyos.vyos_ntp_global_module.rst b/docs/vyos.vyos.vyos_ntp_global_module.rst index d2606f89..8bfa05a3 100644 --- a/docs/vyos.vyos.vyos_ntp_global_module.rst +++ b/docs/vyos.vyos.vyos_ntp_global_module.rst @@ -1,965 +1,966 @@ .. _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
Parameter Choices/Defaults Comments
config
dictionary
List of configurations for ntp module
allow_clients
list / elements=string
Network Time Protocol (NTP) server options
listen_addresses
list / elements=string
local IP addresses for service to listen on
servers
list / elements=dictionary
Network Time Protocol (NTP) server
options
list / elements=string
    Choices:
  • noselect
  • -
  • dynamic
  • -
  • pool
  • +
  • dynamic (v1.2)
  • +
  • pool (v1.3+))
  • preempt
  • prefer
server options for NTP
server
string
server name for NTP
running_config
string
This option is used only with state parsed.
The value of this option should be the output received from the VYOS device by executing the command show configuration commands | grep ntp.
The states replaced and overridden have identical behaviour for this module.
The state parsed reads the configuration from 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 parsed key within the result.
state
string
    Choices:
  • deleted
  • merged ←
  • overridden
  • replaced
  • gathered
  • rendered
  • parsed
The state the configuration should be left in.

Notes ----- .. note:: - Tested against vyos 1.3 - This module works with connection ``network_cli``. + - VyOS v.1.4+ uses chronyd, and path changes from ``system`` to ``service`` 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 + # set service ntp server time1.vyos.net + # set system/service ntp server time2.vyos.net + # set system/service 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" + # "set system/service ntp allow-clients address 10.6.6.0/24", + # "set system/service ntp listen-address 10.1.3.1", + # "set system/service 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 + # set system/service ntp allow-clients address '10.6.6.0/24' + # set system/service ntp listen-address '10.1.3.1' + # set system/service ntp server 203.0.113.0 prefer, + # set system/service ntp server time1.vyos.net + # set system/service ntp server time2.vyos.net + # set system/service 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 + # set system/service ntp allow-clients address '10.4.9.0/24' + # set system/service ntp allow-clients address '10.4.7.0/24' + # set system/service ntp allow-clients address '10.1.2.0/24' + # set system/service ntp allow-clients address '10.2.3.0/24' + # set system/service ntp listen-address '10.1.9.16' + # set system/service ntp listen-address '10.5.3.2' + # set system/service ntp listen-address '10.7.9.21' + # set system/service ntp listen-address '10.8.9.4' + # set system/service ntp listen-address '10.4.5.1' + # set system/service ntp server 10.3.6.5 noselect + # set system/service ntp server 10.3.6.5 dynamic + # set system/service ntp server 10.3.6.5 preempt + # set system/service ntp server 10.3.6.5 prefer + # set system/service ntp server server4 noselect + # set system/service ntp server server4 dynamic + # set system/service ntp server server5 + # set system/service ntp server time1.vyos.net + # set system/service ntp server time2.vyos.net + # set system/service 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" + # "delete system/service ntp allow-clients address 10.4.7.0/24", + # "delete system/service ntp allow-clients address 10.2.3.0/24", + # "delete system/service ntp allow-clients address 10.1.2.0/24", + # "delete system/service ntp allow-clients address 10.4.9.0/24", + # "delete system/service ntp listen-address 10.7.9.21", + # "delete system/service ntp listen-address 10.4.5.1", + # "delete system/service ntp listen-address 10.5.3.2", + # "delete system/service ntp listen-address 10.8.9.4", + # "delete system/service ntp listen-address 10.1.9.16", + # "delete system/service ntp server 10.3.6.5", + # "delete system/service ntp server server4", + # "delete system/service ntp server server5", + # "set system/service ntp allow-clients address 10.6.6.0/24", + # "set system/service ntp listen-address 10.1.3.1", + # "set system/service 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 + # set system/service ntp allow-clients address '10.6.6.0/24' + # set system/service ntp listen-address '10.1.3.1' + # set system/service ntp server 203.0.113.0 prefer, + # set system/service ntp server time1.vyos.net + # set system/service ntp server time2.vyos.net + # set system/service 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 + # set system/service ntp allow-clients address '10.6.6.0/24' + # set system/service ntp listen-address '10.1.3.1' + # set system/service ntp server 203.0.113.0 prefer, + # set system/service ntp server time1.vyos.net + # set system/service ntp server time2.vyos.net + # set system/service 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" + # "delete service ntp allow-clients address 10.6.6.0/24", + # "delete service ntp listen-address 10.1.3.1", + # "delete service ntp server ser", + # "set service ntp allow-clients address 10.3.3.0/24", + # "set service ntp listen-address 10.7.8.1", + # "set service ntp server server1 dynamic", + # "set service ntp server server1 prefer", + # "set service ntp server server2 noselect", + # "set service ntp server server2 preempt", + # "set service 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 + # set service ntp allow-clients address '10.3.3.0/24' + # set service ntp listen-address '10.7.8.1' + # set service ntp server serv + # set service ntp server server1 dynamic + # set service ntp server server1 prefer + # set service ntp server server2 noselect + # set service ntp server server2 preempt + # set service ntp server time1.vyos.net + # set service ntp server time2.vyos.net + # set service 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 + # set service ntp allow-clients address '10.3.3.0/24' + # set service ntp listen-address '10.7.8.1' + # set service ntp server serv + # set service ntp server server1 dynamic + # set service ntp server server1 prefer + # set service ntp server server2 noselect + # set service ntp server server2 preempt + # set service ntp server time1.vyos.net + # set service ntp server time2.vyos.net + # set service 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 + # set service ntp allow-clients address '10.3.3.0/24' + # set service ntp listen-address '10.7.8.1' + # set service ntp server serv + # set service ntp server server1 dynamic + # set service ntp server server1 prefer + # set service ntp server server2 noselect + # set service ntp server server2 preempt + # set service ntp server time1.vyos.net + # set service ntp server time2.vyos.net + # set service 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 + # set service ntp allow-clients address '10.3.3.0/24' + # set service ntp listen-address '10.7.8.1' + # set service ntp server serv + # set service ntp server server1 dynamic + # set service ntp server server1 prefer + # set service ntp server server2 noselect + # set service ntp server server2 preempt + # set service ntp server time1.vyos.net + # set service ntp server time2.vyos.net + # set service 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" + # "delete service ntp allow-clients", + # "delete service ntp listen-address", + # "delete service ntp server serv", + # "delete service ntp server server1", + # "delete service 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 + # set service ntp server time1.vyos.net + # set service ntp server time2.vyos.net + # set service 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 + # set service ntp server time1.vyos.net + # set service ntp server time2.vyos.net + # set service ntp server time3.vyos.net # vyos@vyos:~$ # Task # ------------- - name: Render 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 - pool - 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 server45 pool", - # "set system ntp server time1.vyos.net", - # "set system ntp server time2.vyos.net", - # "set system ntp server time3.vyos.net" + # "set service ntp allow-clients address 10.7.7.0/24", + # "set service ntp allow-clients address 10.8.8.0/24", + # "set service ntp listen-address 10.7.9.1", + # "set service ntp server server7", + # "set service ntp server server45 noselect", + # "set service ntp server server45 prefer", + # "set service ntp server server45 pool", + # "set service ntp server time1.vyos.net", + # "set service ntp server time2.vyos.net", + # "set service 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" + # "set service ntp allow-clients address 10.7.7.0/24", + # "set service ntp listen-address 10.7.9.1", + # "set service ntp server server45 noselect", + # "set service ntp allow-clients addres 10.8.6.0/24", + # "set service ntp listen-address 10.5.4.1", + # "set service ntp server server45 dynamic", + # "set service ntp server time1.vyos.net", + # "set service ntp server time2.vyos.net", + # "set service 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 `_, the following are the fields unique to this module: .. raw:: html
Key Returned Description
after
dictionary
when changed
The resulting configuration after module execution.

Sample:
This output will always be in the same format as the module argspec.
before
dictionary
when state is merged, replaced, overridden, deleted or purged
The configuration prior to the module execution.

Sample:
This output will always be in the same format as the module argspec.
commands
list
when state is merged, replaced, overridden, deleted or purged
The set of commands pushed to the remote device.

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']
+
['set service ntp server server1 dynamic', 'set service ntp server server1 prefer', 'set service ntp server server2 noselect', 'set service ntp server server2 preempt', 'set service ntp server server_add preempt']
gathered
list
when state is gathered
Facts about the network resource gathered from the remote device as structured data.

Sample:
This output will always be in the same format as the module argspec.
parsed
list
when state is parsed
The device native config provided in running_config option parsed into structured data as per module argspec.

Sample:
This output will always be in the same format as the module argspec.
rendered
list
when state is rendered
The provided configuration in the task rendered in device-native format (offline).

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']
+
['set service ntp server server1 dynamic', 'set service ntp server server1 prefer', 'set service ntp server server2 noselect', 'set service ntp server server2 preempt', 'set service ntp server server_add preempt']


Status ------ Authors ~~~~~~~ - Varshitha Yataluru (@YVarshitha) 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 index 106faac5..0af1af58 100644 --- a/plugins/module_utils/network/vyos/config/ntp_global/ntp_global.py +++ b/plugins/module_utils/network/vyos/config/ntp_global/ntp_global.py @@ -1,188 +1,203 @@ # # -*- 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.rm_base.resource_module import ( ResourceModule, ) from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.utils import ( dict_merge, ) 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, ) +from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.vyos import get_os_version + +from ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.utils.version import LooseVersion + class 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, {})) + if LooseVersion(get_os_version(self._module)) >= LooseVersion("1.4"): + path = "service" + ac = "allow-client" + else: + path = "system" + ac = "allow-clients" + + if self.commands: + self.commands = [cl.replace('%%path%%', path) for cl in self.commands] + self.commands = [nc.replace('%%ac%%', ac) for nc in self.commands] + 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/rm_templates/ntp_global.py b/plugins/module_utils/network/vyos/rm_templates/ntp_global.py index 33d173e0..1e011dd9 100644 --- a/plugins/module_utils/network/vyos/rm_templates/ntp_global.py +++ b/plugins/module_utils/network/vyos/rm_templates/ntp_global.py @@ -1,135 +1,135 @@ # -*- 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
{ "name": "allow_clients", "getval": re.compile( r""" - ^set\ssystem\sntp\sallow-clients\saddress (\s(?P\S+))? + ^set\s(?Psystem|service)?\sntp\s(?Pallow-clients|allow-client)?\saddress (\s(?P\S+))? $""", re.VERBOSE, ), - "setval": "system ntp allow-clients address {{allow_clients}}", + "setval": "%%path%% ntp %%ac%% 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 + ^set\s(?Psystem|service)?\sntp\s(?Pallow-clients|allow-client)? $""", re.VERBOSE, ), - "setval": "system ntp allow-clients", + "setval": "%%path%% ntp %%ac%%", "result": { }, }, # set system ntp listen_address
{ "name": "listen_addresses", "getval": re.compile( r""" - ^set\ssystem\sntp\slisten-address (\s(?P\S+))? + ^set\s(?Psystem|service)?\sntp\slisten-address (\s(?P\S+))? $""", re.VERBOSE, ), - "setval": "system ntp listen-address {{listen_addresses}}", + "setval": "%%path%% 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 + ^set\s(?Psystem|service)?\sntp\slisten-address $""", re.VERBOSE, ), - "setval": "system ntp listen-address", + "setval": "%%path%% ntp listen-address", "result": { }, }, # set system ntp server { "name": "server", "getval": re.compile( r""" - ^set\ssystem\sntp\sserver (\s(?P\S+))? + ^set\s(?Psystem|service)?\sntp\sserver (\s(?P\S+))? $""", re.VERBOSE, ), - "setval": "system ntp server {{server}}", + "setval": "%%path%% ntp server {{server}}", "result": { "servers": { "{{name}}": { "server": "{{name}}", }, }, }, }, # set system ntp server { "name": "options", "getval": re.compile( r""" - ^set\ssystem\sntp\sserver + ^set\s(?Psystem|service)?\sntp\sserver \s(?P\S+) \s(?Pnoselect|dynamic|pool|preempt|prefer)? $""", re.VERBOSE, ), - "setval": "system ntp server {{server}} {{options}}", + "setval": "%%path%% ntp server {{server}} {{options}}", "result": { "servers": { "{{name}}": { "server": "{{name}}", "options": ["{{options}}"], }, }, }, }, ] # fmt: on diff --git a/tests/unit/modules/network/vyos/fixtures/vyos_ntp_config_v14.cfg b/tests/unit/modules/network/vyos/fixtures/vyos_ntp_config_v14.cfg new file mode 100644 index 00000000..8fc8ecd0 --- /dev/null +++ b/tests/unit/modules/network/vyos/fixtures/vyos_ntp_config_v14.cfg @@ -0,0 +1,10 @@ +set service ntp allow-client address '10.1.1.0/24' +set service ntp allow-client address '10.1.2.0/24' +set service ntp listen-address '10.2.3.1' +set service ntp listen-address '10.4.3.1' +set service ntp server server1 +set service ntp server server3 noselect +set service ntp server server3 pool +set service ntp server time1.vyos.net +set service ntp server time2.vyos.net +set service 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 index 6609c2f5..0bf61078 100644 --- a/tests/unit/modules/network/vyos/test_vyos_ntp_global.py +++ b/tests/unit/modules/network/vyos/test_vyos_ntp_global.py @@ -1,349 +1,683 @@ # (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 . # Make coding more python3-ish from __future__ import absolute_import, division, print_function __metaclass__ = type from unittest.mock import patch from ansible_collections.vyos.vyos.plugins.modules import vyos_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() + self.mock_get_os_version = patch( + "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.ntp_global.ntp_global.get_os_version", + ) + self.get_os_version = self.mock_get_os_version.start() + self.get_os_version.return_value = "1.2" + 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() + self.mock_get_os_version.stop() def load_fixtures(self, commands=None, 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", - "pool", + "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 pool", + "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) + + +class TestVyosNTPModule14(TestVyosModule): + module = vyos_ntp_global + + def setUp(self): + super(TestVyosNTPModule14, 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() + + self.mock_get_os_version = patch( + "ansible_collections.vyos.vyos.plugins.module_utils.network.vyos.config.ntp_global.ntp_global.get_os_version", + ) + self.get_os_version = self.mock_get_os_version.start() + self.get_os_version.return_value = "1.4" + + def tearDown(self): + super(TestVyosNTPModule14, self).tearDown() + self.mock_get_resource_connection_config.stop() + self.mock_get_resource_connection_facts.stop() + self.mock_execute_show_command.stop() + self.mock_get_os_version.stop() + + def load_fixtures(self, commands=None, filename=None): + if filename is None: + filename = "vyos_ntp_config_v14.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", "pool"]), + 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=["pool", "preempt"]), + dict( + server="server5", + options=[ + "noselect", + "pool", + "preempt", + "prefer", + ], + ), + ], + ), + state="merged", + ), + ) + + commands = [ + "set service ntp allow-client address 10.2.2.0/24", + "set service ntp allow-client address 10.3.3.0/24", + "set service ntp listen-address 10.3.4.1", + "set service ntp listen-address 10.4.5.1", + "set service ntp server server4 pool", + "set service ntp server server4 preempt", + "set service ntp server server5 pool", + "set service ntp server server5 noselect", + "set service ntp server server5 preempt", + "set service 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", + "pool", + "prefer", + "preempt", + ], + ), + dict(server="time1.vyos.net"), + dict(server="time2.vyos.net"), + dict(server="time3.vyos.net"), + ], + ), + state="replaced", + ), + ) + commands = [ + "delete service ntp allow-client address 10.1.1.0/24", + "delete service ntp allow-client address 10.1.2.0/24", + "delete service ntp listen-address 10.2.3.1", + "delete service ntp listen-address 10.4.3.1", + "delete service ntp server server1", + "delete service ntp server server3", + "set service ntp allow-client address 10.3.4.0/24", + "set service ntp allow-client address 10.4.5.0/24", + "set service ntp listen-address 10.3.3.1", + "set service ntp listen-address 10.4.4.1", + "set service ntp server server4 noselect", + "set service ntp server server4 prefer", + "set service ntp server server6 noselect", + "set service ntp server server6 pool", + "set service ntp server server6 prefer", + "set service 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", "pool"]), + 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", "pool"]), + dict(server="time1.vyos.net"), + dict(server="time2.vyos.net"), + dict(server="time3.vyos.net"), + ], + ), + state="overridden", + ), + ) + commands = [ + "delete service ntp allow-client address 10.1.1.0/24", + "delete service ntp allow-client address 10.1.2.0/24", + "delete service ntp listen-address 10.2.3.1", + "delete service ntp listen-address 10.4.3.1", + "delete service ntp server server1", + "delete service ntp server server3", + "set service ntp allow-client address 10.9.9.0/24", + "set service ntp listen-address 10.9.9.1", + "set service ntp server server9", + "set service ntp server server6 noselect", + "set service ntp server server6 pool", + ] + 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", "pool"]), + 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", "pool"]), + dict(server="time1.vyos.net"), + dict(server="time2.vyos.net"), + dict(server="time3.vyos.net"), + ], + ), + state="rendered", + ), + ) + rendered_commands = [ + "set service ntp allow-client address 10.7.7.0/24", + "set service ntp allow-client address 10.8.8.0/24", + "set service ntp listen-address 10.7.9.1", + "set service ntp server server79", + "set service ntp server server46 noselect", + "set service ntp server server46 pool", + "set service ntp server time1.vyos.net", + "set service ntp server time2.vyos.net", + "set service 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 service ntp allow-client address 10.7.7.0/24", + "set service ntp allow-client address 10.6.7.0/24", + "set service ntp listen-address 10.7.9.1", + "set service ntp listen-address 10.7.7.1", + "set service ntp server check", + "set service ntp server server46 noselect", + "set service ntp server server46 prefer", + "set service ntp server time1.vyos.net", + "set service ntp server time2.vyos.net", + "set service 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": ["noselect", "pool"]}, + {"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 service ntp allow-client", + "delete service ntp listen-address", + "delete service ntp server server1", + "delete service ntp server server3", + "delete service ntp server time1.vyos.net", + "delete service ntp server time2.vyos.net", + "delete service ntp server time3.vyos.net", + ] + self.execute_module(changed=True, commands=commands)