Skip to content

Commit 56e1dbe

Browse files
authored
#770 Add module inventory item role (#885)
* Add module for inventory item role
1 parent 3c85711 commit 56e1dbe

File tree

6 files changed

+262
-1
lines changed

6 files changed

+262
-1
lines changed

meta/runtime.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ action_groups:
3939
- netbox_front_port
4040
- netbox_front_port_template
4141
- netbox_inventory_item
42+
- netbox_inventory_item_role
4243
- netbox_ip_address
4344
- netbox_ipam_role
4445
- netbox_l2vpn

plugins/module_utils/netbox_dcim.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
NB_INTERFACES = "interfaces"
2929
NB_INTERFACE_TEMPLATES = "interface_templates"
3030
NB_INVENTORY_ITEMS = "inventory_items"
31+
NB_INVENTORY_ITEM_ROLES = "inventory_item_roles"
3132
NB_LOCATIONS = "locations"
3233
NB_MANUFACTURERS = "manufacturers"
3334
NB_PLATFORMS = "platforms"
@@ -79,6 +80,7 @@ def run(self):
7980
- interfaces
8081
- interface_templates
8182
- inventory_items
83+
- inventory_item_roles
8284
- locations
8385
- manufacturers
8486
- platforms

plugins/module_utils/netbox_utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
"interfaces",
5656
"interface_templates",
5757
"inventory_items",
58+
"inventory_item_roles",
5859
"locations",
5960
"manufacturers",
6061
"platforms",
@@ -127,6 +128,7 @@
127128
export_template="name",
128129
group="slug",
129130
installed_device="name",
131+
inventory_item_role="name",
130132
import_targets="name",
131133
l2vpn="name",
132134
location="slug",
@@ -308,6 +310,7 @@
308310
"interfaces": "interface",
309311
"interface_templates": "interface_template",
310312
"inventory_items": "inventory_item",
313+
"inventory_item_roles": "inventory_item_role",
311314
"ip_addresses": "ip_address",
312315
"l2vpns": "l2vpn",
313316
"locations": "location",
@@ -407,6 +410,7 @@
407410
"interface_b": set(["name", "device"]),
408411
"interface_template": set(["name", "device_type"]),
409412
"inventory_item": set(["name", "device"]),
413+
"inventory_item_role": set(["name"]),
410414
"ip_address": set(["address", "vrf", "device", "interface", "assigned_object"]),
411415
"ip_addresses": set(["address", "vrf", "device", "interface", "assigned_object"]),
412416
"ipaddresses": set(
@@ -560,6 +564,7 @@
560564
"contact_roles",
561565
"device_roles",
562566
"device_types",
567+
"inventory_item_roles",
563568
"ipam_roles",
564569
"l2vpns",
565570
"locations",
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
#!/usr/bin/python
2+
# -*- coding: utf-8 -*-
3+
# Copyright: (c) 2022, Martin Rødvand (@rodvand) <martin@rodvand.net>
4+
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
5+
6+
from __future__ import absolute_import, division, print_function
7+
8+
__metaclass__ = type
9+
10+
DOCUMENTATION = r"""
11+
---
12+
module: netbox_inventory_item_role
13+
short_description: Create, update or delete devices roles within NetBox
14+
description:
15+
- Creates, updates or removes devices roles from NetBox
16+
notes:
17+
- Tags should be defined as a YAML list
18+
- This should be ran with connection C(local) and hosts C(localhost)
19+
author:
20+
- Martin Rødvand (@rodvand)
21+
requirements:
22+
- pynetbox
23+
version_added: '3.10.0'
24+
extends_documentation_fragment:
25+
- netbox.netbox.common
26+
options:
27+
data:
28+
description:
29+
- Defines the inventory item role configuration
30+
suboptions:
31+
name:
32+
description:
33+
- The name of the inventory item role
34+
required: true
35+
type: str
36+
description:
37+
description:
38+
- The description of the inventory item role
39+
required: false
40+
type: str
41+
color:
42+
description:
43+
- Hexidecimal code for a color, ex. FFFFFF
44+
required: false
45+
type: str
46+
slug:
47+
description:
48+
- The slugified version of the name or custom slug.
49+
- This is auto-generated following NetBox rules if not provided
50+
required: false
51+
type: str
52+
tags:
53+
description:
54+
- The tags to add/update
55+
required: false
56+
type: list
57+
elements: raw
58+
custom_fields:
59+
description:
60+
- Must exist in NetBox
61+
required: false
62+
type: dict
63+
required: true
64+
type: dict
65+
"""
66+
67+
EXAMPLES = r"""
68+
- name: "Test NetBox modules"
69+
connection: local
70+
hosts: localhost
71+
gather_facts: False
72+
73+
tasks:
74+
- name: Create inventory item role within NetBox with only required information
75+
netbox.netbox.netbox_inventory_item_role:
76+
netbox_url: http://netbox.local
77+
netbox_token: thisIsMyToken
78+
data:
79+
name: Test Inventory Item role
80+
color: FFFFFF
81+
state: present
82+
83+
- name: Delete inventory item role within netbox
84+
netbox.netbox.netbox_inventory_item_role:
85+
netbox_url: http://netbox.local
86+
netbox_token: thisIsMyToken
87+
data:
88+
name: Test Inventory Item role
89+
state: absent
90+
"""
91+
92+
RETURN = r"""
93+
inventory_item_role:
94+
description: Serialized object as created or already existent within NetBox
95+
returned: success (when I(state=present))
96+
type: dict
97+
msg:
98+
description: Message indicating failure or info about what has been achieved
99+
returned: always
100+
type: str
101+
"""
102+
from ansible_collections.netbox.netbox.plugins.module_utils.netbox_utils import (
103+
NetboxAnsibleModule,
104+
NETBOX_ARG_SPEC,
105+
)
106+
from ansible_collections.netbox.netbox.plugins.module_utils.netbox_dcim import (
107+
NetboxDcimModule,
108+
NB_INVENTORY_ITEM_ROLES,
109+
)
110+
from copy import deepcopy
111+
112+
113+
def main():
114+
"""
115+
Main entry point for module execution
116+
"""
117+
argument_spec = deepcopy(NETBOX_ARG_SPEC)
118+
argument_spec.update(
119+
dict(
120+
data=dict(
121+
type="dict",
122+
required=True,
123+
options=dict(
124+
name=dict(required=True, type="str"),
125+
description=dict(required=False, type="str"),
126+
color=dict(required=False, type="str"),
127+
slug=dict(required=False, type="str"),
128+
tags=dict(required=False, type="list", elements="raw"),
129+
custom_fields=dict(required=False, type="dict"),
130+
),
131+
),
132+
)
133+
)
134+
135+
required_if = [("state", "present", ["name"]), ("state", "absent", ["name"])]
136+
137+
module = NetboxAnsibleModule(
138+
argument_spec=argument_spec, supports_check_mode=True, required_if=required_if
139+
)
140+
141+
netbox_inventory_item_role = NetboxDcimModule(module, NB_INVENTORY_ITEM_ROLES)
142+
netbox_inventory_item_role.run()
143+
144+
145+
if __name__ == "__main__": # pragma: no cover
146+
main()

tests/integration/targets/v3.3/tasks/main.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,13 @@
245245
tags:
246246
- netbox_l2vpn
247247
tags:
248-
- netbox_l2vpn
248+
- netbox_l2vpn
249+
250+
- name: "NETBOX_INVENTORY_ITEM_ROLE TESTS"
251+
include_tasks:
252+
file: "netbox_inventory_item_role.yml"
253+
apply:
254+
tags:
255+
- netbox_inventory_item_role
256+
tags:
257+
- netbox_inventory_item_role
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
---
2+
##
3+
##
4+
### NETBOX_INVENTORY_ITEM_ROLE
5+
##
6+
##
7+
- name: "INVENTORY_ITEM_ROLE 1: Necessary info creation"
8+
netbox.netbox.netbox_inventory_item_role:
9+
netbox_url: http://localhost:32768
10+
netbox_token: 0123456789abcdef0123456789abcdef01234567
11+
data:
12+
name: "Test Inventory Item Role"
13+
color: "FFFFFF"
14+
state: present
15+
register: test_one
16+
17+
- name: "INVENTORY_ITEM_ROLE 1: ASSERT - Necessary info creation"
18+
assert:
19+
that:
20+
- test_one is changed
21+
- test_one['diff']['before']['state'] == "absent"
22+
- test_one['diff']['after']['state'] == "present"
23+
- test_one['inventory_item_role']['name'] == "Test Inventory Item Role"
24+
- test_one['inventory_item_role']['slug'] == "test-inventory-item-role"
25+
- test_one['inventory_item_role']['color'] == "ffffff"
26+
- test_one['msg'] == "inventory_item_role Test Inventory Item Role created"
27+
28+
- name: "INVENTORY_ITEM_ROLE 2: Create duplicate"
29+
netbox.netbox.netbox_inventory_item_role:
30+
netbox_url: http://localhost:32768
31+
netbox_token: 0123456789abcdef0123456789abcdef01234567
32+
data:
33+
name: "Test Inventory Item Role"
34+
color: "FFFFFF"
35+
state: present
36+
register: test_two
37+
38+
- name: "INVENTORY_ITEM_ROLE 2: ASSERT - Create duplicate"
39+
assert:
40+
that:
41+
- not test_two['changed']
42+
- test_two['inventory_item_role']['name'] == "Test Inventory Item Role"
43+
- test_two['inventory_item_role']['slug'] == "test-inventory-item-role"
44+
- test_two['inventory_item_role']['color'] == "ffffff"
45+
- test_two['msg'] == "inventory_item_role Test Inventory Item Role already exists"
46+
47+
- name: "INVENTORY_ITEM_ROLE 3: ASSERT - Update"
48+
netbox.netbox.netbox_inventory_item_role:
49+
netbox_url: http://localhost:32768
50+
netbox_token: 0123456789abcdef0123456789abcdef01234567
51+
data:
52+
name: "Test Inventory Item Role"
53+
color: "003EFF"
54+
state: present
55+
register: test_three
56+
57+
- name: "INVENTORY_ITEM_ROLE 3: ASSERT - Update"
58+
assert:
59+
that:
60+
- test_three is changed
61+
- test_three['diff']['after']['color'] == "003eff"
62+
- test_three['inventory_item_role']['name'] == "Test Inventory Item Role"
63+
- test_three['inventory_item_role']['slug'] == "test-inventory-item-role"
64+
- test_three['inventory_item_role']['color'] == "003eff"
65+
- test_three['msg'] == "inventory_item_role Test Inventory Item Role updated"
66+
67+
- name: "INVENTORY_ITEM_ROLE 4: ASSERT - Delete"
68+
netbox.netbox.netbox_inventory_item_role:
69+
netbox_url: http://localhost:32768
70+
netbox_token: 0123456789abcdef0123456789abcdef01234567
71+
data:
72+
name: Test Inventory Item Role
73+
state: absent
74+
register: test_four
75+
76+
- name: "INVENTORY_ITEM_ROLE 4: ASSERT - Delete"
77+
assert:
78+
that:
79+
- test_four is changed
80+
- test_four['diff']['before']['state'] == "present"
81+
- test_four['diff']['after']['state'] == "absent"
82+
- test_four['msg'] == "inventory_item_role Test Inventory Item Role deleted"
83+
84+
- name: "INVENTORY_ITEM_ROLE 5: ASSERT - Delete non existing"
85+
netbox.netbox.netbox_inventory_item_role:
86+
netbox_url: http://localhost:32768
87+
netbox_token: 0123456789abcdef0123456789abcdef01234567
88+
data:
89+
name: Test Inventory Item Role
90+
state: absent
91+
register: test_five
92+
93+
- name: "INVENTORY_ITEM_ROLE 5: ASSERT - Delete non existing`"
94+
assert:
95+
that:
96+
- not test_five['changed']
97+
- test_five['inventory_item_role'] == None
98+
- test_five['msg'] == "inventory_item_role Test Inventory Item Role already absent"

0 commit comments

Comments
 (0)