Allow Netbox device modification (#53631)

* netbox_device: Allow device modification

* Add ability to update and existing device
* Allow check_mode
* Fail when device name is missing
* Fail when cannot resolve ID instead of taking ID 1 by default

* netbox_device: Add diff output

* netbox: Some refactoring

* Add diff output and check_mode to netbox_ip_address
* Deduplicate redundant code into netbox_utils

* netbox_utils: A few unit tests
This commit is contained in:
Bruno Inec 2019-04-07 12:17:11 +02:00 committed by Nilashish Chakraborty
parent a4c42ba687
commit c637104078
4 changed files with 248 additions and 55 deletions

View file

@ -223,7 +223,14 @@ import json
import traceback
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
from ansible.module_utils.net_tools.netbox.netbox_utils import find_ids, normalize_data, IP_ADDRESS_ROLE, IP_ADDRESS_STATUS
from ansible.module_utils.net_tools.netbox.netbox_utils import (
find_ids,
normalize_data,
create_netbox_object,
delete_netbox_object,
IP_ADDRESS_ROLE,
IP_ADDRESS_STATUS
)
from ansible.module_utils.compat import ipaddress
from ansible.module_utils._text import to_text
@ -249,8 +256,9 @@ def main():
validate_certs=dict(type="bool", default=True)
)
global module
module = AnsibleModule(argument_spec=argument_spec,
supports_check_mode=False)
supports_check_mode=True)
# Fail module if pynetbox is not installed
if not HAS_PYNETBOX:
@ -383,11 +391,11 @@ def create_ip_address(nb_endpoint, data):
changed = False
return {"msg": data, "changed": changed}
ip_addr = nb_endpoint.create(data).serialize()
ip_addr, diff = create_netbox_object(nb_endpoint, data, module.check_mode)
changed = True
msg = "IP Addresses %s created" % (data["address"])
return {"ip_address": ip_addr, "msg": msg, "changed": changed}
return {"ip_address": ip_addr, "msg": msg, "changed": changed, "diff": diff}
def ensure_ip_in_prefix_present_on_netif(nb_app, nb_endpoint, data):
@ -424,21 +432,24 @@ def get_new_available_ip_address(nb_app, data):
if data.get("vrf"):
prefix_query["vrf_id"] = data["vrf"]
result = {}
prefix = nb_app.prefixes.get(**prefix_query)
if not prefix:
changed = False
msg = "%s does not exist - please create first" % (data["prefix"])
return {"msg": msg, "changed": changed}
elif prefix.available_ips.list():
ip_addr = prefix.available_ips.create(data)
ip_addr, diff = create_netbox_object(prefix.available_ips, data, module.check_mode)
changed = True
msg = "IP Addresses %s created" % (ip_addr["address"])
result["diff"] = diff
else:
changed = False
msg = "No available IPs available within %s" % (data['prefix'])
return {"msg": msg, "changed": changed}
return {"ip_address": ip_addr, "msg": msg, "changed": changed}
result.update({"ip_address": ip_addr, "msg": msg, "changed": changed})
return result
def _get_prefix_id(nb_app, prefix, vrf_id=None):
@ -476,15 +487,18 @@ def ensure_ip_address_absent(nb_endpoint, data):
except ValueError:
return _error_multiple_ip_results(data)
result = {}
if ip_addr:
ip_addr.delete()
dummy, diff = delete_netbox_object(ip_addr, module.check_mode)
changed = True
msg = "IP Address %s deleted" % (data["address"])
result["diff"] = diff
else:
changed = False
msg = "IP Address %s already absent" % (data["address"])
return {"msg": msg, "changed": changed}
result.update({"msg": msg, "changed": changed})
return result
if __name__ == "__main__":