Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

create controller_managed_device_groups #432

Open
wants to merge 32 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a3664dc
create controller_managed_device_groups
pugnacity Oct 1, 2024
b78beca
fix use correct type
pugnacity Oct 1, 2024
4f8dd5e
fix version_added
pugnacity Oct 1, 2024
ac4c601
added devices
pugnacity Oct 1, 2024
8f16eb6
assign controller_managed_device_group
pugnacity Oct 2, 2024
9dca56f
Update plugins/modules/controller_managed_device_group.py
pugnacity Oct 2, 2024
baf7812
Update plugins/modules/controller_managed_device_group.py
pugnacity Oct 2, 2024
9fe407a
Update plugins/modules/controller_managed_device_group.py
pugnacity Oct 2, 2024
eb1580f
Update plugins/modules/controller_managed_device_group.py
pugnacity Oct 2, 2024
ce4111c
Update plugins/modules/device.py
pugnacity Oct 2, 2024
e884893
added tests
pugnacity Oct 2, 2024
10ec4da
lint fix
pugnacity Oct 2, 2024
7bebac4
try to fix populate
pugnacity Oct 2, 2024
61d8e57
fix test
pugnacity Oct 7, 2024
3ddca0b
fix use location id
pugnacity Oct 7, 2024
a04775f
fix tests
pugnacity Oct 7, 2024
ab3b86d
fix: added missing parameter
pugnacity Oct 7, 2024
ce9adf4
fix: tests
pugnacity Oct 15, 2024
ec8b41a
fix: an other try
pugnacity Oct 15, 2024
241a546
fix: remove spaces
pugnacity Oct 15, 2024
b60b740
debug test
pugnacity Oct 15, 2024
7a9aaad
typo fix
pugnacity Oct 15, 2024
3acc5fa
remove debug
pugnacity Oct 15, 2024
a787e81
use CONVERT_TO_ID
pugnacity Oct 15, 2024
473e028
debug test
pugnacity Nov 20, 2024
7c14f7d
Merge branch 'develop' into fix_423
pugnacity Nov 20, 2024
d4dd5f1
Merge branch 'nautobot:develop' into fix_423
pugnacity Nov 28, 2024
6e2f274
update
pugnacity Nov 28, 2024
1e868e7
debug tests
pugnacity Nov 28, 2024
d877546
typo fix
pugnacity Nov 28, 2024
b7d6549
fix test
pugnacity Nov 28, 2024
d6ff930
Apply suggestions from code review
joewesch Dec 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions plugins/lookup/lookup.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ def get_endpoint(nautobot, term):
"circuits": {"endpoint": nautobot.circuits.circuits},
"circuit-providers": {"endpoint": nautobot.circuits.providers},
"cables": {"endpoint": nautobot.dcim.cables},
"controllers": {"endpoint": nautobot.dcim.controllers},
"controller-managed-device-groups": {"endpoint": nautobot.dcim.controller_managed_device_groups},
"cloud-accounts": {"endpoint": nautobot.cloud.cloud_accounts},
"cloud-networks": {"endpoint": nautobot.cloud.cloud_networks},
"cloud-network-prefix-assignments": {"endpoint": nautobot.cloud.cloud_network_prefix_assignments},
Expand Down
2 changes: 2 additions & 0 deletions plugins/module_utils/dcim.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
NB_CONSOLE_SERVER_PORTS = "console_server_ports"
NB_CONSOLE_SERVER_PORT_TEMPLATES = "console_server_port_templates"
NB_CONTROLLERS = "controllers"
NB_CONTROLLER_MANAGED_DEVICE_GROUPS = "controller_managed_device_groups"
NB_DEVICE_BAYS = "device_bays"
NB_DEVICE_BAY_TEMPLATES = "device_bay_templates"
NB_DEVICE_REDUNDANCY_GROUPS = "device_redundancy_groups"
Expand Down Expand Up @@ -63,6 +64,7 @@ def run(self):
- console_server_ports
- console_server_port_templates
- controllers
- controller_managed_device_groups
- device_bays
- device_bay_templates
- devices
Expand Down
5 changes: 5 additions & 0 deletions plugins/module_utils/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
"console_server_ports",
"console_server_port_templates",
"controllers",
"controller_managed_device_groups",
"device_bays",
"device_bay_templates",
"devices",
Expand Down Expand Up @@ -122,6 +123,7 @@
cluster_group="name",
cluster_type="name",
controller="name",
controller_managed_device_group="name",
device="name",
role="name",
device_type="model",
Expand Down Expand Up @@ -188,6 +190,7 @@
"cluster_group": "cluster_groups",
"cluster_type": "cluster_types",
"contacts": "contacts",
"controller": "controllers",
"dcim.consoleport": "console_ports",
"dcim.consoleserverport": "console_server_ports",
"dcim.frontport": "front_ports",
Expand Down Expand Up @@ -280,6 +283,7 @@
"console_server_port_templates": "console_server_port_template",
"contacts": "contact",
"controllers": "controller",
"controller_managed_device_groups": "controller_managed_device_group",
"custom_fields": "custom_field",
"custom_field_choices": "custom_field_choice",
"device_bays": "device_bay",
Expand Down Expand Up @@ -358,6 +362,7 @@
"contact": set(["name", "phone", "email"]),
"contacts": set(["name", "phone", "email"]),
"controller": set(["name"]),
"controller_managed_device_group": set(["name"]),
"custom_field": set(["label"]),
"custom_field_choice": set(["value", "custom_field"]),
"dcim.consoleport": set(["name", "device"]),
Expand Down
123 changes: 123 additions & 0 deletions plugins/modules/controller_managed_device_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Copyright: (c) 2024, Network to Code (@networktocode) <[email protected]>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

