#!/usr/bin/python
# -*- coding: utf-8 -*-

# Copyright (c) 2021, Cisco Systems
# GNU General Public License v3.0+ (see LICENSE or https://www.gnu.org/licenses/gpl-3.0.txt)

DOCUMENTATION = r"""
---
module: discovery
short_description: Resource module for Discovery
description:
- Manage operations create, update and delete of the resource Discovery.
- Initiates discovery with the given parameters.
- Stops all the discoveries and removes them.
- >
   Stops the discovery for the given Discovery ID and removes it. Discovery ID can be obtained using the "Get
   Discoveries by range" API.
- Stops or starts an existing discovery.
version_added: '3.1.0'
extends_documentation_fragment:
  - cisco.dnac.module
author: Rafael Campos (@racampos)
options:
  attributeInfo:
    description: Deprecated.
    type: dict
  cdpLevel:
    description: CDP level to which neighbor devices to be discovered.
    type: int
  deviceIds:
    description: Ids of the devices discovered in a discovery.
    type: str
  discoveryCondition:
    description: To indicate the discovery status. Available options Complete or In
      Progress.
    type: str
  discoveryStatus:
    description: Status of the discovery. Available options are active, inactive, edit.
    type: str
  discoveryType:
    description: Type of the discovery. 'SINGLE', 'RANGE', 'MULTI RANGE', 'CDP', 'LLDP',
      'CIDR'.
    type: str
  enablePasswordList:
    description: Enable Password of the devices to be discovered.
    type: str
  globalCredentialIdList:
    description: List of global credential ids to be used.
    elements: str
    type: list
  httpReadCredential:
    description: Discovery's httpReadCredential.
    suboptions:
      comments:
        description: Comments to identify the credential.
        type: str
      credentialType:
        description: Credential type to identify the application that uses the credential.
        type: str
      description:
        description: Description of the credential.
        type: str
      id:
        description: Credential Id.
        type: str
      instanceTenantId:
        description: Credential Tenant Id.
        type: str
      instanceUuid:
        description: Credential Id.
        type: str
      password:
        description: HTTP(S) password.
        type: str
      port:
        description: HTTP(S) port.
        type: int
      secure:
        description: Flag for HTTPS.
        type: bool
      username:
        description: HTTP(S) username.
        type: str
    type: dict
  httpWriteCredential:
    description: Discovery's httpWriteCredential.
    suboptions:
      comments:
        description: Comments to identify the credential.
        type: str
      credentialType:
        description: Credential type to identify the application that uses the credential.
        type: str
      description:
        description: Description of the credential.
        type: str
      id:
        description: Credential Id.
        type: str
      instanceTenantId:
        description: Credential Tenant Id.
        type: str
      instanceUuid:
        description: Credential Id.
        type: str
      password:
        description: HTTP(S) password.
        type: str
      port:
        description: HTTP(S) port.
        type: int
      secure:
        description: Flag for HTTPS.
        type: bool
      username:
        description: HTTP(S) username.
        type: str
    type: dict
  id:
    description: Unique Discovery Id.
    type: str
  ipAddressList:
    description: List of IP address of the devices to be discovered.
    type: str
  ipFilterList:
    description: IP addresses of the devices to be filtered.
    type: str
  isAutoCdp:
    description: Flag to mention if CDP discovery or not.
    type: bool
  lldpLevel:
    description: LLDP level to which neighbor devices to be discovered.
    type: int
  name:
    description: Name for the discovery.
    type: str
  netconfPort:
    description: Netconf port on the device. Netconf will need valid sshv2 credentials
      for it to work.
    type: str
  numDevices:
    description: Number of devices discovered in the discovery.
    type: int
  parentDiscoveryId:
    description: Parent Discovery Id from which the discovery was initiated.
    type: str
  passwordList:
    description: Password of the devices to be discovered.
    type: str
  preferredMgmtIPMethod:
    description: Preferred management IP method. Available options are 'None' and 'UseLoopBack'.
    type: str
  protocolOrder:
    description: Order of protocol (ssh/telnet) in which device connection will be tried.
      Ex 'telnet' only telnet; 'ssh,telnet' ssh with higher order than telnet.
    type: str
  retry:
    description: Number of times to try establishing connection to device.
    type: int
  retryCount:
    description: Number of times to try establishing connection to device.
    type: int
  snmpAuthPassphrase:
    description: Auth passphrase for SNMP.
    type: str
  snmpAuthProtocol:
    description: SNMP auth protocol. SHA' or 'MD5'.
    type: str
  snmpMode:
    description: Mode of SNMP. 'AUTHPRIV' or 'AUTHNOPRIV' or 'NOAUTHNOPRIV'.
    type: str
  snmpPrivPassphrase:
    description: Passphrase for SNMP privacy.
    type: str
  snmpPrivProtocol:
    description: SNMP privacy protocol. 'AES128'.
    type: str
  snmpROCommunity:
    description: SNMP RO community of the devices to be discovered.
    type: str
  snmpROCommunityDesc:
    description: Description for SNMP RO community.
    type: str
  snmpRWCommunity:
    description: SNMP RW community of the devices to be discovered.
    type: str
  snmpRWCommunityDesc:
    description: Description for SNMP RW community.
    type: str
  snmpRoCommunity:
    description: SNMP RO community of the devices to be discovered.
    type: str
  snmpRoCommunityDesc:
    description: Description for SNMP RO community.
    type: str
  snmpRwCommunity:
    description: SNMP RW community of the devices to be discovered.
    type: str
  snmpRwCommunityDesc:
    description: Description for SNMP RW community.
    type: str
  snmpUserName:
    description: SNMP username of the device.
    type: str
  snmpVersion:
    description: Version of SNMP. V2 or v3.
    type: str
  timeOut:
    description: Time to wait for device response.
    type: int
  timeout:
    description: Time to wait for device response in seconds.
    type: int
  updateMgmtIp:
    description: Updates Management IP if multiple IPs are available for a device. If
      set to true, when a device is rediscovered with a different IP, the management
      IP is updated. Default value is false.
    type: bool
  userNameList:
    description: Username of the devices to be discovered.
    type: str
requirements:
- dnacentersdk >= 2.7.1
- python >= 3.5
seealso:
- name: Cisco DNA Center documentation for Discovery StartDiscovery
  description: Complete reference of the StartDiscovery API.
  link: https://developer.cisco.com/docs/dna-center/#!start-discovery
- name: Cisco DNA Center documentation for Discovery DeleteAllDiscovery
  description: Complete reference of the DeleteAllDiscovery API.
  link: https://developer.cisco.com/docs/dna-center/#!delete-all-discovery
- name: Cisco DNA Center documentation for Discovery DeleteDiscoveryById
  description: Complete reference of the DeleteDiscoveryById API.
  link: https://developer.cisco.com/docs/dna-center/#!delete-discovery-by-id
- name: Cisco DNA Center documentation for Discovery UpdatesAnExistingDiscoveryBySpecifiedId
  description: Complete reference of the UpdatesAnExistingDiscoveryBySpecifiedId API.
  link: https://developer.cisco.com/docs/dna-center/#!updates-an-existing-discovery-by-specified-id
notes:
  - SDK Method used are
    discovery.Discovery.delete_discovery_by_id,
    discovery.Discovery.start_discovery,
    discovery.Discovery.updates_discovery_by_id,

  - Paths used are
    post /dna/intent/api/v1/discovery,
    delete /dna/intent/api/v1/discovery,
    delete /dna/intent/api/v1/discovery/{id},
    put /dna/intent/api/v1/discovery,

"""

