{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Post-Deployment Connectivity Testing","siteUrl":"https://docs.hiddenlayer.ai","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"post-deployment-connectivity-testing","__idx":0},"children":["Post-Deployment Connectivity Testing"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide describes how to validate connectivity and functional operation of a HiddenLayer Runtime deployment after it has been successfully deployed to a Kubernetes cluster."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["At this stage:"]}]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The Kubernetes cluster is provisioned."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The Runtime Kubernetes resources have been applied."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pods are running successfully."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The service has been created, typically as an internal LoadBalancer."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The purpose of this guide is to confirm:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The Runtime service is reachable"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The Kubernetes service routing is functioning"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The API endpoint is responding correctly"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Interaction payloads can be submitted successfully"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This validation ensures the infrastructure and runtime configuration are working before integrating upstream LLMs or application traffic."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"1-confirm-deployment-health","__idx":1},"children":["1. Confirm Deployment Health"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Verify the pod is running:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"kubectl -n {namespace} get pods\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Expected output:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"NAME                READY   STATUS    RESTARTS   AGE\naidr-genai-xxxxxx   1/1     Running   0          ...\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the pod is not Running, investigate before continuing:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"kubectl describe pod <pod-name> -n {namespace}\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Check the ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Events"]}," section for common issues:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImagePullBackOff"]}," — registry secret or image path issue"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["CrashLoopBackOff"]}," — container is starting and crashing; check logs with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["kubectl -n {namespace} logs <pod-name>"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Pending"]}," — insufficient cluster resources or node selector mismatch"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"2-access-the-service","__idx":2},"children":["2. Access the Service"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If the Service is configured as an internal LoadBalancer, direct access may not be available from your workstation."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The recommended validation method is port forwarding."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Start port forwarding:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"kubectl -n {namespace} port-forward svc/aidr-genai 8080:80\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["You should see:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"Forwarding from 127.0.0.1:8080 -> 80\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Leave this terminal running. This forwards:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Local port 8080"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["To Service port 80"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Which maps to container port 8000"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"3-validate-basic-api-connectivity","__idx":3},"children":["3. Validate Basic API Connectivity"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["From a separate terminal, confirm the route exists:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"curl -i http://localhost:8080/detection/v1/interactions\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Expected response:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"HTTP/1.1 405 Method Not Allowed\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This confirms the endpoint requires POST."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"4-submit-a-minimal-interaction-request","__idx":4},"children":["4. Submit a Minimal Interaction Request"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Send a valid interaction payload to confirm end-to-end functionality:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"curl -i -X POST http://localhost:8080/detection/v1/interactions \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"metadata\": {\n      \"model\": \"test-model\",\n      \"requester_id\": \"user-1\",\n      \"provider\": \"openai\"\n    },\n    \"input\": {\n      \"messages\": [\n        {\n          \"role\": \"user\",\n          \"content\": \"Hello\"\n        }\n      ]\n    },\n    \"output\": {\n      \"messages\": [\n        {\n          \"role\": \"assistant\",\n          \"content\": \"Hello! How can I help you?\"\n        }\n      ]\n    }\n  }'\n"},"children":[]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Important Note"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is a sample interaction submitted directly to Runtime for validation purposes."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["This test does not require a live connection to an upstream LLM."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Because both ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["input"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["output"]}," are provided in the request, Runtime evaluates the interaction payload without needing to proxy a model call."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The response confirms API connectivity, schema validation, and detection processing."]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Expected result:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["HTTP 200 OK"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["JSON response containing detection results"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If required fields are missing, you may receive:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"HTTP/1.1 422 Unprocessable Content\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A 422 response still confirms:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Connectivity is functioning"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Schema validation is active"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The API is responding correctly"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In addition to the API response, Runtime will emit structured logs inside the container. You can view them with:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"kubectl -n {namespace} logs deploy/aidr-genai\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For details on the log output format, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/products/runtime/container_logging"},"children":["Container Logging"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"5-confirm-application-logs","__idx":5},"children":["5. Confirm Application Logs"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To validate that the application server is running:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"kubectl -n {namespace} logs deploy/aidr-genai\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Look for:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"Application startup complete.\nUvicorn running on http://0.0.0.0:8000\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This confirms the API server is active inside the pod."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"6-optional-test-via-internal-loadbalancer","__idx":6},"children":["6. Optional: Test via Internal LoadBalancer"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you are on corporate VPN or have direct access to the cluster network:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"kubectl -n {namespace} get svc aidr-genai\n"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Then:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"header":{"controls":{"copy":{}}},"source":"curl http://<INTERNAL-IP>\n"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"common-troubleshooting-reference","__idx":7},"children":["Common Troubleshooting Reference"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Symptom"},"children":["Symptom"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Likely Cause"},"children":["Likely Cause"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImagePullBackOff"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Registry secret or image path issue"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["InvalidImageName"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Image string formatting issue"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["422 response"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Missing required JSON fields"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Connection refused"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Port-forward not running"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["404 Not Found"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Incorrect endpoint path"]}]}]}]}]}]},"headings":[{"value":"Post-Deployment Connectivity Testing","id":"post-deployment-connectivity-testing","depth":1},{"value":"1. Confirm Deployment Health","id":"1-confirm-deployment-health","depth":2},{"value":"2. Access the Service","id":"2-access-the-service","depth":2},{"value":"3. Validate Basic API Connectivity","id":"3-validate-basic-api-connectivity","depth":2},{"value":"4. Submit a Minimal Interaction Request","id":"4-submit-a-minimal-interaction-request","depth":2},{"value":"5. Confirm Application Logs","id":"5-confirm-application-logs","depth":2},{"value":"6. Optional: Test via Internal LoadBalancer","id":"6-optional-test-via-internal-loadbalancer","depth":2},{"value":"Common Troubleshooting Reference","id":"common-troubleshooting-reference","depth":2}],"frontmatter":{"seo":{"title":"Post-Deployment Connectivity Testing"}},"lastModified":"2026-03-11T17:41:36.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/resources/tutorials/post_deployment_connectivity_testing","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}