from __future__ import absolute_import, division, print_function

__metaclass__ = type

DOCUMENTATION = r"""
---
module: controller_managed_device_group
short_description: Create, update or delete managed device groups within Nautobot
description:
- Creates, updates or removes managed device groups from Nautobot.
notes:
- Tags should be defined as a YAML list
- This should be ran with connection C(local) and hosts C(localhost)
author:
- Sven Winkelmann (@pugnacity)
version_added: "5.5.0"
extends_documentation_fragment:
- networktocode.nautobot.fragments.base
- networktocode.nautobot.fragments.tags
- networktocode.nautobot.fragments.custom_fields
options:
name:
description:
- The name of the controller managed device groups
required: true
type: str
controller:
description:
- The name of the controller for this group
required: true
type: str
weight:
description:
- weight of the managed device group
required: false
type: int
parent_cloud_network:
aliases:
- parent
description:
- The parent cloud network this network should be child to
required: false
type: raw
"""

EXAMPLES = r"""
- name: "Test Nautobot modules"
connection: local
hosts: localhost
gather_facts: False

tasks:
- name: Create controller managed device group within Nautobot with only required information
networktocode.nautobot.controller_managed_device_group:
url: http://nautobot.local
token: thisIsMyToken
name: "group_1"
controller: my_controller
state: present

- name: Delete controller managed device group within nautobot
networktocode.nautobot.controller_managed_device_group:
url: http://nautobot.local
token: thisIsMyToken
name: "group_1"
controller: test_controller_group_3
state: absent

"""

RETURN = r"""
controller_managed_device_group:
description: Serialized object as created or already existent within Nautobot
returned: success (when I(state=present))
type: dict
msg:
description: Message indicating failure or info about what has been achieved
returned: always
type: str
"""

from ansible_collections.networktocode.nautobot.plugins.module_utils.utils import (
NAUTOBOT_ARG_SPEC,
TAGS_ARG_SPEC,
CUSTOM_FIELDS_ARG_SPEC,
)
from ansible_collections.networktocode.nautobot.plugins.module_utils.dcim import (
NautobotDcimModule,
NB_CONTROLLER_MANAGED_DEVICE_GROUPS,
)
from ansible.module_utils.basic import AnsibleModule
from copy import deepcopy


def main():
"""
Main entry point for module execution
"""
argument_spec = deepcopy(NAUTOBOT_ARG_SPEC)
argument_spec.update(deepcopy(TAGS_ARG_SPEC))
argument_spec.update(deepcopy(CUSTOM_FIELDS_ARG_SPEC))
argument_spec.update(
dict(
name=dict(required=True, type="str"),
controller=dict(required=True, type="str"),
weight=dict(required=False, type="int"),
parent_cloud_network=dict(required=False, type="raw", aliases=["parent"]),
)
)

module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)

controller_group = NautobotDcimModule(module, NB_CONTROLLER_MANAGED_DEVICE_GROUPS)
controller_group.run()


if __name__ == "__main__": # pragma: no cover
main()
8 changes: 8 additions & 0 deletions plugins/modules/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,13 @@
required: false
type: raw
version_added: "5.1.0"
controller_managed_device_group:
description:
- Device controller_managed_device_group the device will be assigned to
pugnacity marked this conversation as resolved.
Show resolved Hide resolved
- Requires Nautobot C(v2.2) or later
required: false
type: raw
version_added: "5.5.0"
device_redundancy_group_priority:
description:
- Priority in the assigned device redundancy group
Expand Down Expand Up @@ -290,6 +297,7 @@ def main():
vc_priority=dict(required=False, type="int"),
comments=dict(required=False, type="str"),
local_config_context_data=dict(required=False, type="dict"),
controller_managed_device_group=dict(required=False, type="raw"),
pugnacity marked this conversation as resolved.
Show resolved Hide resolved
device_redundancy_group=dict(required=False, type="raw"),
device_redundancy_group_priority=dict(required=False, type="int"),
)
Expand Down
12 changes: 12 additions & 0 deletions tests/integration/nautobot-populate.py
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,18 @@ def make_nautobot_calls(endpoint, payload):
contacts = [{"name": "My Contact"}, {"name": "My Contact 2"}]
created_contacts = make_nautobot_calls(nb.extras.contacts, contacts)

# Create Controller
controller = [
{"name": "controller_one", "location": location_child.id, "status": {"name": "Active"}},
{"name": "controller_two", "location": location_child.id, "status": {"name": "Active"}},
]
created_controller = make_nautobot_calls(nb.dcim.controllers, controller)

