Skip to content

Commit d368f87

Browse files
authored
Merge pull request #1456 from dchiquito/users-ordering
Use set comparison for updating permissions, groups, actions, and object types
2 parents 2e25e1f + 9f8b227 commit d368f87

File tree

18 files changed

+846
-46
lines changed

18 files changed

+846
-46
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
minor_changes:
2+
- user.groups, user.permissions, user_group.permissions, permission.actions, and permission.object_types are now treated as unordered sets for update comparison purposes.

plugins/module_utils/netbox_users.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@
1010
ENDPOINT_NAME_MAPPING,
1111
)
1212

13-
NB_CONFIG = "config"
1413
NB_GROUPS = "groups"
1514
NB_PERMISSIONS = "permissions"
1615
NB_TOKENS = "tokens"
1716
NB_USERS = "users"
1817

18+
# These suboptions are lists, but need to be modeled as sets for comparison purposes.
19+
LIST_AS_SET_KEYS = set(["permissions", "groups", "actions", "object_types"])
20+
1921

2022
class NetboxUsersModule(NetboxModule):
2123
def __init__(self, module, endpoint):
@@ -26,7 +28,6 @@ def run(self):
2628
This function should have all necessary code for endpoints within the
2729
application to create/update/delete the endpoint objects
2830
Supported endpoints:
29-
- config
3031
- groups
3132
- permissions
3233
- tokens
@@ -72,18 +73,27 @@ def run(self):
7273
self.module.exit_json(**self.result)
7374

7475
def _update_netbox_object(self, data):
75-
if self.endpoint == "users":
76-
return self._update_netbox_user(data)
76+
if self.endpoint == NB_TOKENS:
77+
return self._update_netbox_token(data)
7778
else:
78-
if self.endpoint == "tokens" and "key" in data:
79-
del data["key"]
80-
return super()._update_netbox_object(data)
79+
return self.__update_netbox_object__(data)
80+
81+
def _update_netbox_token(self, data):
82+
if "key" in data:
83+
del data["key"]
84+
return self.__update_netbox_object__(data)
8185

82-
def _update_netbox_user(self, data):
86+
def __update_netbox_object__(self, data):
8387
serialized_nb_obj = self.nb_object.serialize()
8488
updated_obj = serialized_nb_obj.copy()
8589
updated_obj.update(data)
8690

91+
if serialized_nb_obj:
92+
for key in LIST_AS_SET_KEYS:
93+
if serialized_nb_obj.get(key) and data.get(key):
94+
serialized_nb_obj[key] = set(serialized_nb_obj[key])
95+
updated_obj[key] = set(data[key])
96+
8797
if serialized_nb_obj == updated_obj:
8898
return serialized_nb_obj, None
8999
else:

tests/integration/targets/v4.0/tasks/netbox_permission.yml

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,15 +115,15 @@
115115
ansible.builtin.assert:
116116
that:
117117
- test_five is changed
118-
- test_five['user_group']['permissions'] == [1]
118+
- test_five['user_group']['permissions'] == [test_one['permission']['id']]
119119

120120
- name: "PERMISSION 6: Add permission to user"
121121
netbox.netbox.netbox_user:
122122
netbox_url: http://localhost:32768
123123
netbox_token: "0123456789abcdef0123456789abcdef01234567"
124124
data:
125125
username: TestUser
126-
password: TestPassword
126+
password: TestPassword6
127127
permissions:
128128
- Test Permission 2
129129
state: present
@@ -133,7 +133,7 @@
133133
ansible.builtin.assert:
134134
that:
135135
- test_six is changed
136-
- test_six['user']['permissions'] == [2]
136+
- test_six['user']['permissions'] == [test_four['permission']['id']]
137137

