Skip to content

Commit 6907af6

Browse files
Add integration testing on Netbox 2.5/2.6
1 parent b6b2730 commit 6907af6

File tree

7 files changed

+1273
-54
lines changed

7 files changed

+1273
-54
lines changed

.travis.yml

Lines changed: 108 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,119 @@
11
---
2-
32
language: python
3+
services:
4+
- docker
5+
6+
sudo: false
7+
8+
env:
9+
global:
10+
- COLLECTION_NAMESPACE: fragmentedpacket
11+
- COLLECTION_NAME: netbox_modules
12+
- COLLECTION_VERSION: 0.0.8
13+
414
matrix:
515
include:
6-
- name: "Python 3.6"
16+
- name: "Python 3.6 - units"
717
python: 3.6
818
env: PYTHON_VER=3.6
9-
- name: "Python 3.7"
19+
install:
20+
- pip install -U pip
21+
- pip install pytest==4.6.5 pytest-mock pytest-xdist jinja2 PyYAML black==19.3b0
22+
- cd ../../
23+
# This is due to ansible-test only being available within devel branch
24+
- git clone https://github.com/ansible/ansible.git
25+
- cd ansible
26+
- git checkout stable-2.9
27+
- source hacking/env-setup
28+
- cd ..
29+
30+
before_script:
31+
- mkdir -p ~/ansible_collections/$COLLECTION_NAMESPACE
32+
- mv FragmentedPacket/$COLLECTION_NAME ~/ansible_collections/$COLLECTION_NAMESPACE/$COLLECTION_NAME
33+
- cd ~/ansible_collections/$COLLECTION_NAMESPACE/$COLLECTION_NAME
34+
35+
script:
36+
- ansible-test units --python $PYTHON_VER -vvv
37+
- black . --check
38+
39+
- name: "Python 3.7 - units"
1040
python: 3.7
1141
env: PYTHON_VER=3.7
12-
#python:
13-
# - "3.6"
14-
# - "3.7"
42+
install:
43+
- pip install -U pip
44+
- pip install pytest==4.6.5 pytest-mock pytest-xdist jinja2 PyYAML black==19.3b0
45+
- cd ../../
46+
# This is due to ansible-test only being available within devel branch
47+
- git clone https://github.com/ansible/ansible.git
48+
- cd ansible
49+
- git checkout stable-2.9
50+
- source hacking/env-setup
51+
- cd ..
1552

16-
sudo: false
53+
before_script:
54+
- mkdir -p ~/ansible_collections/$COLLECTION_NAMESPACE
55+
- mv FragmentedPacket/$COLLECTION_NAME ~/ansible_collections/$COLLECTION_NAMESPACE/$COLLECTION_NAME
56+
- cd ~/ansible_collections/$COLLECTION_NAMESPACE/$COLLECTION_NAME
57+
58+
script:
59+
- ansible-test units --python $PYTHON_VER -vvv
60+
- black . --check
1761

18-
env:
19-
global:
20-
- COLLECTION_NAMESPACE: fragmentedpacket
21-
- COLLECTION_NAME: netbox_modules
62+
- name: "Python 3.6 / Netbox 2.5 - integration"
63+
python: 3.6
64+
# This is set and used by netbox-docker to pull the correct Netbox image
65+
env: VERSION=v2.5
66+
install:
67+
- pip install -U pip
68+
- pip install jinja2 PyYAML pynetbox==4.0.6 cryptography
69+
- cd ../../
70+
- git clone https://github.com/ansible/ansible.git
71+
- cd ansible
72+
- git checkout stable-2.9
73+
- source hacking/env-setup
74+
- cd ..
75+
- git clone https://github.com/netbox-community/netbox-docker.git
76+
- cd netbox-docker
77+
- docker-compose --verbose pull
78+
- docker-compose --verbose up -d
79+
- cd ..
80+
81+
before_script:
82+
- cd FragmentedPacket/netbox_modules
83+
- mkdir ansible_collections
84+
- ansible-galaxy collection build .
85+
- ansible-galaxy collection install $COLLECTION_NAMESPACE-$COLLECTION_NAME-$COLLECTION_VERSION.tar.gz -p /home/travis/.ansible/collections
86+
87+
script:
88+
- "sleep 60"
89+
- python tests/integration/netbox-deploy.py
90+
- ansible-playbook tests/integration/integration-tests.yml -v
91+
92+
- name: "Python 3.6 / Netbox 2.6 - integration"
93+
python: 3.6
94+
# This is set and used by netbox-docker to pull the correct Netbox image
95+
env: VERSION=v2.6
96+
install:
97+
- pip install -U pip
98+
- pip install jinja2 PyYAML pynetbox==4.0.6 cryptography
99+
- cd ../../
100+
- git clone https://github.com/ansible/ansible.git
101+
- cd ansible
102+
- git checkout stable-2.9
103+
- source hacking/env-setup
104+
- cd ..
105+
- git clone https://github.com/netbox-community/netbox-docker.git
106+
- cd netbox-docker
107+
- docker-compose --verbose pull
108+
- docker-compose --verbose up -d
109+
- cd ..
110+
111+
before_script:
112+
- cd FragmentedPacket/netbox_modules
113+
- ansible-galaxy collection build .
114+
- ansible-galaxy collection install $COLLECTION_NAMESPACE-$COLLECTION_NAME-$COLLECTION_VERSION.tar.gz -p /home/travis/.ansible/collections
22115

