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)
Ejemplo n.º 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)
Ejemplo n.º 3
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)