fbpx

Parte 5/6: CCNA Devnet 200-901:͇ 𝗣𝘆𝘁𝗵𝗼𝗻 𝘆 𝗝𝗦𝗢𝗡.

Un nuevo post, dando seguimiento al anterior: Parte 4/6: CCNA Devnet 200-901:͇ 𝗜𝗻𝘁𝗿𝗼 𝗮 𝗣𝘆𝘁𝗵𝗼𝗻. Veremos un poco más a detalle sobre JSON, ya que en el examen hay preguntas exclusivamente relacionadas a comprender este formato. ¿Te gustaría poder utilizarlo a tu favor?, pues mantente en este post.

¿Qué es JSON?

Es una abreviación de JavaScript Object Notation. Es un formato ligero de intercambio de datos, con cualidades como:

No alt text provided for this image
  • Fácil para los humanos leer y escribir.
  • Fácil para las máquinas analizar y generar.

¿Genial no?

Que tal si vemos un ejemplo simbólico antes de continuar de donde dejamos el post anterior.

Digamos que quiero decir que tengo la información de algo… algo así como… el token o clave. Lo podríamos colocar así:

“token” : “123456789”

Este formato se le conoce como Data (Data), que se representa como nombre:valor o name:value separados por dos puntos (:).

¿Qué tal si quieres representar muchas Data? puedes hacerlo de esta manera:

{ ‘usuario’ : ‘Kevin’, “token” : “123456789” }

