EN ESTA PÁGINA
Ejemplos: Pruebas
En esta sección se supone que los agentes de prueba (tantos como sean necesarios para las pruebas) se han creado de acuerdo con Creación e implementación de un nuevo agente de prueba.
Descripción general de la orquestación de pruebas
Antes de poder crear y ejecutar una prueba a través de la API de REST, debe tener una plantilla en la que basar la prueba definida en el Centro de control, como se explica en el capítulo Plantillas de prueba y monitoreo. A todos los parámetros especificados en esa plantilla como "Entrada de plantilla" se les deben asignar valores cuando se crea una prueba a partir de ella en la API de REST.
Creación y ejecución de una prueba
La plantilla que usaremos para nuestra prueba en este ejemplo es una plantilla de prueba HTTP.
Para inspeccionar esa plantilla a través de la API de REST, recuperamos una lista de todas las plantillas de prueba de la cuenta:
# Request settings
# NOTE: User is able to pass additional parameters as a query string ?limit=100&offset=111:
# limit: Changes number of elements returned from API
# offset: Changes element from which results will be returned
url = '%s/accounts/%s/test_templates/%s' % (args.ncc_url, args.account, args.query_params)
# Get list of test templates
response = requests.get(url=url, headers={'API-Token': args.token})
Si nuestra plantilla HTTP es la única plantilla de prueba definida, la respuesta se verá así:
{
"count": 1,
"items": [
{
"inputs": {
"clients": {
"input_type": "interface_list"
},
"url": {
"input_type": "string"
}
},
"description": "This is a template for HTTP tests",
"name": "HTTP_test",
"id": 1
}
],
"next": null,
"limit": 10,
"offset": 0,
"previous": null
}
La prueba HTTP en esta plantilla tiene dos requisitos que inputs deben definirse en tiempo de ejecución: clients (lista de interfaces del agente de prueba que desempeñan el papel de clientes) y url (la URL para obtener usando HTTP). Los nombres de los parámetros son los definidos como Nombre de variable en el Centro de control. Aquí, son simplemente versiones en minúsculas de los nombres para mostrar del Centro de control ("clientes" vs. "Clientes", etc.).
Si hay varias plantillas y desea inspeccionar una sola plantilla con un ID conocido, puede hacerlo de la siguiente manera:
# Request settings
url = '%s/accounts/%s/test_templates/%s/' % (args.ncc_url, args.account, args.monitor_id)
# Get test template
response = requests.get(url=url, headers={'API-Token': args.token})
Ahora creamos y ejecutamos la prueba HTTP usando la operación POST para las pruebas.
A continuación se muestra el código que proporciona la configuración de parámetros necesarios para una prueba basada en la plantilla de prueba HTTP. Dependiendo de la estructura de la plantilla, los detalles aquí variarán, por supuesto. Otro ejemplo con una plantilla de prueba un poco más compleja se encuentra en la sección Ejemplo con una plantilla de prueba diferente.
# Request settings
url = '%s/accounts/%s/tests/' % (args.ncc_url, args.account)
# Parameter settings for test
json_data = json.dumps({
"name": "REST API initiated HTTP test",
"description": "This is an HTTP test initiated from the REST API",
"input_values": {
"clients": {
"input_type": "interface_list",
"value": [{
"test_agent_id": 1,
"interface": "eth0",
"ip_version": 4
}]
},
"url": {
"input_type": "string",
"value": "example.com"
},
"status": "scheduled",
"template_id": 1
})
# Create and start test
response = requests.post(url=url, data=json_data, headers={
'API-Token': TOKEN,
'Accept': 'application/json; indent=4',
'Content-Type': 'application/json',
})
La ejecución de la prueba se muestra en el Centro de control:
El centro de control también responderá al comando de la API de REST con el ID de la prueba. En este ejemplo, el ID de prueba es 47:
Status code: 201
{
"template_id": 1,
"description": "",
"name": "HTTP_test",
"id": 47
}
El ID de la prueba también se puede encontrar en la URL de la prueba en la GUI web del Centro de control. En este ejemplo, esa URL es https://<host IP>/<account>/testing/47/.
Ejemplo con una plantilla de prueba diferente
Aquí hay otro ejemplo de una plantilla de prueba: una para UDP, tomando como entrada un servidor, una lista de clientes y un número de puerto UDP. En la GUI de Routing Active Testing, esta plantilla UDP tiene el siguiente aspecto:
Para proporcionar los insumos a esta plantilla, podemos usar el siguiente código. Aquí, hemos anulado el valor predeterminado de port. Si se mantiene el valor predeterminado (5000), la port sección se puede omitir de input_values.
# Request settings
url = '%s/accounts/%s/tests/' % (args.ncc_url, args.account)
# Parameter settings for test
json_data = json.dumps({
"name": "REST API initiated UDP test",
"description": "This is a UDP test initiated from the REST API",
"input_values": {
"clients": {
"input_type": "interface_list",
"value": [{
"test_agent_id": 1,
"interface": "eth0",
"ip_version": 4
}]
},
"server": {
"input_type": "interface",
"value": {
"test_agent_id": 2,
"interface": "eth0",
"ip_version": 4
}
},
"port": {
"input_type": "integer",
"value": "5050"
}
},
"status": "scheduled",
"template_id": 2
})
# Create and start test
response = requests.post(url=url, data=json_data, headers={
'API-Token': TOKEN,
'Accept': 'application/json; indent=4',
'Content-Type': 'application/json',
})
print 'Status code: %s' % response.status_code
print json.dumps(response.json(), indent=4)
Recuperación de los resultados de las pruebas
Para recuperar los resultados de una prueba, apunte al ID de prueba. Esto también obtiene la configuración completa de la prueba.
Los resultados básicos de la prueba consisten en un resultado aprobado / reprobado para cada paso de la prueba y para la prueba en su conjunto.
De forma predeterminada, para las pruebas en las que esto es relevante, los resultados de la prueba también incluyen métricas promediadas tomadas durante toda la duración de la prueba. Las métricas promedio se encuentran en tasks > streams > metrics_avg. Puede desactivar estas métricas promedio estableciendo with_metrics_avg en false en la cadena de consulta.
Opcionalmente, esta operación puede devolver métricas de datos detalladas (segundo a segundo) para cada tarea realizada por la prueba (nuevamente, para las pruebas que producen dichos datos). Esta característica se activa estableciendo with_detailed_metrics en true. De forma predeterminada, esta marca se establece en false. Las métricas de datos detalladas se encuentran en tasks > streams > metrics.
Hay otra configuración with_other_results que, si se establece en true, hace que se devuelvan resultados de pruebas adicionales para el tipo de tarea Path trace (rutas y eventos de reenrutamiento).
Ejemplo 1: Prueba TWAMP
Una prueba TWAMP es un ejemplo de una prueba que produce métricas continuamente.
A continuación se muestra el código Python para obtener los resultados de una prueba TWAMP:
# Request settings
url = '%s/accounts/%s/tests/%s/' % (args.ncc_url, args.account, args.test_id)
# Get test
response = requests.get(url=url, headers={'API-Token': args.token})
El resultado tendrá un aspecto similar al siguiente:
{
"description": "",
"end_time": "2017-09-03T20:05:04.000000Z",
"gui_url": "https://<Control Center host and port>/demo/testing/48/",
"name": "TWAMP_test",
"report_url": "https://<Control Center host and port>/demo/testing/48/report_builder/",
"start_time": "2017-09-03T20:04:27.000000Z",
"status": "passed",
"steps": [
{
"description": "",
"end_time": "2017-09-03T20:05:03.000000Z",
"id": 48,
"name": "Test from template",
"start_time": "2017-09-03T20:04:27.000000Z",
"status": "passed",
"status_message": "",
"tasks": [
{
"name": "",
"streams": [
{
"gui_url": "https://10.0.157.46/dev/results/72/rrd_graph/?start=1526898065&end=1526898965",
"id": 72,
"is_owner": true,
"metrics": [
[
"2017-09-03T20:04:27",
"2017-09-03T20:04:27",
4.4356,
1.7191,
9.9563,
23.5623,
21.8432,
391,
21.09,
93,
66,
null,
null,
null,
null,
48.07,
212,
189,
null,
null,
null,
null,
100,
100,
null,
null,
0,
null,
null
],
[
"2017-09-03T20:04:27",
"2017-09-03T20:04:28",
<metrics omitted>
],
<remaining metrics omitted>
],
"metrics_avg": {
"davg": 10.167887,
"davg_far": null,
"davg_near": null,
"dmax": 24.934801,
"dmax_far": null,
"dmax_near": null,
"dmin": 1.143761,
"dmin_far": null,
"dmin_near": null,
"dv": 23.791039,
"dv_far": null,
"dv_near": null,
"end_time": "2018-05-21T02:01:40",
"es": 1,
"es_delay": null,
"es_dscp": 0,
"es_dv": null,
"es_loss": 1,
"es_ses": null,
"loss_far": 18.584512,
"loss_near": 51.791573,
"lost_far": 81.910714,
"lost_near": 228.285714,
"miso_far": 60.5,
"miso_near": 206.267857,
"rate": 4.507413,
"recv": 397.339286,
"sla": 0,
"sla_status": "unknown",
"start_time": "2018-05-21T02:00:40",
"uas": null
},
"metrics_headers": [
"start_time",
"end_time",
"rate",
"dmin",
"davg",
"dmax",
"dv",
"recv",
"loss_far",
"lost_far",
"miso_far",
"dmin_far",
"davg_far",
"dmax_far",
"dv_far",
"loss_near",
"lost_near",
"miso_near",
"dmin_near",
"davg_near",
"dmax_near",
"dv_near",
"es",
"es_loss",
"es_delay",
"es_dv",
"es_dscp",
"es_ses",
"uas"
],
"metrics_headers_display": [
"Start time",
"End time",
"Rate (Mbit/s)",
"Min round-trip delay (ms)",
"Average round-trip delay (ms)",
"Max round-trip delay (ms)",
"Average round-trip DV (ms)",
"Received packets",
"Far-end loss (%)",
"Far-end lost packets",
"Far-end misorders",
"Min far-end delay (ms)",
"Average far-end delay (ms)",
"Max far-end delay (ms)",
"Far-end DV (ms)",
"Near-end loss (%)",
"Near-end lost packets",
"Near-end misorders",
"Min near-end delay (ms)",
"Average near-end delay (ms)",
"Max near-end delay (ms)",
"Near-end DV (ms)",
"ES (%)",
"ES loss (%)",
"ES delay (%)",
"ES DV (%)",
"ES DSCP (%)",
"SES (%)",
"Unavailable seconds (%)"
],
"reflector": 18,
"sender": {
"ip_version": 4,
"name": "eth1",
"preferred_ip": null,
"test_agent": 1,
"test_agent_name": "VTA1"
}
}
],
"task_type": "twamp",
}
]
}
]
}
Ejemplo 2: Prueba de reasignación de DSCP
Una prueba de reasignación DSCP es aquella que no produce métricas continuas, sino un único conjunto de resultados al final. No puede ejecutarse simultáneamente con nada más. El formato de la salida de esta prueba se indica a continuación. (El código de Python para recuperar los resultados de la prueba es el mismo, excepto por el ID de la prueba).
{
"description": "",
"end_time": "2019-01-04T07:19:53.000000Z",
"gui_url": "https://10.0.157.46/dev/testing/154/",
"id": 154,
"name": "DSCP",
"report_url": "https://10.0.157.46/dev/testing/154/report_builder/",
"start_time": "2019-01-04T07:19:49.000000Z",
"status": "passed",
"steps": [
{
"description": "",
"end_time": "2019-01-04T07:19:52.000000Z",
"id": 154,
"name": "Step 1",
"start_time": "2019-01-04T07:19:49.000000Z",
"status": "passed",
"status_message": "",
"step_type": "exclusive_task_container",
"tasks": [
{
"end_time": "2019-01-04T07:19:52",
"log": [
{
"level": "debug",
"message": "Starting script",
"time": "2019-01-04T07:19:49"
},
{
"level": "debug",
"message": "Sending from VTA1:eth1 (IPv4) to VTA2:eth1 (IPv4)",
"time": "2019-01-04T07:19:49"
},
{
"level": "debug",
"message": "Sending packets",
"time": "2019-01-04T07:19:50"
},
{
"level": "info",
"message": "Passed: ",
"time": "2019-01-04T07:19:52"
}
],
"name": "Step 1",
"results": {
"create": [
{
"id": 269,
"type": "Table"
}
],
"update": {
"269": {
"columns": [
{
"name": "Sent DSCP",
"type": "string"
},
{
"name": "Received DSCP",
"type": "string"
},
{
"name": "Test result",
"type": "string"
}
],
"rows": [
[
"cs0 (0)",
"cs0 (0)",
"Passed"
],
[
"cs1 (8)",
"cs1 (8)",
"Passed"
],
[
"af11 (10)",
"af11 (10)",
"Passed"
],
<... (DSCPs omitted)>
[
"cs7 (56)",
"cs7 (56)",
"Passed"
]
],
"title": "DSCP remapping results"
}
}
},
"start_time": "2019-01-04T07:19:49",
"status": "passed",
"status_message": "",
"task_type": "dscp_remapping"
}
]
}
]
}
Generación de un informe en PDF sobre una prueba
Puede generar un informe en PDF sobre una prueba directamente desde la API de REST. El informe tiene el mismo formato que el generado desde la GUI del Centro de control.
De forma predeterminada, el informe cubre los últimos 15 minutos de la prueba. Puede especificar un intervalo de tiempo diferente si incluye los start parámetros y end en una cadena de consulta al final de la dirección URL. La hora se indica en UTC (ISO 8601) como se especifica en GTI-I RFC 3339.
Además, se pueden incluir las siguientes opciones en la cadena de consulta:
worst_num: Para cada tarea de una prueba, puede especificar cuántos resultados de medición mostrar, clasificados por el número de segundos con errores con el peor en la parte superior. El alcance de un resultado de medición depende de la tarea; por poner un ejemplo, para HTTP es el resultado obtenido para un cliente. El número predeterminado es 30.graphs: Incluya gráficos en el informe.
Ejemplo:
# Include graphs
graphs = 'true'
# Request settings
url = '%s/accounts/%s/tests/%s/pdf_report?graphs=%s' % (args.ncc_url, args.account, args.test_id, graphs)
# Get test
response = requests.get(url=url, headers={'API-Token': args.token})
print 'Status code: %s' % response.status_code
print json.dumps(response.json(), indent=4)