def main(): argspec = dict(name=dict(required=True, type="str"), state=dict(required=True, choices=["present", "absent"], type="str")) module = AnsibleModule(argument_spec=argspec, supports_check_mode=True) space_request = SpaceRequest(module, ) space_request.headers = { "Content-Type": "application/hornetq.jms.queue+xml" } queue_name = to_text(module.params["name"]) if to_text(module.params["state"]) == "present": body = '<queue name="{0}"><durable>false</durable></queue>'.format( queue_name) code, response = space_request.post("/api/hornet-q/queues", payload=body, status_codes='201, 412') if code == 201: module.exit_json(return_code=code, return_body=response, changed=True) elif code == 412: module.exit_json(return_code=code, return_body=response, changed=False) elif to_text(module.params["state"]) == "absent": code, response = space_request.delete( '/api/hornet-q/queues/jms.queue.{0}'.format(queue_name), status_codes='204, 405') if code == 204: module.exit_json(return_code=code, return_body=response, changed=True) elif code == 405: module.exit_json(return_code=code, return_body=response, changed=False)
def main(): argspec = dict(state=dict(required=True, choices=["present", "absent"], type="str"), id=dict(required=False, type="int"), ip_address=dict(required=False, type="str"), username=dict(required=False, type="str", no_log=True), password=dict(required=False, type="str", no_log=True), use_ping=dict(required=False, type="bool", default=True), use_snmp=dict(required=False, type="bool", default=False), snmp_community=dict(required=False, type="str"), queue=dict(required=False, type="str")) module = AnsibleModule(argument_spec=argspec, supports_check_mode=True) space_request = SpaceRequest(module, ) space_device_manager = SpaceDeviceMgr(module, ) # Gather device details to determine if device exists if module.params["id"]: device = space_device_manager.get_device_by_id(module.params["id"]) elif module.params["ip_address"]: #FIXME: Use get_device instead so we get full device details when we implment changing existing device device = space_device_manager.get_devices( ip_address=module.params["ip_address"]) else: module.fail_json(msg='You must provide either an id or ip_address') if to_text(module.params["state"]) == "present": if device: #FIXME: Add logic for changing an existing device module.exit_json(msg='Device already present', device=device[0], changed=False) #check params else: if not module.params["ip_address"]: module.fail_json(msg='You must provide either an ip_address') elif not module.params["username"]: module.fail_json(msg='You must provide a username') elif not module.params["password"]: module.fail_json(msg='You must provide either a password') # Create the device space_request.headers = { "Accept": "application/vnd.net.juniper.space.device-management.discover-devices+json;version=1", "Content-Type": "application/vnd.net.juniper.space.device-management.discover-devices+json;version=1;charset=UTF-8" } body = { "systemDiscoveryRule": { "ipAddressDiscoveryTarget": { "exclude": "false", "ipAddress": "{}".format(module.params["ip_address"]) }, "usePing": "{}".format(module.params["use_ping"]), "manageDiscoveredSystemsFlag": "true", "sshCredential": { "userName": "******".format(module.params["username"]), "password": "******".format(module.params["password"]) }, "tagNewlyManagedDiscoveredSystemsFlag": "false" } } if module.params["snmp_community"]: body['systemDiscoveryRule']['snmpV2CSetting'] = { "communityName": "{}".format(module.params["snmp_community"]) } body['systemDiscoveryRule']['useSnmp'] = "True" code, response = space_request.post( "/api/space/device-management/discover-devices", payload=json.dumps(body)) task_id = response['task']['id'] job_status = space_request.check_job(task_id=task_id) if job_status == "DONE": device = space_device_manager.get_devices( ip_address=module.params["ip_address"]) module.exit_json(device=device, task_id=task_id, job_status=job_status, changed=True) else: module.fail_json(task_id=task_id, job_status=job_status, changed=False) elif module.params["state"] == "absent": if not device: module.exit_json(msg="Device already absent", device=device, changed=False) else: space_request.headers = { "Accept": "application/vnd.net.juniper.space.device-management.device+json;version=1" } space_request.expect_json = False code, response = space_request.delete( "/api/space/device-management/devices/{0}".format( device[0]["device-id"]), status_codes="202") if code == 202: module.exit_json(task_id=response['task']['id'], changed=True)
def main(): argspec = dict(state=dict(required=True, choices=["present", "absent"], type="str"), id=dict(required=False, type="int"), name=dict(required=False, type="str"), ip_address=dict(required=False, type="str"), address_version=dict(required=False, choices=["ipv4", "ipv6"], type="str", default="ipv4"), type=dict(required=False, choices=["ipaddress", "group"], type="str", default="ipaddress"), members=dict(required=False, type="list", elements="str")) module = AnsibleModule(argument_spec=argspec, supports_check_mode=True) space_request = SpaceRequest(module, ) sd_address_manager = SDAddressMgr(module, ) # Gather address details to determine if address exists if module.params["id"]: address = sd_address_manager.get_address_by_id(module.params["id"]) elif module.params["name"]: address = sd_address_manager.get_address(name=module.params["name"]) else: module.fail_json(msg='You must provide either an id or a name') if to_text(module.params["state"]) == "present": if address: #FIXME: Add logic for changing an existing address module.exit_json(msg='Address already present', address=address[0], changed=False) #check params else: if not module.params["name"]: module.fail_json(msg='You must provide a name') elif not module.params["ip_address"] and not module.params[ "type"] == "group": #only require IP addres if this isn't a group module.fail_json(msg='You must provide an IP address') if module.params[ "type"] == "group" and module.params["members"] is None: module.fail_json( msg= 'You must provide at least one member if the address type is GROUP' ) # Create the address space_request.headers = { "Accept": "application/json", "Content-Type": "application/json" } body = { "address": { "definition_type": "CUSTOM", "associated_metadata": "", "name": "{}".format(module.params["name"]), "description": "", "address_type": "{}".format(module.params["type"].upper()), "address_version": "{}".format(module.params["address_version"].upper()), "host_name": "", "ip_address": "{}".format(module.params["ip_address"]) } } if module.params["type"] == "group": address_refs = [] for member in module.params["members"]: response = sd_address_manager.get_address(name=member) if response is not None: address_refs.append( dict(name=response[0]['name'], uuid=response[0]['id'])) else: module.fail_json(msg="Could not find member with name: {}". format(member)) body['address']['address_refs'] = address_refs code, response = space_request.post( "/api/juniper/sd/address-management/v5/address", payload=json.dumps(body)) address = sd_address_manager.get_address_by_id( id=response['address']['uuid']) module.exit_json(address=address, changed=True) elif module.params["state"] == "absent": if not address: module.exit_json(msg="Address already absent", address=address, changed=False) else: space_request.headers = { "Accept": "application/vnd.net.juniper.space.address-management.address+json;version=1" } space_request.expect_json = False code, response = space_request.delete( "/api/juniper/sd/address-management/addresses/{0}".format( address[0]["id"]), status_codes="204, 500") if code == 204: module.exit_json(changed=True) elif code == 500: module.fail_json( msg= "Could not delete the address. Most likely it is in use by another group or policy.", response=response)
def __init__(self, module): self.space_request = SpaceRequest(module, )
class SpaceDeviceMgr(object): def __init__(self, module): self.space_request = SpaceRequest(module, ) def get_device_by_id(self, id): ''' Querries Space API and returns single element list with one device or None ''' self.space_request.headers = { "Accept": "application/vnd.net.juniper.space.device-management.device+json;version=1" } code, response = self.space_request.get_by_path( "/api/space/device-management/devices/{0}".format(id), status_codes="200,404") if code == 200: return self._return_list(response) elif 404: return None def get_devices(self, name=None, osversion=None, devicefamily=None, serialnumber=None, platform=None, managedstatus=None, connectionstatus=None, attribute_column_0=None, ip_address=None): ''' Querries Space API and returns list of any devices matching filter(s) or None ''' query_strs = [] self.space_request.headers = { "Accept": "application/vnd.net.juniper.space.device-management.devices+json;version=2" } if name: query_strs.append(quote("name eq '{0}'".format(to_text(name)))) if osversion: query_strs.append(quote("OSversion eq '{0}'".format(osversion))) if devicefamily: query_strs.append( quote("deviceFamily eq '{0}'".format(devicefamily))) if serialnumber: query_strs.append( quote("SerialNumber eq '{0}'".format(serialnumber))) if platform: query_strs.append(quote("platform eq '{0}'".format(platform))) if managedstatus: query_strs.append( quote("managedStatus eq '{0}'".format(managedstatus))) if connectionstatus: query_strs.append( quote("connectionStatus eq '{0}'".format(connectionstatus))) if attribute_column_0: query_strs.append( quote( "attribute-column-0 eq '{0}'".format(attribute_column_0))) if ip_address: query_strs.append(quote("ipAddr eq '{0}'".format(ip_address))) if query_strs: code, response = self.space_request.get_by_path( "/api/space/device-management/devices?filter=({0})".format( "%20and%20".join(query_strs))) return self._return_list(response['devices']) else: code, response = self.space_request.get_by_path( "/api/space/device-management/devices") return self._return_list(response['devices']) def get_device(self, **kwargs): ''' This device first querries by filter and then uses first device in the list to querry by ID. The /api/space/device-management/devices/<id> endpoint provides greater detail thann simply querrying by filter ''' device_list = self.get_devices(**kwargs) # device_list could already be None from '_return_list'. Make sure it's not None before continuing if device_list: if len(device_list) > 0: return self.get_device_by_id(device_list[0]['device-id']) else: return None #no devices exist def _return_list(self, devices): try: if not isinstance(devices['device'], list): devices = [devices['device']] except KeyError: return None #no devices exist return devices
def main(): argspec = dict(state=dict(required=True, choices=["present", "absent"], type="str"), id=dict(required=False, type="int"), name=dict(required=False, type="str"), ip_address=dict(required=False, type="str"), address_version=dict(required=False, choices=["ipv4", "ipv6"], type="str", default="ipv4"), type=dict( required=False, choices=["ipaddress", "group", "network", "range"], type="str", default="ipaddress"), members=dict(required=False, type="list", elements="str")) module = AnsibleModule(argument_spec=argspec, supports_check_mode=True) space_request = SpaceRequest(module, ) sd_address_manager = SDAddressMgr(module, ) # Gather address details to determine if address exists if module.params["id"]: address = sd_address_manager.get_address_by_id(module.params["id"]) elif module.params["name"]: address = sd_address_manager.get_address(name=module.params["name"]) else: module.fail_json(msg='You must provide either an id or a name') if to_text(module.params["state"]) == "present": #check params if not module.params["name"]: module.fail_json(msg='You must provide a name') elif not module.params["ip_address"] and not module.params[ "type"] == "group": #only require IP addres if this isn't a group module.fail_json(msg='You must provide an IP address') if module.params[ "type"] == "group" and module.params["members"] is None: module.fail_json( msg= 'You must provide at least one member if the address type is GROUP' ) space_request.headers = { "Accept": "application/json", "Content-Type": "application/json" } # Create the address body body = dict( address={ "definition_type": "CUSTOM", "associated_metadata": "", "name": module.params["name"], "description": "", "address_type": module.params["type"].upper(), "address_version": module.params["address_version"].upper(), "host_name": "" }) # Add member-refs if necessary if module.params["type"] == "group": address_refs = [] for member in module.params["members"]: response = sd_address_manager.get_address(name=member) if response is not None: # address_refs.append(dict(name=response[0]['name'], uuid=response[0]['uuid'])) response[0].pop('uri', None) address_refs.append(response[0]) else: module.fail_json(msg="Could not find member with name: {}". format(member)) body['address']['address_refs'] = address_refs else: # only set ip_address key if this isn't a group body['address']['ip_address'] = module.params["ip_address"] # Logic for changing an existing address if address: # make a copy patch_address = dict(address=address[0].copy()) #update the patch with the prepared body patch_address['address'].update(body['address']) #compare for differences if address[0] == patch_address['address']: module.exit_json(msg='Address already up to date', address=address[0], changed=False) else: code, response = space_request.put( "/api/juniper/sd/address-management/v5/address/{0}".format( address[0]["uuid"]), payload=json.dumps(patch_address)) module.exit_json(msg='Address updated', address=response['address'], changed=True) if address[0]["address-type"] == "GROUP": for member in body["address"]["address_refs"]: if not any(d["uuid"] == member["uuid"] for d in a): pass # update body with edit-version and set method to PUT module.exit_json(msg='Address already present', address=address[0], changed=False) code, response = space_request.post( "/api/juniper/sd/address-management/v5/address", payload=json.dumps(body)) module.exit_json(address=response['address'], changed=True) elif module.params["state"] == "absent": if not address: module.exit_json(msg="Address already absent", address=address, changed=False) else: space_request.headers = { "Accept": "application/vnd.net.juniper.space.address-management.address+json;version=1" } space_request.expect_json = False code, response = space_request.delete( "/api/juniper/sd/address-management/addresses/{0}".format( address[0]["uuid"]), status_codes="204, 500") if code == 204: module.exit_json(changed=True) elif code == 500: module.fail_json( msg= "Could not delete the address. Most likely it is in use by another group or policy.", response=response)