summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorRohit Thakur <rohitthakur2590@outlook.com>2020-04-29 16:45:39 +0530
committerRohit Thakur <rohitthakur2590@outlook.com>2020-04-29 16:45:39 +0530
commit7344ffc5dc646bbb362c5cd157a1828c3d1537ec (patch)
tree33b5cd79bb26f04bbc3f628ef3dec4abe056f73e /plugins
parent77e8b041b2983415ac36eb6264f6e385ac87b074 (diff)
downloadvyos.vyos-7344ffc5dc646bbb362c5cd157a1828c3d1537ec.tar.gz
vyos.vyos-7344ffc5dc646bbb362c5cd157a1828c3d1537ec.zip
new states added
Signed-off-by: Rohit Thakur <rohitthakur2590@outlook.com>
Diffstat (limited to 'plugins')
-rw-r--r--plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py52
-rw-r--r--plugins/module_utils/network/vyos/config/interfaces/interfaces.py73
-rw-r--r--plugins/modules/vyos_interfaces.py256
3 files changed, 334 insertions, 47 deletions
diff --git a/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py b/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py
index 3542cb1..141fedc 100644
--- a/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py
+++ b/plugins/module_utils/network/vyos/argspec/interfaces/interfaces.py
@@ -31,7 +31,6 @@ __metaclass__ = type
class InterfacesArgs(object): # pylint: disable=R0903
"""The arg spec for the vyos_interfaces module
"""
-
def __init__(self, **kwargs):
pass
@@ -39,11 +38,23 @@ class InterfacesArgs(object): # pylint: disable=R0903
"config": {
"elements": "dict",
"options": {
- "description": {"type": "str"},
- "duplex": {"choices": ["full", "half", "auto"]},
- "enabled": {"default": True, "type": "bool"},
- "mtu": {"type": "int"},
- "name": {"required": True, "type": "str"},
+ "description": {
+ "type": "str"
+ },
+ "duplex": {
+ "choices": ["full", "half", "auto"]
+ },
+ "enabled": {
+ "default": True,
+ "type": "bool"
+ },
+ "mtu": {
+ "type": "int"
+ },
+ "name": {
+ "required": True,
+ "type": "str"
+ },
"speed": {
"choices": ["auto", "10", "100", "1000", "2500", "10000"],
"type": "str",
@@ -51,19 +62,34 @@ class InterfacesArgs(object): # pylint: disable=R0903
"vifs": {
"elements": "dict",
"options": {
- "vlan_id": {"type": "int"},
- "description": {"type": "str"},
- "enabled": {"default": True, "type": "bool"},
- "mtu": {"type": "int"},
+ "vlan_id": {
+ "type": "int"
+ },
+ "description": {
+ "type": "str"
+ },
+ "enabled": {
+ "default": True,
+ "type": "bool"
+ },
+ "mtu": {
+ "type": "int"
+ },
},
"type": "list",
},
},
"type": "list",
},
+ "running_config": {"type": "str"},
"state": {
- "choices": ["merged", "replaced", "overridden", "deleted"],
- "default": "merged",
- "type": "str",
+ "choices": [
+ "merged", "replaced", "overridden", "deleted", "rendered",
+ "parsed", "gathered"
+ ],
+ "default":
+ "merged",
+ "type":
+ "str",
},
} # pylint: disable=C0301
diff --git a/plugins/module_utils/network/vyos/config/interfaces/interfaces.py b/plugins/module_utils/network/vyos/config/interfaces/interfaces.py
index deb504c..6d6bf77 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,16 +48,18 @@ 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"
)
- interfaces_facts = facts["ansible_network_resources"].get("interfaces")
if not interfaces_facts:
return []
return interfaces_facts
@@ -72,25 +73,44 @@ 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 +138,18 @@ 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 +165,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/modules/vyos_interfaces.py b/plugins/modules/vyos_interfaces.py
index 93df4e4..e2186e8 100644
--- a/plugins/modules/vyos_interfaces.py
+++ b/plugins/modules/vyos_interfaces.py
@@ -37,7 +37,7 @@ ANSIBLE_METADATA = {
}
DOCUMENTATION = """module: vyos_interfaces
-short_description: Manages interface attributes of VyOS network devices.
+short_description: Manages attributes of interfaces for VyOS - 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 +45,9 @@ 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)
+author:
+- Nilashish Chakraborty (@nilashishc)
+- Rohit Thakur (@rohitthakur2590)
options:
config:
description: The provided interfaces configuration.
@@ -119,6 +121,14 @@ 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.
state:
description:
- The state of the configuration after module completion.
@@ -128,6 +138,9 @@ options:
- replaced
- overridden
- deleted
+ - rendered
+ - gathered
+ - parsed
default: merged
"""
EXAMPLES = """
@@ -152,7 +165,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 +343,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 +528,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 +713,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 +851,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 +1110,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()