138138
- name: "PERMISSION 7: Delete"
139139
netbox.netbox.netbox_permission:
@@ -167,3 +167,48 @@
167167
- not test_eight['changed']
168168
- test_eight['permission'] == None
169169
- test_eight['msg'] == "permission Test Permission already absent"
170+
171+
- name: "PERMISSION 9: Necessary permission"
172+
netbox.netbox.netbox_permission:
173+
netbox_url: http://localhost:32768
174+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
175+
data:
176+
name: Test Permission
177+
description: The test permission
178+
enabled: true
179+
actions:
180+
- view
181+
- add
182+
- change
183+
- delete
184+
- extreme_administration
185+
object_types:
186+
- vpn.tunneltermination
187+
- wireless.wirelesslan
188+
state: present
189+
190+
- name: "PERMISSION 9: Re-create permission with lists in wrong order"
191+
netbox.netbox.netbox_permission:
192+
netbox_url: http://localhost:32768
193+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
194+
data:
195+
name: Test Permission
196+
description: The test permission
197+
enabled: true
198+
actions:
199+
- extreme_administration
200+
- delete
201+
- change
202+
- add
203+
- view
204+
object_types:
205+
- wireless.wirelesslan
206+
- vpn.tunneltermination
207+
state: present
208+
register: test_nine
209+
210+
- name: "PERMISSION 9: ASSERT - The same lists in a new order do not update the permission"
211+
ansible.builtin.assert:
212+
that:
213+
- not test_nine['changed']
214+
# actions and object_types seem to be ordered randomly so we cannot test them here

tests/integration/targets/v4.0/tasks/netbox_token.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
netbox_token: "0123456789abcdef0123456789abcdef01234567"
1111
data:
1212
username: TestUser
13-
password: TestPassword
13+
password: TestPassword1
1414
state: present
15+
register: test_user
1516

1617
- name: "TOKEN 1: Necessary info creation"
1718
netbox.netbox.netbox_token:
@@ -29,7 +30,7 @@
2930
- test_one is changed
3031
- test_one['diff']['before']['state'] == "absent"
3132
- test_one['diff']['after']['state'] == "present"
32-
- test_one['token']['user'] == 3
33+
- test_one['token']['user'] == test_user['user']['id']
3334
- test_one['msg'] == "token ******** created"
3435

3536
- name: "TOKEN 2: Create duplicate"

tests/integration/targets/v4.0/tasks/netbox_user.yml

Lines changed: 101 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010
netbox_token: "0123456789abcdef0123456789abcdef01234567"
1111
data:
1212
username: TestUser
13-
password: TestPassword
13+
password: TestPassword1
1414
state: present
1515
register: test_one
1616

17-
- name: "USESR 1: ASSERT - Necessary info creation"
17+
- name: "USER 1: ASSERT - Necessary info creation"
1818
ansible.builtin.assert:
1919
that:
2020
- test_one is changed
@@ -48,7 +48,7 @@
4848
netbox_token: "0123456789abcdef0123456789abcdef01234567"
4949
data:
5050
username: TestUser
51-
password: TestPassword
51+
password: TestPassword3
5252
5353
first_name: Test
5454
last_name: User
@@ -88,7 +88,7 @@
8888
- test_four['diff']['after']['state'] == "absent"
8989
- test_four['msg'] == "user TestUser deleted"
9090

91-
- name: "USER 5: ASSERT - Delete non existing"
91+
- name: "USER 5: Delete non existing"
9292
netbox.netbox.netbox_user:
9393
netbox_url: http://localhost:32768
9494
netbox_token: "0123456789abcdef0123456789abcdef01234567"
@@ -103,3 +103,100 @@
103103
- not test_five['changed']
104104
- test_five['user'] == None
105105
- test_five['msg'] == "user TestUser already absent"
106+
107+
- name: "USER 6: Necessary group 1"
108+
netbox.netbox.netbox_user_group:
109+
netbox_url: http://localhost:32768
110+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
111+
data:
112+
name: Test User Group Alpha
113+
state: present
114+
register: user_group_alpha
115+
116+
- name: "USER 6: Necessary group 2"
117+
netbox.netbox.netbox_user_group:
118+
netbox_url: http://localhost:32768
119+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
120+
data:
121+
name: Test User Group Beta
122+
state: present
123+
register: user_group_beta
124+
125+
- name: "User 6: Necessary permission 1"
126+
netbox.netbox.netbox_permission:
127+
netbox_url: http://localhost:32768
128+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
129+
data:
130+
name: Test Permission Foo
131+
actions:
132+
- view
133+
object_types: []
134+
state: present
135+
register: permission_foo
136+
137+
- name: "User 6: Necessary permission 2"
138+
netbox.netbox.netbox_permission:
139+
netbox_url: http://localhost:32768
140+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
141+
data:
142+
name: Test Permission Bar
143+
actions:
144+
- view
145+
object_types: []
146+
state: present
147+
register: permission_bar
148+
149+
- name: "User 6: Necessary permission 3"
150+
netbox.netbox.netbox_permission:
151+
netbox_url: http://localhost:32768
152+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
153+
data:
154+
name: Test Permission Baz
155+
actions:
156+
- view
157+
object_types: []
158+
state: present
159+
register: permission_baz
160+
161+
- name: "USER 6: Set up user with multiple groups and permissions"
162+
netbox.netbox.netbox_user:
163+
netbox_url: http://localhost:32768
164+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
165+
data:
166+
username: TestUser2
167+
password: TestPassword2
168+
permissions:
169+
- Test Permission Foo
170+
- Test Permission Bar
171+
- Test Permission Baz
172+
groups:
173+
- Test User Group Alpha
174+
- Test User Group Beta
175+
state: present
176+
177+
- name: "USER 6: Re-create user with lists in wrong order"
178+
netbox.netbox.netbox_user:
179+
netbox_url: http://localhost:32768
180+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
181+
data:
182+
username: TestUser2
183+
permissions:
184+
- Test Permission Bar
185+
- Test Permission Baz
186+
- Test Permission Foo
187+
groups:
188+
- Test User Group Beta
189+
- Test User Group Alpha
190+
state: present
191+
register: test_six
192+
193+
- name: "USER 6: ASSERT - The same lists in a new order do not update the user"
194+
ansible.builtin.assert:
195+
that:
196+
- not test_six['changed']
197+
- test_six['msg'] == "user TestUser2 already exists"
198+
- test_six['user']['groups'][0] == user_group_alpha['user_group']['id']
199+
- test_six['user']['groups'][1] == user_group_beta['user_group']['id']
200+
- test_six['user']['permissions'][0] == permission_foo['permission']['id']
201+
- test_six['user']['permissions'][1] == permission_bar['permission']['id']
202+
- test_six['user']['permissions'][2] == permission_baz['permission']['id']

