1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Allow module to claim devices into an organization (#42448)

- Before this, it allowed claiming devices into a network only
- Make integration tests a block
- Note, API doesn't allow unclaiming in an organization, only net
- Added an integration test for claiming into an org
	- Requires unclaiming manually
- There is a bug in the API which isn't showing claimed devices
This commit is contained in:
Kevin Breit 2018-07-09 04:08:37 -05:00 committed by Dag Wieers
parent 5960b215bb
commit 779f3c0c1a
2 changed files with 232 additions and 215 deletions

View file

@ -211,6 +211,14 @@ def is_device_valid(meraki, serial, data):
return False return False
def get_org_devices(meraki, org_id):
path = meraki.construct_path('get_all_org', org_id=org_id)
response = meraki.request(path, method='GET')
if meraki.status != 200:
meraki.fail_json(msg='Failed to query all devices belonging to the organization')
return response
def temp_get_nets(meraki, org_name, net_name): def temp_get_nets(meraki, org_name, net_name):
org_id = meraki.get_org_id(org_name) org_id = meraki.get_org_id(org_name)
path = meraki.construct_path('get_all', function='network', org_id=org_id) path = meraki.construct_path('get_all', function='network', org_id=org_id)
@ -263,24 +271,19 @@ def main():
meraki.params['follow_redirects'] = 'all' meraki.params['follow_redirects'] = 'all'
query_urls = {'device': '/networks/{net_id}/devices', query_urls = {'device': '/networks/{net_id}/devices'}
} query_org_urls = {'device': '/organizations/{org_id}/deviceStatuses'}
query_device_urls = {'device': '/networks/{net_id}/devices/'}
query_device_urls = {'device': '/networks/{net_id}/devices/', claim_device_urls = {'device': '/networks/{net_id}/devices/claim'}
} bind_org_urls = {'device': '/organizations/{org_id}/claim'}
update_device_urls = {'device': '/networks/{net_id}/devices/'}
claim_device_urls = {'device': '/networks/{net_id}/devices/claim', delete_device_urls = {'device': '/networks/{net_id}/devices/'}
}
update_device_urls = {'device': '/networks/{net_id}/devices/',
}
delete_device_urls = {'device': '/networks/{net_id}/devices/',
}
meraki.url_catalog['get_all'].update(query_urls) meraki.url_catalog['get_all'].update(query_urls)
meraki.url_catalog['get_all_org'] = query_org_urls
meraki.url_catalog['get_device'] = query_device_urls meraki.url_catalog['get_device'] = query_device_urls
meraki.url_catalog['create'] = claim_device_urls meraki.url_catalog['create'] = claim_device_urls
meraki.url_catalog['bind_org'] = bind_org_urls
meraki.url_catalog['update'] = update_device_urls meraki.url_catalog['update'] = update_device_urls
meraki.url_catalog['delete'] = delete_device_urls meraki.url_catalog['delete'] = delete_device_urls
@ -297,15 +300,19 @@ def main():
# manipulate or modify the state as needed (this is going to be the # manipulate or modify the state as needed (this is going to be the
# part where your module will do what it needs to do) # part where your module will do what it needs to do)
nets = temp_get_nets(meraki, meraki.params['org_name'], meraki.params['net_name'])
org_id = meraki.params['org_id']
if org_id is None:
org_id = meraki.get_org_id(meraki.params['org_name'])
net_id = meraki.params['net_id']
if net_id is None:
if meraki.params['net_name']:
nets = temp_get_nets(meraki, meraki.params['org_name'], meraki.params['net_name'])
net_id = meraki.get_net_id(net_name=meraki.params['net_name'], data=nets)
if meraki.params['state'] == 'query': if meraki.params['state'] == 'query':
if meraki.params['net_name'] or meraki.params['net_id']: if meraki.params['net_name'] or meraki.params['net_id']:
device = [] device = []
if meraki.params['net_name']:
net_id = meraki.get_net_id(net_name=meraki.params['net_name'], data=nets)
elif meraki.params['net_id']:
net_id = meraki.params['net_id']
if meraki.params['serial']: if meraki.params['serial']:
path = meraki.construct_path('get_device', net_id=net_id) + meraki.params['serial'] path = meraki.construct_path('get_device', net_id=net_id) + meraki.params['serial']
request = meraki.request(path, method='GET') request = meraki.request(path, method='GET')
@ -341,24 +348,16 @@ def main():
request = meraki.request(path, method='GET') request = meraki.request(path, method='GET')
meraki.result['data'] = request meraki.result['data'] = request
else: else:
devices = [] path = meraki.construct_path('get_all_org', org_id=org_id)
for net in nets: # Gather all devices in all networks devices = meraki.request(path, method='GET')
path = meraki.construct_path('get_all', net_id=net['id'])
request = meraki.request(path, method='GET')
devices.append(request)
if meraki.params['serial']: if meraki.params['serial']:
for network in devices: for device in devices:
for dev in network: if device['serial'] == meraki.params['serial']:
if dev['serial'] == meraki.params['serial']: meraki.result['data'] = device
meraki.result['data'] = [dev]
else: else:
meraki.result['data'] = devices meraki.result['data'] = devices
elif meraki.params['state'] == 'present': elif meraki.params['state'] == 'present':
device = [] device = []
if meraki.params['net_name']:
net_id = meraki.get_net_id(net_name=meraki.params['net_name'], data=nets)
elif meraki.params['net_id']:
net_id = meraki.params['net_id']
if meraki.params['hostname']: if meraki.params['hostname']:
query_path = meraki.construct_path('get_all', net_id=net_id) query_path = meraki.construct_path('get_all', net_id=net_id)
device_list = meraki.request(query_path, method='GET') device_list = meraki.request(query_path, method='GET')
@ -380,21 +379,28 @@ def main():
meraki.result['data'] = updated_device meraki.result['data'] = updated_device
meraki.result['changed'] = True meraki.result['changed'] = True
else: else:
query_path = meraki.construct_path('get_all', net_id=net_id) if net_id is None:
device_list = meraki.request(query_path, method='GET') device_list = get_org_devices(meraki, org_id)
if is_device_valid(meraki, meraki.params['serial'], device_list) is False: if is_device_valid(meraki, meraki.params['serial'], device_list) is False:
payload = {'serial': meraki.params['serial']} payload = {'serial': meraki.params['serial']}
path = meraki.construct_path('create', net_id=net_id) path = meraki.construct_path('bind_org', org_id=org_id)
created_device = [] created_device = []
created_device.append(meraki.request(path, method='POST', payload=json.dumps(payload))) created_device.append(meraki.request(path, method='POST', payload=json.dumps(payload)))
meraki.result['data'] = created_device meraki.result['data'] = created_device
meraki.result['changed'] = True meraki.result['changed'] = True
else:
query_path = meraki.construct_path('get_all', net_id=net_id)
device_list = meraki.request(query_path, method='GET')
if is_device_valid(meraki, meraki.params['serial'], device_list) is False:
if net_id:
payload = {'serial': meraki.params['serial']}
path = meraki.construct_path('create', net_id=net_id)
created_device = []
created_device.append(meraki.request(path, method='POST', payload=json.dumps(payload)))
meraki.result['data'] = created_device
meraki.result['changed'] = True
elif meraki.params['state'] == 'absent': elif meraki.params['state'] == 'absent':
device = [] device = []
if meraki.params['net_name']:
net_id = meraki.get_net_id(net_name=meraki.params['net_name'], data=nets)
elif meraki.params['net_id']:
net_id = meraki.params['net_id']
query_path = meraki.construct_path('get_all', net_id=net_id) query_path = meraki.construct_path('get_all', net_id=net_id)
device_list = meraki.request(query_path, method='GET') device_list = meraki.request(query_path, method='GET')
if is_device_valid(meraki, meraki.params['serial'], device_list) is True: if is_device_valid(meraki, meraki.params['serial'], device_list) is True:

View file

@ -1,202 +1,213 @@
--- ---
- name: Claim a device - block:
meraki_device: - name: Claim a device into an organization
auth_key: '{{auth_key}}' meraki_device:
org_name: '{{test_org_name}}' auth_key: '{{auth_key}}'
net_name: '{{test_net_name}}' org_name: '{{test_org_name}}'
serial: '{{serial}}' serial: '{{serial}}'
state: present state: present
delegate_to: localhost delegate_to: localhost
register: claim_device register: claim_device_org
- debug: - assert:
msg: '{{claim_device}}' that:
- claim_device_org.changed == true
- assert: - name: Query status of all devices in an organization
that: meraki_device:
- claim_device.changed == true auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
state: query
delegate_to: localhost
register: query_device_org
- name: Query all devices - debug:
meraki_device: msg: '{{query_device_org}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
state: query
delegate_to: localhost
register: query_all
- debug: - name: Claim a device into a network
msg: '{{query_all}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
state: present
delegate_to: localhost
register: claim_device
- assert: - debug:
that: msg: '{{claim_device}}'
- query_all.changed == False
- name: Query all devices in one network by network ID - assert:
meraki_device: that:
auth_key: '{{auth_key}}' - claim_device.changed == true
org_name: '{{test_org_name}}'
net_id: '{{test_net_id}}'
state: query
delegate_to: localhost
register: query_one_net_id
- debug: - name: Query all devices in one network by network ID
msg: '{{query_one_net_id}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_id: '{{test_net_id}}'
state: query
delegate_to: localhost
register: query_one_net_id
- name: Query all devices in one network - debug:
meraki_device: msg: '{{query_one_net_id}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
state: query
delegate_to: localhost
register: query_one_net
- debug: - name: Query all devices in one network
msg: '{{query_one_net}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
state: query
delegate_to: localhost
register: query_one_net
- name: Query device by serial - debug:
meraki_device: msg: '{{query_one_net}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
serial: '{{serial}}'
state: query
delegate_to: localhost
register: query_serial_no_net
- debug: - name: Query device by serial
msg: '{{query_serial_no_net}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
serial: '{{serial}}'
state: query
delegate_to: localhost
register: query_serial_no_net
- name: Query device by serial - debug:
meraki_device: msg: '{{query_serial_no_net}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
state: query
delegate_to: localhost
register: query_serial
- debug: - name: Query device by serial
msg: '{{query_serial}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
state: query
delegate_to: localhost
register: query_serial
- assert: - debug:
that: msg: '{{query_serial}}'
- query_serial.changed == False
- name: Query uplink information for a device - assert:
meraki_device: that:
auth_key: '{{auth_key}}' - query_serial.changed == False
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial_uplink: '{{serial}}'
state: query
delegate_to: localhost
register: query_serial_uplink
- debug: - name: Query uplink information for a device
msg: '{{query_serial_uplink}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial_uplink: '{{serial}}'
state: query
delegate_to: localhost
register: query_serial_uplink
- name: Query LLDP/CDP information about a device - debug:
meraki_device: msg: '{{query_serial_uplink}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial_lldp_cdp: '{{serial}}'
lldp_cdp_timespan: 6000
state: query
delegate_to: localhost
register: query_serial_lldp_cdp
- debug: - name: Query LLDP/CDP information about a device
msg: '{{query_serial_lldp_cdp}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial_lldp_cdp: '{{serial}}'
lldp_cdp_timespan: 6000
state: query
delegate_to: localhost
register: query_serial_lldp_cdp
- name: Query a device by hostname - debug:
meraki_device: msg: '{{query_serial_lldp_cdp}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
hostname: test-hostname
state: query
delegate_to: localhost
register: query_hostname
- debug: - name: Query a device by hostname
msg: '{{query_hostname}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
hostname: test-hostname
state: query
delegate_to: localhost
register: query_hostname
- name: Query a device by model - debug:
meraki_device: msg: '{{query_hostname}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
model: MR26
state: query
delegate_to: localhost
register: query_model
- debug: - name: Query a device by model
msg: '{{query_model}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
model: MR26
state: query
delegate_to: localhost
register: query_model
- name: Update a device - debug:
meraki_device: msg: '{{query_model}}'
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
name: mr26
address: 1060 W. Addison St., Chicago, IL
lat: 41.948038
lng: -87.65568
tags: recently-added
state: present
move_map_marker: True
delegate_to: localhost
register: update_device
- debug: - name: Update a device
msg: '{{update_device}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
name: mr26
address: 1060 W. Addison St., Chicago, IL
lat: 41.948038
lng: -87.65568
tags: recently-added
state: present
move_map_marker: True
delegate_to: localhost
register: update_device
# - assert: - debug:
# that: msg: '{{update_device}}'
# - update_device.changed == true
# - '"1060 W. Addison St., Chicago, IL" in update_device.data.0.address'
- name: Update a device with idempotency # - assert:
meraki_device: # that:
auth_key: '{{auth_key}}' # - update_device.changed == true
org_name: '{{test_org_name}}' # - '"1060 W. Addison St., Chicago, IL" in update_device.data.0.address'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
name: mr26
address: 1060 W. Addison St., Chicago, IL
lat: 41.948038
lng: -87.65568
tags: recently-added
state: present
move_map_marker: True
delegate_to: localhost
register: update_device_idempotent
- debug: - name: Update a device with idempotency
msg: '{{update_device_idempotent}}' meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
name: mr26
address: 1060 W. Addison St., Chicago, IL
lat: 41.948038
lng: -87.65568
tags: recently-added
state: present
move_map_marker: True
delegate_to: localhost
register: update_device_idempotent
- assert: - debug:
that: msg: '{{update_device_idempotent}}'
- update_device_idempotent.changed == False
- name: Remove a device - assert:
meraki_device: that:
auth_key: '{{auth_key}}' - update_device_idempotent.changed == False
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
state: absent
delegate_to: localhost
register: delete_device
- debug: always:
msg: '{{delete_device}}' - name: Remove a device
meraki_device:
auth_key: '{{auth_key}}'
org_name: '{{test_org_name}}'
net_name: '{{test_net_name}}'
serial: '{{serial}}'
state: absent
delegate_to: localhost
register: delete_device
- assert: - debug:
that: msg: '{{delete_device}}'
- delete_device.changed == true
- assert:
that:
- delete_device.changed == true