23-
install:
24-
- pip install -U pip
25-
- pip install pytest==4.6.5 pytest-mock pytest-xdist jinja2 PyYAML black==19.3b0
26-
- cd ../../
27-
# This is due to ansible-test only being available within devel branch
28-
- git clone https://github.com/ansible/ansible.git
29-
- source ansible/hacking/env-setup
30-
31-
before_script:
32-
- mkdir -p ~/ansible_collections/$COLLECTION_NAMESPACE
33-
- mv FragmentedPacket/$COLLECTION_NAME ~/ansible_collections/$COLLECTION_NAMESPACE/$COLLECTION_NAME
34-
- cd ~/ansible_collections/$COLLECTION_NAMESPACE/$COLLECTION_NAME
35-
36-
script:
37-
- ansible-test units --python $PYTHON_VER
38-
- black . --check
116+
script:
117+
- "sleep 60"
118+
- python tests/integration/netbox-deploy.py
119+
- ansible-playbook tests/integration/integration-tests.yml -v

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
**THIS IS A WIP DUE TO COLLECTIONS BEING IN TECH REVIEW CURRENTLY (Ansible 2.8) BUT WILL BE UPDATED AS NECESSARY AS COLLECTIONS MATURES**
55

6-
**TODO**
6+
## Todo
77
- ~~initial build and changes to properly import module_utils~~
88
- Add testing to Travis CI
9-
- ~~Existing unit tests~~
9+
- ~~Initial unit tests~~
1010
- ~~Test different Python versions (3.6/3.7)~~
11+
- ~~Integration testing against at least two versions of Netbox~~
1112
- Local testing using Tox
1213
- Test currently supported versions of Ansible
13-
- Integration testing against at least two versions of Netbox
1414
- ~~Add documentation on how to use to README~~
1515
- Add documentation on how to contribute to collection
1616

@@ -24,7 +24,7 @@
2424
## Existing Modules
2525

2626
- netbox_device
27-
- netbox_interface
27+
- netbox_device_interface
2828
- netbox_ip_address
2929
- netbox_prefix
3030
- netbox_site

galaxy.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace: fragmentedpacket
99
name: netbox_modules
1010

1111
# The version of the collection. Must be compatible with semantic versioning
12-
version: 0.0.7
12+
version: 0.0.8
1313

1414
# The path to the Markdown (.md) readme file. This path is relative to the root of the collection
1515
readme: README.md

