# Pruebas de API de Smarthands Esta guía proporciona enfoques y ejemplos de pruebas específicas para la API Smarthands de Equinix, basándose en los principios generales de [Pruebas de API](https://docs.equinix.com/es/equinix-api/testing.md). ## Visión general de la API de Smarthands La API Smarthands le permite solicitar y gestionar de forma programática diversos servicios de manos remotas en los centros de datos Equinix IBX.\NAquí tiene la correspondencia de la API ECP con los tipos de smarthands admitidos: | Smarthands Type | Description | ECP API Mapping | | ---------------------------- | --------------------------------------------- | ---------------------------------------------------------------- | | Request photos/documentation | Request cage-related photos or documentation | | | SmartHand Other | Request a Smart Hands order not listed above | | | SmartHand Cage Clean up | Request a cage clean up | | | SmartHand Shipment Unpack | Unpack inbound shipment and dispose packaging | | | SmartHand Cage Escort | Request IBX security escort | | | Equipment Install | Request equipment installation | | | Request Cables | Request cables | | | Locate Packages | Request package location | | | Run Patch Cables | Request cables run between devices | | | Patch Cable Install | Request patch cable installation | | | Move Patch Cable | Move patch cables between devices | | | Patch Cable Removal | Remove patch cables | | | Large SmartHands Order | Large cable/equipment requests | | ## Flujo de trabajo de pruebas de Smarthands Antes de probar la API de Smarthands, asegúrese de que dispone de: * Credenciales API válidas con los permisos adecuados * Acceso a las ubicaciones IBX de Equinix donde tiene equipos * Familiaridad con el flujo de trabajo de los tickets de servicio **Creación de una solicitud de servicio Smarthands** ``` import requests import json # Setup authentication auth_url = "https://api.equinix.com/oauth2/v1/token" auth_payload = { "grant_type": "client_credentials", "client_id": "YOUR_CLIENT_ID", "client_secret": "YOUR_CLIENT_SECRET" } auth_response = requests.post(auth_url, data=auth_payload) token = auth_response.json()["access_token"] # Test creating a Smarthands request base_url = "https://api.equinix.com/v1" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json" } # Example: Create a cage escort request request_payload = { "customerReferenceNumber": "RSS41244", "purchaseOrder": { "number": "123455", "purchaseOrderType": "EXISTING" }, "ibxLocation": { "ibx": "AM1", "cages": [ { "cage": "AM1:01:001MC3", "accountNumber": "12345", "cabinets": [ "AM1:01:001MC3:0102" ] } ] }, "contacts": [ { "contactType": "ORDERING", "userName": "jondoe@test.com" }, { "contactType": "NOTIFICATION", "userName": "jondoe@test.com" }, { "contactType": "TECHNICAL", "name": "John Doe", "workPhone": "1111111", "workPhonePrefToCall": "ANYTIME", "mobilePhone": "1111111", "mobilePhonePrefToCall": "ANYTIME" } ], "schedule": { "scheduleType": "STANDARD", "requestedStartDate": "2017-04-05T12:00:00Z", "requestedCompletionDate": "2017-04-05T12:00:00Z" }, "attachments": [ { "id": "eb9ab7e9-3785-41e4-af24-112dff", "name": "eb9ab7e9-3785-41e4-af24-asfsa5424" } ], "serviceDetails": { "durationVisit": "30 Minutes", "openCabinetForVisitor": false, "scopeOfWork": "Scope of work", "supervisionReqForVisitor": false, "workVisitOrderNumber": "1-108050984499" } } create_response = requests.post( f"{base_url}/orders/smarthands/cageEscort", headers=headers, data=json.dumps(request_payload) ) # Verify response assert create_response.status_code == 201, f"Failed to create request: {create_response.text}" order_number = create_response.json()["OrderNumber"] print(f"Successfully created Smarthands request with order number: {order_number}") ``` **Comprobar el estado de la solicitud** ``` # Test retrieving request status status_response = requests.get( f"https://api.equinix.com/colocations/v2/orders/{order_number}", headers=headers ) assert status_response.status_code == 200, f"Failed to retrieve status: {status_response.text}" status = status_response.json()["status"] print(f"Current request status: {status}") ``` ## Pruebas de escenarios de error Pruebe siempre la gestión de errores de su implementación de API: ``` # Test with invalid location invalid_payload = { "customerReferenceNumber": "RSS41244", "purchaseOrder": { "number": "123455", "purchaseOrderType": "EXISTING" }, "ibxLocation": { "ibx": "INVALID", # Invalid IBX code "cages": [ { "cage": "INVALID:01:001MC3", "accountNumber": "12345", "cabinets": [ "INVALID:01:001MC3:0102" ] } ] }, "contacts": [ { "contactType": "ORDERING", "userName": "jondoe@test.com" } ], "schedule": { "scheduleType": "STANDARD", "requestedStartDate": "2025-08-01T10:00:00Z", "requestedCompletionDate": "2025-08-01T12:00:00Z" }, "serviceDetails": { "durationVisit": "30 Minutes", "openCabinetForVisitor": false, "scopeOfWork": "Test invalid IBX location", "supervisionReqForVisitor": false } } error_response = requests.post( f"{base_url}/orders/smarthands/cageEscort", headers=headers, data=json.dumps(invalid_payload) ) # Verify error response assert error_response.status_code == 400, f"Expected error but got: {error_response.status_code}" assert "Invalid IBX location" in error_response.text, "Error message not as expected" ``` ## Mejores prácticas para las pruebas de API de Smarthands **Nota importante**: La API de Equinix es un sistema de producción que crea solicitudes de envío reales. Siga siempre estas prácticas recomendadas de prueba para asegurarse de no crear trabajo operativo no intencionado. 1. **Establezca una cuenta dedicada a las pruebas**: Si es posible, solicite una cuenta independiente para pruebas 2. **Comience con operaciones de sólo lectura**: Pruebe primero los puntos finales GET antes de crear/modificar recursos 3. **Utilice solicitudes de prueba claramente marcadas**: Anteponga siempre a las descripciones el prefijo "TEST:" para ayudar a los operadores a identificar las solicitudes de prueba 4. **Limpie los recursos de prueba**: Cancele cualquier envío de prueba inmediatamente después de crearlo con éxito 5. **Incluya detalles completos**: Proporcione información completa en sus solicitudes 6. **Números de seguimiento**: Proporcione siempre números de seguimiento precisos para los envíos entrantes con el fin de garantizar una manipulación adecuada 7. **Información de contacto**: Asegúrese de que la información de contacto está actualizada y de que la persona está disponible durante la ventana de servicio programada 8. **Detalles de la descripción**: Sea detallado pero conciso al describir los requisitos para ayudar al personal de las instalaciones a completar su solicitud de forma eficiente ## Consideraciones sobre automatización Al construir la automatización en torno a la API de Smarthands: * Implemente una gestión de errores y reintentos adecuada * Considere la posibilidad de implementar receptores webhook para las actualizaciones de estado * Incorpore la validación de ventanas de tiempo y disponibilidad del servicio * Incluya un registro de auditoría de todas las interacciones de la API * Asegúrese de que la información de seguimiento se incluye automáticamente para todas las solicitudes relacionadas con envíos * Validar la disponibilidad de los contactos durante las ventanas de servicio programadas ## Recursos adicionales * [Smart Hands Product Documentation](https://docs.equinix.com/es/smart-hands.md) * [Smart Hands API Guides](https://docs.equinix.com/es/smart-hands/smart-hands-api/order-cage-escort.md) * [Equinix API Authentication](https://docs.equinix.com/es/equinix-api/api-authentication.md)