diff options
58 files changed, 2052 insertions, 614 deletions
| @@ -7,5 +7,5 @@ license_file: LICENSE  name: vyos  namespace: vyos  readme: README.rst -repository: https://github.com/ansible-collections/vyos +repository: https://github.com/ansible-collections/vyos.vyos  tags: [vyos, networking] diff --git a/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py b/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py index 3542cb1..fd8b612 100644 --- a/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py +++ b/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py @@ -61,8 +61,17 @@ class InterfacesArgs(object):  # pylint: disable=R0903              },              "type": "list",          }, +        "running_config": {"type": "str"},          "state": { -            "choices": ["merged", "replaced", "overridden", "deleted"], +            "choices": [ +                "merged", +                "replaced", +                "overridden", +                "deleted", +                "rendered", +                "parsed", +                "gathered", +            ],              "default": "merged",              "type": "str",          }, diff --git a/plugins/module_utils/network/vyos/argspec/l3_interfaces/l3_interfaces.py b/plugins/module_utils/network/vyos/argspec/l3_interfaces/l3_interfaces.py index 91434e4..2f1dfe4 100644 --- a/plugins/module_utils/network/vyos/argspec/l3_interfaces/l3_interfaces.py +++ b/plugins/module_utils/network/vyos/argspec/l3_interfaces/l3_interfaces.py @@ -25,7 +25,6 @@  The arg spec for the vyos_l3_interfaces module  """ -  from __future__ import absolute_import, division, print_function  __metaclass__ = type @@ -73,8 +72,17 @@ class L3_interfacesArgs(object):  # pylint: disable=R0903              },              "type": "list",          }, +        "running_config": {"type": "str"},          "state": { -            "choices": ["merged", "replaced", "overridden", "deleted"], +            "choices": [ +                "merged", +                "replaced", +                "overridden", +                "deleted", +                "rendered", +                "gathered", +                "parsed", +            ],              "default": "merged",              "type": "str",          }, diff --git a/plugins/module_utils/network/vyos/argspec/lag_interfaces/lag_interfaces.py b/plugins/module_utils/network/vyos/argspec/lag_interfaces/lag_interfaces.py index 97c5d5a..6cfdabf 100644 --- a/plugins/module_utils/network/vyos/argspec/lag_interfaces/lag_interfaces.py +++ b/plugins/module_utils/network/vyos/argspec/lag_interfaces/lag_interfaces.py @@ -19,7 +19,6 @@  #   builder template.  #  ############################################# -  """  The arg spec for the vyos_lag_interfaces module  """ @@ -72,8 +71,17 @@ class Lag_interfacesArgs(object):  # pylint: disable=R0903              },              "type": "list",          }, +        "running_config": {"type": "str"},          "state": { -            "choices": ["merged", "replaced", "overridden", "deleted"], +            "choices": [ +                "merged", +                "replaced", +                "overridden", +                "deleted", +                "rendered", +                "gathered", +                "parsed", +            ],              "default": "merged",              "type": "str",          }, diff --git a/plugins/module_utils/network/vyos/argspec/lldp_global/lldp_global.py b/plugins/module_utils/network/vyos/argspec/lldp_global/lldp_global.py index 84bbc00..6205fd7 100644 --- a/plugins/module_utils/network/vyos/argspec/lldp_global/lldp_global.py +++ b/plugins/module_utils/network/vyos/argspec/lldp_global/lldp_global.py @@ -19,7 +19,6 @@  #   builder template.  #  ############################################# -  """  The arg spec for the vyos_lldp_global module  """ @@ -48,8 +47,16 @@ class Lldp_globalArgs(object):  # pylint: disable=R0903              },              "type": "dict",          }, +        "running_config": {"type": "str"},          "state": { -            "choices": ["merged", "replaced", "deleted"], +            "choices": [ +                "merged", +                "replaced", +                "deleted", +                "rendered", +                "parsed", +                "gathered", +            ],              "default": "merged",              "type": "str",          }, diff --git a/plugins/module_utils/network/vyos/argspec/lldp_interfaces/lldp_interfaces.py b/plugins/module_utils/network/vyos/argspec/lldp_interfaces/lldp_interfaces.py index 2976fc0..109ea43 100644 --- a/plugins/module_utils/network/vyos/argspec/lldp_interfaces/lldp_interfaces.py +++ b/plugins/module_utils/network/vyos/argspec/lldp_interfaces/lldp_interfaces.py @@ -81,8 +81,17 @@ class Lldp_interfacesArgs(object):  # pylint: disable=R0903              },              "type": "list",          }, +        "running_config": {"type": "str"},          "state": { -            "choices": ["merged", "replaced", "overridden", "deleted"], +            "choices": [ +                "merged", +                "replaced", +                "overridden", +                "deleted", +                "rendered", +                "gathered", +                "parsed", +            ],              "default": "merged",              "type": "str",          }, diff --git a/plugins/module_utils/network/vyos/config/interfaces/interfaces.py b/plugins/module_utils/network/vyos/config/interfaces/interfaces.py index deb504c..51bf98e 100644 --- a/plugins/module_utils/network/vyos/config/interfaces/interfaces.py +++ b/plugins/module_utils/network/vyos/config/interfaces/interfaces.py @@ -13,7 +13,6 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type -  from copy import deepcopy  from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import (      ConfigBase, @@ -49,14 +48,14 @@ class Interfaces(ConfigBase):      def __init__(self, module):          super(Interfaces, self).__init__(module) -    def get_interfaces_facts(self): +    def get_interfaces_facts(self, data=None):          """ Get the 'facts' (the current configuration)          :rtype: A dictionary          :returns: The current configuration as a dictionary          """          facts, _warnings = Facts(self._module).get_facts( -            self.gather_subset, self.gather_network_resources +            self.gather_subset, self.gather_network_resources, data=data          )          interfaces_facts = facts["ansible_network_resources"].get("interfaces")          if not interfaces_facts: @@ -72,25 +71,42 @@ class Interfaces(ConfigBase):          commands = list()          warnings = list() -        existing_interfaces_facts = self.get_interfaces_facts() -        commands.extend(self.set_config(existing_interfaces_facts)) -        if commands: -            if self._module.check_mode: -                resp = self._connection.edit_config(commands, commit=False) -            else: -                resp = self._connection.edit_config(commands) -            result["changed"] = True +        if self.state in self.ACTION_STATES: +            existing_interfaces_facts = self.get_interfaces_facts() +        else: +            existing_interfaces_facts = [] -        result["commands"] = commands +        if self.state in self.ACTION_STATES or self.state == "rendered": +            commands.extend(self.set_config(existing_interfaces_facts)) -        if self._module._diff: -            result["diff"] = resp["diff"] if result["changed"] else None +        if commands and self.state in self.ACTION_STATES: +            if not self._module.check_mode: +                self._connection.edit_config(commands) +            result["changed"] = True -        changed_interfaces_facts = self.get_interfaces_facts() +        if self.state in self.ACTION_STATES: +            result["commands"] = commands + +        if self.state in self.ACTION_STATES or self.state == "gathered": +            changed_interfaces_facts = self.get_interfaces_facts() +        elif self.state == "rendered": +            result["rendered"] = commands +        elif self.state == "parsed": +            running_config = self._module.params["running_config"] +            if not running_config: +                self._module.fail_json( +                    msg="value of running_config parameter must not be empty for state parsed" +                ) +            result["parsed"] = self.get_interfaces_facts(data=running_config) +        else: +            changed_interfaces_facts = [] -        result["before"] = existing_interfaces_facts -        if result["changed"]: -            result["after"] = changed_interfaces_facts +        if self.state in self.ACTION_STATES: +            result["before"] = existing_interfaces_facts +            if result["changed"]: +                result["after"] = changed_interfaces_facts +        elif self.state == "gathered": +            result["gathered"] = changed_interfaces_facts          result["warnings"] = warnings          return result @@ -118,19 +134,21 @@ class Interfaces(ConfigBase):                    to the desired configuration          """          commands = [] -        state = self._module.params["state"] -        if state in ("merged", "replaced", "overridden") and not want: +        if ( +            self.state in ("merged", "replaced", "overridden", "rendered") +            and not want +        ):              self._module.fail_json(                  msg="value of config parameter must not be empty for state {0}".format( -                    state +                    self.state                  )              ) -        if state == "overridden": +        if self.state == "overridden":              commands.extend(self._state_overridden(want=want, have=have)) -        elif state == "deleted": +        elif self.state == "deleted":              if not want:                  for intf in have:                      commands.extend( @@ -146,12 +164,12 @@ class Interfaces(ConfigBase):                  obj_in_have = search_obj_in_list(name, have)                  if not obj_in_have: -                    obj_in_have = {"name": item["name"]} +                    obj_in_have = {"name": name} -                elif state == "merged": +                if self.state in ("merged", "rendered"):                      commands.extend(self._state_merged(item, obj_in_have)) -                elif state == "replaced": +                elif self.state == "replaced":                      commands.extend(self._state_replaced(item, obj_in_have))          return commands diff --git a/plugins/module_utils/network/vyos/config/l3_interfaces/l3_interfaces.py b/plugins/module_utils/network/vyos/config/l3_interfaces/l3_interfaces.py index a23e417..122cc1e 100644 --- a/plugins/module_utils/network/vyos/config/l3_interfaces/l3_interfaces.py +++ b/plugins/module_utils/network/vyos/config/l3_interfaces/l3_interfaces.py @@ -52,14 +52,14 @@ class L3_interfaces(ConfigBase):      def __init__(self, module):          super(L3_interfaces, self).__init__(module) -    def get_l3_interfaces_facts(self): +    def get_l3_interfaces_facts(self, data=None):          """ Get the 'facts' (the current configuration)          :rtype: A dictionary          :returns: The current configuration as a dictionary          """          facts, _warnings = Facts(self._module).get_facts( -            self.gather_subset, self.gather_network_resources +            self.gather_subset, self.gather_network_resources, data=data          )          l3_interfaces_facts = facts["ansible_network_resources"].get(              "l3_interfaces" @@ -78,25 +78,44 @@ class L3_interfaces(ConfigBase):          warnings = list()          commands = list() -        existing_l3_interfaces_facts = self.get_l3_interfaces_facts() -        commands.extend(self.set_config(existing_l3_interfaces_facts)) -        if commands: -            if self._module.check_mode: -                resp = self._connection.edit_config(commands, commit=False) -            else: -                resp = self._connection.edit_config(commands) -            result["changed"] = True +        if self.state in self.ACTION_STATES: +            existing_l3_interfaces_facts = self.get_l3_interfaces_facts() +        else: +            existing_l3_interfaces_facts = [] -        result["commands"] = commands +        if self.state in self.ACTION_STATES or self.state == "rendered": +            commands.extend(self.set_config(existing_l3_interfaces_facts)) -        if self._module._diff: -            result["diff"] = resp["diff"] if result["changed"] else None +        if commands and self.state in self.ACTION_STATES: +            if not self._module.check_mode: +                self._connection.edit_config(commands) +            result["changed"] = True -        changed_l3_interfaces_facts = self.get_l3_interfaces_facts() +        if self.state in self.ACTION_STATES: +            result["commands"] = commands + +        if self.state in self.ACTION_STATES or self.state == "gathered": +            changed_l3_interfaces_facts = self.get_l3_interfaces_facts() +        elif self.state == "rendered": +            result["rendered"] = commands +        elif self.state == "parsed": +            running_config = self._module.params["running_config"] +            if not running_config: +                self._module.fail_json( +                    msg="value of running_config parameter must not be empty for state parsed" +                ) +            result["parsed"] = self.get_l3_interfaces_facts( +                data=running_config +            ) +        else: +            changed_l3_interfaces_facts = [] -        result["before"] = existing_l3_interfaces_facts -        if result["changed"]: -            result["after"] = changed_l3_interfaces_facts +        if self.state in self.ACTION_STATES: +            result["before"] = existing_l3_interfaces_facts +            if result["changed"]: +                result["after"] = changed_l3_interfaces_facts +        elif self.state == "gathered": +            result["gathered"] = changed_l3_interfaces_facts          result["warnings"] = warnings          return result @@ -126,7 +145,10 @@ class L3_interfaces(ConfigBase):          commands = []          state = self._module.params["state"] -        if state in ("merged", "replaced", "overridden") and not want: +        if ( +            state in ("merged", "replaced", "overridden", "rendered") +            and not want +        ):              self._module.fail_json(                  msg="value of config parameter must not be empty for state {0}".format(                      state @@ -154,7 +176,7 @@ class L3_interfaces(ConfigBase):                  if not obj_in_have:                      obj_in_have = {"name": item["name"]} -                if state == "merged": +                if state in ("merged", "rendered"):                      commands.extend(self._state_merged(item, obj_in_have))                  elif state == "replaced": diff --git a/plugins/module_utils/network/vyos/config/lag_interfaces/lag_interfaces.py b/plugins/module_utils/network/vyos/config/lag_interfaces/lag_interfaces.py index 2a9efd9..452670f 100644 --- a/plugins/module_utils/network/vyos/config/lag_interfaces/lag_interfaces.py +++ b/plugins/module_utils/network/vyos/config/lag_interfaces/lag_interfaces.py @@ -56,14 +56,14 @@ class Lag_interfaces(ConfigBase):      def __init__(self, module):          super(Lag_interfaces, self).__init__(module) -    def get_lag_interfaces_facts(self): +    def get_lag_interfaces_facts(self, data=None):          """ Get the 'facts' (the current configuration)          :rtype: A dictionary          :returns: The current configuration as a dictionary          """          facts, _warnings = Facts(self._module).get_facts( -            self.gather_subset, self.gather_network_resources +            self.gather_subset, self.gather_network_resources, data=data          )          lag_interfaces_facts = facts["ansible_network_resources"].get(              "lag_interfaces" @@ -79,27 +79,47 @@ class Lag_interfaces(ConfigBase):          :returns: The result from module execution          """          result = {"changed": False} -        commands = list()          warnings = list() -        existing_lag_interfaces_facts = self.get_lag_interfaces_facts() -        commands.extend(self.set_config(existing_lag_interfaces_facts)) -        if commands: -            if self._module.check_mode: -                resp = self._connection.edit_config(commands, commit=False) -            else: -                resp = self._connection.edit_config(commands) -            result["changed"] = True +        commands = list() + +        if self.state in self.ACTION_STATES: +            existing_lag_interfaces_facts = self.get_lag_interfaces_facts() +        else: +            existing_lag_interfaces_facts = [] -        result["commands"] = commands +        if self.state in self.ACTION_STATES or self.state == "rendered": +            commands.extend(self.set_config(existing_lag_interfaces_facts)) -        if self._module._diff: -            result["diff"] = resp["diff"] if result["changed"] else None +        if commands and self.state in self.ACTION_STATES: +            if not self._module.check_mode: +                self._connection.edit_config(commands) +            result["changed"] = True -        changed_lag_interfaces_facts = self.get_lag_interfaces_facts() +        if self.state in self.ACTION_STATES: +            result["commands"] = commands + +        if self.state in self.ACTION_STATES or self.state == "gathered": +            changed_lag_interfaces_facts = self.get_lag_interfaces_facts() +        elif self.state == "rendered": +            result["rendered"] = commands +        elif self.state == "parsed": +            running_config = self._module.params["running_config"] +            if not running_config: +                self._module.fail_json( +                    msg="value of running_config parameter must not be empty for state parsed" +                ) +            result["parsed"] = self.get_lag_interfaces_facts( +                data=running_config +            ) +        else: +            changed_lag_interfaces_facts = [] -        result["before"] = existing_lag_interfaces_facts -        if result["changed"]: -            result["after"] = changed_lag_interfaces_facts +        if self.state in self.ACTION_STATES: +            result["before"] = existing_lag_interfaces_facts +            if result["changed"]: +                result["after"] = changed_lag_interfaces_facts +        elif self.state == "gathered": +            result["gathered"] = changed_lag_interfaces_facts          result["warnings"] = warnings          return result @@ -127,16 +147,18 @@ class Lag_interfaces(ConfigBase):                    to the desired configuration          """          commands = [] -        state = self._module.params["state"] -        if state in ("merged", "replaced", "overridden") and not want: +        if ( +            self.state in ("merged", "replaced", "overridden", "rendered") +            and not want +        ):              self._module.fail_json(                  msg="value of config parameter must not be empty for state {0}".format( -                    state +                    self.state                  )              ) -        if state == "overridden": +        if self.state == "overridden":              commands.extend(self._state_overridden(want, have)) -        elif state == "deleted": +        elif self.state == "deleted":              if want:                  for want_item in want:                      name = want_item["name"] @@ -149,9 +171,9 @@ class Lag_interfaces(ConfigBase):              for want_item in want:                  name = want_item["name"]                  obj_in_have = search_obj_in_list(name, have) -                if state == "merged": +                if self.state in ("merged", "rendered"):                      commands.extend(self._state_merged(want_item, obj_in_have)) -                elif state == "replaced": +                elif self.state == "replaced":                      commands.extend(                          self._state_replaced(want_item, obj_in_have)                      ) diff --git a/plugins/module_utils/network/vyos/config/lldp_global/lldp_global.py b/plugins/module_utils/network/vyos/config/lldp_global/lldp_global.py index 010e96d..c70d27f 100644 --- a/plugins/module_utils/network/vyos/config/lldp_global/lldp_global.py +++ b/plugins/module_utils/network/vyos/config/lldp_global/lldp_global.py @@ -47,20 +47,20 @@ class Lldp_global(ConfigBase):      def __init__(self, module):          super(Lldp_global, self).__init__(module) -    def get_lldp_global_facts(self): +    def get_lldp_global_facts(self, data=None):          """ Get the 'facts' (the current configuration)          :rtype: A dictionary          :returns: The current configuration as a dictionary          """          facts, _warnings = Facts(self._module).get_facts( -            self.gather_subset, self.gather_network_resources +            self.gather_subset, self.gather_network_resources, data=data          )          lldp_global_facts = facts["ansible_network_resources"].get(              "lldp_global"          )          if not lldp_global_facts: -            return {} +            return []          return lldp_global_facts      def execute_module(self): @@ -70,22 +70,45 @@ class Lldp_global(ConfigBase):          :returns: The result from module execution          """          result = {"changed": False} -        commands = list()          warnings = list() +        commands = list() + +        if self.state in self.ACTION_STATES: +            existing_lldp_global_facts = self.get_lldp_global_facts() +        else: +            existing_lldp_global_facts = [] -        existing_lldp_global_facts = self.get_lldp_global_facts() -        commands.extend(self.set_config(existing_lldp_global_facts)) -        if commands: +        if self.state in self.ACTION_STATES or self.state == "rendered": +            commands.extend(self.set_config(existing_lldp_global_facts)) + +        if commands and self.state in self.ACTION_STATES:              if not self._module.check_mode:                  self._connection.edit_config(commands)              result["changed"] = True -        result["commands"] = commands -        changed_lldp_global_facts = self.get_lldp_global_facts() +        if self.state in self.ACTION_STATES: +            result["commands"] = commands + +        if self.state in self.ACTION_STATES or self.state == "gathered": +            changed_lldp_global_facts = self.get_lldp_global_facts() +        elif self.state == "rendered": +            result["rendered"] = commands +        elif self.state == "parsed": +            running_config = self._module.params["running_config"] +            if not running_config: +                self._module.fail_json( +                    msg="value of running_config parameter must not be empty for state parsed" +                ) +            result["parsed"] = self.get_lldp_global_facts(data=running_config) +        else: +            changed_lldp_global_facts = [] -        result["before"] = existing_lldp_global_facts -        if result["changed"]: -            result["after"] = changed_lldp_global_facts +        if self.state in self.ACTION_STATES: +            result["before"] = existing_lldp_global_facts +            if result["changed"]: +                result["after"] = changed_lldp_global_facts +        elif self.state == "gathered": +            result["gathered"] = changed_lldp_global_facts          result["warnings"] = warnings          return result @@ -113,18 +136,17 @@ class Lldp_global(ConfigBase):                    to the desired configuration          """          commands = [] -        state = self._module.params["state"] -        if state in ("merged", "replaced") and not want: +        if self.state in ("merged", "replaced", "rendered") and not want:              self._module.fail_json(                  msg="value of config parameter must not be empty for state {0}".format( -                    state +                    self.state                  )              ) -        if state == "deleted": +        if self.state == "deleted":              commands.extend(self._state_deleted(want=None, have=have)) -        elif state == "merged": +        elif self.state in ("merged", "rendered"):              commands.extend(self._state_merged(want=want, have=have)) -        elif state == "replaced": +        elif self.state == "replaced":              commands.extend(self._state_replaced(want=want, have=have))          return commands diff --git a/plugins/module_utils/network/vyos/config/lldp_interfaces/lldp_interfaces.py b/plugins/module_utils/network/vyos/config/lldp_interfaces/lldp_interfaces.py index 377fec9..94e39c3 100644 --- a/plugins/module_utils/network/vyos/config/lldp_interfaces/lldp_interfaces.py +++ b/plugins/module_utils/network/vyos/config/lldp_interfaces/lldp_interfaces.py @@ -15,7 +15,6 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type -  from ansible_collections.ansible.netcommon.plugins.module_utils.network.common.cfg.base import (      ConfigBase,  ) @@ -54,14 +53,14 @@ class Lldp_interfaces(ConfigBase):      def __init__(self, module):          super(Lldp_interfaces, self).__init__(module) -    def get_lldp_interfaces_facts(self): +    def get_lldp_interfaces_facts(self, data=None):          """ Get the 'facts' (the current configuration)          :rtype: A dictionary          :returns: The current configuration as a dictionary          """          facts, _warnings = Facts(self._module).get_facts( -            self.gather_subset, self.gather_network_resources +            self.gather_subset, self.gather_network_resources, data=data          )          lldp_interfaces_facts = facts["ansible_network_resources"].get(              "lldp_interfaces" @@ -77,26 +76,47 @@ class Lldp_interfaces(ConfigBase):          :returns: The result from module execution          """          result = {"changed": False} -        commands = list()          warnings = list() -        existing_lldp_interfaces_facts = self.get_lldp_interfaces_facts() -        commands.extend(self.set_config(existing_lldp_interfaces_facts)) -        if commands: -            if self._module.check_mode: -                resp = self._connection.edit_config(commands, commit=False) -            else: -                resp = self._connection.edit_config(commands) -            result["changed"] = True +        commands = list() + +        if self.state in self.ACTION_STATES: +            existing_lldp_interfaces_facts = self.get_lldp_interfaces_facts() +        else: +            existing_lldp_interfaces_facts = [] -        result["commands"] = commands +        if self.state in self.ACTION_STATES or self.state == "rendered": +            commands.extend(self.set_config(existing_lldp_interfaces_facts)) -        if self._module._diff: -            result["diff"] = resp["diff"] if result["changed"] else None +        if commands and self.state in self.ACTION_STATES: +            if not self._module.check_mode: +                self._connection.edit_config(commands) +            result["changed"] = True -        changed_lldp_interfaces_facts = self.get_lldp_interfaces_facts() -        result["before"] = existing_lldp_interfaces_facts -        if result["changed"]: -            result["after"] = changed_lldp_interfaces_facts +        if self.state in self.ACTION_STATES: +            result["commands"] = commands + +        if self.state in self.ACTION_STATES or self.state == "gathered": +            changed_lldp_interfaces_facts = self.get_lldp_interfaces_facts() +        elif self.state == "rendered": +            result["rendered"] = commands +        elif self.state == "parsed": +            running_config = self._module.params["running_config"] +            if not running_config: +                self._module.fail_json( +                    msg="value of running_config parameter must not be empty for state parsed" +                ) +            result["parsed"] = self.get_lldp_interfaces_facts( +                data=running_config +            ) +        else: +            changed_lldp_interfaces_facts = [] + +        if self.state in self.ACTION_STATES: +            result["before"] = existing_lldp_interfaces_facts +            if result["changed"]: +                result["after"] = changed_lldp_interfaces_facts +        elif self.state == "gathered": +            result["gathered"] = changed_lldp_interfaces_facts          result["warnings"] = warnings          return result @@ -124,16 +144,18 @@ class Lldp_interfaces(ConfigBase):                    to the desired configuration          """          commands = [] -        state = self._module.params["state"] -        if state in ("merged", "replaced", "overridden") and not want: +        if ( +            self.state in ("merged", "replaced", "overridden", "rendered") +            and not want +        ):              self._module.fail_json(                  msg="value of config parameter must not be empty for state {0}".format( -                    state +                    self.state                  )              ) -        if state == "overridden": +        if self.state == "overridden":              commands.extend(self._state_overridden(want=want, have=have)) -        elif state == "deleted": +        elif self.state == "deleted":              if want:                  for item in want:                      name = item["name"] @@ -150,11 +172,11 @@ class Lldp_interfaces(ConfigBase):              for want_item in want:                  name = want_item["name"]                  have_item = search_obj_in_list(name, have) -                if state == "merged": +                if self.state in ("merged", "rendered"):                      commands.extend(                          self._state_merged(want=want_item, have=have_item)                      ) -                else: +                if self.state == "replaced":                      commands.extend(                          self._state_replaced(want=want_item, have=have_item)                      ) @@ -243,7 +265,6 @@ class Lldp_interfaces(ConfigBase):          lldp_name = want["name"]          params = Lldp_interfaces.params -        commands.extend(self._add_location(lldp_name, want, have))          for attrib in params:              value = want[attrib]              if value: diff --git a/plugins/module_utils/network/vyos/config/static_routes/static_routes.py b/plugins/module_utils/network/vyos/config/static_routes/static_routes.py index e93d4ee..b359dbb 100644 --- a/plugins/module_utils/network/vyos/config/static_routes/static_routes.py +++ b/plugins/module_utils/network/vyos/config/static_routes/static_routes.py @@ -160,7 +160,7 @@ class Static_routes(ConfigBase):              routes = self._get_routes(want)              for r in routes:                  h_item = self.search_route_in_have(have, r["dest"]) -                if self.state == "merged" or self.state == "rendered": +                if self.state in ("merged", "rendered"):                      commands.extend(self._state_merged(want=r, have=h_item))                  elif self.state == "replaced":                      commands.extend(self._state_replaced(want=r, have=h_item)) @@ -253,12 +253,6 @@ class Static_routes(ConfigBase):                                      afi=item["afi"], remove=True                                  )                              ) -            for r in routes: -                h_route = self.search_route_in_have(have, r["dest"]) -                if h_route: -                    commands.extend( -                        self._render_updates(r, h_route, opr=False) -                    )          else:              routes = self._get_routes(have)              if self._is_ip_route_exist(routes): diff --git a/plugins/module_utils/network/vyos/facts/l3_interfaces/l3_interfaces.py b/plugins/module_utils/network/vyos/facts/l3_interfaces/l3_interfaces.py index d1d62c2..3b99d34 100644 --- a/plugins/module_utils/network/vyos/facts/l3_interfaces/l3_interfaces.py +++ b/plugins/module_utils/network/vyos/facts/l3_interfaces/l3_interfaces.py @@ -10,7 +10,12 @@ for a given resource, parsed, and the facts tree is populated  based on the configuration.  """ -from __future__ import absolute_import, division, print_function +from __future__ import ( +    absolute_import, +    division, +    print_function, +    unicode_literals, +)  __metaclass__ = type diff --git a/plugins/module_utils/network/vyos/facts/lag_interfaces/lag_interfaces.py b/plugins/module_utils/network/vyos/facts/lag_interfaces/lag_interfaces.py index 9201e5c..9056294 100644 --- a/plugins/module_utils/network/vyos/facts/lag_interfaces/lag_interfaces.py +++ b/plugins/module_utils/network/vyos/facts/lag_interfaces/lag_interfaces.py @@ -12,6 +12,7 @@ based on the configuration.  from __future__ import absolute_import, division, print_function  __metaclass__ = type +  from re import findall, search, M  from copy import deepcopy @@ -59,30 +60,21 @@ class Lag_interfacesFacts(object):                  lag_regex = r" %s .+$" % lag                  cfg = findall(lag_regex, data, M)                  obj = self.render_config(cfg) - -                output = connection.run_commands( -                    ["show interfaces bonding " + lag + " slaves"] -                ) -                lines = output[0].splitlines()                  members = []                  member = {} -                if len(lines) > 1: -                    for line in lines[2:]: -                        splitted_line = line.split() - -                        if len(splitted_line) > 1: -                            member["member"] = splitted_line[0] -                            members.append(member) -                        else: -                            members = [] -                        member = {} + +                group_regex = r".*eth.* '%s'" % lag +                g_cfg = findall(group_regex, data, M) +                for item in g_cfg: +                    output = search("^set interfaces ethernet (\\S+)", item, M) +                    if output: +                        member["member"] = output.group(1).strip("'") +                        members.append(member)                  obj["name"] = lag.strip("'")                  if members:                      obj["members"] = members -                  if obj:                      objs.append(obj) -          facts = {}          if objs:              facts["lag_interfaces"] = [] diff --git a/plugins/modules/vyos_interfaces.py b/plugins/modules/vyos_interfaces.py index 93df4e4..6730e30 100644 --- a/plugins/modules/vyos_interfaces.py +++ b/plugins/modules/vyos_interfaces.py @@ -30,14 +30,10 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type -ANSIBLE_METADATA = { -    "metadata_version": "1.1", -    "status": ["preview"], -    "supported_by": "network", -} +ANSIBLE_METADATA = {"metadata_version": "1.1", "supported_by": "Ansible"}  DOCUMENTATION = """module: vyos_interfaces -short_description: Manages interface attributes of VyOS network devices. +short_description: Interfaces resource module  description:  - This module manages the interface attributes on VyOS network devices.  - This module supports managing base attributes of Ethernet, Bonding, VXLAN, Loopback @@ -45,7 +41,10 @@ description:  notes:  - Tested against VyOS 1.1.8 (helium).  - This module works with connection C(network_cli). See L(the VyOS OS Platform Options,../network/user_guide/platform_vyos.html). -author: Nilashish Chakraborty (@nilashishc) +version_added: "1.0.0" +author: +- Nilashish Chakraborty (@nilashishc) +- Rohit Thakur (@rohitthakur2590)  options:    config:      description: The provided interfaces configuration. @@ -119,6 +118,15 @@ options:              - MTU for the virtual sub-interface.              - Refer to vendor documentation for valid values.              type: int +  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 interfaces). +      - The state I(parsed) reads the configuration from C(running_config) 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 of the configuration after module completion. @@ -128,6 +136,9 @@ options:      - replaced      - overridden      - deleted +    - rendered +    - gathered +    - parsed      default: merged  """  EXAMPLES = """ @@ -152,7 +163,7 @@ EXAMPLES = """  # set interfaces loopback lo  - name: Merge provided configuration with device configuration -  vyos_interfaces: +  vyos.vyos.vyos_interfaces:      config:        - name: eth2          description: 'Configured by Ansible' @@ -330,7 +341,7 @@ EXAMPLES = """  #  #  - name: Replace device configurations of listed interfaces with provided configurations -  vyos_interfaces: +  vyos.vyos.vyos_interfaces:      config:        - name: eth2          description: "Replaced by Ansible" @@ -515,7 +526,7 @@ EXAMPLES = """  #  #  - name: Overrides all device configuration with provided configuration -  vyos_interfaces: +  vyos.vyos.vyos_interfaces:      config:        - name: eth0          description: Outbound Interface For The Appliance @@ -700,7 +711,7 @@ EXAMPLES = """  #  #  - name: Delete attributes of given interfaces (Note - This won't delete the interfaces themselves) -  vyos_interfaces: +  vyos.vyos.vyos_interfaces:      config:        - name: bond1 @@ -838,6 +849,224 @@ EXAMPLES = """  # set interfaces loopback lo  #  # + + +# Using gathered +# +# Before state: +# ------------- +# +# vyos@192# run show configuration commands | grep interfaces +# set interfaces ethernet eth0 address 'dhcp' +# set interfaces ethernet eth0 duplex 'auto' +# set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' +# set interfaces ethernet eth0 smp_affinity 'auto' +# set interfaces ethernet eth0 speed 'auto' +# set interfaces ethernet eth1 description 'Configured by Ansible' +# set interfaces ethernet eth1 duplex 'auto' +# set interfaces ethernet eth1 mtu '1500' +# set interfaces ethernet eth1 speed 'auto' +# set interfaces ethernet eth1 vif 200 description 'VIF - 200' +# set interfaces ethernet eth2 description 'Configured by Ansible' +# set interfaces ethernet eth2 duplex 'auto' +# set interfaces ethernet eth2 mtu '1500' +# set interfaces ethernet eth2 speed 'auto' +# set interfaces ethernet eth2 vif 200 description 'VIF - 200' +# +- name: Gather listed interfaces with provided configurations +  vyos.vyos.vyos_interfaces: +    config: +    state: gathered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +#    "gathered": [ +#         { +#             "description": "Configured by Ansible", +#             "duplex": "auto", +#             "enabled": true, +#             "mtu": 1500, +#             "name": "eth2", +#             "speed": "auto", +#             "vifs": [ +#                 { +#                     "description": "VIF - 200", +#                     "enabled": true, +#                     "vlan_id": 200 +#                 } +#             ] +#         }, +#         { +#             "description": "Configured by Ansible", +#             "duplex": "auto", +#             "enabled": true, +#             "mtu": 1500, +#             "name": "eth1", +#             "speed": "auto", +#             "vifs": [ +#                 { +#                     "description": "VIF - 200", +#                     "enabled": true, +#                     "vlan_id": 200 +#                 } +#             ] +#         }, +#         { +#             "duplex": "auto", +#             "enabled": true, +#             "name": "eth0", +#             "speed": "auto" +#         } +#     ] +# +# +# After state: +# ------------- +# +# vyos@192# run show configuration commands | grep interfaces +# set interfaces ethernet eth0 address 'dhcp' +# set interfaces ethernet eth0 duplex 'auto' +# set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' +# set interfaces ethernet eth0 smp_affinity 'auto' +# set interfaces ethernet eth0 speed 'auto' +# set interfaces ethernet eth1 description 'Configured by Ansible' +# set interfaces ethernet eth1 duplex 'auto' +# set interfaces ethernet eth1 mtu '1500' +# set interfaces ethernet eth1 speed 'auto' +# set interfaces ethernet eth1 vif 200 description 'VIF - 200' +# set interfaces ethernet eth2 description 'Configured by Ansible' +# set interfaces ethernet eth2 duplex 'auto' +# set interfaces ethernet eth2 mtu '1500' +# set interfaces ethernet eth2 speed 'auto' +# set interfaces ethernet eth2 vif 200 description 'VIF - 200' + + +# Using rendered +# +# +- name: Render the commands for provided  configuration +  vyos.vyos.vyos_interfaces: +    config: +      - name: eth0 +        enabled: true +        duplex: auto +        speed: auto +      - name: eth1 +        description: Configured by Ansible - Interface 1 +        mtu: 1500 +        speed: auto +        duplex: auto +        enabled: true +        vifs: +          - vlan_id: 100 +            description: Eth1 - VIF 100 +            mtu: 400 +            enabled: true +          - vlan_id: 101 +            description: Eth1 - VIF 101 +            enabled: true +      - name: eth2 +        description: Configured by Ansible - Interface 2 (ADMIN DOWN) +        mtu: 600 +        enabled: false +    state: rendered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "rendered": [ +#         "set interfaces ethernet eth0 duplex 'auto'", +#         "set interfaces ethernet eth0 speed 'auto'", +#         "delete interfaces ethernet eth0 disable", +#         "set interfaces ethernet eth1 duplex 'auto'", +#         "delete interfaces ethernet eth1 disable", +#         "set interfaces ethernet eth1 speed 'auto'", +#         "set interfaces ethernet eth1 description 'Configured by Ansible - Interface 1'", +#         "set interfaces ethernet eth1 mtu '1500'", +#         "set interfaces ethernet eth1 vif 100 description 'Eth1 - VIF 100'", +#         "set interfaces ethernet eth1 vif 100 mtu '400'", +#         "set interfaces ethernet eth1 vif 101 description 'Eth1 - VIF 101'", +#         "set interfaces ethernet eth2 disable", +#         "set interfaces ethernet eth2 description 'Configured by Ansible - Interface 2 (ADMIN DOWN)'", +#         "set interfaces ethernet eth2 mtu '600'" +#     ] + + +# Using parsed +# +# +- name: Parse the configuration. +  vyos.vyos.vyos_interfaces: +    running_config: +      "set interfaces ethernet eth0 address 'dhcp' + set interfaces ethernet eth0 duplex 'auto' + set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' + set interfaces ethernet eth0 smp_affinity 'auto' + set interfaces ethernet eth0 speed 'auto' + set interfaces ethernet eth1 description 'Configured by Ansible' + set interfaces ethernet eth1 duplex 'auto' + set interfaces ethernet eth1 mtu '1500' + set interfaces ethernet eth1 speed 'auto' + set interfaces ethernet eth1 vif 200 description 'VIF - 200' + set interfaces ethernet eth2 description 'Configured by Ansible' + set interfaces ethernet eth2 duplex 'auto' + set interfaces ethernet eth2 mtu '1500' + set interfaces ethernet eth2 speed 'auto' + set interfaces ethernet eth2 vif 200 description 'VIF - 200'" +    state: parsed +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "parsed": [ +#         { +#             "description": "Configured by Ansible", +#             "duplex": "auto", +#             "enabled": true, +#             "mtu": 1500, +#             "name": "eth2", +#             "speed": "auto", +#             "vifs": [ +#                 { +#                     "description": "VIF - 200", +#                     "enabled": true, +#                     "vlan_id": 200 +#                 } +#             ] +#         }, +#         { +#             "description": "Configured by Ansible", +#             "duplex": "auto", +#             "enabled": true, +#             "mtu": 1500, +#             "name": "eth1", +#             "speed": "auto", +#             "vifs": [ +#                 { +#                     "description": "VIF - 200", +#                     "enabled": true, +#                     "vlan_id": 200 +#                 } +#             ] +#         }, +#         { +#             "duplex": "auto", +#             "enabled": true, +#             "name": "eth0", +#             "speed": "auto" +#         } +#     ] + +  """  RETURN = """  before: @@ -879,8 +1108,19 @@ def main():      :returns: the result form module invocation      """ +    required_if = [ +        ("state", "merged", ("config",)), +        ("state", "replaced", ("config",)), +        ("state", "rendered", ("config",)), +        ("state", "overridden", ("config",)), +        ("state", "parsed", ("running_config",)), +    ] +    mutually_exclusive = [("config", "running_config")]      module = AnsibleModule( -        argument_spec=InterfacesArgs.argument_spec, supports_check_mode=True +        argument_spec=InterfacesArgs.argument_spec, +        required_if=required_if, +        supports_check_mode=True, +        mutually_exclusive=mutually_exclusive,      )      result = Interfaces(module).execute_module() diff --git a/plugins/modules/vyos_l3_interfaces.py b/plugins/modules/vyos_l3_interfaces.py index a77ecaf..4724240 100644 --- a/plugins/modules/vyos_l3_interfaces.py +++ b/plugins/modules/vyos_l3_interfaces.py @@ -37,12 +37,14 @@ ANSIBLE_METADATA = {  }  DOCUMENTATION = """module: vyos_l3_interfaces -short_description: Manages L3 interface attributes of VyOS network devices. +short_description: L3 interfaces resource module  description: This module manages the L3 interface attributes on VyOS network devices.  notes:  - Tested against VyOS 1.1.8 (helium).  - This module works with connection C(network_cli). See L(the VyOS OS Platform Options,../network/user_guide/platform_vyos.html). -author: Nilashish Chakraborty (@NilashishC) +author: +- Nilashish Chakraborty (@NilashishC) +- Rohit Thakur (@rohitthakur2590)  options:    config:      description: The provided L3 interfaces configuration. @@ -104,6 +106,16 @@ options:                  description:                  - IPv6 address of the virtual interface.                  type: str +  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 -e eth[2,3]). +      - The state I(parsed) reads the configuration from C(running_config) 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 +    version_added: "1.0.0"    state:      description:      - The state of the configuration after module completion. @@ -113,6 +125,9 @@ options:      - replaced      - overridden      - deleted +    - parsed +    - gathered +    - rendered      default: merged  """  EXAMPLES = """ @@ -128,7 +143,7 @@ EXAMPLES = """  # set interfaces ethernet eth3 vif 102  - name: Merge provided configuration with device configuration -  vyos_l3_interfaces: +  vyos.vyos.vyos_l3_interfaces:      config:        - name: eth2          ipv4: @@ -196,7 +211,7 @@ EXAMPLES = """  # set interfaces ethernet eth3 vif 102 address '2001:db8:4000::2/34'  #  - name: Replace device configurations of listed interfaces with provided configurations -  vyos_l3_interfaces: +  vyos.vyos.vyos_l3_interfaces:      config:        - name: eth2          ipv4: @@ -252,7 +267,7 @@ EXAMPLES = """  # set interfaces ethernet eth3 vif 102 address '2001:db8:4000::2/34'  - name: Overrides all device configuration with provided configuration -  vyos_l3_interfaces: +  vyos.vyos.vyos_l3_interfaces:      config:        - name: eth0          ipv4: @@ -303,7 +318,7 @@ EXAMPLES = """  # set interfaces ethernet eth3 vif 102 address '2001:db8:4000::2/34'  - name: Delete L3 attributes of given interfaces (Note - This won't delete the interface itself) -  vyos_l3_interfaces: +  vyos.vyos.vyos_l3_interfaces:      config:        - name: eth1        - name: eth2 @@ -326,6 +341,180 @@ EXAMPLES = """  # set interfaces ethernet eth3 smp_affinity 'auto' +# Using gathered +# +# Before state: +# ------------- +# +# vyos:~$ show configuration commands | grep -e eth[2,3,0] +# set interfaces ethernet eth0 address 'dhcp' +# set interfaces ethernet eth0 duplex 'auto' +# set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' +# set interfaces ethernet eth0 smp_affinity 'auto' +# set interfaces ethernet eth0 speed 'auto' +# set interfaces ethernet eth1 address '192.0.2.14/24' +# set interfaces ethernet eth2 address '192.0.2.11/24' +# set interfaces ethernet eth2 address '192.0.2.10/24' +# set interfaces ethernet eth2 address '2001:db8::10/32' +# set interfaces ethernet eth2 address '2001:db8::12/32' +# +- name: Gather listed l3 interfaces with provided configurations +  vyos.vyos.vyos_l3_interfaces: +    config: +    state: gathered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +#    "gathered": [ +#         { +#             "ipv4": [ +#                 { +#                     "address": "192.0.2.11/24" +#                 }, +#                 { +#                     "address": "192.0.2.10/24" +#                 } +#             ], +#             "ipv6": [ +#                 { +#                     "address": "2001:db8::10/32" +#                 }, +#                 { +#                     "address": "2001:db8::12/32" +#                 } +#             ], +#             "name": "eth2" +#         }, +#         { +#             "ipv4": [ +#                 { +#                     "address": "192.0.2.14/24" +#                 } +#             ], +#             "name": "eth1" +#         }, +#         { +#             "ipv4": [ +#                 { +#                     "address": "dhcp" +#                 } +#             ], +#             "name": "eth0" +#         } +#     ] +# +# +# After state: +# ------------- +# +# vyos:~$ show configuration commands | grep -e eth[2,3] +# set interfaces ethernet eth0 address 'dhcp' +# set interfaces ethernet eth0 duplex 'auto' +# set interfaces ethernet eth0 hw-id '08:00:27:50:5e:19' +# set interfaces ethernet eth0 smp_affinity 'auto' +# set interfaces ethernet eth0 speed 'auto' +# set interfaces ethernet eth1 address '192.0.2.14/24' +# set interfaces ethernet eth2 address '192.0.2.11/24' +# set interfaces ethernet eth2 address '192.0.2.10/24' +# set interfaces ethernet eth2 address '2001:db8::10/32' +# set interfaces ethernet eth2 address '2001:db8::12/32' + + +# Using rendered +# +# +- name: Render the commands for provided  configuration +  vyos.vyos.vyos_l3_interfaces: +    config: +      - name: eth1 +        ipv4: +          - address: 192.0.2.14/24 +      - name: eth2 +        ipv4: +          - address: 192.0.2.10/24 +          - address: 192.0.2.11/24 +        ipv6: +          - address: 2001:db8::10/32 +          - address: 2001:db8::12/32 +    state: rendered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "rendered": [ +#         "set interfaces ethernet eth1 address '192.0.2.14/24'", +#         "set interfaces ethernet eth2 address '192.0.2.11/24'", +#         "set interfaces ethernet eth2 address '192.0.2.10/24'", +#         "set interfaces ethernet eth2 address '2001:db8::10/32'", +#         "set interfaces ethernet eth2 address '2001:db8::12/32'" +#     ] + + +# Using parsed +# +# +- name: parse the provided running configuration +  vyos.vyos.vyos_l3_interfaces: +    running_config: +      "set interfaces ethernet eth0 address 'dhcp' + set interfaces ethernet eth1 address '192.0.2.14/24' + set interfaces ethernet eth2 address '192.0.2.10/24' + set interfaces ethernet eth2 address '192.0.2.11/24' + set interfaces ethernet eth2 address '2001:db8::10/32' + set interfaces ethernet eth2 address '2001:db8::12/32'" +    state: parsed +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "parsed": [ +#         { +#             "ipv4": [ +#                 { +#                     "address": "192.0.2.10/24" +#                 }, +#                 { +#                     "address": "192.0.2.11/24" +#                 } +#             ], +#             "ipv6": [ +#                 { +#                     "address": "2001:db8::10/32" +#                 }, +#                 { +#                     "address": "2001:db8::12/32" +#                 } +#             ], +#             "name": "eth2" +#         }, +#         { +#             "ipv4": [ +#                 { +#                     "address": "192.0.2.14/24" +#                 } +#             ], +#             "name": "eth1" +#         }, +#         { +#             "ipv4": [ +#                 { +#                     "address": "dhcp" +#                 } +#             ], +#             "name": "eth0" +#         } +#     ] + +  """  RETURN = """  before: @@ -365,8 +554,20 @@ def main():      :returns: the result form module invocation      """ +    required_if = [ +        ("state", "merged", ("config",)), +        ("state", "replaced", ("config",)), +        ("state", "rendered", ("config",)), +        ("state", "overridden", ("config",)), +        ("state", "parsed", ("running_config",)), +    ] +    mutually_exclusive = [("config", "running_config")] +      module = AnsibleModule( -        argument_spec=L3_interfacesArgs.argument_spec, supports_check_mode=True +        argument_spec=L3_interfacesArgs.argument_spec, +        required_if=required_if, +        supports_check_mode=True, +        mutually_exclusive=mutually_exclusive,      )      result = L3_interfaces(module).execute_module() diff --git a/plugins/modules/vyos_lag_interfaces.py b/plugins/modules/vyos_lag_interfaces.py index 84f3d01..1ba511c 100644 --- a/plugins/modules/vyos_lag_interfaces.py +++ b/plugins/modules/vyos_lag_interfaces.py @@ -30,16 +30,13 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type -ANSIBLE_METADATA = { -    "metadata_version": "1.1", -    "status": ["preview"], -    "supported_by": "network", -} +ANSIBLE_METADATA = {"metadata_version": "1.1", "supported_by": "Ansible"}  DOCUMENTATION = """module: vyos_lag_interfaces -short_description: Manages attributes of link aggregation groups on VyOS network devices. +short_description: LAG interfaces resource module  description: This module manages attributes of link aggregation groups on VyOS network    devices. +version_added: "1.0.0"  notes:  - Tested against VyOS 1.1.8 (helium).  - This module works with connection C(network_cli). See L(the VyOS OS Platform Options,../network/user_guide/platform_vyos.html). @@ -100,6 +97,15 @@ options:              description:              - IP address to use for ARP monitoring.              type: list +  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 bond). +      - The state I(parsed) reads the configuration from C(running_config) 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 of the configuration after module completion. @@ -109,6 +115,9 @@ options:      - replaced      - overridden      - deleted +    - parsed +    - gathered +    - rendered      default: merged  """  EXAMPLES = """ @@ -122,7 +131,7 @@ EXAMPLES = """  # set interfaces bonding bond3  #  - name: Merge provided configuration with device configuration -  vyos_lag_interfaces: +  vyos.vyos.vyos_lag_interfaces:      config:        - name: bond2          mode: active-backup @@ -226,7 +235,7 @@ EXAMPLES = """  # set interfaces ethernet eth3 bond-group 'bond3'  #  - name: Replace device configurations of listed LAGs with provided configurations -  vyos_lag_interfaces: +  vyos.vyos.vyos_lag_interfaces:      config:        - name: bond3          mode: '802.3ad' @@ -331,7 +340,7 @@ EXAMPLES = """  # set interfaces ethernet eth3 bond-group 'bond3'  #  - name: Overrides all device configuration with provided configuration -  vyos_lag_interfaces: +  vyos.vyos.vyos_lag_interfaces:      config:        - name: bond3          mode: active-backup @@ -441,7 +450,7 @@ EXAMPLES = """  # set interfaces ethernet eth3 bond-group 'bond3'  #  - name: Delete LAG attributes of given interfaces (Note This won't delete the interface itself) -  vyos_lag_interfaces: +  vyos.vyos.vyos_lag_interfaces:      config:        - name: bond2        - name: bond3 @@ -507,6 +516,202 @@ EXAMPLES = """  # set interfaces bonding bond3 +# Using gathered +# +# Before state: +# ------------- +# +# vyos@192# run show configuration commands | grep bond +# set interfaces bonding bond0 hash-policy 'layer2' +# set interfaces bonding bond0 mode 'active-backup' +# set interfaces bonding bond0 primary 'eth1' +# set interfaces bonding bond1 hash-policy 'layer2+3' +# set interfaces bonding bond1 mode 'active-backup' +# set interfaces bonding bond1 primary 'eth2' +# set interfaces ethernet eth1 bond-group 'bond0' +# set interfaces ethernet eth2 bond-group 'bond1' +# +- name: Gather listed  lag interfaces with provided configurations +  vyos.vyos.vyos_lag_interfaces: +    config: +    state: gathered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +#    "gathered": [ +#        { +#            "afi": "ipv6", +#            "rule_sets": [ +#                { +#                    "default_action": "accept", +#                    "description": "This is ipv6 specific rule-set", +#                    "name": "UPLINK", +#                    "rules": [ +#                        { +#                            "action": "accept", +#                            "description": "Fwipv6-Rule 1 is configured by Ansible", +#                            "ipsec": "match-ipsec", +#                            "number": 1 +#                        }, +#                        { +#                            "action": "accept", +#                            "description": "Fwipv6-Rule 2 is configured by Ansible", +#                            "ipsec": "match-ipsec", +#                            "number": 2 +#                        } +#                    ] +#                } +#            ] +#        }, +#        { +#            "afi": "ipv4", +#            "rule_sets": [ +#                { +#                    "default_action": "accept", +#                    "description": "IPv4 INBOUND rule set", +#                    "name": "INBOUND", +#                    "rules": [ +#                        { +#                            "action": "accept", +#                            "description": "Rule 101 is configured by Ansible", +#                            "ipsec": "match-ipsec", +#                            "number": 101 +#                        }, +#                        { +#                            "action": "reject", +#                            "description": "Rule 102 is configured by Ansible", +#                            "ipsec": "match-ipsec", +#                            "number": 102 +#                        }, +#                        { +#                            "action": "accept", +#                            "description": "Rule 103 is configured by Ansible", +#                            "destination": { +#                                "group": { +#                                    "address_group": "inbound" +#                                } +#                            }, +#                            "number": 103, +#                            "source": { +#                                "address": "192.0.2.0" +#                            }, +#                            "state": { +#                                "established": true, +#                                "invalid": false, +#                                "new": false, +#                                "related": true +#                            } +#                        } +#                    ] +#                } +#            ] +#        } +#    ] +# +# +# After state: +# ------------- +# +# vyos@192# run show configuration commands | grep bond +# set interfaces bonding bond0 hash-policy 'layer2' +# set interfaces bonding bond0 mode 'active-backup' +# set interfaces bonding bond0 primary 'eth1' +# set interfaces bonding bond1 hash-policy 'layer2+3' +# set interfaces bonding bond1 mode 'active-backup' +# set interfaces bonding bond1 primary 'eth2' +# set interfaces ethernet eth1 bond-group 'bond0' +# set interfaces ethernet eth2 bond-group 'bond1' + + +# Using rendered +# +# +- name: Render the commands for provided  configuration +  vyos.vyos.vyos_lag_interfaces: +    config: +       - name: bond0 +         hash_policy: layer2 +         members: +           - member: eth1 +         mode: active-backup +         primary: eth1 +       - name: bond1 +         hash_policy: layer2+3 +         members: +           - member: eth2 +         mode: active-backup +         primary: eth2 +    state: rendered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "rendered": [ +#        "set interfaces bonding bond0 hash-policy 'layer2'", +#        "set interfaces ethernet eth1 bond-group 'bond0'", +#        "set interfaces bonding bond0 mode 'active-backup'", +#        "set interfaces bonding bond0 primary 'eth1'", +#        "set interfaces bonding bond1 hash-policy 'layer2+3'", +#        "set interfaces ethernet eth2 bond-group 'bond1'", +#        "set interfaces bonding bond1 mode 'active-backup'", +#        "set interfaces bonding bond1 primary 'eth2'" +#    ] + + +# Using parsed +# +# +- name: Parsed the commands for provided  configuration +  vyos.vyos.vyos_l3_interfaces: +    running_config: +      "set interfaces bonding bond0 hash-policy 'layer2' + set interfaces bonding bond0 mode 'active-backup' + set interfaces bonding bond0 primary 'eth1' + set interfaces bonding bond1 hash-policy 'layer2+3' + set interfaces bonding bond1 mode 'active-backup' + set interfaces bonding bond1 primary 'eth2' + set interfaces ethernet eth1 bond-group 'bond0' + set interfaces ethernet eth2 bond-group 'bond1'" +    state: parsed +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "parsed": [ +#         { +#             "hash_policy": "layer2", +#             "members": [ +#                 { +#                     "member": "eth1" +#                 } +#             ], +#             "mode": "active-backup", +#             "name": "bond0", +#             "primary": "eth1" +#         }, +#         { +#             "hash_policy": "layer2+3", +#             "members": [ +#                 { +#                     "member": "eth2" +#                 } +#             ], +#             "mode": "active-backup", +#             "name": "bond1", +#             "primary": "eth2" +#         } +#     ] + +  """  RETURN = """  before: @@ -551,12 +756,17 @@ def main():      required_if = [          ("state", "merged", ("config",)),          ("state", "replaced", ("config",)), +        ("state", "rendered", ("config",)),          ("state", "overridden", ("config",)), +        ("state", "parsed", ("running_config",)),      ] +    mutually_exclusive = [("config", "running_config")] +      module = AnsibleModule(          argument_spec=Lag_interfacesArgs.argument_spec,          required_if=required_if,          supports_check_mode=True, +        mutually_exclusive=mutually_exclusive,      )      result = Lag_interfaces(module).execute_module() diff --git a/plugins/modules/vyos_lldp_global.py b/plugins/modules/vyos_lldp_global.py index 08eb113..3a93c95 100644 --- a/plugins/modules/vyos_lldp_global.py +++ b/plugins/modules/vyos_lldp_global.py @@ -30,17 +30,13 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type -ANSIBLE_METADATA = { -    "metadata_version": "1.1", -    "status": ["preview"], -    "supported_by": "network", -} +ANSIBLE_METADATA = {"metadata_version": "1.1", "supported_by": "Ansible"}  DOCUMENTATION = """module: vyos_lldp_global -short_description: Manage link layer discovery protocol (LLDP) attributes on VyOS -  devices.. +short_description: LLDP global resource module  description: This module manages link layer discovery protocol (LLDP) attributes on    VyOS devices. +version_added: "1.0.0"  notes:  - Tested against VyOS 1.1.8 (helium).  - This module works with connection C(network_cli). See L(the VyOS OS Platform Options,../network/user_guide/platform_vyos.html). @@ -72,6 +68,15 @@ options:          - edp          - fdp          - sonmp +  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 lldp). +      - The state I(parsed) reads the configuration from C(running_config) 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 of the configuration after module completion. @@ -80,6 +85,9 @@ options:      - merged      - replaced      - deleted +    - gathered +    - rendered +    - parsed      default: merged  """  EXAMPLES = """ @@ -89,10 +97,9 @@ EXAMPLES = """  # -------------  #  # vyos@vyos:~$ show configuration commands|grep lldp -# vyos@vyos:~$  #  - name: Merge provided configuration with device configuration -  vyos_lldp_global: +  vyos.vyos.vyos_lldp_global:      config:        legacy_protocols:          - 'fdp' @@ -154,7 +161,7 @@ EXAMPLES = """  # set service lldp snmp enable  #  - name: Replace device configurations with provided configurations -  vyos_lldp_global: +  vyos.vyos.vyos_lldp_global:      config:        legacy_protocols:          - 'edp' @@ -231,7 +238,7 @@ EXAMPLES = """  # set service lldp management-address '192.0.2.14'  #  - name: Delete attributes of given lldp service (This won't delete the LLDP service itself) -  vyos_lldp_global: +  vyos.vyos.vyos_lldp_global:      config:      state: deleted  # @@ -273,6 +280,163 @@ EXAMPLES = """  # set service lldp +# Using gathered +# +# Before state: +# ------------- +# +# vyos@192# run show configuration commands | grep lldp +# set service lldp legacy-protocols 'cdp' +# set service lldp management-address '192.0.2.17' +# +- name: Gather lldp global config with provided configurations +  vyos.vyos.vyos_lldp_global: +    config: +    state: gathered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +#    "gathered": [ +# { +#        "config_trap": true, +#        "group": { +#            "address_group": [ +#                { +#                    "description": "Sales office hosts address list", +#                    "members": [ +#                        { +#                            "address": "192.0.3.1" +#                        }, +#                        { +#                            "address": "192.0.3.2" +#                        } +#                    ], +#                    "name": "ENG-HOSTS" +#                }, +#                { +#                    "description": "Sales office hosts address list", +#                    "members": [ +#                        { +#                            "address": "192.0.2.1" +#                        }, +#                        { +#                            "address": "192.0.2.2" +#                        }, +#                        { +#                            "address": "192.0.2.3" +#                        } +#                    ], +#                    "name": "SALES-HOSTS" +#                } +#            ], +#            "network_group": [ +#                { +#                    "description": "This group has the Management network addresses", +#                    "members": [ +#                        { +#                            "address": "192.0.1.0/24" +#                        } +#                    ], +#                    "name": "MGMT" +#                } +#            ] +#        }, +#        "log_martians": true, +#        "ping": { +#            "all": true, +#            "broadcast": true +#        }, +#        "route_redirects": [ +#            { +#                "afi": "ipv4", +#                "icmp_redirects": { +#                    "receive": false, +#                    "send": true +#                }, +#                "ip_src_route": true +#            } +#        ], +#        "state_policy": [ +#            { +#                "action": "accept", +#                "connection_type": "established", +#                "log": true +#            }, +#            { +#                "action": "reject", +#                "connection_type": "invalid" +#            } +#        ], +#        "syn_cookies": true, +#        "twa_hazards_protection": true, +#        "validation": "strict" +#    } +# +# After state: +# ------------- +# +# vyos@192# run show configuration commands | grep lldp +# set service lldp legacy-protocols 'cdp' +# set service lldp management-address '192.0.2.17' + + +# Using rendered +# +# +- name: Render the commands for provided  configuration +  vyos.vyos.vyos_lldp_global: +    config: +      address: 192.0.2.17 +      enable: true +      legacy_protocols: +        - cdp +    state: rendered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "rendered": [ +#         "set service lldp legacy-protocols 'cdp'", +#         "set service lldp", +#         "set service lldp management-address '192.0.2.17'" +#     ] +# + + +# Using parsed +# +# +- name: Parse the provided commands to provide structured configuration +  vyos.vyos.vyos_lldp_global: +    running_config: +      "set service lldp legacy-protocols 'cdp' + set service lldp legacy-protocols 'fdp' + set service lldp management-address '192.0.2.11'" +    state: parsed +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "parsed": { +#         "address": "192.0.2.11", +#         "enable": true, +#         "legacy_protocols": [ +#             "cdp", +#             "fdp" +#         ] +#     } +# + +  """  RETURN = """  before: @@ -317,13 +481,16 @@ def main():      required_if = [          ("state", "merged", ("config",)),          ("state", "replaced", ("config",)), +        ("state", "rendered", ("config",)), +        ("state", "parsed", ("running_config",)),      ] +    mutually_exclusive = [("config", "running_config")]      module = AnsibleModule(          argument_spec=Lldp_globalArgs.argument_spec,          required_if=required_if,          supports_check_mode=True, +        mutually_exclusive=mutually_exclusive,      ) -      result = Lldp_global(module).execute_module()      module.exit_json(**result) diff --git a/plugins/modules/vyos_lldp_interfaces.py b/plugins/modules/vyos_lldp_interfaces.py index 8fe572b..b26da49 100644 --- a/plugins/modules/vyos_lldp_interfaces.py +++ b/plugins/modules/vyos_lldp_interfaces.py @@ -30,18 +30,15 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type -ANSIBLE_METADATA = { -    "metadata_version": "1.1", -    "status": ["preview"], -    "supported_by": "network", -} +ANSIBLE_METADATA = {"metadata_version": "1.1", "supported_by": "Ansible"}  DOCUMENTATION = """module: vyos_lldp_interfaces -short_description: Manages attributes of lldp interfaces on VyOS devices. +short_description: LLDP interfaces resource module  description: This module manages attributes of lldp interfaces on VyOS network devices.  notes:  - Tested against VyOS 1.1.8 (helium).  - This module works with connection C(network_cli). See L(the VyOS OS Platform Options,../network/user_guide/platform_vyos.html). +version_added: "1.0.0"  author:  - Rohit Thakur (@rohitthakur2590)  options: @@ -111,6 +108,15 @@ options:            elin:              description: Emergency Call Service ELIN number (between 10-25 numbers).              type: str +  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 lldp). +      - The state I(parsed) reads the configuration from C(running_config) 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 of the configuration after module completion. @@ -120,6 +126,9 @@ options:      - replaced      - overridden      - deleted +    - rendered +    - parsed +    - gathered      default: merged  """  EXAMPLES = """ @@ -131,7 +140,7 @@ EXAMPLES = """  # vyos@vyos:~$ show configuration  commands | grep lldp  #  - name: Merge provided configuration with device configuration -  vyos_lldp_interfaces: +  vyos.vyos.vyos_lldp_interfaces:      config:        - name: 'eth1'          location: @@ -225,7 +234,7 @@ EXAMPLES = """  # set service lldp interface eth2 location coordinate-based longitude '222.267255W'  #  - name: Replace device configurations of listed LLDP interfaces with provided configurations -  vyos_lldp_interfaces: +  vyos.vyos.vyos_lldp_interfaces:      config:        - name: 'eth2'          location: @@ -348,7 +357,7 @@ EXAMPLES = """  # set service lldp interface eth2 location civic-based country-code 'US'  #  - name: Overrides all device configuration with provided configuration -  vyos_lag_interfaces: +  vyos.vyos.vyos_lldp_interfaces:      config:       - name: 'eth2'         location: @@ -423,7 +432,7 @@ EXAMPLES = """  # set service lldp interface eth2 location elin '0000000911'  #  - name: Delete lldp  interface attributes of given interfaces. -  vyos_lag_interfaces: +  vyos.vyos.vyos_lldp_interfaces:      config:       - name: 'eth2'      state: deleted @@ -453,6 +462,159 @@ EXAMPLES = """  # set service 'lldp' +# Using gathered +# +# Before state: +# ------------- +# +# vyos@192# run show configuration commands | grep lldp +# set service lldp interface eth1 location civic-based ca-type 0 ca-value 'ENGLISH' +# set service lldp interface eth1 location civic-based country-code 'US' +# set service lldp interface eth2 location coordinate-based altitude '2200' +# set service lldp interface eth2 location coordinate-based datum 'WGS84' +# set service lldp interface eth2 location coordinate-based latitude '33.524449N' +# set service lldp interface eth2 location coordinate-based longitude '222.267255W' +# +- name: Gather listed lldp interfaces from running configuration +  vyos.vyos.vyos_lldp_interfaces: +    config: +    state: gathered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +#    "gathered": [ +#         { +#             "location": { +#                 "coordinate_based": { +#                     "altitude": 2200, +#                     "datum": "WGS84", +#                     "latitude": "33.524449N", +#                     "longitude": "222.267255W" +#                 } +#             }, +#             "name": "eth2" +#         }, +#         { +#             "location": { +#                 "civic_based": { +#                     "ca_info": [ +#                         { +#                             "ca_type": 0, +#                             "ca_value": "ENGLISH" +#                         } +#                     ], +#                     "country_code": "US" +#                 } +#             }, +#             "name": "eth1" +#         } +#     ] +# +# +# After state: +# ------------- +# +# vyos@192# run show configuration commands | grep lldp +# set service lldp interface eth1 location civic-based ca-type 0 ca-value 'ENGLISH' +# set service lldp interface eth1 location civic-based country-code 'US' +# set service lldp interface eth2 location coordinate-based altitude '2200' +# set service lldp interface eth2 location coordinate-based datum 'WGS84' +# set service lldp interface eth2 location coordinate-based latitude '33.524449N' +# set service lldp interface eth2 location coordinate-based longitude '222.267255W' + + +# Using rendered +# +# +- name: Render the commands for provided  configuration +  vyos.vyos.vyos_lldp_interfaces: +    config: +          - name: eth1 +            location: +              civic_based: +                country_code: US +                ca_info: +                  - ca_type: 0 +                    ca_value: ENGLISH +          - name: eth2 +            location: +              coordinate_based: +                altitude: 2200 +                datum: WGS84 +                longitude: 222.267255W +                latitude: 33.524449N +    state: rendered +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "rendered": [ +#         "set service lldp interface eth1 location civic-based country-code 'US'", +#         "set service lldp interface eth1 location civic-based ca-type 0 ca-value 'ENGLISH'", +#         "set service lldp interface eth1", +#         "set service lldp interface eth2 location coordinate-based latitude '33.524449N'", +#         "set service lldp interface eth2 location coordinate-based altitude '2200'", +#         "set service lldp interface eth2 location coordinate-based datum 'WGS84'", +#         "set service lldp interface eth2 location coordinate-based longitude '222.267255W'", +#         "set service lldp interface eth2" +#     ] + + +# Using parsed +# +# +- name: Parsed the commands to provide structured configuration. +  vyos.vyos.vyos_lldp_interfaces: +    running_config: +      "set service lldp interface eth1 location civic-based ca-type 0 ca-value 'ENGLISH' + set service lldp interface eth1 location civic-based country-code 'US' + set service lldp interface eth2 location coordinate-based altitude '2200' + set service lldp interface eth2 location coordinate-based datum 'WGS84' + set service lldp interface eth2 location coordinate-based latitude '33.524449N' + set service lldp interface eth2 location coordinate-based longitude '222.267255W'" +    state: parsed +# +# +# ------------------------- +# Module Execution Result +# ------------------------- +# +# +# "parsed": [ +#         { +#             "location": { +#                 "coordinate_based": { +#                     "altitude": 2200, +#                     "datum": "WGS84", +#                     "latitude": "33.524449N", +#                     "longitude": "222.267255W" +#                 } +#             }, +#             "name": "eth2" +#         }, +#         { +#             "location": { +#                 "civic_based": { +#                     "ca_info": [ +#                         { +#                             "ca_type": 0, +#                             "ca_value": "ENGLISH" +#                         } +#                     ], +#                     "country_code": "US" +#                 } +#             }, +#             "name": "eth1" +#         } +#     ] + +  """  RETURN = """  before: @@ -497,12 +659,17 @@ def main():      required_if = [          ("state", "merged", ("config",)),          ("state", "replaced", ("config",)), +        ("state", "rendered", ("config",)),          ("state", "overridden", ("config",)), +        ("state", "parsed", ("running_config",)),      ] +    mutually_exclusive = [("config", "running_config")] +      module = AnsibleModule(          argument_spec=Lldp_interfacesArgs.argument_spec,          required_if=required_if,          supports_check_mode=True, +        mutually_exclusive=mutually_exclusive,      )      result = Lldp_interfaces(module).execute_module() diff --git a/plugins/modules/vyos_static_routes.py b/plugins/modules/vyos_static_routes.py index 6e50203..e71114a 100644 --- a/plugins/modules/vyos_static_routes.py +++ b/plugins/modules/vyos_static_routes.py @@ -30,16 +30,13 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type -ANSIBLE_METADATA = { -    "metadata_version": "1.1", -    "status": ["preview"], -    "supported_by": "network", -} +ANSIBLE_METADATA = {"metadata_version": "1.1", "supported_by": "Ansible"}  DOCUMENTATION = """module: vyos_static_routes -short_description: Manages attributes of static routes on VyOS network devices. +short_description: Static routes resource module  description: This module manages attributes of static routes on VyOS network devices.  notes: +version_added: "1.0.0"  - Tested against VyOS 1.1.8 (helium).  - This module works with connection C(network_cli). See L(the VyOS OS Platform Options,../network/user_guide/platform_vyos.html).  author: @@ -114,13 +111,12 @@ options:                      type: str    running_config:      description: -    - The module, by default, will connect to the remote device and retrieve the current -      running-config to use as a base for comparing against the contents of source. -      There are times when it is not desirable to have the task get the current running-config -      for every task in a playbook.  The I(running_config) argument allows the implementer -      to pass in the configuration to use as the base config for comparison. This -      value of this option should be the output received from device by executing -      command C(show configuration commands | grep 'static route') +      - 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 static route). +      - The state I(parsed) reads the configuration from C(running_config) 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: @@ -145,7 +141,7 @@ EXAMPLES = """  # vyos@vyos:~$ show configuration  commands | grep static  #  - name: Merge the provided configuration with the exisiting running configuration -  vyos_static_routes: +  vyos.vyos.vyos_static_routes:      config:       - address_families:         - afi: 'ipv4' @@ -259,7 +255,7 @@ EXAMPLES = """  # set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2'  #  - name: Replace device configurations of listed static routes with provided configurations -  vyos_static_routes: +  vyos.vyos.vyos_static_routes:      config:       - address_families:         - afi: 'ipv4' @@ -435,7 +431,7 @@ EXAMPLES = """  # set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2'  #  - name: Overrides all device configuration with provided configuration -  vyos_static_routes: +  vyos.vyos.vyos_static_routes:      config:       - address_families:         - afi: 'ipv4' @@ -531,92 +527,6 @@ EXAMPLES = """  # set protocols static route 198.0.2.48/28 next-hop '192.0.2.18' -# Using deleted to delete static route based on destination -# -# Before state -# ------------- -# -# vyos@vyos:~$ show configuration commands| grep static -# set protocols static route 192.0.2.32/28 'blackhole' -# set protocols static route 192.0.2.32/28 next-hop '192.0.2.6' -# set protocols static route 192.0.2.32/28 next-hop '192.0.2.7' -# set protocols static route6 2001:db8:1000::/36 blackhole distance '2' -# set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::1' -# set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2' -# -- name: Delete static route per destination. -  vyos_static_routes: -    config: -     - address_families: -       - afi: 'ipv4' -         routes: -           - dest: '192.0.2.32/28' -       - afi: 'ipv6' -         routes: -           - dest: '2001:db8:1000::/36' -    state: deleted -# -# -# ------------------------ -# Module Execution Results -# ------------------------ -# -#    "before": [ -#        { -#            "address_families": [ -#                { -#                    "afi": "ipv4", -#                    "routes": [ -#                        { -#                            "blackhole_config": { -#                                "type": "blackhole" -#                            }, -#                            "dest": "192.0.2.32/28", -#                            "next_hops": [ -#                                { -#                                    "forward_router_address": "192.0.2.6" -#                                }, -#                                { -#                                    "forward_router_address": "192.0.2.7" -#                                } -#                            ] -#                        } -#                    ] -#                }, -#                { -#                    "afi": "ipv6", -#                    "routes": [ -#                        { -#                            "blackhole_config": { -#                                "distance": 2 -#                            }, -#                            "dest": "2001:db8:1000::/36", -#                            "next_hops": [ -#                                { -#                                    "forward_router_address": "2001:db8:2000:2::1" -#                                }, -#                                { -#                                    "forward_router_address": "2001:db8:2000:2::2" -#                                } -#                            ] -#                        } -#                    ] -#                } -#            ] -#        } -#    ] -#    "commands": [ -#       "delete protocols static route 192.0.2.32/28", -#       "delete protocols static route6 2001:db8:1000::/36" -#    ] -# -# "after": [] -# After state -# ------------ -# vyos@vyos# run show configuration commands | grep static -# set protocols 'static' - -  # Using deleted to delete static route based on afi  #  # Before state @@ -631,7 +541,7 @@ EXAMPLES = """  # set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2'  #  - name: Delete static route based on afi. -  vyos_static_routes: +  vyos.vyos.vyos_static_routes:      config:       - address_families:         - afi: 'ipv4' @@ -713,7 +623,7 @@ EXAMPLES = """  # set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2'  #  - name: Delete all the static routes. -  vyos_static_routes: +  vyos.vyos.vyos_static_routes:      config:      state: deleted  # @@ -778,141 +688,11 @@ EXAMPLES = """  # set protocols 'static' -# Using deleted to delete static route based on next-hop -# -# Before state -# ------------- -# -# vyos@vyos:~$ show configuration commands| grep static -# set protocols static route 192.0.2.32/28 'blackhole' -# set protocols static route 192.0.2.32/28 next-hop '192.0.2.6' -# set protocols static route 192.0.2.32/28 next-hop '192.0.2.7' -# set protocols static route6 2001:db8:1000::/36 blackhole distance '2' -# set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::1' -# set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2' -# -- name: Delete static routes per next-hops -  vyos_static_routes: -    config: -     - address_families: -       - afi: 'ipv4' -         routes: -           - dest: '192.0.2.32/28' -             next-hops: -               - forward_router_address: '192.0.2.6' -       - afi: 'ipv6' -         routes: -           - dest: '2001:db8:1000::/36' -             next-hops: -               - forward_router_address: '2001:db8:2000:2::1' -    state: deleted -# -# -# ------------------------ -# Module Execution Results -# ------------------------ -# -#    "before": [ -#        { -#            "address_families": [ -#                { -#                    "afi": "ipv4", -#                    "routes": [ -#                        { -#                            "blackhole_config": { -#                                "type": "blackhole" -#                            }, -#                            "dest": "192.0.2.32/28", -#                            "next_hops": [ -#                                { -#                                    "forward_router_address": "192.0.2.6" -#                                }, -#                                { -#                                    "forward_router_address": "192.0.2.7" -#                                } -#                            ] -#                        } -#                    ] -#                }, -#                { -#                    "afi": "ipv6", -#                    "routes": [ -#                        { -#                            "blackhole_config": { -#                                "distance": 2 -#                            }, -#                            "dest": "2001:db8:1000::/36", -#                            "next_hops": [ -#                                { -#                                    "forward_router_address": "2001:db8:2000:2::1" -#                                }, -#                                { -#                                    "forward_router_address": "2001:db8:2000:2::2" -#                                } -#                            ] -#                        } -#                    ] -#                } -#            ] -#        } -#    ] -#    "commands": [ -#       "delete protocols static route 192.0.2.32/28 next-hop '192.0.2.6'", -#       "delete protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::1'" -#    ] -# -#    "after": [ -#        { -#            "address_families": [ -#                { -#                    "afi": "ipv4", -#                    "routes": [ -#                        { -#                            "blackhole_config": { -#                                "type": "blackhole" -#                            }, -#                            "dest": "192.0.2.32/28", -#                            "next_hops": [ -#                                { -#                                    "forward_router_address": "192.0.2.7" -#                                } -#                            ] -#                        } -#                    ] -#                }, -#                { -#                    "afi": "ipv6", -#                    "routes": [ -#                        { -#                            "blackhole_config": { -#                                "distance": 2 -#                            }, -#                            "dest": "2001:db8:1000::/36", -#                            "next_hops": [ -#                                { -#                                    "forward_router_address": "2001:db8:2000:2::2" -#                                } -#                            ] -#                        } -#                    ] -#                } -#            ] -#        } -#    ] -# After state -# ------------ -# vyos@vyos:~$ show configuration commands| grep static -# set protocols static route 192.0.2.32/28 'blackhole' -# set protocols static route 192.0.2.32/28 next-hop '192.0.2.7' -# set protocols static route6 2001:db8:1000::/36 blackhole distance '2' -# set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2' - -  # Using rendered  #  #  - name: Render the commands for provided  configuration -  vyos_static_routes: +  vyos.vyos.vyos_static_routes:      config:        - address_families:            - afi: 'ipv4' @@ -955,8 +735,8 @@ EXAMPLES = """  # Using parsed  #  # -- name: Render the commands for provided  configuration -  vyos_static_routes: +- name: Parse the provided running configuration +  vyos.vyos.vyos_static_routes:      running_config:        "set protocols static route 192.0.2.32/28 'blackhole'   set protocols static route 192.0.2.32/28 next-hop '192.0.2.6' @@ -1026,7 +806,7 @@ EXAMPLES = """  # set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2'  #  - name: Gather listed static routes with provided configurations -  vyos_static_routes: +  vyos.vyos.vyos_static_routes:      config:      state: gathered  # @@ -1137,6 +917,7 @@ def main():      required_if = [          ("state", "merged", ("config",)),          ("state", "replaced", ("config",)), +        ("state", "rendered", ("config",)),          ("state", "overridden", ("config",)),          ("state", "parsed", ("running_config",)),      ] diff --git a/plugins/terminal/vyos.py b/plugins/terminal/vyos.py index fe7712f..606f77b 100644 --- a/plugins/terminal/vyos.py +++ b/plugins/terminal/vyos.py @@ -40,7 +40,14 @@ class TerminalModule(TerminalBase):          re.compile(br"\n\s+Set failed"),      ] -    terminal_length = os.getenv("ANSIBLE_VYOS_TERMINAL_LENGTH", 10000) +    try: +        terminal_length = os.getenv("ANSIBLE_VYOS_TERMINAL_LENGTH", 10000) +        terminal_length = int(terminal_length) +    except ValueError: +        raise AnsibleConnectionFailure( +            "Invalid value set for vyos terminal length '%s', value should be a valid integer string" +            % terminal_length +        )      def on_open_shell(self):          try: diff --git a/test-requirements.txt b/test-requirements.txt index 5037396..3f3af99 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,4 +1,6 @@  black ; python_version > '3.5'  flake8 +mock  pexpect +pytest-xdist  yamllint diff --git a/tests/integration/network-integration.cfg b/tests/integration/network-integration.cfg new file mode 100644 index 0000000..d12c1ef --- /dev/null +++ b/tests/integration/network-integration.cfg @@ -0,0 +1,4 @@ +[persistent_connection] +command_timeout = 100 +connect_timeout = 100 +connect_retry_timeout = 100 diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/_parsed_config.cfg b/tests/integration/targets/vyos_interfaces/tests/cli/_parsed_config.cfg new file mode 100644 index 0000000..e5c3fc7 --- /dev/null +++ b/tests/integration/targets/vyos_interfaces/tests/cli/_parsed_config.cfg @@ -0,0 +1,12 @@ +set interfaces ethernet eth1 description 'Configured by Ansible - Interface 1' +set interfaces ethernet eth1 duplex 'auto' +set interfaces ethernet eth1 hw-id '08:00:27:da:67:43' +set interfaces ethernet eth1 mtu '1500' +set interfaces ethernet eth1 speed 'auto' +set interfaces ethernet eth1 vif 100 description 'Eth1 - VIF 100' +set interfaces ethernet eth1 vif 100 mtu '400' +set interfaces ethernet eth1 vif 101 description 'Eth1 - VIF 101' +set interfaces ethernet eth2 description 'Configured by Ansible - Interface 2 (ADMIN DOWN)' +set interfaces ethernet eth2 'disable' +set interfaces ethernet eth2 hw-id '08:00:27:d8:70:b0' +set interfaces ethernet eth2 mtu '600' diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/empty_config.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/empty_config.yaml index e1e154d..652f158 100644 --- a/tests/integration/targets/vyos_interfaces/tests/cli/empty_config.yaml +++ b/tests/integration/targets/vyos_interfaces/tests/cli/empty_config.yaml @@ -1,7 +1,7 @@  ---  - debug: -    msg: START vyos_interfaces empty_config integration tests on connection={{ ansible_connection -      }} +    msg: START vyos_interfaces empty_config integration tests on connection={{ +      ansible_connection }}  - name: Merged with empty config should give appropriate error message    register: result @@ -35,3 +35,26 @@  - 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_interfaces: +    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_interfaces: +    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_interfaces/tests/cli/gathered.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/gathered.yaml new file mode 100644 index 0000000..ac9892c --- /dev/null +++ b/tests/integration/targets/vyos_interfaces/tests/cli/gathered.yaml @@ -0,0 +1,26 @@ +--- +- debug: +    msg: START vyos_interfaces gathered integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Gather the provided configuration with the exisiting running configuration +      register: result +      vyos.vyos.vyos_interfaces: +        config: +        state: gathered + +    - name: Assert that gathered dicts was correctly generated +      assert: +        that: +          - "{{ populate | symmetric_difference(result['gathered']) |length == 0\ +            \ }}" + +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/parsed.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/parsed.yaml new file mode 100644 index 0000000..a44fc2f --- /dev/null +++ b/tests/integration/targets/vyos_interfaces/tests/cli/parsed.yaml @@ -0,0 +1,16 @@ +--- +- debug: +    msg: START vyos_interfaces parsed integration tests on connection={{ ansible_connection +      }} + +- name: Parse externally provided interfaces config to agnostic model +  register: result +  vyos.vyos.vyos_interfaces: +    running_config: "{{ lookup('file', '_parsed_config.cfg') }}" +    state: parsed + +- name: Assert that config was correctly parsed +  assert: +    that: +      - "{{ parsed['after'] | symmetric_difference(result['parsed']) |length ==\ +        \ 0 }}" diff --git a/tests/integration/targets/vyos_interfaces/tests/cli/rendered.yaml b/tests/integration/targets/vyos_interfaces/tests/cli/rendered.yaml new file mode 100644 index 0000000..5030d71 --- /dev/null +++ b/tests/integration/targets/vyos_interfaces/tests/cli/rendered.yaml @@ -0,0 +1,47 @@ +--- +- debug: +    msg: START vyos_interfaces rendered integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Structure provided configuration into device specific commands +      register: result +      vyos.vyos.vyos_interfaces: +        config: +          - name: eth0 +            enabled: true +            duplex: auto +            speed: auto +          - name: eth1 +            description: Configured by Ansible - Interface 1 +            mtu: 1500 +            speed: auto +            duplex: auto +            enabled: true +            vifs: +              - vlan_id: 100 +                description: Eth1 - VIF 100 +                mtu: 400 +                enabled: true +              - vlan_id: 101 +                description: Eth1 - VIF 101 +                enabled: true +          - name: eth2 +            description: Configured by Ansible - Interface 2 (ADMIN DOWN) +            mtu: 600 +            enabled: false +        state: rendered + +    - name: Assert that correct set of commands were generated +      assert: +        that: +          - "{{ rendered['commands'] | symmetric_difference(result['rendered'])\ +            \ |length == 0 }}" +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_interfaces/vars/main.yaml b/tests/integration/targets/vyos_interfaces/vars/main.yaml index b730080..84a8bf0 100644 --- a/tests/integration/targets/vyos_interfaces/vars/main.yaml +++ b/tests/integration/targets/vyos_interfaces/vars/main.yaml @@ -104,6 +104,26 @@ replaced:        enabled: true        duplex: auto        speed: auto +parsed: +  after: +    - name: eth1 +      description: Configured by Ansible - Interface 1 +      mtu: 1500 +      speed: auto +      duplex: auto +      enabled: true +      vifs: +        - vlan_id: 100 +          description: Eth1 - VIF 100 +          mtu: 400 +          enabled: true +        - vlan_id: 101 +          description: Eth1 - VIF 101 +          enabled: true +    - name: eth2 +      description: Configured by Ansible - Interface 2 (ADMIN DOWN) +      mtu: 600 +      enabled: false  overridden:    commands:      - delete interfaces ethernet eth1 description @@ -133,6 +153,23 @@ overridden:        vifs:          - vlan_id: 200            enabled: true +rendered: +  commands: +    - set interfaces ethernet eth0 duplex 'auto' +    - set interfaces ethernet eth0 speed 'auto' +    - delete interfaces ethernet eth0 disable +    - set interfaces ethernet eth1 duplex 'auto' +    - delete interfaces ethernet eth1 disable +    - set interfaces ethernet eth1 speed 'auto' +    - set interfaces ethernet eth1 description 'Configured by Ansible - Interface 1' +    - set interfaces ethernet eth1 mtu '1500' +    - set interfaces ethernet eth1 vif 100 description 'Eth1 - VIF 100' +    - set interfaces ethernet eth1 vif 100 mtu '400' +    - set interfaces ethernet eth1 vif 101 description 'Eth1 - VIF 101' +    - set interfaces ethernet eth2 disable +    - set interfaces ethernet eth2 description 'Configured by Ansible - Interface 2 (ADMIN DOWN)' +    - set interfaces ethernet eth2 mtu '600' +  deleted:    commands:      - delete interfaces ethernet eth1 description diff --git a/tests/integration/targets/vyos_l3_interfaces/tests/cli/_parsed_config.cfg b/tests/integration/targets/vyos_l3_interfaces/tests/cli/_parsed_config.cfg new file mode 100644 index 0000000..ef070a7 --- /dev/null +++ b/tests/integration/targets/vyos_l3_interfaces/tests/cli/_parsed_config.cfg @@ -0,0 +1,9 @@ +set interfaces ethernet eth1 address '192.0.2.10/24' +set interfaces ethernet eth1 address '2001:db8::10/32' +set interfaces ethernet eth1 hw-id '08:00:27:da:67:43' +set interfaces ethernet eth2 address '198.51.100.10/24' +set interfaces ethernet eth2 hw-id '08:00:27:d8:70:b0' +set interfaces ethernet eth2 vif 101 address '198.51.100.130/25' +set interfaces ethernet eth2 vif 101 address '2001:db8::20/32' + + diff --git a/tests/integration/targets/vyos_l3_interfaces/tests/cli/empty_config.yaml b/tests/integration/targets/vyos_l3_interfaces/tests/cli/empty_config.yaml index 96d4cda..9929dd7 100644 --- a/tests/integration/targets/vyos_l3_interfaces/tests/cli/empty_config.yaml +++ b/tests/integration/targets/vyos_l3_interfaces/tests/cli/empty_config.yaml @@ -35,3 +35,26 @@  - 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_l3_interfaces: +    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_l3_interfaces: +    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_l3_interfaces/tests/cli/gathered.yaml b/tests/integration/targets/vyos_l3_interfaces/tests/cli/gathered.yaml new file mode 100644 index 0000000..625047b --- /dev/null +++ b/tests/integration/targets/vyos_l3_interfaces/tests/cli/gathered.yaml @@ -0,0 +1,34 @@ +--- +- debug: +    msg: START vyos_l3_interfaces gathered integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Merge the provided configuration with the exisiting running configuration +      register: result +      vyos.vyos.vyos_l3_interfaces: &id001 +        config: +        state: gathered + +    - name: Assert that gathered dicts was correctly generated +      assert: +        that: +          - "{{ populate | symmetric_difference(result['gathered']) |length == 0\ +            \ }}" + +    - name: Gather the existing running configuration (IDEMPOTENT) +      register: result +      vyos.vyos.vyos_l3_interfaces: *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_l3_interfaces/tests/cli/parsed.yaml b/tests/integration/targets/vyos_l3_interfaces/tests/cli/parsed.yaml new file mode 100644 index 0000000..d5ff205 --- /dev/null +++ b/tests/integration/targets/vyos_l3_interfaces/tests/cli/parsed.yaml @@ -0,0 +1,16 @@ +--- +- debug: +    msg: START vyos_l3_nterfaces parsed integration tests on connection={{ ansible_connection +      }} + +- name: Parse externally provided interfaces config to agnostic model +  register: result +  vyos.vyos.vyos_l3_interfaces: +    running_config: "{{ lookup('file', '_parsed_config.cfg') }}" +    state: parsed + +- name: Assert that config was correctly parsed +  assert: +    that: +      - "{{ parsed['after'] | symmetric_difference(result['parsed']) |length ==\ +        \ 0 }}" diff --git a/tests/integration/targets/vyos_l3_interfaces/tests/cli/rendered.yaml b/tests/integration/targets/vyos_l3_interfaces/tests/cli/rendered.yaml new file mode 100644 index 0000000..02a2865 --- /dev/null +++ b/tests/integration/targets/vyos_l3_interfaces/tests/cli/rendered.yaml @@ -0,0 +1,44 @@ +--- +- debug: +    msg: START vyos_l3_interfaces rendered integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Structure provided configuration into device specific commands +      register: result +      vyos.vyos.vyos_l3_interfaces: &id001 +        config: +          - name: eth1 +            ipv4: +              - address: 192.0.2.14/24 +          - name: eth2 +            ipv4: +              - address: 192.0.2.10/24 +              - address: 192.0.2.11/24 +            ipv6: +              - address: 2001:db8::10/32 +              - address: 2001:db8::12/32 +        state: rendered + +    - name: Assert that correct set of commands were generated +      assert: +        that: +          - "{{ rendered['commands'] | symmetric_difference(result['rendered'])\ +            \ |length == 0 }}" + +    - name: Structure provided configuration into device specific commands (IDEMPOTENT) +      register: result +      vyos.vyos.vyos_l3_interfaces: *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_l3_interfaces/vars/main.yaml b/tests/integration/targets/vyos_l3_interfaces/vars/main.yaml index ee329d3..e9781e6 100644 --- a/tests/integration/targets/vyos_l3_interfaces/vars/main.yaml +++ b/tests/integration/targets/vyos_l3_interfaces/vars/main.yaml @@ -79,6 +79,30 @@ overridden:        ipv4:          - address: 192.0.2.15/24      - name: eth2 +parsed: +  after: +    - name: eth1 +      ipv4: +        - address: 192.0.2.10/24 +      ipv6: +        - address: 2001:db8::10/32 +    - name: eth2 +      ipv4: +        - address: 198.51.100.10/24 +      vifs: +        - vlan_id: 101 +          ipv4: +            - address: 198.51.100.130/25 +          ipv6: +            - address: 2001:db8::20/32 +rendered: +  commands: +    - set interfaces ethernet eth1 address '192.0.2.14/24' +    - set interfaces ethernet eth2 address '192.0.2.11/24' +    - set interfaces ethernet eth2 address '192.0.2.10/24' +    - set interfaces ethernet eth2 address '2001:db8::10/32' +    - set interfaces ethernet eth2 address '2001:db8::12/32' +  deleted:    commands:      - delete interfaces ethernet eth1 address '192.0.2.14/24' diff --git a/tests/integration/targets/vyos_lag_interfaces/tests/cli/_parsed_config.cfg b/tests/integration/targets/vyos_lag_interfaces/tests/cli/_parsed_config.cfg new file mode 100644 index 0000000..ea3bfce --- /dev/null +++ b/tests/integration/targets/vyos_lag_interfaces/tests/cli/_parsed_config.cfg @@ -0,0 +1,8 @@ +set interfaces bonding bond0 hash-policy 'layer2' +set interfaces bonding bond0 mode 'active-backup' +set interfaces bonding bond0 primary 'eth1' +set interfaces bonding bond1 hash-policy 'layer2+3' +set interfaces bonding bond1 mode 'active-backup' +set interfaces bonding bond1 primary 'eth2' +set interfaces ethernet eth1 bond-group 'bond0' +set interfaces ethernet eth2 bond-group 'bond1'
\ No newline at end of file diff --git a/tests/integration/targets/vyos_lag_interfaces/tests/cli/empty_config.yaml b/tests/integration/targets/vyos_lag_interfaces/tests/cli/empty_config.yaml index 3894fb5..6e89eae 100644 --- a/tests/integration/targets/vyos_lag_interfaces/tests/cli/empty_config.yaml +++ b/tests/integration/targets/vyos_lag_interfaces/tests/cli/empty_config.yaml @@ -35,3 +35,26 @@  - 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_lag_interfaces: +    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_lag_interfaces: +    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_lag_interfaces/tests/cli/gathered.yaml b/tests/integration/targets/vyos_lag_interfaces/tests/cli/gathered.yaml new file mode 100644 index 0000000..aca168d --- /dev/null +++ b/tests/integration/targets/vyos_lag_interfaces/tests/cli/gathered.yaml @@ -0,0 +1,26 @@ +--- +- debug: +    msg: START vyos_lag_interfaces gathered integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Gather the provided configuration with the exisiting running configuration +      register: result +      vyos.vyos.vyos_lag_interfaces: &id001 +        config: +        state: gathered + +    - name: Assert that gathered dicts was correctly generated +      assert: +        that: +          - "{{ populate | symmetric_difference(result['gathered']) |length == 0\ +            \ }}" + +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_lag_interfaces/tests/cli/parsed.yaml b/tests/integration/targets/vyos_lag_interfaces/tests/cli/parsed.yaml new file mode 100644 index 0000000..ed7bc61 --- /dev/null +++ b/tests/integration/targets/vyos_lag_interfaces/tests/cli/parsed.yaml @@ -0,0 +1,33 @@ +--- +- debug: +    msg: START vyos_lag_interfaces parsed integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Gather lag_interfaces facts +      register: lag_interfaces_facts +      vyos.vyos.vyos_facts: +        gather_subset: +          - default +        gather_network_resources: +          - lag_interfaces + +    - name: Provide the running configuration for parsing (config to be parsed) +      register: result +      vyos.vyos.vyos_lag_interfaces: +        running_config: "{{ lookup('file', '_parsed_config.cfg') }}" +        state: parsed + +    - name: Assert that correct parsing done +      assert: +        that: "{{ ansible_facts['network_resources']['lag_interfaces'] | symmetric_difference(result['parsed'])\ +          \ |length == 0 }}" + +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_lag_interfaces/tests/cli/rendered.yaml b/tests/integration/targets/vyos_lag_interfaces/tests/cli/rendered.yaml new file mode 100644 index 0000000..e6d7928 --- /dev/null +++ b/tests/integration/targets/vyos_lag_interfaces/tests/cli/rendered.yaml @@ -0,0 +1,38 @@ +--- +- debug: +    msg: START vyos_lag_interfaces rendered integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Structure provided configuration into device specific commands +      register: result +      vyos.vyos.vyos_lag_interfaces: +        config: +          - name: bond0 +            hash_policy: layer2 +            members: +              - member: eth1 +            mode: active-backup +            primary: eth1 +          - name: bond1 +            hash_policy: layer2+3 +            members: +              - member: eth2 +            mode: active-backup +            primary: eth2 +        state: rendered + +    - name: Assert that correct set of commands were generated +      assert: +        that: +          - "{{ rendered['commands'] | symmetric_difference(result['rendered'])\ +            \ |length == 0 }}" + +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_lag_interfaces/vars/main.yaml b/tests/integration/targets/vyos_lag_interfaces/vars/main.yaml index 5783693..9784fb9 100644 --- a/tests/integration/targets/vyos_lag_interfaces/vars/main.yaml +++ b/tests/integration/targets/vyos_lag_interfaces/vars/main.yaml @@ -83,6 +83,16 @@ deleted:    after:      - name: bond0      - name: bond1 +rendered: +  commands: +    - set interfaces bonding bond0 hash-policy 'layer2' +    - set interfaces ethernet eth1 bond-group 'bond0' +    - set interfaces bonding bond0 mode 'active-backup' +    - set interfaces bonding bond0 primary 'eth1' +    - set interfaces bonding bond1 hash-policy 'layer2+3' +    - set interfaces ethernet eth2 bond-group 'bond1' +    - set interfaces bonding bond1 mode 'active-backup' +    - set interfaces bonding bond1 primary 'eth2'  round_trip:    after:      - name: bond0 diff --git a/tests/integration/targets/vyos_lldp_global/tests/cli/_parsed_config.cfg b/tests/integration/targets/vyos_lldp_global/tests/cli/_parsed_config.cfg new file mode 100644 index 0000000..9c9f66c --- /dev/null +++ b/tests/integration/targets/vyos_lldp_global/tests/cli/_parsed_config.cfg @@ -0,0 +1,3 @@ +set service lldp legacy-protocols 'fdp' +set service lldp legacy-protocols 'cdp' +set service lldp management-address '192.0.2.17' diff --git a/tests/integration/targets/vyos_lldp_global/tests/cli/empty_config.yaml b/tests/integration/targets/vyos_lldp_global/tests/cli/empty_config.yaml index a197c45..0333fa4 100644 --- a/tests/integration/targets/vyos_lldp_global/tests/cli/empty_config.yaml +++ b/tests/integration/targets/vyos_lldp_global/tests/cli/empty_config.yaml @@ -24,3 +24,26 @@  - assert:      that:        - result.msg == 'value of config parameter must not be empty for state replaced' + +- name: Parsed with empty running_config should give appropriate error message +  register: result +  ignore_errors: true +  vyos.vyos.vyos_lldp_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_lldp_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_lldp_global/tests/cli/gathered.yaml b/tests/integration/targets/vyos_lldp_global/tests/cli/gathered.yaml new file mode 100644 index 0000000..95e01de --- /dev/null +++ b/tests/integration/targets/vyos_lldp_global/tests/cli/gathered.yaml @@ -0,0 +1,25 @@ +--- +- debug: +    msg: START vyos_lldp_global gathered integration tests on connection={{ +      ansible_connection }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Gather the provided configuration with the exisiting running configuration +      register: result +      vyos.vyos.vyos_lldp_global: +        config: +        state: gathered + +    - name: Assert that gathered dicts was correctly generated +      assert: +        that: +          - "{{ populate  == result['gathered'] }}" + +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_lldp_global/tests/cli/parsed.yaml b/tests/integration/targets/vyos_lldp_global/tests/cli/parsed.yaml new file mode 100644 index 0000000..b9c3abf --- /dev/null +++ b/tests/integration/targets/vyos_lldp_global/tests/cli/parsed.yaml @@ -0,0 +1,15 @@ +--- +- debug: +    msg: START vyos_lldp_global parsed integration tests on connection={{ ansible_connection +      }} + +- name: Parse externally provided LLDP global config to agnostic model +  register: result +  vyos.vyos.vyos_lldp_global: +    running_config: "{{ lookup('file', '_parsed_config.cfg') }}" +    state: parsed + +- name: Assert that config was correctly parsed +  assert: +    that: +      - "{{ parsed['after'] == result['parsed'] }}" diff --git a/tests/integration/targets/vyos_lldp_global/tests/cli/rendered.yaml b/tests/integration/targets/vyos_lldp_global/tests/cli/rendered.yaml new file mode 100644 index 0000000..5e9f4c5 --- /dev/null +++ b/tests/integration/targets/vyos_lldp_global/tests/cli/rendered.yaml @@ -0,0 +1,28 @@ +--- +- debug: +    msg: START vyos_lldp_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_lldp_global: +        config: +          address: 192.0.2.17 +          enable: true +          legacy_protocols: +            - cdp +        state: rendered + +    - name: Assert that correct set of commands were generated +      assert: +        that: +          - "{{ rendered['commands'] | symmetric_difference(result['rendered'])\ +            \ |length == 0 }}" + +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_lldp_global/vars/main.yaml b/tests/integration/targets/vyos_lldp_global/vars/main.yaml index 81e71be..622b8e4 100644 --- a/tests/integration/targets/vyos_lldp_global/vars/main.yaml +++ b/tests/integration/targets/vyos_lldp_global/vars/main.yaml @@ -31,6 +31,18 @@ replaced:        - cdp        - edp        - sonmp +parsed: +  after: +    address: 192.0.2.17 +    enable: true +    legacy_protocols: +      - fdp +      - cdp +rendered: +  commands: +    - set service lldp legacy-protocols 'cdp' +    - set service lldp +    - set service lldp management-address '192.0.2.17'  deleted:    commands:      - delete service lldp management-address diff --git a/tests/integration/targets/vyos_lldp_interfaces/tests/cli/_parsed_config.cfg b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/_parsed_config.cfg new file mode 100644 index 0000000..40c96c4 --- /dev/null +++ b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/_parsed_config.cfg @@ -0,0 +1,6 @@ +set service lldp interface eth1 location civic-based ca-type 0 ca-value 'ENGLISH' +set service lldp interface eth1 location civic-based country-code 'US' +set service lldp interface eth2 location coordinate-based altitude '2200' +set service lldp interface eth2 location coordinate-based datum 'WGS84' +set service lldp interface eth2 location coordinate-based latitude '33.524449N' +set service lldp interface eth2 location coordinate-based longitude '222.267255W'
\ No newline at end of file diff --git a/tests/integration/targets/vyos_lldp_interfaces/tests/cli/empty_config.yaml b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/empty_config.yaml index a5ff0a8..4ef40c9 100644 --- a/tests/integration/targets/vyos_lldp_interfaces/tests/cli/empty_config.yaml +++ b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/empty_config.yaml @@ -35,3 +35,26 @@  - 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_lldp_interfaces: +    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_lldp_interfaces: +    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_lldp_interfaces/tests/cli/gathered.yaml b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/gathered.yaml new file mode 100644 index 0000000..180b62f --- /dev/null +++ b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/gathered.yaml @@ -0,0 +1,25 @@ +--- +- debug: +    msg: START vyos_lldp_interfaces gathered integration tests on connection={{ ansible_connection +      }} + +- include_tasks: _remove_config.yaml + +- include_tasks: _populate.yaml + +- block: + +    - name: Gather the provided configuration with the exisiting running configuration +      register: result +      vyos.vyos.vyos_lldp_interfaces: +        config: +        state: gathered + +    - name: Assert that gathered dicts was correctly generated +      assert: +        that: +          - "{{ populate | symmetric_difference(result['gathered']) |length == 0\ +            \ }}" +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_lldp_interfaces/tests/cli/parsed.yaml b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/parsed.yaml new file mode 100644 index 0000000..0ca52be --- /dev/null +++ b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/parsed.yaml @@ -0,0 +1,16 @@ +--- +- debug: +    msg: START vyos_lldp_nterfaces parsed integration tests on connection={{ ansible_connection +      }} + +- name: Parse externally provided interfaces config to agnostic model +  register: result +  vyos.vyos.vyos_lldp_interfaces: +    running_config: "{{ lookup('file', '_parsed_config.cfg') }}" +    state: parsed + +- name: Assert that config was correctly parsed +  assert: +    that: +      - "{{ parsed['after'] | symmetric_difference(result['parsed']) |length ==\ +        \ 0 }}" diff --git a/tests/integration/targets/vyos_lldp_interfaces/tests/cli/rendered.yaml b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/rendered.yaml new file mode 100644 index 0000000..342e64b --- /dev/null +++ b/tests/integration/targets/vyos_lldp_interfaces/tests/cli/rendered.yaml @@ -0,0 +1,37 @@ +--- +- debug: +    msg: START vyos_lldp_interfaces 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_lldp_interfaces: +        config: +          - name: eth1 +            location: +              civic_based: +                country_code: US +                ca_info: +                  - ca_type: 0 +                    ca_value: ENGLISH +          - name: eth2 +            location: +              coordinate_based: +                altitude: 2200 +                datum: WGS84 +                longitude: 222.267255W +                latitude: 33.524449N +        state: rendered + +    - name: Assert that correct set of commands were generated +      assert: +        that: +          - "{{ rendered['commands'] | symmetric_difference(result['rendered'])\ +            \ |length == 0 }}" +  always: + +    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_lldp_interfaces/vars/main.yaml b/tests/integration/targets/vyos_lldp_interfaces/vars/main.yaml index 3cb684e..092f653 100644 --- a/tests/integration/targets/vyos_lldp_interfaces/vars/main.yaml +++ b/tests/integration/targets/vyos_lldp_interfaces/vars/main.yaml @@ -9,10 +9,6 @@ merged:      - set service lldp interface eth2 location coordinate-based altitude '2200'      - set service lldp interface eth2 location coordinate-based datum 'WGS84'      - set service lldp interface eth2 location coordinate-based longitude '222.267255W' -    - set service lldp interface eth2 location coordinate-based latitude '33.524449N' -    - set service lldp interface eth2 location coordinate-based altitude '2200' -    - set service lldp interface eth2 location coordinate-based datum 'WGS84' -    - set service lldp interface eth2 location coordinate-based longitude '222.267255W'      - set service lldp interface eth2    after:      - name: eth1 @@ -44,6 +40,16 @@ populate:          datum: WGS84          longitude: 222.267255W          latitude: 33.524449N +rendered: +  commands: +    - set service lldp interface eth1 location civic-based country-code 'US' +    - set service lldp interface eth1 location civic-based ca-type 0 ca-value 'ENGLISH' +    - set service lldp interface eth1 +    - set service lldp interface eth2 location coordinate-based latitude '33.524449N' +    - set service lldp interface eth2 location coordinate-based altitude '2200' +    - set service lldp interface eth2 location coordinate-based datum 'WGS84' +    - set service lldp interface eth2 location coordinate-based longitude '222.267255W' +    - set service lldp interface eth2  replaced:    commands:      - delete service lldp interface eth2 location @@ -91,6 +97,22 @@ overridden:      - name: eth2        location:          elin: 0000000911 +parsed: +  after: +    - name: eth1 +      location: +        civic_based: +          country_code: US +          ca_info: +            - ca_type: 0 +              ca_value: ENGLISH +    - name: eth2 +      location: +        coordinate_based: +          altitude: 2200 +          datum: WGS84 +          longitude: 222.267255W +          latitude: 33.524449N  deleted:    commands:      - delete service lldp interface eth1 diff --git a/tests/integration/targets/vyos_static_routes/tests/cli/deleted.yaml b/tests/integration/targets/vyos_static_routes/tests/cli/deleted.yaml deleted file mode 100644 index 7f098f5..0000000 --- a/tests/integration/targets/vyos_static_routes/tests/cli/deleted.yaml +++ /dev/null @@ -1,62 +0,0 @@ ---- -- debug: -    msg: Start vyos_static_routes deleted integration tests ansible_connection={{ -      ansible_connection }} - -- include_tasks: _populate.yaml - -- block: - -    - name: Delete static route based on destiation. -      register: result -      vyos.vyos.vyos_static_routes: &id001 -        config: - -          - address_families: - -              - afi: ipv4 -                routes: - -                  - dest: 192.0.2.32/28 - -              - afi: ipv6 -                routes: - -                  - dest: 2001:db8:1000::/36 -        state: deleted - -    - name: Assert that the before dicts were correctly generated -      assert: -        that: -          - "{{ populate | symmetric_difference(result['before']) |length == 0 }}" - -    - name: Assert that the correct set of commands were generated -      assert: -        that: -          - "{{ deleted_dest['commands'] | symmetric_difference(result['commands'])\ -            \ |length == 0 }}" - -    - name: Assert that the after dicts were correctly generated -      assert: -        that: -          - "{{ deleted_dest['after'] | symmetric_difference(result['after']) |length\ -            \ == 0 }}" - -    - name: Delete attributes of given interfaces (IDEMPOTENT) -      register: result -      vyos.vyos.vyos_static_routes: *id001 - -    - name: Assert that the previous task was idempotent -      assert: -        that: -          - result.changed == false -          - result.commands|length == 0 - -    - name: Assert that the before dicts were correctly generated -      assert: -        that: -          - "{{ deleted_dest['after'] | symmetric_difference(result['before']) |length\ -            \ == 0 }}" -  always: - -    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_static_routes/tests/cli/deleted_nh.yaml b/tests/integration/targets/vyos_static_routes/tests/cli/deleted_nh.yaml deleted file mode 100644 index f6075d2..0000000 --- a/tests/integration/targets/vyos_static_routes/tests/cli/deleted_nh.yaml +++ /dev/null @@ -1,68 +0,0 @@ ---- -- debug: -    msg: Start vyos_static_routes deleted integration tests ansible_connection={{ -      ansible_connection }} - -- include_tasks: _populate.yaml - -- block: - -    - name: Delete static route based on next_hop. -      register: result -      vyos.vyos.vyos_static_routes: &id001 -        config: - -          - address_families: - -              - afi: ipv4 -                routes: - -                  - dest: 192.0.2.32/28 -                    next_hops: - -                      - forward_router_address: 192.0.2.9 - -              - afi: ipv6 -                routes: - -                  - dest: 2001:db8:1000::/36 -                    next_hops: - -                      - forward_router_address: 2001:db8:2000:2::1 -        state: deleted - -    - name: Assert that the before dicts were correctly generated -      assert: -        that: -          - "{{ populate | symmetric_difference(result['before']) |length == 0 }}" - -    - name: Assert that the correct set of commands were generated -      assert: -        that: -          - "{{ deleted_nh['commands'] | symmetric_difference(result['commands'])\ -            \ |length == 0 }}" - -    - name: Assert that the after dicts were correctly generated -      assert: -        that: -          - "{{ deleted_nh['after'] | symmetric_difference(result['after']) |length\ -            \ == 0 }}" - -    - name: Delete attributes of given interfaces (IDEMPOTENT) -      register: result -      vyos.vyos.vyos_static_routes: *id001 - -    - name: Assert that the previous task was idempotent -      assert: -        that: -          - result.changed == false -          - result.commands|length == 0 - -    - name: Assert that the before dicts were correctly generated -      assert: -        that: -          - "{{ deleted_nh['after'] | symmetric_difference(result['before']) |length\ -            \ == 0 }}" -  always: - -    - include_tasks: _remove_config.yaml diff --git a/tests/integration/targets/vyos_static_routes/vars/main.yaml b/tests/integration/targets/vyos_static_routes/vars/main.yaml index 93b875f..6ce4cea 100644 --- a/tests/integration/targets/vyos_static_routes/vars/main.yaml +++ b/tests/integration/targets/vyos_static_routes/vars/main.yaml @@ -94,31 +94,7 @@ rendered:      - set protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::2'      - set protocols static route6 2001:db8:1000::/36 blackhole distance '2'      - set protocols static route6 2001:db8:1000::/36 -deleted_dest: -  commands: -    - delete protocols static route 192.0.2.32/28 -    - delete protocols static route6 2001:db8:1000::/36 -  after: [] -deleted_nh: -  commands: -    - delete protocols static route 192.0.2.32/28 next-hop '192.0.2.9' -    - delete protocols static route6 2001:db8:1000::/36 next-hop '2001:db8:2000:2::1' -  after: -    - address_families: -        - afi: ipv4 -          routes: -            - dest: 192.0.2.32/28 -              blackhole_config: -                type: blackhole -              next_hops: -                - forward_router_address: 192.0.2.10 -        - afi: ipv6 -          routes: -            - dest: 2001:db8:1000::/36 -              blackhole_config: -                distance: 2 -              next_hops: -                - forward_router_address: 2001:db8:2000:2::2 +  deleted_afi_all:    commands:      - delete protocols static route diff --git a/tests/unit/modules/network/vyos/test_vyos_static_route.py b/tests/unit/modules/network/vyos/test_vyos_static_route.py index 762508c..8eef5fb 100644 --- a/tests/unit/modules/network/vyos/test_vyos_static_route.py +++ b/tests/unit/modules/network/vyos/test_vyos_static_route.py @@ -21,7 +21,7 @@ from __future__ import absolute_import, division, print_function  __metaclass__ = type  from ansible_collections.vyos.vyos.tests.unit.compat.mock import patch -from ansible.modules.network.vyos import _vyos_static_route +from ansible.modules.network.vyos import vyos_static_route  from ansible_collections.vyos.vyos.tests.unit.modules.utils import (      set_module_args,  ) @@ -30,18 +30,18 @@ from .vyos_module import TestVyosModule  class TestVyosStaticRouteModule(TestVyosModule): -    module = _vyos_static_route +    module = vyos_static_route      def setUp(self):          super(TestVyosStaticRouteModule, self).setUp()          self.mock_get_config = patch( -            "ansible.modules.network.vyos._vyos_static_route.get_config" +            "ansible.modules.network.vyos.vyos_static_route.get_config"          )          self.get_config = self.mock_get_config.start()          self.mock_load_config = patch( -            "ansible.modules.network.vyos._vyos_static_route.load_config" +            "ansible.modules.network.vyos.vyos_static_route.load_config"          )          self.load_config = self.mock_load_config.start() diff --git a/tests/unit/modules/network/vyos/test_vyos_static_routes.py b/tests/unit/modules/network/vyos/test_vyos_static_routes.py index 3646d61..85c0842 100644 --- a/tests/unit/modules/network/vyos/test_vyos_static_routes.py +++ b/tests/unit/modules/network/vyos/test_vyos_static_routes.py @@ -277,17 +277,9 @@ class TestVyosStaticRoutesModule(TestVyosModule):      def test_vyos_static_routes_deleted(self):          set_module_args(              dict( -                config=[ -                    dict( -                        address_families=[ -                            dict( -                                afi="ipv4", routes=[dict(dest="192.0.2.32/28")] -                            ) -                        ] -                    ) -                ], +                config=[dict(address_families=[dict(afi="ipv4")])],                  state="deleted",              )          ) -        commands = ["delete protocols static route 192.0.2.32/28"] +        commands = ["delete protocols static route"]          self.execute_module(changed=True, commands=commands) | 