EXAMPLES = r"""
- name: Delete all
  cisco.dnac.discovery:
    dnac_host: "{{dnac_host}}"
    dnac_username: "{{dnac_username}}"
    dnac_password: "{{dnac_password}}"
    dnac_verify: "{{dnac_verify}}"
    dnac_port: "{{dnac_port}}"
    dnac_version: "{{dnac_version}}"
    dnac_debug: "{{dnac_debug}}"
    state: absent

- name: Update all
  cisco.dnac.discovery:
    dnac_host: "{{dnac_host}}"
    dnac_username: "{{dnac_username}}"
    dnac_password: "{{dnac_password}}"
    dnac_verify: "{{dnac_verify}}"
    dnac_port: "{{dnac_port}}"
    dnac_version: "{{dnac_version}}"
    dnac_debug: "{{dnac_debug}}"
    state: present
    attributeInfo: {}
    cdpLevel: 0
    deviceIds: string
    discoveryCondition: string
    discoveryStatus: string
    discoveryType: string
    enablePasswordList: string
    globalCredentialIdList:
    - string
    httpReadCredential:
      comments: string
      credentialType: string
      description: string
      id: string
      instanceTenantId: string
      instanceUuid: string
      password: string
      port: 0
      secure: true
      username: string
    httpWriteCredential:
      comments: string
      credentialType: string
      description: string
      id: string
      instanceTenantId: string
      instanceUuid: string
      password: string
      port: 0
      secure: true
      username: string
    id: string
    ipAddressList: string
    ipFilterList: string
    isAutoCdp: true
    lldpLevel: 0
    name: string
    netconfPort: string
    numDevices: 0
    parentDiscoveryId: string
    passwordList: string
    preferredMgmtIPMethod: string
    protocolOrder: string
    retryCount: 0
    snmpAuthPassphrase: string
    snmpAuthProtocol: string
    snmpMode: string
    snmpPrivPassphrase: string
    snmpPrivProtocol: string
    snmpRoCommunity: string
    snmpRoCommunityDesc: string
    snmpRwCommunity: string
    snmpRwCommunityDesc: string
    snmpUserName: string
    timeOut: 0
    updateMgmtIp: true
    userNameList: string

- name: Create
  cisco.dnac.discovery:
    dnac_host: "{{dnac_host}}"
    dnac_username: "{{dnac_username}}"
    dnac_password: "{{dnac_password}}"
    dnac_verify: "{{dnac_verify}}"
    dnac_port: "{{dnac_port}}"
    dnac_version: "{{dnac_version}}"
    dnac_debug: "{{dnac_debug}}"
    state: present
    cdpLevel: 0
    discoveryType: string
    enablePasswordList:
    - string
    globalCredentialIdList:
    - string
    httpReadCredential:
      password: string
      port: 0
      secure: true
      username: string
    httpWriteCredential:
      password: string
      port: 0
      secure: true
      username: string
    ipAddressList: string
    ipFilterList:
    - string
    lldpLevel: 0
    name: string
    netconfPort: string
    passwordList:
    - string
    preferredMgmtIPMethod: string
    protocolOrder: string
    retry: 0
    snmpAuthPassphrase: string
    snmpAuthProtocol: string
    snmpMode: string
    snmpPrivPassphrase: string
    snmpPrivProtocol: string
    snmpROCommunity: string
    snmpROCommunityDesc: string
    snmpRWCommunity: string
    snmpRWCommunityDesc: string
    snmpUserName: string
    snmpVersion: string
    timeout: 0
    userNameList:
    - string

- name: Delete by id
  cisco.dnac.discovery:
    dnac_host: "{{dnac_host}}"
    dnac_username: "{{dnac_username}}"
    dnac_password: "{{dnac_password}}"
    dnac_verify: "{{dnac_verify}}"
    dnac_port: "{{dnac_port}}"
    dnac_version: "{{dnac_version}}"
    dnac_debug: "{{dnac_debug}}"
    state: absent
    id: string

"""
RETURN = r"""
dnac_response:
  description: A dictionary or list with the response returned by the Cisco DNAC Python SDK
  returned: always
  type: dict
  sample: >
    {
      "response": {
        "taskId": "string",
        "url": "string"
      },
      "version": "string"
    }
"""
