summaryrefslogtreecommitdiff
path: root/plugins/modules/vyos_ospfv3.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/modules/vyos_ospfv3.py')
-rw-r--r--plugins/modules/vyos_ospfv3.py257
1 files changed, 257 insertions, 0 deletions
diff --git a/plugins/modules/vyos_ospfv3.py b/plugins/modules/vyos_ospfv3.py
new file mode 100644
index 0000000..0de49d7
--- /dev/null
+++ b/plugins/modules/vyos_ospfv3.py
@@ -0,0 +1,257 @@
+#!/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_ospfv3
+short_description: OSPFv3 resource module via REST API.
+description:
+ - Manages OSPFv3 (OSPF for IPv6) configuration on VyOS via HTTPS REST API.
+version_added: "1.0.0"
+author:
+ - VyOS Community (@vyos)
+options:
+ config:
+ description: OSPFv3 configuration.
+ type: dict
+ suboptions:
+ areas:
+ type: list
+ elements: dict
+ suboptions:
+ area_id:
+ type: str
+ export_list:
+ type: str
+ import_list:
+ type: str
+ interface:
+ description: Interfaces in this area.
+ type: list
+ elements: dict
+ suboptions:
+ name:
+ type: str
+ range:
+ type: list
+ elements: dict
+ suboptions:
+ address:
+ type: str
+ advertise:
+ type: bool
+ not_advertise:
+ type: bool
+ parameters:
+ type: dict
+ suboptions:
+ router_id:
+ type: str
+ redistribute:
+ type: list
+ elements: dict
+ suboptions:
+ route_type:
+ type: str
+ choices: [bgp, connected, kernel, ripng, static]
+ route_map:
+ type: str
+ state:
+ type: str
+ choices: [merged, replaced, 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: dict
+after:
+ returned: when changed
+ type: dict
+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,
+)
+
+
+_BASE = ["protocols", "ospfv3"]
+
+
+def _get(client):
+ try:
+ r = client.retrieve_show_config(_BASE)
+ return r.get("data") or {}
+ except VyOSRestError:
+ return {}
+
+
+def _apply(client, config, commands):
+ params = config.get("parameters") or {}
+ if params.get("router_id"):
+ client.configure_set(_BASE + ["parameters", "router-id"], params["router_id"])
+ commands.append(
+ "set protocols ospfv3 parameters router-id {r}".format(r=params["router_id"]),
+ )
+
+ for redist in config.get("redistribute") or []:
+ rb = _BASE + ["redistribute", redist["route_type"]]
+ client.configure_set(rb)
+ commands.append("set protocols ospfv3 redistribute {r}".format(r=redist["route_type"]))
+ if redist.get("route_map"):
+ client.configure_set(rb + ["route-map"], redist["route_map"])
+
+ for area in config.get("areas") or []:
+ aid = area["area_id"]
+ ab = _BASE + ["area", aid]
+ client.configure_set(ab)
+ commands.append("set protocols ospfv3 area '{a}'".format(a=aid))
+ if area.get("export_list"):
+ client.configure_set(ab + ["export-list"], area["export_list"])
+ commands.append(
+ "set protocols ospfv3 area {a} export-list {e}".format(
+ a=aid,
+ e=area["export_list"],
+ ),
+ )
+ if area.get("import_list"):
+ client.configure_set(ab + ["import-list"], area["import_list"])
+ for iface in area.get("interface") or []:
+ client.configure_set(ab + ["interface"], iface["name"])
+ commands.append(
+ "set protocols ospfv3 area {a} interface {i}".format(
+ a=aid,
+ i=iface["name"],
+ ),
+ )
+ for rng in area.get("range") or []:
+ rb2 = ab + ["range", rng["address"]]
+ client.configure_set(rb2)
+ commands.append(
+ "set protocols ospfv3 area {a} range {r}".format(
+ a=aid,
+ r=rng["address"],
+ ),
+ )
+ if rng.get("advertise"):
+ client.configure_set(rb2 + ["advertise"])
+ if rng.get("not_advertise"):
+ client.configure_set(rb2 + ["not-advertise"])
+
+
+def main():
+ argument_spec = dict(
+ config=dict(
+ type="dict",
+ options=dict(
+ areas=dict(
+ type="list",
+ elements="dict",
+ options=dict(
+ area_id=dict(type="str"),
+ export_list=dict(type="str"),
+ import_list=dict(type="str"),
+ interface=dict(
+ type="list",
+ elements="dict",
+ options=dict(name=dict(type="str")),
+ ),
+ range=dict(
+ type="list",
+ elements="dict",
+ options=dict(
+ address=dict(type="str"),
+ advertise=dict(type="bool"),
+ not_advertise=dict(type="bool"),
+ ),
+ ),
+ ),
+ ),
+ parameters=dict(type="dict", options=dict(router_id=dict(type="str"))),
+ redistribute=dict(
+ type="list",
+ elements="dict",
+ options=dict(
+ route_type=dict(
+ type="str",
+ choices=["bgp", "connected", "kernel", "ripng", "static"],
+ ),
+ route_map=dict(type="str"),
+ ),
+ ),
+ ),
+ ),
+ state=dict(
+ type="str",
+ default="merged",
+ choices=["merged", "replaced", "deleted", "gathered"],
+ ),
+ )
+ argument_spec.update(VYOS_REST_CONNECTION_ARGSPEC)
+ module = AnsibleModule(
+ argument_spec=argument_spec,
+ required_if=[("state", "merged", ["config"]), ("state", "replaced", ["config"])],
+ supports_check_mode=True,
+ )
+ client = VyOSRestClient(module)
+ state = module.params["state"]
+ config = module.params.get("config")
+ 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":
+ if before:
+ client.configure_delete(_BASE)
+ commands.append("delete protocols ospfv3")
+ changed = True
+ elif state in ("merged", "replaced"):
+ if state == "replaced" and before:
+ client.configure_delete(_BASE)
+ commands.append("delete protocols ospfv3")
+ _apply(client, config, 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()