summaryrefslogtreecommitdiff
path: root/plugins/modules/vyos_lldp_interfaces.py
diff options
context:
space:
mode:
authoromnom62 <omnom62@outlook.com>2026-05-06 08:08:27 +1000
committeromnom62 <omnom62@outlook.com>2026-05-06 08:08:27 +1000
commit9a3fa5777e7203d46faf1185cfb56c4fc121d885 (patch)
tree80988400ba3582cfc97ff6445fb8f97c724d3fc6 /plugins/modules/vyos_lldp_interfaces.py
parentc2493986714604aa992bea28628b74587b3b51bd (diff)
downloadrest.vyos-9a3fa5777e7203d46faf1185cfb56c4fc121d885.tar.gz
rest.vyos-9a3fa5777e7203d46faf1185cfb56c4fc121d885.zip
More modules
Diffstat (limited to 'plugins/modules/vyos_lldp_interfaces.py')
-rw-r--r--plugins/modules/vyos_lldp_interfaces.py227
1 files changed, 227 insertions, 0 deletions
diff --git a/plugins/modules/vyos_lldp_interfaces.py b/plugins/modules/vyos_lldp_interfaces.py
new file mode 100644
index 0000000..4f012aa
--- /dev/null
+++ b/plugins/modules/vyos_lldp_interfaces.py
@@ -0,0 +1,227 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# GNU General Public License v3.0+
+
+from __future__ import absolute_import, division, print_function
+
+
+__metaclass__ = type
+
+DOCUMENTATION = r"""
+---
+module: vyos_lldp_interfaces
+short_description: LLDP interfaces resource module via REST API.
+description:
+ - Manages per-interface LLDP settings (enable/disable, location) on VyOS
+ via the HTTPS REST API.
+version_added: "1.0.0"
+author:
+ - VyOS Community (@vyos)
+options:
+ config:
+ description: List of LLDP interface configurations.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ description: Interface name.
+ type: str
+ required: true
+ enable:
+ description: Enable LLDP on this interface (default true).
+ type: bool
+ default: true
+ location:
+ description: LLDP-MED location data.
+ type: dict
+ suboptions:
+ coordinate_based:
+ type: dict
+ suboptions:
+ altitude:
+ type: int
+ datum:
+ type: str
+ choices: [WGS84, NAD83, MLLW]
+ latitude:
+ type: str
+ required: true
+ longitude:
+ type: str
+ required: true
+ elin:
+ description: Emergency ELIN number (10-25 digits).
+ type: str
+ state:
+ type: str
+ choices: [merged, replaced, overridden, deleted, gathered]
+ default: merged
+ hostname:
+ type: str
+ required: true
+ port:
+ type: int
+ default: 443
+ api_key:
+ type: str
+ required: true
+ no_log: true
+ timeout:
+ type: int
+ default: 30
+ verify_ssl:
+ type: bool
+ default: false
+"""
+
+RETURN = r"""
+before:
+ returned: always
+ type: list
+after:
+ returned: when changed
+ type: list
+commands:
+ returned: always
+ type: list
+"""
+
+from ansible.module_utils.basic import AnsibleModule
+from ansible_collections.vyos.rest.plugins.module_utils.vyos_rest import (
+ VYOS_REST_CONNECTION_ARGSPEC,
+ VyOSRestClient,
+ VyOSRestError,
+)
+
+
+_IFACE_TYPES = {
+ "eth": "ethernet",
+ "bond": "bonding",
+ "lo": "loopback",
+ "dummy": "dummy",
+ "br": "bridge",
+}
+
+
+def _itype(name):
+ for p, t in _IFACE_TYPES.items():
+ if name.startswith(p):
+ return t
+ return "ethernet"
+
+
+def _get(client):
+ try:
+ r = client.retrieve_show_config(["service", "lldp", "interface"])
+ data = r.get("data") or {}
+ out = []
+ for iname, idata in data.items():
+ entry = {"name": iname}
+ if isinstance(idata, dict):
+ entry["enable"] = "disable" not in idata
+ out.append(entry)
+ return out
+ except VyOSRestError:
+ return []
+
+
+def _apply(client, cfg, commands):
+ name = cfg["name"]
+ base = ["service", "lldp", "interface", name]
+ client.configure_set(base)
+ commands.append("set service lldp interface {n}".format(n=name))
+
+ if "enable" in cfg and not cfg["enable"]:
+ client.configure_set(base + ["disable"])
+ commands.append("set service lldp interface {n} disable".format(n=name))
+
+ loc = cfg.get("location") or {}
+ coord = loc.get("coordinate_based") or {}
+ if coord:
+ lbase = base + ["location", "coordinate-based"]
+ if coord.get("latitude"):
+ client.configure_set(lbase + ["latitude"], coord["latitude"])
+ if coord.get("longitude"):
+ client.configure_set(lbase + ["longitude"], coord["longitude"])
+ if coord.get("altitude"):
+ client.configure_set(lbase + ["altitude"], str(coord["altitude"]))
+ if coord.get("datum"):
+ client.configure_set(lbase + ["datum"], coord["datum"])
+ commands.append(
+ "set service lldp interface {n} location coordinate-based ...".format(n=name),
+ )
+ if loc.get("elin"):
+ client.configure_set(base + ["location", "elin"], loc["elin"])
+ commands.append(
+ "set service lldp interface {n} location elin {e}".format(n=name, e=loc["elin"]),
+ )
+
+
+def main():
+ argument_spec = dict(
+ config=dict(
+ type="list",
+ elements="dict",
+ options=dict(
+ name=dict(type="str", required=True),
+ enable=dict(type="bool", default=True),
+ location=dict(
+ type="dict",
+ options=dict(
+ coordinate_based=dict(
+ type="dict",
+ options=dict(
+ altitude=dict(type="int"),
+ datum=dict(type="str", choices=["WGS84", "NAD83", "MLLW"]),
+ latitude=dict(type="str", required=True),
+ longitude=dict(type="str", required=True),
+ ),
+ ),
+ elin=dict(type="str"),
+ ),
+ ),
+ ),
+ ),
+ state=dict(
+ type="str",
+ default="merged",
+ choices=["merged", "replaced", "overridden", "deleted", "gathered"],
+ ),
+ )
+ argument_spec.update(VYOS_REST_CONNECTION_ARGSPEC)
+ module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)
+ client = VyOSRestClient(module)
+ state = module.params["state"]
+ config = module.params.get("config") or []
+ commands = []
+ changed = False
+ before = _get(client)
+
+ if state == "gathered":
+ module.exit_json(changed=False, gathered=before, before=before, commands=[])
+ if module.check_mode:
+ module.exit_json(changed=True, before=before, commands=["(check mode)"])
+
+ try:
+ if state == "deleted":
+ for cfg in config if config else before:
+ name = cfg["name"] if isinstance(cfg, dict) else cfg
+ try:
+ client.configure_delete(["service", "lldp", "interface", name])
+ commands.append("delete service lldp interface {n}".format(n=name))
+ changed = True
+ except VyOSRestError:
+ pass
+ elif state in ("merged", "replaced", "overridden"):
+ for cfg in config:
+ _apply(client, cfg, commands)
+ changed = True
+ except VyOSRestError as exc:
+ module.fail_json(msg=str(exc))
+
+ after = _get(client) if changed else before
+ module.exit_json(changed=changed, before=before, after=after, commands=commands)
+
+
+if __name__ == "__main__":
+ main()