Este formato se le conoce como Objeto (Objecty puedes agruparlos con el símbolo llaves {}, separados por comas (,).

¿Qué tal si quieres representar muchos Objetos?, Se puede realizar de la siguiente manera:

Departamento: [

{ ‘usuario’ : ‘Kevin’, “token” : “123456789” },

{ ‘usuario’ : ‘Mario’, “token” : “abcdefghij” },

{ ‘usuario’ : ‘Goku’, “token” : “Dragon Ball” }

]

Este formato se le conoce como Arreglo (Array). Los mismos se agrupan con el símbolo corches [], separados por coma (,).

¿Recuerdas que mencionamos en el post anterior que en Python todo es un objeto?. Bueno, para guardar la información en una variable de formato JSON debes colocarlo dentro del símbolo de llaves {}.

No alt text provided for this image

Retomando post: Parte 4/5…

En el post anterior quedamos hasta la autenticación en la plataforma Cisco DNA Center. Solo como recordatorio, coloco el código anterior:

import requests

resp2 = requests.post("https://sandboxdnac.cisco.com/dna/system/api/v1/auth/token",auth=('devnetuser', 'Cisco123!'), verify=False)


print(resp2.text)

¿Recuerdan que devolvía una respuesta que representa JSON?. Si, es cierto, solo que el detalle aquí es que la variable resp2.text devolvía un texto o String, lo cual no es manejable.

En este caso, hay 2 maneras de transformar la información en formato JSON.

Modo 1: Librería requests: función json()

La librería requests discutida en el post anterior, incluye la función json(). Si la respuesta HTTP o HTTPS detecta formato JSON, lo convertirá:

resp2.json()

Modo 2: Librería JSON.

Si tienes la información en modo String, pero sabes que dentro tiene una estructura JSON, puedes transformarlo con la opción json.loads()

import json

json.loads(resp2.text)

Probemos lo aprendido. Guardemos la información en una variable token.

No alt text provided for this image

Referencia API: Listado de equipos

Ya con el token guardado en una variable, es posible realizar consultas a la plataforma Cisco DNA Center. ¿Qué tal si preguntamos los equipos en la plataforma?

Bueno… ¿y como lo hago?. Necesitas conocer la referencia API de la plataforma. En nuestro caso se encuentra en el siguiente link:

https://developer.cisco.com/docs/dna-center/

No alt text provided for this image

GET:

/dna/intent/api/v1/network-device

Exploramos la referencia API y encontramos el API que devuelve los dispositivos de red en la plataforma (/dna/intent/api/v1/network-device).

Recordar que las referencias API solo te brinda la extensión requerida luego del host. Esto quiere decir que nos hace falta el host. En nuestro caso, la dirección es:

https://sandboxdnac.cisco.com

Listo, tenemos la url completa, pero debemos enviar el token en la petición GET de alguna forma… Busquemos nuevamente la referencia API:

No alt text provided for this image

X-Auth-Token

Si vamos al API de autenticación, nos indica que hay que colocar un header con el nombre X-Auth-Token y especificar el valor. Los valores de los headers se representan como Data, es decir de la forma X-Auth-Token: “VALOR_DEL_TOKEN”

En resumen, la información que necesitamos para realizar la consulta sería:

url= “https://sandboxdnac.cisco.com”

api=”/dna/intent/api/v1/network-device”

headers = {‘X-auth-token’ : token[‘Token’]}

Nota: Recordar que en Python todos son objetos, razón por la cual del formato de la variable headers.

url= "https://sandboxdnac.cisco.com"
api="/dna/intent/api/v1/network-device"
headers = {'X-auth-token' : token1['Token']}

response= requests.get(url + api,headers=headers,verify=False)
No alt text provided for this image

Nota: ¿Notaste que coloque la variable url api como: url + api?

En Python puedes concatenar String de esa manera

Opcional: Analizando una estructura JSON de un equipo real

El resultado no es leíble, por lo menos en ese formato. Por suerte Atom tiene un complemento llamado Atom Beautify, que te permite “embellecer” data estructura y puedas leerla facilmente. Veamos como queda:

No alt text provided for this image

Nota: Atom Beautify es totalmente opcional, solo usado para fines explicativos.

Ya podemos leer la estructura JSON. Tomemos el primer elemento del arreglo para analizarlo:

{
  "response": [{
    "memorySize": "NA",
    "family": "Routers",
    "hostname": "asr1001-x",
    "macAddress": "00:c8:8b:80:bb:00",
    "serialNumber": "FXS1932Q1SE",
    "inventoryStatusDetail": "<status><general code=\\"
    SUCCESS\\ "/></status>",
    "deviceSupportLevel": "Supported",
    "collectionStatus": "Managed",
    "apManagerInterfaceIp": "",
    "tagCount": "0",
    "tunnelUdpPort": null,
    "waasDeviceMode": null,
    "upTime": "50 days, 15:10:04.46",
    "lastUpdateTime": 1602023920285,
    "collectionInterval": "Global Default",
    "softwareType": "IOS-XE",
    "softwareVersion": "16.3.2",
    "associatedWlcIp": "",
    "bootDateTime": "2020-08-17 07:28:40",
    "errorCode": null,
    "errorDescription": null,
    "interfaceCount": "0",
    "lastUpdated": "2020-10-06 22:38:40",
    "lineCardCount": "0",
    "lineCardId": "",
    "locationName": null,
    "managementIpAddress": "10.10.22.253",
    "platformId": "ASR1001-X",
    "reachabilityFailureReason": "",
    "reachabilityStatus": "Reachable",
    "series": "Cisco ASR 1000 Series Aggregation Services Routers",
    "snmpContact": "",
    "snmpLocation": "",
    "roleSource": "MANUAL",
    "type": "Cisco ASR 1001-X Router",
    "location": null,
    "role": "CORE",
    "instanceUuid": "1cfd383a-7265-47fb-96b3-f069191a0ed5",
    "instanceTenantId": "5dc444d31485c5004c0fb20b",
    "id": "1cfd383a-7265-47fb-96b3-f069191a0ed5"

  }
...
}

Muestra toda la información de un equipo de red obtenido de la plataforma DNA Center.

Un dato importante, es que si usas la referencia API de este GET, verás que hay un modelo de ejemplo:

No alt text provided for this image

Es exactamente igual a la respuesta recibida, por lo que no necesitas tener acceso a la plataforma real para saber como la información viene estructurada.

Leyendo info JSON

Como último paso de este post es poder manipular la información recibida en Python.

Cuando tienes que leer un Arreglo (Array)puedes verlo bajo su posición numérica en el arreglo bajo corchetes [] de la siguiente forma:

response.json()[‘response’][0]

response.json()[‘response’][1]

response.json()[‘response’][2]

response.json()[‘response’][3]

Dentro de cada Objeto, está la Data, asi que es solo preguntar por el valor que se quiere obtener. Tenemos valores de ejemplo como ‘serialNumber’, ‘platformId’ o ‘series’, según lo que me indica la referencia API.

No alt text provided for this image
response.json()['response'][0]['serialNumber']
response.json()['response'][1]['softwareType']
response.json()['response'][2]['softwareVersion']
response.json()['response'][3]['serialNumber']
response.json()['response'][3]['platformId']
response.json()['response'][3]['series']

No alt text provided for this image

Búsqueda ciclica en Python: FOR

Un detalle, ¿No sería engorroso preguntar por cada objeto dentro de una variable uno a uno? Pues si… y mucho.

Por suerte en Python nos da la herramienta en bucle llamado for para que consulte la info hasta que ya no haya información. Su formato sería:

for VAR_ITERABLE in VAR_LISTA:
   #Cosas que harías con la variable VAR_ITERABLE

VAR_ITERABLE tendrá el valor VAR_LISTA[0], VAR_LISTA[1], VAR_LISTA[2] y así sucesivamente hasta que ya no haya información.

En ese caso podemos consultar todos los seriales de los equipos con solo 2 líneas de código:

for i in response.json()['response']:
    print(i['serialNumber'])

No alt text provided for this image

Conclusiones

Con la comprensión de librerías como requests json, así como también saber interpretar la información desde Python, te permite tener control de la data y generar automatizaciones con ella.

Bueno ha terminado este artículo. Espero que les haya dado una guía para comprender un poco sobre JSON orientado a la certificación CCNA DEVNET.

¿Dudas, opinión o sugerencias? Déjame tus comentarios.

Si te interesa alguno de nuestros servicios o leer todos nuestros posts, puedes localizarlos por esta red social o en mi portal SYNCORP. Gracias por la lectura.

Referencias

Formato JSON:

https://www.json.org/json-en.html

https://www.w3schools.com/js/js_json.asp

Cisco

https://developer.cisco.com/learning/modules/dnav3-intro-dnac

Leave a Reply