tests/integration/targets/v4.0/tasks/netbox_user_group.yml

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
netbox_token: "0123456789abcdef0123456789abcdef01234567"
8282
data:
8383
username: TestUser
84-
password: TestPassword
84+
password: TestPassword5
8585
groups:
8686
- Test User Group
8787
state: present
@@ -91,7 +91,7 @@
9191
ansible.builtin.assert:
9292
that:
9393
- test_five is changed
94-
- test_five['user']['groups'] == [1]
94+
- test_five['user']['groups'] == [test_one['user_group']['id']]
9595

9696
- name: "USER_GROUP 6: Delete"
9797
netbox.netbox.netbox_user_group:
@@ -125,3 +125,57 @@
125125
- not test_seven['changed']
126126
- test_seven['user_group'] == None
127127
- test_seven['msg'] == "user_group Test User Group already absent"
128+
129+
- name: "USER_GROUP 8: Necessary permission 1"
130+
netbox.netbox.netbox_permission:
131+
netbox_url: http://localhost:32768
132+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
133+
data:
134+
name: Test Permission Foo
135+
actions:
136+
- view
137+
object_types: []
138+
state: present
139+
register: permission_foo
140+
141+
- name: "USER_GROUP 8: Necessary permission 2"
142+
netbox.netbox.netbox_permission:
143+
netbox_url: http://localhost:32768
144+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
145+
data:
146+
name: Test Permission Bar
147+
actions:
148+
- view
149+
object_types: []
150+
state: present
151+
register: permission_bar
152+
153+
- name: "USER_GROUP 8: Necessary info creation"
154+
netbox.netbox.netbox_user_group:
155+
netbox_url: http://localhost:32768
156+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
157+
data:
158+
name: Test User Group
159+
permissions:
160+
- Test Permission Foo
161+
- Test Permission Bar
162+
state: present
163+
164+
- name: "USER_GROUP 8: Re-create user group with permissions in wrong order"
165+
netbox.netbox.netbox_user_group:
166+
netbox_url: http://localhost:32768
167+
netbox_token: "0123456789abcdef0123456789abcdef01234567"
168+
data:
169+
name: Test User Group
170+
permissions:
171+
- Test Permission Bar
172+
- Test Permission Foo
173+
state: present
174+
register: test_eight
175+
176+
- name: "USER_GROUP 8: ASSERT - The same permissions in a new order do not update the group"
177+
ansible.builtin.assert:
178+
that:
179+
- not test_eight is changed
180+
- test_eight['user_group']['permissions'][0] == permission_foo['permission']['id']
181+
- test_eight['user_group']['permissions'][1] == permission_bar['permission']['id']

0 commit comments

Comments
 (0)