Пример #1
0
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)
Пример #2
0
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)
Пример #4
0
 def __init__(self, module):
     self.space_request = SpaceRequest(module, )
Пример #5
0
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
Пример #6
0
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)