# Create Controller Managed Device Groups
test_controller_one = nb.dcim.controllers.get(name="controller_one")
controller_device_group = [{"name": "controller_group_one", "weight": "1000", "controller": test_controller_one.id}]
created_controller_device_group = make_nautobot_calls(nb.dcim.controller_managed_device_groups, controller_device_group)

###############
# v2.3+ items #
###############
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
---
- debug:
msg: "{{ nautobot_version }}"

- block:
- name: "CONTROLLER GROUP 1: Create Group"
networktocode.nautobot.controller_managed_device_group:
url: "{{ nautobot_url }}"
token: "{{ nautobot_token }}"
name: Test Controller Group One
controller: controller_one
weight: 1000
state: present
register: test_one

- name: "CONTROLLER 1: ASSERT - Create Group"
assert:
that:
- test_one['changed']
- test_one['controller_managed_device_group']['name'] == "Test Controller Group One"

- name: "CONTROLLER GROUP 2: Create duplicate"
networktocode.nautobot.controller_managed_device_group:
url: "{{ nautobot_url }}"
token: "{{ nautobot_token }}"
name: Test Controller Group One
controller: controller_one
weight: 1000
state: present
register: test_two

- name: "CONTROLLER 2: ASSERT - Create duplicate"
assert:
that:
- not test_two['changed']
- test_two['controller_managed_device_group']['name'] == "Test Controller Group One"
- test_two['msg'] == "controller_managed_device_group Test Controller Group One already exists"

- name: "CONTROLLER GROUP 3: Update"
networktocode.nautobot.controller_managed_device_group:
url: "{{ nautobot_url }}"
token: "{{ nautobot_token }}"
name: Test Controller Group One
weight: 2000
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please add an assertion to validate that this field did indeed change?

controller: controller_two
register: test_three

- name: "CONTROLLER GROUP 3: ASSERT - Update"
assert:
that:
- test_three['changed']
- test_three['controller_managed_device_group']['name'] == "Test Controller Group One"
- test_three['diff']['after']['weight'] == "2000"
- test_three['msg'] == "controller_managed_device_group Test Controller Group One updated"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add a duplicate update test to verify idempotency

- name: "CONTROLLER GROUP 4: idempotent"
networktocode.nautobot.controller_managed_device_group:
url: "{{ nautobot_url }}"
token: "{{ nautobot_token }}"
name: Test Controller Group One
weight: 2000
controller: controller_two
register: test_four

- debug:
msg: "{{ test_four}}"

- name: "CONTROLLER GROUP 4: ASSERT - idempotent"
assert:
that:
- not test_four['changed']
- test_four['controller_managed_device_group']['name'] == "Test Controller Group One"
- test_four['msg'] == "controller_managed_device_group Test Controller Group One already exists"

- name: "CONTROLLER GROUP 5: ASSERT - Delete"
networktocode.nautobot.controller_managed_device_group:
url: "{{ nautobot_url }}"
token: "{{ nautobot_token }}"
name: Test Controller Group One
controller: controller_two
state: absent
register: test_five

- name: "CONTROLLER 5: ASSERT - Delete"
assert:
that:
- test_five is changed
- test_five['diff']['before']['state'] == "present"
- test_five['diff']['after']['state'] == "absent"
- test_five['msg'] == "controller_managed_device_group Test Controller Group One deleted"

- name: "CONTROLLER GROUP 6: ASSERT - Delete non existing"
networktocode.nautobot.controller_managed_device_group:
url: "{{ nautobot_url }}"
token: "{{ nautobot_token }}"
name: Test Controller Group Two
controller: controller_two
state: absent
register: test_six

- name: "CONTROLLER GROUP 6: ASSERT - Delete non existing"
assert:
that:
- not test_five['changed']
- test_six['controller_managed_device_group'] == None
- test_six['msg'] == "controller_managed_device_group Test Controller Group Two already absent"

when:
# Controllers are only available on Nautobot 2.2+
- "nautobot_version is version('2.2', '>=')"
1 change: 1 addition & 0 deletions tests/integration/targets/latest/tasks/device.yml
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@
parent: "Parent Test Location"
rack: "Main Test Rack"
status: "Active"
controller_managed_device_group: "{{ 'controller_group_one' if nautobot_version is version('2.2', '>=') else omit }}"
position: 35
face: "Front"
tags:
Expand Down
10 changes: 10 additions & 0 deletions tests/integration/targets/latest/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,15 @@
tags:
- controller

- name: "PYNAUTOBOT_CONTROLLER_MANAGED_DEVICE_GROUP TESTS"
include_tasks:
file: "controller_managed_device_group.yml"
apply:
tags:
- controller_managed_device_group
tags:
- controller_managed_device_group

- name: "PYNAUTOBOT_MODULE_TYPE TESTS"
include_tasks:
file: "module_type.yml"
Expand Down Expand Up @@ -680,3 +689,4 @@
- cloud_network_prefix_assignment
tags:
- cloud_network_prefix_assignment

Loading