plugins/module_utils/netbox_ipam.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,21 @@ def _handle_state_new_present(self, nb_app, nb_endpoint, endpoint_name, name, da
3636
if self.state == "present":
3737
self._ensure_object_exists(nb_endpoint, endpoint_name, name, data)
3838
elif self.state == "new":
39-
self._create_netbox_object(nb_endpoint, data)
39+
self.nb_object, diff = self._create_netbox_object(nb_endpoint, data)
40+
self.result["msg"] = "%s %s created" % (endpoint_name, name)
41+
self.result["changed"] = True
42+
self.result["diff"] = diff
4043
else:
4144
if self.state == "present":
42-
self._ensure_ip_in_prefix_present_on_netif(nb_app, nb_endpoint, data)
45+
self._ensure_ip_in_prefix_present_on_netif(
46+
nb_app, nb_endpoint, data, endpoint_name
47+
)
4348
elif self.state == "new":
44-
self._get_new_available_ip_address(nb_app, data)
49+
self._get_new_available_ip_address(nb_app, data, endpoint_name)
4550

46-
def _ensure_ip_in_prefix_present_on_netif(self, nb_app, nb_endpoint, data):
51+
def _ensure_ip_in_prefix_present_on_netif(
52+
self, nb_app, nb_endpoint, data, endpoint_name
53+
):
4754
"""
4855
"""
4956
if not data.get("interface") or not data.get("prefix"):
@@ -57,13 +64,14 @@ def _ensure_ip_in_prefix_present_on_netif(self, nb_app, nb_endpoint, data):
5764
if attached_ips:
5865
self.nb_object = attached_ips[-1].serialize()
5966
self.result["changed"] = False
60-
self.result["msg"] = "IP Address %s already attached" % (
61-
self.nb_object["address"]
67+
self.result["msg"] = "%s %s already attached" % (
68+
endpoint_name,
69+
self.nb_object["address"],
6270
)
6371
else:
64-
self._get_new_available_ip_address(nb_app, data)
72+
self._get_new_available_ip_address(nb_app, data, endpoint_name)
6573

66-
def _get_new_available_ip_address(self, nb_app, data):
74+
def _get_new_available_ip_address(self, nb_app, data, endpoint_name):
6775
prefix_query = self._build_query_params("prefix", data)
6876
prefix = nb_app.prefixes.get(**prefix_query)
6977
if not prefix:
@@ -76,24 +84,30 @@ def _get_new_available_ip_address(self, nb_app, data):
7684
prefix.available_ips, data
7785
)
7886
self.result["changed"] = True
79-
self.result["msg"] = "IP Address %s created" % (self.nb_object["address"])
87+
self.result["msg"] = "%s %s created" % (
88+
endpoint_name,
89+
self.nb_object["address"],
90+
)
8091
self.result["diff"] = diff
8192
else:
8293
self.result["changed"] = False
8394
self.result["msg"] = "No available IPs available within %s" % (
8495
data["prefix"]
8596
)
8697

87-
def _get_new_available_prefix(self, data):
98+
def _get_new_available_prefix(self, data, endpoint_name):
8899
if not self.nb_object:
89100
self.result["changed"] = False
90-
self.result["msg"] = "Parent prefix does not exist: %s" % (data["parent"])
101+
self.result["msg"] = "Parent prefix does not exist - %s" % (data["parent"])
91102
elif self.nb_object.available_prefixes.list():
92103
self.nb_object, diff = self._create_netbox_object(
93104
self.nb_object.available_prefixes, data
94105
)
95106
self.result["changed"] = True
96-
self.result["msg"] = "Prefix %s created" % (self.nb_object["prefix"])
107+
self.result["msg"] = "%s %s created" % (
108+
endpoint_name,
109+
self.nb_object["prefix"],
110+
)
97111
self.result["diff"] = diff
98112
else:
99113
self.result["changed"] = False
@@ -146,7 +160,7 @@ def run(self):
146160
nb_app, nb_endpoint, endpoint_name, name, data
147161
)
148162
elif self.state == "present" and first_available and data.get("parent"):
149-
self._get_new_available_prefix(data)
163+
self._get_new_available_prefix(data, endpoint_name)
150164
elif self.state == "present":
151165
self._ensure_object_exists(nb_endpoint, endpoint_name, name, data)
152166
elif self.state == "absent":

plugins/modules/netbox_interface.py renamed to plugins/modules/netbox_device_interface.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
DOCUMENTATION = r"""
1818
---
19-
module: netbox_interface
20-
short_description: Creates or removes interfaces from Netbox
19+
module: netbox_device_interface
20+
short_description: Creates or removes interfaces on devices from Netbox
2121
description:
2222
- Creates or removes interfaces from Netbox
2323
notes:
@@ -127,23 +127,23 @@
127127
gather_facts: False
128128
tasks:
129129
- name: Create interface within Netbox with only required information
130-
netbox_interface:
130+
netbox_device_interface:
131131
netbox_url: http://netbox.local
132132
netbox_token: thisIsMyToken
133133
data:
134134
device: test100
135135
name: GigabitEthernet1
136136
state: present
137137
- name: Delete interface within netbox
138-
netbox_interface:
138+
netbox_device_interface:
139139
netbox_url: http://netbox.local
140140
netbox_token: thisIsMyToken
141141
data:
142142
device: test100
143143
name: GigabitEthernet1
144144
state: absent
145145
- name: Create LAG with several specified options
146-
netbox_interface:
146+
netbox_device_interface:
147147
netbox_url: http://netbox.local
148148
netbox_token: thisIsMyToken
149149
data:
@@ -155,7 +155,7 @@
155155
mode: Access
156156
state: present
157157
- name: Create interface and assign it to parent LAG
158-
netbox_interface:
158+
netbox_device_interface:
159159
netbox_url: http://netbox.local
160160
netbox_token: thisIsMyToken
161161
data:
@@ -170,7 +170,7 @@
170170
mode: Access
171171
state: present
172172
- name: Create interface as a trunk port
173-
netbox_interface:
173+
netbox_device_interface:
174174
netbox_url: http://netbox.local
175175
netbox_token: thisIsMyToken
176176
data:
@@ -224,8 +224,8 @@ def main():
224224

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

227-
netbox_interface = NetboxDcimModule(module, NB_INTERFACES)
228-
netbox_interface.run()
227+
netbox_device_interface = NetboxDcimModule(module, NB_INTERFACES)
228+
netbox_device_interface.run()
229229

230230

231231
if __name__ == "__main__":

0 commit comments

Comments
 (0)