From 48066e3d410ce815c6d5361c97372648560b9dda Mon Sep 17 00:00:00 2001 From: tejal29 Date: Wed, 24 Jun 2020 11:28:03 -0700 Subject: [PATCH] Refactor diag.Resource and deploy.Resource.Status to contain actionable error proto proto.ActionableErr In this PR, 1. For suggesting actionable errors for k8 infra errors, it would make sense to do it in the diag package. 2. Hence adding ActionableErr to diag.Resource package and propogating to depoyment status in skaffold.deploy.Resource.Status --- docs/content/en/api/skaffold.swagger.json | 72 ++-- docs/content/en/docs/references/api/grpc.md | 2 + pkg/diag/validator/pod.go | 47 +-- pkg/diag/validator/pod_test.go | 75 ++-- pkg/diag/validator/resource.go | 28 +- pkg/diag/validator/resource_test.go | 6 +- pkg/skaffold/deploy/resource/deployment.go | 82 +++-- .../deploy/resource/deployment_test.go | 78 ++-- pkg/skaffold/deploy/resource/status.go | 32 +- pkg/skaffold/deploy/resource/status_test.go | 47 +-- pkg/skaffold/deploy/status_check.go | 19 +- pkg/skaffold/deploy/status_check_test.go | 44 +-- pkg/skaffold/event/event.go | 33 +- pkg/skaffold/event/event_test.go | 10 +- proto/skaffold.pb.go | 338 +++++++++--------- proto/skaffold.proto | 8 + 16 files changed, 502 insertions(+), 419 deletions(-) diff --git a/docs/content/en/api/skaffold.swagger.json b/docs/content/en/api/skaffold.swagger.json index c6e5b8fad8e..218a77b210f 100644 --- a/docs/content/en/api/skaffold.swagger.json +++ b/docs/content/en/api/skaffold.swagger.json @@ -151,7 +151,7 @@ }, { "name": "event.buildEvent.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -192,13 +192,15 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, { "name": "event.buildEvent.actionableErr.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -239,7 +241,9 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, @@ -263,7 +267,7 @@ }, { "name": "event.deployEvent.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -304,13 +308,15 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, { "name": "event.deployEvent.actionableErr.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -351,7 +357,9 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, @@ -437,7 +445,7 @@ }, { "name": "event.statusCheckEvent.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -478,13 +486,15 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, { "name": "event.statusCheckEvent.actionableErr.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -525,7 +535,9 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, @@ -561,7 +573,7 @@ }, { "name": "event.resourceStatusCheckEvent.statusCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -602,13 +614,15 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, { "name": "event.resourceStatusCheckEvent.actionableErr.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -649,7 +663,9 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, @@ -686,7 +702,7 @@ }, { "name": "event.fileSyncEvent.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -727,13 +743,15 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, { "name": "event.fileSyncEvent.actionableErr.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -774,7 +792,9 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, @@ -841,7 +861,7 @@ }, { "name": "event.devLoopEvent.err.errCode", - "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.", + "description": " - OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded", "in": "query", "required": false, "type": "string", @@ -882,7 +902,9 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK" }, @@ -1573,10 +1595,12 @@ "DEVINIT_REGISTER_BUILD_DEPS", "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", - "DEVINIT_REGISTER_CONFIG_DEP" + "DEVINIT_REGISTER_CONFIG_DEP", + "STATUSCHECK_CONTEXT_CANCELLED", + "STATUSCHECK_DEADLINE_EXCEEDED" ], "default": "OK", - "description": "Enum for Status codes\nThese error codes are prepended by Phase Name e.g.\nBUILD, DEPLOY, STATUSCHECK, DEVINIT\n- OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file." + "description": "Enum for Status codes\nThese error codes are prepended by Phase Name e.g.\nBUILD, DEPLOY, STATUSCHECK, DEVINIT\n- OK: A default status code for events that do not have an associated phase.\nTypically seen with the DevEndEvent event on success.\n - STATUSCHECK_SUCCESS: Status Check Success\n - BUILD_SUCCESS: Build Success\n - BUILD_PUSH_ACCESS_DENIED: Build error due to push access denied\n - BUILD_PROJECT_NOT_FOUND: Build error due to GCP project not found.\n - STATUSCHECK_IMAGE_PULL_ERR: Container image pull error\n - STATUSCHECK_CONTAINER_CREATING: Container creating error\n - STATUSCHECK_RUN_CONTAINER_ERR: Container run error\n - STATUSCHECK_CONTAINER_TERMINATED: Container is already terminated\n - STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING: Deployment waiting for rollout\n - STATUSCHECK_CONTAINER_RESTARTING: Container restarting error\n - STATUSCHECK_NODE_MEMORY_PRESSURE: Node memory pressure error\n - STATUSCHECK_NODE_DISK_PRESSURE: Node disk pressure error\n - STATUSCHECK_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - STATUSCHECK_NODE_PID_PRESSURE: Node PID pressure error\n - STATUSCHECK_NODE_UNSCHEDULABLE: Node unschedulable error\n - STATUSCHECK_NODE_UNREACHABLE: Node unreachable error\n - STATUSCHECK_NODE_NOT_READY: Node not ready error\n - STATUSCHECK_FAILED_SCHEDULING: Scheduler failure error\n - STATUSCHECK_UNHEALTHY: Readiness probe failed\n - STATUSCHECK_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - UNKNOWN_ERROR: Could not determine error and phase\n - STATUSCHECK_UNKNOWN: Status Check error unknown\n - STATUSCHECK_UNKNOWN_UNSCHEDULABLE: Container is unschedulable due to unknown reasons\n - STATUSCHECK_CONTAINER_WAITING_UNKNOWN: Container is waiting due to unknown reason\n - STATUSCHECK_UNKNOWN_EVENT: Container event reason unknown\n - DEPLOY_UNKNOWN: Deploy failed due to unknown reason\n - SYNC_UNKNOWN: SYNC failed due to known reason\n - BUILD_UNKNOWN: Build failed due to unknown reason\n - DEVINIT_UNKNOWN: Dev Init failed due to unknown reason\n - CLEANUP_UNKNOWN: Cleanup failed due to unknown reason\n - SYNC_INIT_ERROR: File Sync Initialize failure\n - DEVINIT_REGISTER_BUILD_DEPS: Failed to configure watcher for build dependencies in dev loop\n - DEVINIT_REGISTER_TEST_DEPS: Failed to configure watcher for test dependencies in dev loop\n - DEVINIT_REGISTER_DEPLOY_DEPS: Failed to configure watcher for deploy dependencies in dev loop\n - DEVINIT_REGISTER_CONFIG_DEP: Failed to configure watcher for Skaffold configuration file.\n - STATUSCHECK_CONTEXT_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded" }, "protoSuggestion": { "type": "object", diff --git a/docs/content/en/docs/references/api/grpc.md b/docs/content/en/docs/references/api/grpc.md index 0ff1eee0693..2b49717ce13 100644 --- a/docs/content/en/docs/references/api/grpc.md +++ b/docs/content/en/docs/references/api/grpc.md @@ -783,6 +783,8 @@ BUILD, DEPLOY, STATUSCHECK, DEVINIT | DEVINIT_REGISTER_TEST_DEPS | 702 | Failed to configure watcher for test dependencies in dev loop | | DEVINIT_REGISTER_DEPLOY_DEPS | 703 | Failed to configure watcher for deploy dependencies in dev loop | | DEVINIT_REGISTER_CONFIG_DEP | 704 | Failed to configure watcher for Skaffold configuration file. | +| STATUSCHECK_CONTEXT_CANCELLED | 800 | User cancelled the skaffold dev run | +| STATUSCHECK_DEADLINE_EXCEEDED | 801 | Deadline for status check exceeded | diff --git a/pkg/diag/validator/pod.go b/pkg/diag/validator/pod.go index 3ab4930ed9d..5b6b91ea19f 100644 --- a/pkg/diag/validator/pod.go +++ b/pkg/diag/validator/pod.go @@ -85,7 +85,7 @@ func (p *PodValidator) Validate(ctx context.Context, ns string, opts metav1.List if po.Kind == "" { po.Kind = podKind } - rs = append(rs, NewResourceFromObject(&po, Status(ps.phase), ps.err, ps.statusCode, ps.logs)) + rs = append(rs, NewResourceFromObject(&po, Status(ps.phase), ps.ae, ps.logs)) } return rs, nil } @@ -209,34 +209,35 @@ func processPodEvents(e corev1.EventInterface, pod v1.Pod, ps *podStatus) { } switch recentEvent.Reason { case failedScheduling: - ps.statusCode = proto.StatusCode_STATUSCHECK_FAILED_SCHEDULING - ps.err = fmt.Errorf(recentEvent.Message) + ps.ae.ErrCode = proto.StatusCode_STATUSCHECK_FAILED_SCHEDULING + ps.ae.Message = recentEvent.Message case unhealthy: - ps.statusCode = proto.StatusCode_STATUSCHECK_UNHEALTHY - ps.err = fmt.Errorf(recentEvent.Message) + ps.ae.ErrCode = proto.StatusCode_STATUSCHECK_UNHEALTHY + ps.ae.Message = recentEvent.Message default: // TODO: Add unique error codes for reasons - ps.statusCode = proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT - ps.err = fmt.Errorf("%s: %s", recentEvent.Reason, recentEvent.Message) + ps.ae.ErrCode = proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT + ps.ae.Message = fmt.Sprintf("%s: %s", recentEvent.Reason, recentEvent.Message) } } type podStatus struct { - name string - namespace string - phase string - logs []string - err error - statusCode proto.StatusCode + name string + namespace string + phase string + logs []string + ae *proto.ActionableErr } func (p *podStatus) isStable() bool { - return p.phase == success || (p.phase == running && p.err == nil) + return p.phase == success || (p.phase == running && p.ae.Message == "") } func (p *podStatus) withErrAndLogs(errCode proto.StatusCode, l []string, err error) *podStatus { - p.err = err - p.statusCode = errCode + if err != nil { + p.ae.Message = err.Error() + } + p.ae.ErrCode = errCode p.logs = l return p } @@ -246,8 +247,8 @@ func (p *podStatus) String() string { case p.isStable(): return "" default: - if p.err != nil { - return fmt.Sprintf("%s", p.err) + if p.ae.Message != "" { + return p.ae.Message } } return fmt.Sprintf(actionableMessage, p.namespace, p.name) @@ -275,10 +276,12 @@ func extractErrorMessageFromWaitingContainerStatus(po *v1.Pod, c v1.ContainerSta func newPodStatus(n string, ns string, p string) *podStatus { return &podStatus{ - name: n, - namespace: ns, - phase: p, - statusCode: proto.StatusCode_STATUSCHECK_SUCCESS, + name: n, + namespace: ns, + phase: p, + ae: &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS, + }, } } diff --git a/pkg/diag/validator/pod_test.go b/pkg/diag/validator/pod_test.go index ffd27bb0b36..8f36fd06fc6 100644 --- a/pkg/diag/validator/pod_test.go +++ b/pkg/diag/validator/pod_test.go @@ -84,8 +84,10 @@ func TestRun(t *testing.T) { }, }}, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("container foo-container is waiting to start: foo-image can't be pulled"), - proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR, nil)}, + &proto.ActionableErr{ + Message: "container foo-container is waiting to start: foo-image can't be pulled", + ErrCode: proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR, + }, nil)}, }, { description: "pod is Waiting condition due to ErrImageBackOffPullErr", @@ -113,8 +115,10 @@ func TestRun(t *testing.T) { }, }}, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("container foo-container is waiting to start: foo-image can't be pulled"), - proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR, nil)}, + &proto.ActionableErr{ + Message: "container foo-container is waiting to start: foo-image can't be pulled", + ErrCode: proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR, + }, nil)}, }, { description: "pod is Waiting due to Image Backoff Pull error", @@ -142,8 +146,10 @@ func TestRun(t *testing.T) { }, }}, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("container foo-container is waiting to start: foo-image can't be pulled"), - proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR, nil)}, + &proto.ActionableErr{ + Message: "container foo-container is waiting to start: foo-image can't be pulled", + ErrCode: proto.StatusCode_STATUSCHECK_IMAGE_PULL_ERR, + }, nil)}, }, { description: "pod is in Terminated State", @@ -158,8 +164,11 @@ func TestRun(t *testing.T) { Conditions: []v1.PodCondition{{Type: v1.PodScheduled, Status: v1.ConditionTrue}}, }, }}, - expected: []Resource{NewResource("test", "Pod", "foo", "Succeeded", nil, - proto.StatusCode_STATUSCHECK_SUCCESS, nil)}, + expected: []Resource{NewResource("test", "Pod", "foo", "Succeeded", + &proto.ActionableErr{ + Message: "", + ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS, + }, nil)}, }, { description: "pod is in Stable State", @@ -180,8 +189,11 @@ func TestRun(t *testing.T) { }, }, }}, - expected: []Resource{NewResource("test", "Pod", "foo", "Running", nil, - proto.StatusCode_STATUSCHECK_SUCCESS, nil)}, + expected: []Resource{NewResource("test", "Pod", "foo", "Running", + &proto.ActionableErr{ + Message: "", + ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS, + }, nil)}, }, { description: "pod condition unknown", @@ -201,7 +213,10 @@ func TestRun(t *testing.T) { }, }}, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("could not determine"), proto.StatusCode_STATUSCHECK_UNKNOWN, nil)}, + &proto.ActionableErr{ + Message: "could not determine", + ErrCode: proto.StatusCode_STATUSCHECK_UNKNOWN, + }, nil)}, }, { description: "pod could not be scheduled", @@ -222,8 +237,10 @@ func TestRun(t *testing.T) { }, }}, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("Unschedulable: 0/2 nodes available: 1 node has disk pressure, 1 node is unreachable"), - proto.StatusCode_STATUSCHECK_NODE_DISK_PRESSURE, nil)}, + &proto.ActionableErr{ + Message: "Unschedulable: 0/2 nodes available: 1 node has disk pressure, 1 node is unreachable", + ErrCode: proto.StatusCode_STATUSCHECK_NODE_DISK_PRESSURE, + }, nil)}, }, { description: "pod is running but container terminated", @@ -248,8 +265,10 @@ func TestRun(t *testing.T) { output: []byte("main.go:57 \ngo panic"), }, expected: []Resource{NewResource("test", "Pod", "foo", "Running", - fmt.Errorf("container foo-container terminated with exit code 1"), - proto.StatusCode_STATUSCHECK_CONTAINER_TERMINATED, []string{ + &proto.ActionableErr{ + Message: "container foo-container terminated with exit code 1", + ErrCode: proto.StatusCode_STATUSCHECK_CONTAINER_TERMINATED, + }, []string{ "[foo foo-container] main.go:57 ", "[foo foo-container] go panic"}, )}, @@ -276,8 +295,10 @@ func TestRun(t *testing.T) { err: fmt.Errorf("error"), }, expected: []Resource{NewResource("test", "pod", "foo", "Running", - fmt.Errorf("container foo-container terminated with exit code 1"), - proto.StatusCode_STATUSCHECK_CONTAINER_TERMINATED, []string{ + &proto.ActionableErr{ + Message: "container foo-container terminated with exit code 1", + ErrCode: proto.StatusCode_STATUSCHECK_CONTAINER_TERMINATED, + }, []string{ "Error retrieving logs for pod foo. Try `kubectl logs foo -n test -c foo-container`"}, )}, }, @@ -306,7 +327,10 @@ func TestRun(t *testing.T) { }, }, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("eventCode: dummy event"), proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT, nil)}, + &proto.ActionableErr{ + Message: "eventCode: dummy event", + ErrCode: proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT, + }, nil)}, }, { description: "pod condition a warning event followed up normal event", @@ -338,7 +362,10 @@ func TestRun(t *testing.T) { }, }, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("eventCode: dummy event"), proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT, nil)}, + &proto.ActionableErr{ + Message: "eventCode: dummy event", + ErrCode: proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT, + }, nil)}, }, { description: "pod condition a normal event followed by a warning event", @@ -370,7 +397,10 @@ func TestRun(t *testing.T) { }, }, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("eventCode: dummy event"), proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT, nil)}, + &proto.ActionableErr{ + Message: "eventCode: dummy event", + ErrCode: proto.StatusCode_STATUSCHECK_UNKNOWN_EVENT, + }, nil)}, }, { description: "pod condition a warning event followed up by warning adds last warning seen", @@ -402,7 +432,10 @@ func TestRun(t *testing.T) { }, }, expected: []Resource{NewResource("test", "Pod", "foo", "Pending", - fmt.Errorf("0/1 nodes are available: 1 node(s) had taint {key: value}, that the pod didn't tolerate"), proto.StatusCode_STATUSCHECK_FAILED_SCHEDULING, nil)}, + &proto.ActionableErr{ + Message: "0/1 nodes are available: 1 node(s) had taint {key: value}, that the pod didn't tolerate", + ErrCode: proto.StatusCode_STATUSCHECK_FAILED_SCHEDULING, + }, nil)}, }, } diff --git a/pkg/diag/validator/resource.go b/pkg/diag/validator/resource.go index aa0856f5d8f..dd8f8d19c9f 100644 --- a/pkg/diag/validator/resource.go +++ b/pkg/diag/validator/resource.go @@ -26,20 +26,18 @@ import ( ) type Resource struct { - namespace string - kind string - name string - logs []string - status Status - err error - StatusCode proto.StatusCode + namespace string + kind string + name string + logs []string + status Status + ae *proto.ActionableErr } func (r Resource) Kind() string { return r.kind } func (r Resource) Name() string { return r.name } func (r Resource) Namespace() string { return r.namespace } func (r Resource) Status() Status { return r.status } -func (r Resource) Error() error { return r.err } func (r Resource) Logs() []string { return r.logs } func (r Resource) String() string { if r.namespace == "default" { @@ -47,10 +45,16 @@ func (r Resource) String() string { } return fmt.Sprintf("%s:%s/%s", r.namespace, r.kind, r.name) } +func (r Resource) ActionableError() *proto.ActionableErr { + return r.ae +} +func (r Resource) StatusUpdated(another Resource) bool { + return r.ae.ErrCode != another.ae.ErrCode +} // NewResource creates new Resource of kind -func NewResource(namespace, kind, name string, status Status, err error, statusCode proto.StatusCode, logs []string) Resource { - return Resource{namespace: namespace, kind: kind, name: name, status: status, err: err, StatusCode: statusCode, logs: logs} +func NewResource(namespace, kind, name string, status Status, ae *proto.ActionableErr, logs []string) Resource { + return Resource{namespace: namespace, kind: kind, name: name, status: status, ae: ae, logs: logs} } // objectWithMetadata is any k8s object that has kind and object metadata. @@ -60,6 +64,6 @@ type objectWithMetadata interface { } // NewResourceFromObject creates new Resource with fields populated from object metadata. -func NewResourceFromObject(object objectWithMetadata, status Status, err error, statusCode proto.StatusCode, logs []string) Resource { - return NewResource(object.GetNamespace(), object.GetObjectKind().GroupVersionKind().Kind, object.GetName(), status, err, statusCode, logs) +func NewResourceFromObject(object objectWithMetadata, status Status, ae *proto.ActionableErr, logs []string) Resource { + return NewResource(object.GetNamespace(), object.GetObjectKind().GroupVersionKind().Kind, object.GetName(), status, ae, logs) } diff --git a/pkg/diag/validator/resource_test.go b/pkg/diag/validator/resource_test.go index 093552d1510..9ed0436cf26 100644 --- a/pkg/diag/validator/resource_test.go +++ b/pkg/diag/validator/resource_test.go @@ -42,7 +42,7 @@ func TestNewResource(t *testing.T) { Name: "foo", }, }, - expected: Resource{"default", "pod", "foo", nil, Status(""), nil, 0}, + expected: Resource{"default", "pod", "foo", nil, Status(""), nil}, expectedName: "pod/foo", }, { @@ -54,13 +54,13 @@ func TestNewResource(t *testing.T) { Name: "bar", }, }, - expected: Resource{"test", "pod", "bar", nil, Status(""), nil, 0}, + expected: Resource{"test", "pod", "bar", nil, Status(""), nil}, expectedName: "test:pod/bar", }, } for _, test := range tests { testutil.Run(t, test.description, func(t *testutil.T) { - actual := NewResourceFromObject(test.resource, Status(""), nil, 0, nil) + actual := NewResourceFromObject(test.resource, Status(""), nil, nil) t.CheckDeepEqual(test.expected, actual, cmp.AllowUnexported(Resource{})) t.CheckDeepEqual(test.expectedName, actual.String(), cmp.AllowUnexported(Resource{})) }) diff --git a/pkg/skaffold/deploy/resource/deployment.go b/pkg/skaffold/deploy/resource/deployment.go index 7780e8792cd..b12f33691e9 100644 --- a/pkg/skaffold/deploy/resource/deployment.go +++ b/pkg/skaffold/deploy/resource/deployment.go @@ -18,7 +18,6 @@ package resource import ( "context" - "errors" "fmt" "strings" "time" @@ -44,8 +43,8 @@ const ( ) var ( - errKubectlKilled = errors.New("kubectl rollout status command interrupted") - ErrKubectlConnection = errors.New("kubectl connection error") + msgKubectlKilled = "kubectl rollout status command interrupted" + MsgKubectlConnection = "kubectl connection error" ) type Deployment struct { @@ -64,19 +63,15 @@ func (d *Deployment) Deadline() time.Duration { return d.deadline } -func (d *Deployment) UpdateStatus(details string, err error) { - errCode := proto.StatusCode_STATUSCHECK_SUCCESS - if err != nil { - errCode = proto.StatusCode_STATUSCHECK_UNKNOWN - } - updated := newStatus(details, errCode, err) +func (d *Deployment) UpdateStatus(ae *proto.ActionableErr) { + updated := newStatus(ae) if d.status.Equal(updated) { d.status.changed = false return } d.status = updated d.status.changed = true - if strings.Contains(details, rollOutSuccess) || isErrAndNotRetryAble(err) { + if ae.ErrCode == proto.StatusCode_STATUSCHECK_SUCCESS || isErrAndNotRetryAble(ae.ErrCode) { d.done = true } } @@ -86,7 +81,7 @@ func NewDeployment(name string, ns string, deadline time.Duration) *Deployment { name: name, namespace: ns, rType: deploymentType, - status: newStatus("", proto.StatusCode_STATUSCHECK_UNKNOWN, nil), + status: newStatus(&proto.ActionableErr{}), deadline: deadline, podValidator: diag.New(nil), } @@ -107,12 +102,12 @@ func (d *Deployment) CheckStatus(ctx context.Context, runCtx *runcontext.RunCont details := d.cleanupStatus(string(b)) - d.StatusCode, err = parseKubectlRolloutError(err) - if err == errKubectlKilled { - err = fmt.Errorf("received Ctrl-C or deployments could not stabilize within %v: %w", d.deadline, err) + ae := parseKubectlRolloutError(details, err) + if ae.ErrCode == proto.StatusCode_STATUSCHECK_KUBECTL_PID_KILLED { + ae.Message = fmt.Sprintf("received Ctrl-C or deployments could not stabilize within %v: %v", d.deadline, err) } - d.UpdateStatus(details, err) + d.UpdateStatus(ae) if err := d.fetchPods(ctx); err != nil { logrus.Debugf("pod statuses could be fetched this time due to %s", err) } @@ -153,8 +148,8 @@ func (d *Deployment) ReportSinceLastUpdated() string { var result strings.Builder result.WriteString(fmt.Sprintf("%s %s: %s", tabHeader, d, d.status)) for _, p := range d.pods { - if p.Error() != nil { - result.WriteString(fmt.Sprintf("%s %s %s: %s\n", tab, tabHeader, p, p.Error())) + if s := p.ActionableError().Message; s != "" { + result.WriteString(fmt.Sprintf("%s %s %s: %s\n", tab, tabHeader, p, s)) for _, l := range p.Logs() { result.WriteString(fmt.Sprintf("%s\n", l)) } @@ -179,24 +174,39 @@ func (d *Deployment) cleanupStatus(msg string) string { // $kubectl logs testPod -f // 2020/06/18 17:28:31 service is running // Killed: 9 -func parseKubectlRolloutError(err error) (proto.StatusCode, error) { - if err == nil { - return proto.StatusCode_STATUSCHECK_SUCCESS, err - } - if strings.Contains(err.Error(), connectionErrMsg) { - return proto.StatusCode_STATUSCHECK_KUBECTL_CONNECTION_ERR, ErrKubectlConnection - } - if strings.Contains(err.Error(), killedErrMsg) { - return proto.StatusCode_STATUSCHECK_KUBECTL_PID_KILLED, errKubectlKilled +func parseKubectlRolloutError(details string, err error) *proto.ActionableErr { + switch { + case err == nil && strings.Contains(details, rollOutSuccess): + return &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS, + Message: details, + } + case err == nil: + return &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING, + Message: details, + } + case strings.Contains(err.Error(), connectionErrMsg): + return &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_KUBECTL_CONNECTION_ERR, + Message: MsgKubectlConnection, + } + case strings.Contains(err.Error(), killedErrMsg): + return &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_KUBECTL_PID_KILLED, + Message: msgKubectlKilled, + } + default: + return &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_UNKNOWN, + Message: err.Error(), + } } - return proto.StatusCode_STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING, err } -func isErrAndNotRetryAble(err error) bool { - if err == nil { - return false - } - return err != ErrKubectlConnection +func isErrAndNotRetryAble(statusCode proto.StatusCode) bool { + return statusCode != proto.StatusCode_STATUSCHECK_KUBECTL_CONNECTION_ERR && + statusCode != proto.StatusCode_STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING } func (d *Deployment) fetchPods(ctx context.Context) error { @@ -211,13 +221,13 @@ func (d *Deployment) fetchPods(ctx context.Context) error { d.status.changed = false for _, p := range pods { originalPod, found := d.pods[p.String()] - if !found || originalPod.StatusCode != p.StatusCode { + if !found || originalPod.StatusUpdated(p) { d.status.changed = true - switch p.StatusCode { + switch p.ActionableError().ErrCode { case proto.StatusCode_STATUSCHECK_CONTAINER_CREATING: - event.ResourceStatusCheckEventUpdated(p.String(), p.StatusCode, p.Error().Error()) + event.ResourceStatusCheckEventUpdated(p.String(), p.ActionableError()) default: - event.ResourceStatusCheckEventCompleted(p.String(), p.StatusCode, p.Error()) + event.ResourceStatusCheckEventCompleted(p.String(), p.ActionableError()) } } newPods[p.String()] = p diff --git a/pkg/skaffold/deploy/resource/deployment_test.go b/pkg/skaffold/deploy/resource/deployment_test.go index 143f140aa81..eb635203358 100644 --- a/pkg/skaffold/deploy/resource/deployment_test.go +++ b/pkg/skaffold/deploy/resource/deployment_test.go @@ -77,7 +77,7 @@ func TestDeploymentCheckStatus(t *testing.T) { "", errors.New("Unable to connect to the server"), ), - expectedErr: ErrKubectlConnection.Error(), + expectedErr: MsgKubectlConnection, }, } @@ -94,7 +94,7 @@ func TestDeploymentCheckStatus(t *testing.T) { if test.expectedErr != "" { t.CheckErrorContains(test.expectedErr, r.Status().Error()) } else { - t.CheckDeepEqual(r.status.details, test.expectedDetails) + t.CheckDeepEqual(r.status.ae.Message, test.expectedDetails) } }) } @@ -103,45 +103,47 @@ func TestDeploymentCheckStatus(t *testing.T) { func TestParseKubectlError(t *testing.T) { tests := []struct { description string + details string err error - expected string - expectedSc proto.StatusCode - shouldErr bool + expectedAe *proto.ActionableErr }{ { description: "rollout status connection error", err: errors.New("Unable to connect to the server"), - expected: ErrKubectlConnection.Error(), - expectedSc: proto.StatusCode_STATUSCHECK_KUBECTL_CONNECTION_ERR, - shouldErr: true, + expectedAe: &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_KUBECTL_CONNECTION_ERR, + Message: MsgKubectlConnection, + }, }, { description: "rollout status kubectl command killed", err: errors.New("signal: killed"), - expected: errKubectlKilled.Error(), - expectedSc: proto.StatusCode_STATUSCHECK_KUBECTL_PID_KILLED, - shouldErr: true, + expectedAe: &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_KUBECTL_PID_KILLED, + Message: msgKubectlKilled, + }, }, { description: "rollout status random error", err: errors.New("deployment test not found"), - expected: "deployment test not found", - expectedSc: proto.StatusCode_STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING, - shouldErr: true, + expectedAe: &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_UNKNOWN, + Message: "deployment test not found", + }, }, { description: "rollout status nil error", - expectedSc: proto.StatusCode_STATUSCHECK_SUCCESS, + details: "successfully rolled out", + expectedAe: &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS, + Message: "successfully rolled out", + }, }, } for _, test := range tests { testutil.Run(t, test.description, func(t *testutil.T) { - sc, actual := parseKubectlRolloutError(test.err) - t.CheckError(test.shouldErr, actual) - t.CheckDeepEqual(test.expectedSc, sc) - if test.shouldErr { - t.CheckErrorContains(test.expected, actual) - } + ae := parseKubectlRolloutError(test.details, test.err) + t.CheckDeepEqual(test.expectedAe, ae) }) } } @@ -149,40 +151,42 @@ func TestParseKubectlError(t *testing.T) { func TestIsErrAndNotRetriable(t *testing.T) { tests := []struct { description string - err error + statusCode proto.StatusCode expected bool }{ { description: "rollout status connection error", - err: ErrKubectlConnection, + statusCode: proto.StatusCode_STATUSCHECK_KUBECTL_CONNECTION_ERR, }, { description: "rollout status kubectl command killed", - err: errKubectlKilled, + statusCode: proto.StatusCode_STATUSCHECK_KUBECTL_PID_KILLED, expected: true, }, { description: "rollout status random error", - err: errors.New("deployment test not found"), + statusCode: proto.StatusCode_STATUSCHECK_UNKNOWN, expected: true, }, { - description: "rollout status parent context cancelled", - err: context.Canceled, + description: "rollout status parent context canceled", + statusCode: proto.StatusCode_STATUSCHECK_CONTEXT_CANCELLED, expected: true, }, { description: "rollout status parent context timed out", - err: context.DeadlineExceeded, + statusCode: proto.StatusCode_STATUSCHECK_DEADLINE_EXCEEDED, expected: true, }, { description: "rollout status nil error", + statusCode: proto.StatusCode_STATUSCHECK_SUCCESS, + expected: true, }, } for _, test := range tests { testutil.Run(t, test.description, func(t *testutil.T) { - actual := isErrAndNotRetryAble(test.err) + actual := isErrAndNotRetryAble(test.statusCode) t.CheckDeepEqual(test.expected, actual) }) } @@ -191,27 +195,24 @@ func TestIsErrAndNotRetriable(t *testing.T) { func TestReportSinceLastUpdated(t *testing.T) { var tests = []struct { description string - message string - err error + ae *proto.ActionableErr expected string }{ { description: "updating an error status", - message: "cannot pull image", - err: errors.New("cannot pull image"), + ae: &proto.ActionableErr{Message: "cannot pull image"}, expected: " - test-ns:deployment/test: cannot pull image", }, { description: "updating a non error status", - message: "waiting for container", + ae: &proto.ActionableErr{Message: "waiting for container"}, expected: " - test-ns:deployment/test: waiting for container", }, } for _, test := range tests { testutil.Run(t, test.description, func(t *testutil.T) { dep := NewDeployment("test", "test-ns", 1) - dep.UpdateStatus(test.message, test.err) - + dep.UpdateStatus(test.ae) t.CheckDeepEqual(test.expected, dep.ReportSinceLastUpdated()) t.CheckTrue(dep.status.changed) }) @@ -250,7 +251,10 @@ func TestReportSinceLastUpdatedMultipleTimes(t *testing.T) { var actual string for i, status := range test.statuses { // update to same status - dep.UpdateStatus(status, nil) + dep.UpdateStatus(&proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING, + Message: status, + }) if test.reportStatusSeq[i] { actual = dep.ReportSinceLastUpdated() } diff --git a/pkg/skaffold/deploy/resource/status.go b/pkg/skaffold/deploy/resource/status.go index 81602362bda..8b63a40100f 100644 --- a/pkg/skaffold/deploy/resource/status.go +++ b/pkg/skaffold/deploy/resource/status.go @@ -17,47 +17,39 @@ limitations under the License. package resource import ( + "fmt" + "github.com/GoogleContainerTools/skaffold/proto" ) type Status struct { - err error - details string - errCode proto.StatusCode + ae *proto.ActionableErr changed bool reported bool } func (rs Status) Error() error { - return rs.err + return fmt.Errorf(rs.ae.Message) } -func (rs Status) ErrorCode() proto.StatusCode { - return rs.errCode +func (rs Status) ActionableError() *proto.ActionableErr { + return rs.ae } func (rs Status) String() string { - if rs.err != nil { - return rs.err.Error() - } - return rs.details + return rs.ae.Message } func (rs Status) Equal(other Status) bool { - if rs.details != other.details { - return false - } - if rs.err != nil && other.err != nil { - return rs.err.Error() == other.err.Error() + if rs.ae != nil && other.ae != nil { + return rs.ae.Message == other.ae.Message && rs.ae.ErrCode == other.ae.ErrCode } - return rs.err == other.err + return rs.ae == other.ae } -func newStatus(msg string, errCode proto.StatusCode, err error) Status { +func newStatus(ae *proto.ActionableErr) Status { return Status{ - details: msg, - err: err, - errCode: errCode, + ae: ae, changed: true, } } diff --git a/pkg/skaffold/deploy/resource/status_test.go b/pkg/skaffold/deploy/resource/status_test.go index 6e4c069466e..d55e49f7f32 100644 --- a/pkg/skaffold/deploy/resource/status_test.go +++ b/pkg/skaffold/deploy/resource/status_test.go @@ -17,43 +17,36 @@ limitations under the License. package resource import ( - "errors" - "fmt" "testing" + "github.com/GoogleContainerTools/skaffold/proto" "github.com/GoogleContainerTools/skaffold/testutil" ) func TestString(t *testing.T) { var tests = []struct { description string - details string - err error + ae *proto.ActionableErr expected string }{ { description: "should return error string if error is set", - err: errors.New("some error"), + ae: &proto.ActionableErr{Message: "some error"}, expected: "some error", }, - { - description: "should return error details if error is not set", - details: "details", - expected: "details", - }, { description: "should return error if both details and error are set", - details: "error details", - err: errors.New("error happened due to something"), + ae: &proto.ActionableErr{Message: "error happened due to something"}, expected: "error happened due to something", }, { description: "should return empty string if all empty", + ae: &proto.ActionableErr{}, }, } for _, test := range tests { testutil.Run(t, test.description, func(t *testutil.T) { - status := newStatus(test.details, 0, test.err) + status := newStatus(test.ae) t.CheckDeepEqual(test.expected, status.String()) }) } @@ -67,31 +60,25 @@ func TestEqual(t *testing.T) { expected bool }{ { - description: "status should be same for same details and error", - old: Status{details: "Waiting for 0/1 replicas to be available...", err: nil}, - new: Status{details: "Waiting for 0/1 replicas to be available...", err: nil}, - expected: true, - }, - { - description: "status should be new if error messages are same", - old: Status{details: "same", err: errors.New("same error")}, - new: Status{details: "same", err: errors.New("same error")}, + description: "status should be same if error messages are same", + old: Status{ae: &proto.ActionableErr{ErrCode: 100, Message: "Waiting for 0/1 replicas to be available..."}}, + new: Status{ae: &proto.ActionableErr{ErrCode: 100, Message: "Waiting for 0/1 replicas to be available..."}}, expected: true, }, { description: "status should be new if error is different", - old: Status{details: "same", err: nil}, - new: Status{details: "same", err: fmt.Errorf("see this error")}, + old: Status{ae: nil}, + new: Status{ae: &proto.ActionableErr{ErrCode: 100, Message: "see this error"}}, }, { - description: "status should be new if details and err are different", - old: Status{details: "same", err: nil}, - new: Status{details: "same", err: fmt.Errorf("see this error")}, + description: "status should be new if errcode are different but same message", + old: Status{ae: &proto.ActionableErr{ErrCode: 100, Message: "see this error"}}, + new: Status{ae: &proto.ActionableErr{ErrCode: 101, Message: "see this error"}}, }, { - description: "status should be new if details change", - old: Status{details: "same", err: nil}, - new: Status{details: "error", err: nil}, + description: "status should be new if messages change", + old: Status{ae: &proto.ActionableErr{ErrCode: 100, Message: "Waiting for 2/2 replicas to be available..."}}, + new: Status{ae: &proto.ActionableErr{ErrCode: 100, Message: "Waiting for 1/2 replicas to be available..."}}, }, } for _, test := range tests { diff --git a/pkg/skaffold/deploy/status_check.go b/pkg/skaffold/deploy/status_check.go index 0c2da370860..e85d578e39c 100644 --- a/pkg/skaffold/deploy/status_check.go +++ b/pkg/skaffold/deploy/status_check.go @@ -18,7 +18,6 @@ package deploy import ( "context" - "errors" "fmt" "io" "strings" @@ -36,6 +35,7 @@ import ( "github.com/GoogleContainerTools/skaffold/pkg/skaffold/event" pkgkubernetes "github.com/GoogleContainerTools/skaffold/pkg/skaffold/kubernetes" "github.com/GoogleContainerTools/skaffold/pkg/skaffold/runner/runcontext" + "github.com/GoogleContainerTools/skaffold/proto" ) var ( @@ -143,8 +143,9 @@ func pollDeploymentStatus(ctx context.Context, runCtx *runcontext.RunContext, r for { select { case <-timeoutContext.Done(): - err := fmt.Errorf("could not stabilize within %v: %w", r.Deadline(), timeoutContext.Err()) - r.UpdateStatus(err.Error(), err) + msg := fmt.Sprintf("could not stabilize within %v: %v", r.Deadline(), timeoutContext.Err()) + r.UpdateStatus(&proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_DEADLINE_EXCEEDED, + Message: msg}) return case <-time.After(pollDuration): r.CheckStatus(timeoutContext, runCtx) @@ -172,18 +173,18 @@ func getDeadline(d int) time.Duration { } func printStatusCheckSummary(out io.Writer, r *resource.Deployment, c counter) { - err := r.Status().Error() - if errors.Is(err, context.Canceled) { + ae := r.Status().ActionableError() + if ae.ErrCode == proto.StatusCode_STATUSCHECK_CONTEXT_CANCELLED { // Don't print the status summary if the user ctrl-C return } - event.ResourceStatusCheckEventCompleted(r.String(), r.StatusCode, err) + event.ResourceStatusCheckEventCompleted(r.String(), r.Status().ActionableError()) status := fmt.Sprintf("%s %s", tabHeader, r) - if err != nil { + if ae.ErrCode != proto.StatusCode_STATUSCHECK_SUCCESS { status = fmt.Sprintf("%s failed.%s Error: %s.", status, trimNewLine(getPendingMessage(c.pending, c.total)), - trimNewLine(err.Error()), + trimNewLine(ae.Message), ) } else { status = fmt.Sprintf("%s is ready.%s", status, getPendingMessage(c.pending, c.total)) @@ -218,7 +219,7 @@ func printStatus(deployments []*resource.Deployment, out io.Writer) bool { } allDone = false if str := r.ReportSinceLastUpdated(); str != "" { - event.ResourceStatusCheckEventUpdated(r.String(), r.StatusCode, str) + event.ResourceStatusCheckEventUpdated(r.String(), r.Status().ActionableError()) fmt.Fprintln(out, trimNewLine(str)) } } diff --git a/pkg/skaffold/deploy/status_check_test.go b/pkg/skaffold/deploy/status_check_test.go index 22467297f32..42de32f8460 100644 --- a/pkg/skaffold/deploy/status_check_test.go +++ b/pkg/skaffold/deploy/status_check_test.go @@ -35,6 +35,7 @@ import ( "github.com/GoogleContainerTools/skaffold/pkg/skaffold/deploy/resource" "github.com/GoogleContainerTools/skaffold/pkg/skaffold/event" "github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest" + "github.com/GoogleContainerTools/skaffold/proto" "github.com/GoogleContainerTools/skaffold/testutil" ) @@ -269,7 +270,7 @@ func TestPrintSummaryStatus(t *testing.T) { namespace string deployment string pending int32 - err error + ae *proto.ActionableErr expected string }{ { @@ -277,7 +278,7 @@ func TestPrintSummaryStatus(t *testing.T) { namespace: "test", deployment: "dep", pending: 0, - err: nil, + ae: &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS}, expected: " - test:deployment/dep is ready.\n", }, { @@ -285,7 +286,7 @@ func TestPrintSummaryStatus(t *testing.T) { namespace: "default", deployment: "dep", pending: 0, - err: nil, + ae: &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS}, expected: " - deployment/dep is ready.\n", }, { @@ -293,7 +294,7 @@ func TestPrintSummaryStatus(t *testing.T) { namespace: "test", deployment: "dep", pending: 0, - err: errors.New("context deadline expired"), + ae: &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_DEADLINE_EXCEEDED, Message: "context deadline expired"}, expected: " - test:deployment/dep failed. Error: context deadline expired.\n", }, { @@ -301,7 +302,7 @@ func TestPrintSummaryStatus(t *testing.T) { namespace: "test", deployment: "dep", pending: 4, - err: nil, + ae: &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS}, expected: " - test:deployment/dep is ready. [4/10 deployment(s) still pending]\n", }, { @@ -309,7 +310,7 @@ func TestPrintSummaryStatus(t *testing.T) { namespace: "test", deployment: "dep", pending: 8, - err: errors.New("context deadline expired"), + ae: &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_DEADLINE_EXCEEDED, Message: "context deadline expired"}, expected: " - test:deployment/dep failed. [8/10 deployment(s) still pending] Error: context deadline expired.\n", }, } @@ -319,9 +320,10 @@ func TestPrintSummaryStatus(t *testing.T) { out := new(bytes.Buffer) rc := newCounter(10) rc.pending = test.pending + event.InitializeState(latest.Pipeline{}, "test", true, true, true) printStatusCheckSummary( out, - withStatus(resource.NewDeployment(test.deployment, test.namespace, 0), "", test.err), + withStatus(resource.NewDeployment(test.deployment, test.namespace, 0), test.ae), *rc, ) t.CheckDeepEqual(test.expected, out.String()) @@ -341,8 +343,7 @@ func TestPrintStatus(t *testing.T) { rs: []*resource.Deployment{ withStatus( resource.NewDeployment("r1", "test", 1), - "deployment successfully rolled out", - nil, + &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS}, ), }, expected: true, @@ -352,8 +353,7 @@ func TestPrintStatus(t *testing.T) { rs: []*resource.Deployment{ withStatus( resource.NewDeployment("r1", "test", 1), - "error", - errors.New("error"), + &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_UNKNOWN, Message: "error"}, ), }, expected: true, @@ -363,13 +363,12 @@ func TestPrintStatus(t *testing.T) { rs: []*resource.Deployment{ withStatus( resource.NewDeployment("r1", "test", 1), - "deployment successfully rolled out", - nil, + &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS}, ), withStatus( resource.NewDeployment("r2", "test", 1), - "pending", - nil, + &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_DEPLOYMENT_ROLLOUT_PENDING, + Message: "pending"}, ), }, expectedOut: " - test:deployment/r2: pending\n", @@ -379,13 +378,13 @@ func TestPrintStatus(t *testing.T) { rs: []*resource.Deployment{ withStatus( resource.NewDeployment("r1", "test", 1), - "eployment successfully rolled out", - nil, + &proto.ActionableErr{ErrCode: proto.StatusCode_STATUSCHECK_SUCCESS}, ), withStatus( resource.NewDeployment("r2", "test", 1), - "", - resource.ErrKubectlConnection, + &proto.ActionableErr{ + ErrCode: proto.StatusCode_STATUSCHECK_KUBECTL_CONNECTION_ERR, + Message: resource.MsgKubectlConnection}, ), }, expectedOut: " - test:deployment/r2: kubectl connection error\n", @@ -395,6 +394,7 @@ func TestPrintStatus(t *testing.T) { for _, test := range tests { testutil.Run(t, test.description, func(t *testutil.T) { out := new(bytes.Buffer) + event.InitializeState(latest.Pipeline{}, "test", true, true, true) actual := printStatus(test.rs, out) t.CheckDeepEqual(test.expectedOut, out.String()) t.CheckDeepEqual(test.expected, actual) @@ -402,8 +402,8 @@ func TestPrintStatus(t *testing.T) { } } -func withStatus(d *resource.Deployment, details string, err error) *resource.Deployment { - d.UpdateStatus(details, err) +func withStatus(d *resource.Deployment, ae *proto.ActionableErr) *resource.Deployment { + d.UpdateStatus(ae) return d } @@ -446,7 +446,7 @@ func TestResourceMarkProcessed(t *testing.T) { { description: "when deployment failed, counter is updated", c: newCounter(10), - err: errors.New("some err"), + err: errors.New("some ae"), expected: counter{total: 10, failed: 1, pending: 9}, }, { diff --git a/pkg/skaffold/event/event.go b/pkg/skaffold/event/event.go index fb136cb0a6b..2f7bbed87b2 100644 --- a/pkg/skaffold/event/event.go +++ b/pkg/skaffold/event/event.go @@ -217,9 +217,9 @@ func StatusCheckEventInProgress(s string) { }) } -func ResourceStatusCheckEventCompleted(r string, statusCode proto.StatusCode, err error) { - if err != nil { - resourceStatusCheckEventFailed(r, statusCode, err) +func ResourceStatusCheckEventCompleted(r string, ae *proto.ActionableErr) { + if ae.ErrCode != proto.StatusCode_STATUSCHECK_SUCCESS { + resourceStatusCheckEventFailed(r, ae) return } resourceStatusCheckEventSucceeded(r) @@ -234,24 +234,23 @@ func resourceStatusCheckEventSucceeded(r string) { }) } -func resourceStatusCheckEventFailed(r string, statusCode proto.StatusCode, err error) { +func resourceStatusCheckEventFailed(r string, ae *proto.ActionableErr) { handler.handleResourceStatusCheckEvent(&proto.ResourceStatusCheckEvent{ - Resource: r, - Status: Failed, - Err: err.Error(), - StatusCode: statusCode, - ActionableErr: &proto.ActionableErr{ - ErrCode: statusCode, - Message: err.Error(), - }}) + Resource: r, + Status: Failed, + Err: ae.Message, + StatusCode: ae.ErrCode, + ActionableErr: ae, + }) } -func ResourceStatusCheckEventUpdated(r string, statusCode proto.StatusCode, status string) { +func ResourceStatusCheckEventUpdated(r string, ae *proto.ActionableErr) { handler.handleResourceStatusCheckEvent(&proto.ResourceStatusCheckEvent{ - Resource: r, - Status: InProgress, - Message: status, - StatusCode: statusCode, + Resource: r, + Status: InProgress, + Message: ae.Message, + StatusCode: ae.ErrCode, + ActionableErr: ae, }) } diff --git a/pkg/skaffold/event/event_test.go b/pkg/skaffold/event/event_test.go index 734961ca253..d279c6b1a3e 100644 --- a/pkg/skaffold/event/event_test.go +++ b/pkg/skaffold/event/event_test.go @@ -221,7 +221,10 @@ func TestResourceStatusCheckEventUpdated(t *testing.T) { } wait(t, func() bool { return handler.getState().StatusCheckState.Status == NotStarted }) - ResourceStatusCheckEventUpdated("ns:pod/foo", 509, "img pull error") + ResourceStatusCheckEventUpdated("ns:pod/foo", &proto.ActionableErr{ + ErrCode: 509, + Message: "image pull error", + }) wait(t, func() bool { return handler.getState().StatusCheckState.Resources["ns:pod/foo"] == InProgress }) } @@ -245,7 +248,10 @@ func TestResourceStatusCheckEventFailed(t *testing.T) { } wait(t, func() bool { return handler.getState().StatusCheckState.Status == NotStarted }) - resourceStatusCheckEventFailed("ns:pod/foo", 309, errors.New("one or more deployments failed")) + resourceStatusCheckEventFailed("ns:pod/foo", &proto.ActionableErr{ + ErrCode: 309, + Message: "one or more deployments failed", + }) wait(t, func() bool { return handler.getState().StatusCheckState.Resources["ns:pod/foo"] == Failed }) } diff --git a/proto/skaffold.pb.go b/proto/skaffold.pb.go index 08b37aadd7f..9971281e486 100644 --- a/proto/skaffold.pb.go +++ b/proto/skaffold.pb.go @@ -264,6 +264,10 @@ const ( StatusCode_DEVINIT_REGISTER_DEPLOY_DEPS StatusCode = 703 // Failed to configure watcher for Skaffold configuration file. StatusCode_DEVINIT_REGISTER_CONFIG_DEP StatusCode = 704 + // User cancelled the skaffold dev run + StatusCode_STATUSCHECK_CONTEXT_CANCELLED StatusCode = 800 + // Deadline for status check exceeded + StatusCode_STATUSCHECK_DEADLINE_EXCEEDED StatusCode = 801 ) var StatusCode_name = map[int32]string{ @@ -304,6 +308,8 @@ var StatusCode_name = map[int32]string{ 702: "DEVINIT_REGISTER_TEST_DEPS", 703: "DEVINIT_REGISTER_DEPLOY_DEPS", 704: "DEVINIT_REGISTER_CONFIG_DEP", + 800: "STATUSCHECK_CONTEXT_CANCELLED", + 801: "STATUSCHECK_DEADLINE_EXCEEDED", } var StatusCode_value = map[string]int32{ @@ -344,6 +350,8 @@ var StatusCode_value = map[string]int32{ "DEVINIT_REGISTER_TEST_DEPS": 702, "DEVINIT_REGISTER_DEPLOY_DEPS": 703, "DEVINIT_REGISTER_CONFIG_DEP": 704, + "STATUSCHECK_CONTEXT_CANCELLED": 800, + "STATUSCHECK_DEADLINE_EXCEEDED": 801, } func (x StatusCode) String() string { @@ -2325,170 +2333,172 @@ func init() { func init() { proto.RegisterFile("skaffold.proto", fileDescriptor_4f2d38e344f9dbf5) } var fileDescriptor_4f2d38e344f9dbf5 = []byte{ - // 2600 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x4d, 0x90, 0x1b, 0x47, - 0x15, 0x5e, 0x69, 0xa4, 0x5d, 0xe9, 0xed, 0x8f, 0xc7, 0x6d, 0xaf, 0xad, 0xc8, 0x8e, 0xbd, 0x19, - 0xec, 0x8d, 0xb3, 0x09, 0xbb, 0x71, 0x4c, 0x51, 0xc1, 0x24, 0x50, 0xda, 0xd1, 0x78, 0x35, 0x5e, - 0xed, 0x68, 0xab, 0x35, 0x4a, 0x70, 0xaa, 0x28, 0xd5, 0x58, 0xea, 0x55, 0x54, 0xd6, 0x6a, 0xc4, - 0xcc, 0xc8, 0x61, 0x2f, 0x1c, 0xb8, 0x72, 0x01, 0x42, 0xf8, 0x2b, 0x0e, 0x5c, 0xb8, 0x85, 0xc0, - 0x95, 0xa2, 0x20, 0xdc, 0x80, 0x33, 0x55, 0x54, 0x71, 0xa4, 0x2a, 0x1c, 0xb8, 0x27, 0xfc, 0x53, - 0x45, 0xf5, 0xdf, 0x4c, 0x8f, 0x7e, 0xbc, 0xd9, 0xca, 0x81, 0xd3, 0xaa, 0x5f, 0x7f, 0xef, 0xb7, - 0x5f, 0xbf, 0xf7, 0xa6, 0x17, 0xd6, 0xc2, 0x47, 0xde, 0xd1, 0x91, 0x3f, 0xe8, 0x6e, 0x8f, 0x02, - 0x3f, 0xf2, 0x51, 0x9e, 0xfd, 0x29, 0x5f, 0xed, 0xf9, 0x7e, 0x6f, 0x40, 0x76, 0xbc, 0x51, 0x7f, - 0xc7, 0x1b, 0x0e, 0xfd, 0xc8, 0x8b, 0xfa, 0xfe, 0x30, 0xe4, 0xa0, 0xf2, 0x75, 0xb1, 0xcb, 0x56, - 0x0f, 0xc7, 0x47, 0x3b, 0x51, 0xff, 0x98, 0x84, 0x91, 0x77, 0x3c, 0x12, 0x80, 0x2b, 0x93, 0x00, - 0x72, 0x3c, 0x8a, 0x4e, 0xf8, 0xa6, 0x71, 0x07, 0x56, 0x9b, 0x91, 0x17, 0x11, 0x4c, 0xc2, 0x91, - 0x3f, 0x0c, 0x09, 0x32, 0x20, 0x1f, 0x52, 0x42, 0x29, 0xb3, 0x91, 0xb9, 0xb5, 0xfc, 0xd2, 0x0a, - 0xc7, 0x6d, 0x73, 0x10, 0xdf, 0x32, 0xae, 0x42, 0x21, 0xc6, 0xeb, 0xa0, 0x1d, 0x87, 0x3d, 0x86, - 0x2e, 0x62, 0xfa, 0xd3, 0x78, 0x1a, 0x96, 0x30, 0xf9, 0xca, 0x98, 0x84, 0x11, 0x42, 0x90, 0x1b, - 0x7a, 0xc7, 0x44, 0xec, 0xb2, 0xdf, 0xc6, 0x3b, 0x39, 0xc8, 0x33, 0x69, 0xe8, 0x36, 0xc0, 0xc3, - 0x71, 0x7f, 0xd0, 0x6d, 0x2a, 0xfa, 0xce, 0x0b, 0x7d, 0xbb, 0xf1, 0x06, 0x56, 0x40, 0xe8, 0x33, - 0xb0, 0xdc, 0x25, 0xa3, 0x81, 0x7f, 0xc2, 0x79, 0xb2, 0x8c, 0x07, 0x09, 0x9e, 0x6a, 0xb2, 0x83, - 0x55, 0x18, 0xaa, 0xc1, 0xda, 0x91, 0x1f, 0xbc, 0xe5, 0x05, 0x5d, 0xd2, 0x3d, 0xf4, 0x83, 0x28, - 0x2c, 0xe5, 0x36, 0xb4, 0x5b, 0xcb, 0x2f, 0x6d, 0xa8, 0xce, 0x6d, 0xdf, 0x4b, 0x41, 0xac, 0x61, - 0x14, 0x9c, 0xe0, 0x09, 0x3e, 0x64, 0x82, 0x4e, 0x43, 0x30, 0x0e, 0xcd, 0x37, 0x49, 0xe7, 0x11, - 0x37, 0x22, 0xcf, 0x8c, 0xb8, 0xac, 0xc8, 0x52, 0xb7, 0xf1, 0x14, 0x03, 0xba, 0x0b, 0xab, 0x47, - 0xfd, 0x01, 0x69, 0x9e, 0x0c, 0x3b, 0x5c, 0xc2, 0x22, 0x93, 0x70, 0x51, 0x48, 0xb8, 0xa7, 0xee, - 0xe1, 0x34, 0x14, 0x1d, 0xc2, 0x85, 0x2e, 0x79, 0x38, 0xee, 0xf5, 0xfa, 0xc3, 0x9e, 0xe9, 0x0f, - 0x23, 0xaf, 0x3f, 0x24, 0x41, 0x58, 0x5a, 0x62, 0xfe, 0x5c, 0x8b, 0x03, 0x31, 0x89, 0xb0, 0x1e, - 0x93, 0x61, 0x84, 0x67, 0xb1, 0xa2, 0xe7, 0xa1, 0x70, 0x4c, 0x22, 0xaf, 0xeb, 0x45, 0x5e, 0xa9, - 0xc0, 0x0c, 0x39, 0x27, 0xc4, 0x1c, 0x08, 0x32, 0x8e, 0x01, 0xe5, 0x26, 0x5c, 0x98, 0x11, 0x26, - 0x9a, 0x04, 0x8f, 0xc8, 0x09, 0x3b, 0xc2, 0x3c, 0xa6, 0x3f, 0xd1, 0x26, 0xe4, 0x1f, 0x7b, 0x83, - 0xb1, 0x3c, 0x22, 0x5d, 0x88, 0xa4, 0x3c, 0xdc, 0x16, 0xbe, 0x7d, 0x37, 0xfb, 0x72, 0xe6, 0x7e, - 0xae, 0xa0, 0xe9, 0x39, 0xe3, 0x2f, 0x19, 0x28, 0x48, 0x8d, 0x68, 0x0b, 0xf2, 0xec, 0xd4, 0x45, - 0x56, 0x5c, 0x54, 0xb3, 0x22, 0x36, 0x8b, 0x43, 0xd0, 0xa7, 0x61, 0x91, 0x1f, 0xb6, 0xd0, 0xb5, - 0x9e, 0x4a, 0x87, 0x18, 0x2d, 0x40, 0xe8, 0x8b, 0x00, 0x5e, 0xb7, 0xdb, 0xa7, 0x57, 0xc8, 0x1b, - 0x94, 0x3a, 0x2c, 0x70, 0xd7, 0x27, 0x3c, 0xde, 0xae, 0xc4, 0x08, 0x9e, 0x07, 0x0a, 0x4b, 0xf9, - 0x55, 0x38, 0x37, 0xb1, 0xad, 0xfa, 0x5f, 0xe4, 0xfe, 0x5f, 0x54, 0xfd, 0x2f, 0x2a, 0xde, 0x1a, - 0x1f, 0x65, 0x61, 0x35, 0xe5, 0x07, 0x7a, 0x01, 0xce, 0x0f, 0xc7, 0xc7, 0x0f, 0x49, 0xd0, 0x38, - 0xaa, 0x04, 0x51, 0xff, 0xc8, 0xeb, 0x44, 0xa1, 0x88, 0xe5, 0xf4, 0x06, 0x7a, 0x15, 0x0a, 0xcc, - 0x6f, 0x7a, 0xec, 0x59, 0x66, 0xfd, 0x33, 0xb3, 0xa2, 0xb3, 0x6d, 0x1f, 0x7b, 0x3d, 0xb2, 0xcb, - 0x91, 0x38, 0x66, 0x41, 0x37, 0x20, 0x17, 0x9d, 0x8c, 0x48, 0x49, 0xdb, 0xc8, 0xdc, 0x5a, 0x8b, - 0xcf, 0x85, 0xe1, 0xdc, 0x93, 0x11, 0xc1, 0x6c, 0x17, 0x55, 0x67, 0x04, 0xe9, 0xc6, 0x4c, 0x35, - 0x4f, 0x8a, 0x54, 0x1d, 0x56, 0x54, 0x2b, 0xd0, 0xa6, 0xd0, 0x9d, 0x61, 0xba, 0x91, 0x2a, 0x8f, - 0x04, 0x8a, 0xf6, 0x8b, 0x90, 0xef, 0xf8, 0xe3, 0x61, 0xc4, 0x82, 0x97, 0xc7, 0x7c, 0xf1, 0x49, - 0xe3, 0xfe, 0xdb, 0x0c, 0xac, 0xa5, 0x53, 0x02, 0xbd, 0x02, 0x45, 0x9e, 0x14, 0x34, 0x96, 0x99, - 0x89, 0x2b, 0xa4, 0x22, 0xc5, 0x92, 0x04, 0x38, 0x61, 0x40, 0x2f, 0xc0, 0x52, 0x67, 0x30, 0x0e, - 0x23, 0x12, 0x30, 0x65, 0x89, 0x43, 0x26, 0xa7, 0x32, 0x87, 0x24, 0xa4, 0x6c, 0x43, 0x41, 0x0a, - 0x41, 0xcf, 0xa6, 0xe2, 0x70, 0x21, 0xa5, 0xf2, 0xf4, 0x40, 0x18, 0xef, 0x66, 0x00, 0x92, 0xfa, - 0x88, 0xbe, 0x00, 0x45, 0x4f, 0x49, 0x1b, 0xb5, 0xb0, 0x25, 0xa8, 0xed, 0x38, 0x81, 0xf8, 0x31, - 0x25, 0x2c, 0x68, 0x03, 0x96, 0xbd, 0x71, 0xe4, 0xbb, 0x41, 0xbf, 0xd7, 0x13, 0xbe, 0x14, 0xb0, - 0x4a, 0x2a, 0xbf, 0x02, 0x6b, 0x69, 0xf6, 0x33, 0x05, 0x7e, 0x0f, 0x96, 0x95, 0xca, 0x8c, 0x2e, - 0xc1, 0x22, 0xaf, 0x88, 0x82, 0x5b, 0xac, 0x4e, 0x37, 0xc3, 0x78, 0x2f, 0x03, 0xfa, 0x64, 0x79, - 0x9d, 0x2b, 0xae, 0x0a, 0xc5, 0x80, 0x84, 0xfe, 0x38, 0xe8, 0x10, 0x79, 0x4f, 0x36, 0xe7, 0x94, - 0xe8, 0x6d, 0x2c, 0x81, 0x22, 0x36, 0x31, 0x23, 0xf5, 0x3c, 0xbd, 0x79, 0x26, 0xcf, 0x6d, 0x58, - 0x4d, 0x15, 0xf3, 0x4f, 0xe0, 0xfb, 0x9f, 0x73, 0x90, 0x67, 0x85, 0x13, 0xbd, 0x08, 0x45, 0x5a, - 0x8e, 0xd9, 0x42, 0x94, 0x47, 0x5d, 0x29, 0x5f, 0x8c, 0x5e, 0x5b, 0xc0, 0x09, 0x08, 0xdd, 0x11, - 0x7d, 0x96, 0xb3, 0x64, 0xa7, 0xfb, 0xac, 0xe4, 0x51, 0x60, 0xe8, 0xb3, 0xb2, 0xd3, 0x72, 0x2e, - 0x6d, 0x46, 0xa7, 0x95, 0x6c, 0x2a, 0x90, 0x9a, 0x37, 0x92, 0x45, 0xbe, 0x94, 0x9b, 0x5d, 0xfc, - 0xa9, 0x79, 0x31, 0x08, 0x59, 0xa9, 0x9e, 0xca, 0x19, 0xe7, 0xf6, 0x54, 0xc9, 0x3f, 0xc5, 0x82, - 0xbe, 0x0c, 0x25, 0x79, 0x6e, 0x93, 0x78, 0xd1, 0x60, 0x65, 0x95, 0xc7, 0x73, 0x60, 0xb5, 0x05, - 0x3c, 0x57, 0x04, 0x7a, 0x25, 0x69, 0xda, 0x5c, 0xe6, 0xd2, 0xcc, 0xa6, 0x2d, 0x05, 0xa5, 0xc1, - 0xe8, 0x0d, 0xb8, 0xdc, 0x9d, 0xdd, 0x94, 0x45, 0xcf, 0x3d, 0xa5, 0x75, 0xd7, 0x16, 0xf0, 0x3c, - 0x01, 0xe8, 0x73, 0xb0, 0xd2, 0x25, 0x8f, 0xeb, 0xbe, 0x3f, 0xe2, 0x02, 0x8b, 0x4c, 0x60, 0x52, - 0x55, 0x92, 0xad, 0xda, 0x02, 0x4e, 0x41, 0x77, 0x57, 0x00, 0x08, 0xfd, 0xd1, 0xa6, 0xd5, 0xc6, - 0x18, 0xc0, 0x8a, 0x8a, 0x46, 0x57, 0xa1, 0xd8, 0x8f, 0x48, 0xc0, 0xa6, 0x4d, 0xd1, 0x8f, 0x12, - 0x82, 0x92, 0xcb, 0xd9, 0x54, 0x2e, 0x6f, 0x82, 0x46, 0x82, 0x40, 0x24, 0x8c, 0x0c, 0x4f, 0xa5, - 0xc3, 0xca, 0xf6, 0xc3, 0x01, 0xb1, 0x82, 0x00, 0x53, 0x80, 0xf1, 0x8d, 0x0c, 0xac, 0xa6, 0xc8, - 0xe8, 0x79, 0x58, 0x22, 0x41, 0x60, 0xfa, 0x5d, 0x59, 0x19, 0xcf, 0xa7, 0xcf, 0xdf, 0xef, 0x12, - 0x2c, 0x11, 0xa8, 0x04, 0x4b, 0xc7, 0x24, 0x0c, 0xbd, 0x9e, 0xbc, 0x77, 0x72, 0x89, 0xee, 0xc0, - 0x72, 0x38, 0xee, 0xf5, 0x48, 0xc8, 0xa6, 0xe4, 0x92, 0xc6, 0xee, 0x7e, 0x2c, 0x2a, 0xde, 0xc1, - 0x2a, 0xca, 0x70, 0xa0, 0x18, 0xdf, 0x1e, 0x7a, 0xa3, 0x09, 0xbd, 0xec, 0xe2, 0x96, 0xf2, 0x45, - 0x6a, 0x50, 0xca, 0x9e, 0x32, 0x28, 0x19, 0xbf, 0x94, 0x35, 0x9a, 0x4b, 0x2c, 0x43, 0x41, 0x16, - 0x5c, 0x21, 0x34, 0x5e, 0xcf, 0x0d, 0xa4, 0x9e, 0x04, 0xb2, 0xc8, 0x42, 0xa6, 0x06, 0x28, 0x77, - 0x6a, 0x80, 0xee, 0xc2, 0xaa, 0xa7, 0x86, 0x57, 0xdc, 0xa9, 0xd9, 0x27, 0x92, 0x86, 0x1a, 0x3f, - 0xce, 0xc8, 0x9a, 0xcd, 0xcd, 0x9f, 0x57, 0xb7, 0x84, 0x89, 0xd9, 0x99, 0x26, 0x6a, 0x67, 0x37, - 0x31, 0xf7, 0xf1, 0x4d, 0x7c, 0x3f, 0xdd, 0x0c, 0x9e, 0x6c, 0xe7, 0xfc, 0x64, 0xf9, 0x3f, 0x06, - 0xf9, 0xaf, 0x19, 0x28, 0xcd, 0x2b, 0x45, 0x34, 0x61, 0x64, 0x29, 0x92, 0x09, 0x23, 0xd7, 0x73, - 0x13, 0x46, 0xf1, 0x52, 0x9b, 0xe9, 0x65, 0x2e, 0xf1, 0xf2, 0x36, 0x40, 0x18, 0xfb, 0xc3, 0xac, - 0x9e, 0xe9, 0xa8, 0x02, 0x9a, 0xf6, 0x75, 0xf1, 0xe3, 0xfb, 0xfa, 0x93, 0x2c, 0x14, 0xe3, 0xf2, - 0x4f, 0x0b, 0xcb, 0xc0, 0xef, 0x78, 0x03, 0x4a, 0x91, 0x85, 0x25, 0x26, 0xa0, 0x6b, 0x00, 0x01, - 0x39, 0xf6, 0x23, 0xc2, 0xb6, 0xf9, 0xe4, 0xa3, 0x50, 0xa8, 0x9b, 0x23, 0xbf, 0xeb, 0xd0, 0xef, - 0x4a, 0xe1, 0xa6, 0x58, 0xa2, 0x1b, 0xb0, 0xda, 0x91, 0xb5, 0x91, 0xed, 0x73, 0x87, 0xd3, 0x44, - 0xaa, 0x9d, 0x7e, 0x88, 0x86, 0x23, 0xaf, 0xc3, 0x3d, 0x2f, 0xe2, 0x84, 0x40, 0x03, 0x4f, 0x5b, - 0x13, 0x63, 0x5f, 0xe4, 0x81, 0x97, 0x6b, 0x64, 0xc0, 0x8a, 0x3c, 0x04, 0x3a, 0xa4, 0xb1, 0x16, - 0x50, 0xc4, 0x29, 0x9a, 0x8a, 0x61, 0x32, 0x0a, 0x69, 0x0c, 0x93, 0x53, 0x82, 0x25, 0xaf, 0xdb, - 0x0d, 0x48, 0x18, 0xb2, 0x62, 0x5d, 0xc4, 0x72, 0x69, 0xfc, 0x31, 0x93, 0x8c, 0x0c, 0x71, 0xac, - 0x68, 0x2b, 0x31, 0xd9, 0x18, 0x28, 0x62, 0x15, 0x13, 0x68, 0xa5, 0xea, 0x1f, 0x27, 0x69, 0xcd, - 0x17, 0x4a, 0x82, 0x68, 0xb3, 0xae, 0x6b, 0x6e, 0x66, 0xb2, 0xe7, 0xcf, 0x9e, 0xec, 0x67, 0x48, - 0x80, 0x0f, 0xb3, 0x70, 0x79, 0x4e, 0x6f, 0x7b, 0xd2, 0xad, 0x95, 0x07, 0x9d, 0x3d, 0xe5, 0xa0, - 0xb5, 0x53, 0x0f, 0x3a, 0x37, 0xe3, 0xa0, 0xe3, 0x92, 0x9c, 0x9f, 0x28, 0xc9, 0x25, 0x58, 0x0a, - 0xc6, 0xc3, 0xa8, 0x1f, 0xe7, 0x80, 0x5c, 0xd2, 0xe4, 0x7c, 0xcb, 0x0f, 0x1e, 0xf5, 0x87, 0xbd, - 0x6a, 0x3f, 0x10, 0x09, 0xa0, 0x50, 0x90, 0x03, 0xc0, 0xfa, 0x34, 0x7f, 0x66, 0x28, 0xb0, 0xde, - 0xb3, 0xfd, 0xe4, 0xde, 0xce, 0xe9, 0xca, 0xa3, 0x83, 0x22, 0x81, 0x7e, 0xf4, 0x4c, 0x6c, 0x9f, - 0x36, 0x81, 0xae, 0xaa, 0x13, 0xe8, 0xd7, 0xa0, 0x50, 0xf7, 0x7b, 0x9c, 0xef, 0x65, 0x28, 0xc6, - 0x4f, 0x43, 0x62, 0x70, 0x2c, 0x6f, 0xf3, 0xb7, 0xa1, 0x6d, 0xf9, 0x36, 0xb4, 0xed, 0x4a, 0x04, - 0x4e, 0xc0, 0xc8, 0x80, 0x3c, 0x51, 0x66, 0x47, 0xf9, 0x26, 0x24, 0x3e, 0xe4, 0x49, 0xba, 0x67, - 0x6a, 0x4a, 0xcf, 0x34, 0xee, 0xc2, 0xf9, 0x56, 0x48, 0x02, 0x7b, 0x18, 0x51, 0xa8, 0x78, 0x15, - 0xba, 0x09, 0x8b, 0x7d, 0x46, 0x10, 0x56, 0xac, 0x0a, 0x79, 0x02, 0x25, 0x36, 0x8d, 0xcf, 0xc3, - 0x9a, 0x98, 0x7e, 0x25, 0xe3, 0x73, 0xe9, 0xb7, 0x29, 0x39, 0xe2, 0x08, 0x54, 0xea, 0x89, 0xea, - 0x36, 0xac, 0xa8, 0x64, 0x54, 0x86, 0x25, 0xc2, 0x92, 0x91, 0x3f, 0x29, 0x14, 0x6a, 0x0b, 0x58, - 0x12, 0x76, 0xf3, 0xa0, 0x3d, 0xf6, 0x06, 0xc6, 0x7d, 0x58, 0xe4, 0x16, 0x50, 0x5f, 0x92, 0xd7, - 0x87, 0x82, 0x7c, 0x67, 0x40, 0x90, 0x0b, 0x4f, 0x86, 0x1d, 0x31, 0x9d, 0xb3, 0xdf, 0x34, 0x75, - 0xc5, 0xdb, 0x83, 0xc6, 0xa8, 0x62, 0x65, 0x74, 0x00, 0x92, 0x49, 0x03, 0xbd, 0x0a, 0x6b, 0xc9, - 0xac, 0xa1, 0xcc, 0x37, 0xeb, 0x53, 0x43, 0x09, 0xbb, 0x70, 0x13, 0x60, 0xaa, 0x84, 0x5f, 0x26, - 0x59, 0xef, 0xf9, 0x6a, 0xcb, 0x87, 0x65, 0xe5, 0xdb, 0x19, 0x95, 0xe0, 0x62, 0xcb, 0xd9, 0x77, - 0x1a, 0xaf, 0x3b, 0xed, 0xdd, 0x96, 0x5d, 0xaf, 0x5a, 0xb8, 0xed, 0x3e, 0x38, 0xb4, 0xf4, 0x05, - 0xb4, 0x04, 0xda, 0x7d, 0x7b, 0x57, 0xcf, 0xa0, 0x22, 0xe4, 0x77, 0x2b, 0x6f, 0x58, 0x75, 0x3d, - 0x8b, 0xd6, 0x00, 0x18, 0xea, 0xb0, 0x62, 0xee, 0x37, 0x75, 0x0d, 0x01, 0x2c, 0x9a, 0xad, 0xa6, - 0xdb, 0x38, 0xd0, 0x73, 0xf4, 0xf7, 0x7e, 0xc5, 0xb1, 0xf7, 0x1b, 0x7a, 0x9e, 0xfe, 0xae, 0x36, - 0xcc, 0x7d, 0x0b, 0xeb, 0x8b, 0x5b, 0x55, 0x28, 0xc6, 0x0f, 0x05, 0xe8, 0x12, 0xa0, 0x94, 0x3a, - 0xa9, 0x6c, 0x19, 0x96, 0xcc, 0x7a, 0xab, 0xe9, 0x5a, 0x58, 0xcf, 0x50, 0xcd, 0x7b, 0xe6, 0xae, - 0x9e, 0xa5, 0x9a, 0xeb, 0x0d, 0xb3, 0x52, 0xd7, 0xb5, 0xad, 0x06, 0x1d, 0x33, 0x93, 0x4f, 0x5d, - 0xf4, 0x14, 0xac, 0x4b, 0x41, 0x55, 0xeb, 0xb0, 0xde, 0x78, 0x90, 0x18, 0x5e, 0x80, 0x5c, 0xcd, - 0xaa, 0x1f, 0xe8, 0x19, 0xb4, 0x0a, 0xc5, 0x7d, 0x66, 0x9e, 0xfd, 0x86, 0xa5, 0x67, 0xa9, 0x92, - 0xfd, 0xd6, 0xae, 0x65, 0xba, 0x54, 0xa0, 0x0d, 0xcb, 0xca, 0x27, 0xb7, 0x1a, 0x07, 0x61, 0x88, - 0x14, 0xb7, 0x02, 0x85, 0x03, 0xdb, 0xb1, 0x29, 0xa7, 0xb0, 0x6d, 0xdf, 0xe2, 0xb6, 0x35, 0xdc, - 0x9a, 0x85, 0x75, 0x6d, 0xeb, 0x47, 0x45, 0x80, 0xa4, 0xf4, 0xa1, 0x45, 0xc8, 0x36, 0xf6, 0xf5, - 0x05, 0x54, 0x82, 0x0b, 0x4d, 0xb7, 0xe2, 0xb6, 0x9a, 0x66, 0xcd, 0x32, 0xf7, 0xdb, 0xcd, 0x96, - 0x69, 0x5a, 0xcd, 0xa6, 0xfe, 0xbb, 0x0c, 0x42, 0xb0, 0xca, 0xbd, 0x97, 0xb4, 0xdf, 0x67, 0xd0, - 0x55, 0x28, 0x71, 0xda, 0x61, 0xab, 0x59, 0x6b, 0x57, 0x18, 0xbd, 0x5d, 0xb5, 0x1c, 0xdb, 0xaa, - 0xea, 0x04, 0x5d, 0x81, 0xcb, 0x62, 0x17, 0x37, 0xee, 0x5b, 0xa6, 0xdb, 0x76, 0x1a, 0x6e, 0xfb, - 0x5e, 0xa3, 0xe5, 0x54, 0xf5, 0x23, 0x74, 0x1d, 0xca, 0xaa, 0x22, 0xfb, 0xa0, 0xb2, 0x67, 0xb5, - 0x0f, 0x5b, 0xf5, 0x7a, 0xdb, 0xc2, 0x58, 0x7f, 0x37, 0x8b, 0x3e, 0x05, 0xd7, 0x54, 0x80, 0xd9, - 0x70, 0xdc, 0x8a, 0xed, 0x58, 0xb8, 0x6d, 0x62, 0xab, 0xe2, 0xda, 0xce, 0x9e, 0xfe, 0xd3, 0x2c, - 0x32, 0xe0, 0x69, 0x15, 0x84, 0x5b, 0x8e, 0x02, 0xa4, 0x82, 0xde, 0xcb, 0xa2, 0x9b, 0xb0, 0x31, - 0x5b, 0x90, 0x6b, 0xe1, 0x03, 0xdb, 0xa9, 0xb8, 0x56, 0x55, 0xff, 0x59, 0x16, 0x3d, 0x0f, 0x9b, - 0x2a, 0x8c, 0x1f, 0xd0, 0x81, 0xe5, 0xb8, 0x6d, 0xdc, 0xa8, 0xd7, 0x1b, 0x2d, 0xb7, 0x7d, 0x68, - 0x39, 0x55, 0xaa, 0xf7, 0xe7, 0x4f, 0x90, 0x89, 0xad, 0xa6, 0x5b, 0xc1, 0xcc, 0xbc, 0x0f, 0xa6, - 0x60, 0x4e, 0xa3, 0x6a, 0xb5, 0x0f, 0xac, 0x83, 0x06, 0x7e, 0xd0, 0x3e, 0xc4, 0x56, 0xb3, 0xd9, - 0xc2, 0x96, 0xfe, 0x4d, 0x6d, 0xd2, 0x55, 0x06, 0xab, 0xda, 0xcd, 0xfd, 0x04, 0xf4, 0x2d, 0x0d, - 0x3d, 0x07, 0x37, 0xa6, 0x40, 0x8e, 0xe5, 0xbe, 0xde, 0xc0, 0xfb, 0xed, 0x96, 0x53, 0x79, 0xad, - 0x62, 0xd7, 0x2b, 0xbb, 0x75, 0x4b, 0xff, 0xb6, 0x36, 0x19, 0x15, 0x06, 0x3d, 0xb4, 0xab, 0x89, - 0xb8, 0xb7, 0x67, 0xeb, 0x6c, 0x39, 0x74, 0x55, 0x6d, 0x71, 0x41, 0xdf, 0xd1, 0xd0, 0x33, 0x70, - 0x75, 0x06, 0x08, 0x5b, 0x15, 0xb3, 0xc6, 0x20, 0xef, 0x68, 0x93, 0xe7, 0xc8, 0xcd, 0x6a, 0xb8, - 0x6d, 0x6c, 0x55, 0xaa, 0x0f, 0xf4, 0xef, 0x4e, 0x19, 0x73, 0xaf, 0x62, 0xd7, 0xad, 0x6a, 0x5b, - 0x28, 0xa2, 0x71, 0xfa, 0x9e, 0x86, 0xca, 0xb0, 0xae, 0x62, 0x5a, 0x4e, 0xcd, 0xaa, 0xd4, 0xdd, - 0xda, 0x03, 0xfd, 0xfb, 0x1a, 0x7a, 0x16, 0x0c, 0x75, 0x4f, 0x5c, 0x06, 0x1a, 0x72, 0xc7, 0x32, - 0x5d, 0xbb, 0xe1, 0xb0, 0x73, 0xfe, 0xc1, 0x94, 0x47, 0x12, 0x48, 0x1d, 0xdf, 0xb7, 0xeb, 0x75, - 0xab, 0xaa, 0xff, 0x50, 0xa3, 0x59, 0x2c, 0xaf, 0x8c, 0x85, 0x71, 0x03, 0xeb, 0x1f, 0x6a, 0x93, - 0x39, 0x2f, 0xf6, 0xf5, 0x8f, 0x34, 0xb4, 0x09, 0xcf, 0xcc, 0xd8, 0x99, 0x88, 0xd3, 0xdf, 0x34, - 0xb4, 0x05, 0x37, 0x67, 0xa7, 0xc3, 0xeb, 0x15, 0x9b, 0xe6, 0x42, 0x2c, 0xf3, 0xef, 0x1a, 0xba, - 0x06, 0x4f, 0xcd, 0x92, 0x69, 0xbd, 0x66, 0x39, 0xae, 0xfe, 0x5f, 0x0d, 0x5d, 0x80, 0x35, 0x9e, - 0x7b, 0x31, 0xd3, 0x3f, 0x34, 0x74, 0x1e, 0x56, 0x9a, 0x0f, 0x1c, 0x33, 0x26, 0xfd, 0x53, 0x4b, - 0xee, 0xa3, 0xa4, 0xfd, 0x4b, 0x43, 0x17, 0xe1, 0x5c, 0xd5, 0x7a, 0xcd, 0x76, 0x6c, 0x37, 0xa6, - 0xfe, 0x9b, 0x51, 0xcd, 0xba, 0x55, 0x71, 0x5a, 0x87, 0x31, 0xf5, 0x3f, 0x8c, 0xca, 0x44, 0x32, - 0x34, 0x8f, 0xc5, 0x9f, 0x72, 0x68, 0x03, 0xae, 0x48, 0x09, 0xd8, 0xda, 0xb3, 0x59, 0x4d, 0xe1, - 0x6a, 0xaa, 0xd6, 0x61, 0x53, 0xff, 0x55, 0x9e, 0x1e, 0xf8, 0x14, 0xc2, 0xb5, 0x9a, 0x2e, 0x07, - 0xfc, 0x3a, 0x4f, 0x93, 0x66, 0x0a, 0x20, 0x3c, 0x62, 0x90, 0xf7, 0xf3, 0x33, 0xb5, 0x98, 0x0d, - 0xe7, 0x9e, 0xbd, 0x47, 0x21, 0xfa, 0x6f, 0xf2, 0x5b, 0x4f, 0xc1, 0x5a, 0xba, 0x57, 0xd0, 0x22, - 0xe6, 0xd8, 0x75, 0x7d, 0xe1, 0xa5, 0x5f, 0xe4, 0xe1, 0x5c, 0x53, 0xfc, 0xfb, 0xa8, 0x49, 0x82, - 0xc7, 0xfd, 0x0e, 0x41, 0x26, 0x14, 0xf6, 0x48, 0x24, 0x9e, 0x9e, 0xa6, 0x5a, 0xbd, 0x75, 0x3c, - 0x8a, 0x4e, 0xca, 0xa9, 0x7f, 0xf0, 0x18, 0xe7, 0xbf, 0xfe, 0x87, 0x0f, 0xde, 0xce, 0x2e, 0xa3, - 0xe2, 0xce, 0xe3, 0xdb, 0x3b, 0xac, 0x93, 0xa2, 0x3d, 0x28, 0xb0, 0x46, 0x5f, 0xf7, 0x7b, 0x48, - 0x7e, 0xf0, 0xca, 0x99, 0xa2, 0x3c, 0x49, 0x30, 0xd6, 0x99, 0x80, 0x73, 0x68, 0x95, 0x0a, 0xe0, - 0x6f, 0x0b, 0x03, 0xbf, 0x77, 0x2b, 0xf3, 0x62, 0x06, 0xed, 0xc1, 0x22, 0x13, 0x14, 0xce, 0xb5, - 0x65, 0x4a, 0x1a, 0x62, 0xd2, 0x56, 0x10, 0xc4, 0xd2, 0xc2, 0x17, 0x33, 0xe8, 0x4b, 0xb0, 0x64, - 0x7d, 0x95, 0x74, 0xc6, 0x11, 0x41, 0x25, 0xc1, 0x31, 0x35, 0x64, 0x94, 0xe7, 0xe8, 0x30, 0xae, - 0x30, 0x91, 0xeb, 0xc6, 0x32, 0x13, 0xc9, 0xc5, 0xdc, 0x15, 0x23, 0x07, 0xf2, 0xa0, 0x58, 0x19, - 0x47, 0x3e, 0x6b, 0x72, 0x68, 0x3d, 0x3d, 0x5e, 0x9c, 0x26, 0xf8, 0x26, 0x13, 0x7c, 0xbd, 0x7c, - 0x89, 0x0a, 0x66, 0x13, 0xc3, 0x8e, 0x37, 0x8e, 0xfc, 0xb6, 0xd4, 0xc1, 0x07, 0x13, 0xd4, 0x86, - 0x02, 0x55, 0x41, 0x07, 0xfc, 0xb3, 0x6a, 0xb8, 0xc1, 0x34, 0x5c, 0x2b, 0xaf, 0xb3, 0xc3, 0x39, - 0x19, 0x76, 0x66, 0x2a, 0xe8, 0x00, 0x50, 0x05, 0xbc, 0xc5, 0x9e, 0x55, 0xc5, 0x26, 0x53, 0xb1, - 0x51, 0xbe, 0x4c, 0x55, 0xf0, 0x59, 0x66, 0xa6, 0x92, 0x3a, 0x2c, 0xd6, 0xbc, 0x61, 0x77, 0x40, - 0x50, 0x6a, 0x18, 0x9c, 0x2b, 0xf7, 0x2a, 0x93, 0x7b, 0xc9, 0x38, 0x9f, 0x1c, 0xe4, 0xce, 0x9b, - 0x4c, 0xc0, 0xdd, 0xcc, 0xd6, 0xc3, 0x45, 0x86, 0xbe, 0xf3, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xf7, 0xa1, 0x48, 0x69, 0x00, 0x1d, 0x00, 0x00, + // 2635 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0x4d, 0x6c, 0x1b, 0xc7, + 0x15, 0x16, 0xb9, 0x24, 0x45, 0x3e, 0xfd, 0x78, 0x35, 0xb6, 0x6c, 0x86, 0x76, 0x6c, 0x65, 0x6b, + 0x2b, 0x8e, 0x92, 0x4a, 0x71, 0x5c, 0x14, 0xa9, 0x9b, 0xb4, 0xa0, 0x76, 0xc7, 0xe2, 0x5a, 0xd4, + 0x52, 0x18, 0x2e, 0x93, 0x38, 0x40, 0x41, 0xac, 0xc9, 0x15, 0x43, 0x98, 0xe2, 0xb2, 0xbb, 0x4b, + 0xa7, 0xba, 0xf4, 0xd0, 0x6b, 0x2f, 0x6d, 0xd3, 0xf4, 0xef, 0x94, 0x1e, 0x7a, 0x4b, 0xd3, 0x5e, + 0x8b, 0xa2, 0x4d, 0x6f, 0x6d, 0xcf, 0x05, 0x0a, 0xf4, 0x58, 0xc0, 0x3d, 0xf4, 0x9e, 0xf4, 0xbf, + 0x40, 0x31, 0x3f, 0xbb, 0x3b, 0xcb, 0x1f, 0x2b, 0x42, 0x0e, 0x3d, 0x89, 0xf3, 0xe6, 0x7b, 0xbf, + 0xf3, 0xe6, 0xbd, 0xb7, 0x23, 0x58, 0x0d, 0x1e, 0x3a, 0x47, 0x47, 0xde, 0xa0, 0xbb, 0x3d, 0xf2, + 0xbd, 0xd0, 0x43, 0x79, 0xf6, 0xa7, 0x72, 0xa5, 0xe7, 0x79, 0xbd, 0x81, 0xbb, 0xe3, 0x8c, 0xfa, + 0x3b, 0xce, 0x70, 0xe8, 0x85, 0x4e, 0xd8, 0xf7, 0x86, 0x01, 0x07, 0x55, 0xae, 0x89, 0x5d, 0xb6, + 0x7a, 0x30, 0x3e, 0xda, 0x09, 0xfb, 0xc7, 0x6e, 0x10, 0x3a, 0xc7, 0x23, 0x01, 0xb8, 0x3c, 0x09, + 0x70, 0x8f, 0x47, 0xe1, 0x09, 0xdf, 0xd4, 0x6e, 0xc3, 0x4a, 0x33, 0x74, 0x42, 0x97, 0xb8, 0xc1, + 0xc8, 0x1b, 0x06, 0x2e, 0xd2, 0x20, 0x1f, 0x50, 0x42, 0x39, 0xb3, 0x91, 0xb9, 0xb9, 0xf4, 0xd2, + 0x32, 0xc7, 0x6d, 0x73, 0x10, 0xdf, 0xd2, 0xae, 0x40, 0x31, 0xc6, 0xab, 0xa0, 0x1c, 0x07, 0x3d, + 0x86, 0x2e, 0x11, 0xfa, 0x53, 0x7b, 0x1a, 0x16, 0x89, 0xfb, 0xd5, 0xb1, 0x1b, 0x84, 0x08, 0x41, + 0x6e, 0xe8, 0x1c, 0xbb, 0x62, 0x97, 0xfd, 0xd6, 0xde, 0xcd, 0x41, 0x9e, 0x49, 0x43, 0xb7, 0x00, + 0x1e, 0x8c, 0xfb, 0x83, 0x6e, 0x53, 0xd2, 0xb7, 0x26, 0xf4, 0xed, 0xc6, 0x1b, 0x44, 0x02, 0xa1, + 0xcf, 0xc1, 0x52, 0xd7, 0x1d, 0x0d, 0xbc, 0x13, 0xce, 0x93, 0x65, 0x3c, 0x48, 0xf0, 0x18, 0xc9, + 0x0e, 0x91, 0x61, 0xa8, 0x06, 0xab, 0x47, 0x9e, 0xff, 0xb6, 0xe3, 0x77, 0xdd, 0xee, 0xa1, 0xe7, + 0x87, 0x41, 0x39, 0xb7, 0xa1, 0xdc, 0x5c, 0x7a, 0x69, 0x43, 0x76, 0x6e, 0xfb, 0x6e, 0x0a, 0x82, + 0x87, 0xa1, 0x7f, 0x42, 0x26, 0xf8, 0x90, 0x0e, 0x2a, 0x0d, 0xc1, 0x38, 0xd0, 0xdf, 0x72, 0x3b, + 0x0f, 0xb9, 0x11, 0x79, 0x66, 0xc4, 0x25, 0x49, 0x96, 0xbc, 0x4d, 0xa6, 0x18, 0xd0, 0x1d, 0x58, + 0x39, 0xea, 0x0f, 0xdc, 0xe6, 0xc9, 0xb0, 0xc3, 0x25, 0x14, 0x98, 0x84, 0x0b, 0x42, 0xc2, 0x5d, + 0x79, 0x8f, 0xa4, 0xa1, 0xe8, 0x10, 0xce, 0x77, 0xdd, 0x07, 0xe3, 0x5e, 0xaf, 0x3f, 0xec, 0xe9, + 0xde, 0x30, 0x74, 0xfa, 0x43, 0xd7, 0x0f, 0xca, 0x8b, 0xcc, 0x9f, 0xab, 0x71, 0x20, 0x26, 0x11, + 0xf8, 0x91, 0x3b, 0x0c, 0xc9, 0x2c, 0x56, 0xf4, 0x3c, 0x14, 0x8f, 0xdd, 0xd0, 0xe9, 0x3a, 0xa1, + 0x53, 0x2e, 0x32, 0x43, 0xce, 0x09, 0x31, 0x07, 0x82, 0x4c, 0x62, 0x40, 0xa5, 0x09, 0xe7, 0x67, + 0x84, 0x89, 0x26, 0xc1, 0x43, 0xf7, 0x84, 0x1d, 0x61, 0x9e, 0xd0, 0x9f, 0x68, 0x13, 0xf2, 0x8f, + 0x9c, 0xc1, 0x38, 0x3a, 0x22, 0x55, 0x88, 0xa4, 0x3c, 0xdc, 0x16, 0xbe, 0x7d, 0x27, 0xfb, 0x72, + 0xe6, 0x5e, 0xae, 0xa8, 0xa8, 0x39, 0xed, 0x2f, 0x19, 0x28, 0x46, 0x1a, 0xd1, 0x16, 0xe4, 0xd9, + 0xa9, 0x8b, 0xac, 0xb8, 0x20, 0x67, 0x45, 0x6c, 0x16, 0x87, 0xa0, 0xcf, 0x42, 0x81, 0x1f, 0xb6, + 0xd0, 0xb5, 0x9e, 0x4a, 0x87, 0x18, 0x2d, 0x40, 0xe8, 0xcb, 0x00, 0x4e, 0xb7, 0xdb, 0xa7, 0x57, + 0xc8, 0x19, 0x94, 0x3b, 0x2c, 0x70, 0xd7, 0x26, 0x3c, 0xde, 0xae, 0xc6, 0x08, 0x9e, 0x07, 0x12, + 0x4b, 0xe5, 0x55, 0x38, 0x37, 0xb1, 0x2d, 0xfb, 0x5f, 0xe2, 0xfe, 0x5f, 0x90, 0xfd, 0x2f, 0x49, + 0xde, 0x6a, 0x1f, 0x67, 0x61, 0x25, 0xe5, 0x07, 0x7a, 0x01, 0xd6, 0x86, 0xe3, 0xe3, 0x07, 0xae, + 0xdf, 0x38, 0xaa, 0xfa, 0x61, 0xff, 0xc8, 0xe9, 0x84, 0x81, 0x88, 0xe5, 0xf4, 0x06, 0x7a, 0x15, + 0x8a, 0xcc, 0x6f, 0x7a, 0xec, 0x59, 0x66, 0xfd, 0x33, 0xb3, 0xa2, 0xb3, 0x6d, 0x1e, 0x3b, 0x3d, + 0x77, 0x97, 0x23, 0x49, 0xcc, 0x82, 0xae, 0x43, 0x2e, 0x3c, 0x19, 0xb9, 0x65, 0x65, 0x23, 0x73, + 0x73, 0x35, 0x3e, 0x17, 0x86, 0xb3, 0x4f, 0x46, 0x2e, 0x61, 0xbb, 0xc8, 0x98, 0x11, 0xa4, 0xeb, + 0x33, 0xd5, 0x3c, 0x29, 0x52, 0x75, 0x58, 0x96, 0xad, 0x40, 0x9b, 0x42, 0x77, 0x86, 0xe9, 0x46, + 0xb2, 0x3c, 0xd7, 0x97, 0xb4, 0x5f, 0x80, 0x7c, 0xc7, 0x1b, 0x0f, 0x43, 0x16, 0xbc, 0x3c, 0xe1, + 0x8b, 0x4f, 0x1b, 0xf7, 0xdf, 0x66, 0x60, 0x35, 0x9d, 0x12, 0xe8, 0x15, 0x28, 0xf1, 0xa4, 0xa0, + 0xb1, 0xcc, 0x4c, 0x5c, 0x21, 0x19, 0x29, 0x96, 0xae, 0x4f, 0x12, 0x06, 0xf4, 0x02, 0x2c, 0x76, + 0x06, 0xe3, 0x20, 0x74, 0x7d, 0xa6, 0x2c, 0x71, 0x48, 0xe7, 0x54, 0xe6, 0x50, 0x04, 0xa9, 0x98, + 0x50, 0x8c, 0x84, 0xa0, 0x67, 0x53, 0x71, 0x38, 0x9f, 0x52, 0x79, 0x7a, 0x20, 0xb4, 0xf7, 0x33, + 0x00, 0x49, 0x7d, 0x44, 0x5f, 0x82, 0x92, 0x23, 0xa5, 0x8d, 0x5c, 0xd8, 0x12, 0xd4, 0x76, 0x9c, + 0x40, 0xfc, 0x98, 0x12, 0x16, 0xb4, 0x01, 0x4b, 0xce, 0x38, 0xf4, 0x6c, 0xbf, 0xdf, 0xeb, 0x09, + 0x5f, 0x8a, 0x44, 0x26, 0x55, 0x5e, 0x81, 0xd5, 0x34, 0xfb, 0x99, 0x02, 0xbf, 0x07, 0x4b, 0x52, + 0x65, 0x46, 0x17, 0xa1, 0xc0, 0x2b, 0xa2, 0xe0, 0x16, 0xab, 0xd3, 0xcd, 0xd0, 0x3e, 0xc8, 0x80, + 0x3a, 0x59, 0x5e, 0xe7, 0x8a, 0x33, 0xa0, 0xe4, 0xbb, 0x81, 0x37, 0xf6, 0x3b, 0x6e, 0x74, 0x4f, + 0x36, 0xe7, 0x94, 0xe8, 0x6d, 0x12, 0x01, 0x45, 0x6c, 0x62, 0x46, 0xea, 0x79, 0x7a, 0xf3, 0x4c, + 0x9e, 0x9b, 0xb0, 0x92, 0x2a, 0xe6, 0x9f, 0xc2, 0xf7, 0x3f, 0xe7, 0x20, 0xcf, 0x0a, 0x27, 0x7a, + 0x11, 0x4a, 0xb4, 0x1c, 0xb3, 0x85, 0x28, 0x8f, 0xaa, 0x54, 0xbe, 0x18, 0xbd, 0xb6, 0x40, 0x12, + 0x10, 0xba, 0x2d, 0xfa, 0x2c, 0x67, 0xc9, 0x4e, 0xf7, 0xd9, 0x88, 0x47, 0x82, 0xa1, 0xcf, 0x47, + 0x9d, 0x96, 0x73, 0x29, 0x33, 0x3a, 0x6d, 0xc4, 0x26, 0x03, 0xa9, 0x79, 0xa3, 0xa8, 0xc8, 0x97, + 0x73, 0xb3, 0x8b, 0x3f, 0x35, 0x2f, 0x06, 0x21, 0x9c, 0xea, 0xa9, 0x9c, 0x71, 0x6e, 0x4f, 0x8d, + 0xf8, 0xa7, 0x58, 0xd0, 0x57, 0xa0, 0x1c, 0x9d, 0xdb, 0x24, 0x5e, 0x34, 0xd8, 0xa8, 0xca, 0x93, + 0x39, 0xb0, 0xda, 0x02, 0x99, 0x2b, 0x02, 0xbd, 0x92, 0x34, 0x6d, 0x2e, 0x73, 0x71, 0x66, 0xd3, + 0x8e, 0x04, 0xa5, 0xc1, 0xe8, 0x4d, 0xb8, 0xd4, 0x9d, 0xdd, 0x94, 0x45, 0xcf, 0x3d, 0xa5, 0x75, + 0xd7, 0x16, 0xc8, 0x3c, 0x01, 0xe8, 0x0b, 0xb0, 0xdc, 0x75, 0x1f, 0xd5, 0x3d, 0x6f, 0xc4, 0x05, + 0x96, 0x98, 0xc0, 0xa4, 0xaa, 0x24, 0x5b, 0xb5, 0x05, 0x92, 0x82, 0xee, 0x2e, 0x03, 0xb8, 0xf4, + 0x47, 0x9b, 0x56, 0x1b, 0x6d, 0x00, 0xcb, 0x32, 0x1a, 0x5d, 0x81, 0x52, 0x3f, 0x74, 0x7d, 0x36, + 0x6d, 0x8a, 0x7e, 0x94, 0x10, 0xa4, 0x5c, 0xce, 0xa6, 0x72, 0x79, 0x13, 0x14, 0xd7, 0xf7, 0x45, + 0xc2, 0x44, 0xe1, 0xa9, 0x76, 0x58, 0xd9, 0x7e, 0x30, 0x70, 0xb1, 0xef, 0x13, 0x0a, 0xd0, 0xbe, + 0x99, 0x81, 0x95, 0x14, 0x19, 0x3d, 0x0f, 0x8b, 0xae, 0xef, 0xeb, 0x5e, 0x37, 0xaa, 0x8c, 0x6b, + 0xe9, 0xf3, 0xf7, 0xba, 0x2e, 0x89, 0x10, 0xa8, 0x0c, 0x8b, 0xc7, 0x6e, 0x10, 0x38, 0xbd, 0xe8, + 0xde, 0x45, 0x4b, 0x74, 0x1b, 0x96, 0x82, 0x71, 0xaf, 0xe7, 0x06, 0x6c, 0x4a, 0x2e, 0x2b, 0xec, + 0xee, 0xc7, 0xa2, 0xe2, 0x1d, 0x22, 0xa3, 0x34, 0x0b, 0x4a, 0xf1, 0xed, 0xa1, 0x37, 0xda, 0xa5, + 0x97, 0x5d, 0xdc, 0x52, 0xbe, 0x48, 0x0d, 0x4a, 0xd9, 0x53, 0x06, 0x25, 0xed, 0x97, 0x51, 0x8d, + 0xe6, 0x12, 0x2b, 0x50, 0x8c, 0x0a, 0xae, 0x10, 0x1a, 0xaf, 0xe7, 0x06, 0x52, 0x4d, 0x02, 0x59, + 0x62, 0x21, 0x93, 0x03, 0x94, 0x3b, 0x35, 0x40, 0x77, 0x60, 0xc5, 0x91, 0xc3, 0x2b, 0xee, 0xd4, + 0xec, 0x13, 0x49, 0x43, 0xb5, 0xf7, 0x32, 0x51, 0xcd, 0xe6, 0xe6, 0xcf, 0xab, 0x5b, 0xc2, 0xc4, + 0xec, 0x4c, 0x13, 0x95, 0xb3, 0x9b, 0x98, 0xfb, 0xe4, 0x26, 0x7e, 0x98, 0x6e, 0x06, 0x4f, 0xb6, + 0x73, 0x7e, 0xb2, 0xfc, 0x1f, 0x83, 0xfc, 0xd7, 0x0c, 0x94, 0xe7, 0x95, 0x22, 0x9a, 0x30, 0x51, + 0x29, 0x8a, 0x12, 0x26, 0x5a, 0xcf, 0x4d, 0x18, 0xc9, 0x4b, 0x65, 0xa6, 0x97, 0xb9, 0xc4, 0xcb, + 0x5b, 0x00, 0x41, 0xec, 0x0f, 0xb3, 0x7a, 0xa6, 0xa3, 0x12, 0x68, 0xda, 0xd7, 0xc2, 0x27, 0xf7, + 0xf5, 0x27, 0x59, 0x28, 0xc5, 0xe5, 0x9f, 0x16, 0x96, 0x81, 0xd7, 0x71, 0x06, 0x94, 0x12, 0x15, + 0x96, 0x98, 0x80, 0xae, 0x02, 0xf8, 0xee, 0xb1, 0x17, 0xba, 0x6c, 0x9b, 0x4f, 0x3e, 0x12, 0x85, + 0xba, 0x39, 0xf2, 0xba, 0x16, 0xfd, 0xae, 0x14, 0x6e, 0x8a, 0x25, 0xba, 0x0e, 0x2b, 0x9d, 0xa8, + 0x36, 0xb2, 0x7d, 0xee, 0x70, 0x9a, 0x48, 0xb5, 0xd3, 0x0f, 0xd1, 0x60, 0xe4, 0x74, 0xb8, 0xe7, + 0x25, 0x92, 0x10, 0x68, 0xe0, 0x69, 0x6b, 0x62, 0xec, 0x05, 0x1e, 0xf8, 0x68, 0x8d, 0x34, 0x58, + 0x8e, 0x0e, 0x81, 0x0e, 0x69, 0xac, 0x05, 0x94, 0x48, 0x8a, 0x26, 0x63, 0x98, 0x8c, 0x62, 0x1a, + 0xc3, 0xe4, 0x94, 0x61, 0xd1, 0xe9, 0x76, 0x7d, 0x37, 0x08, 0x58, 0xb1, 0x2e, 0x91, 0x68, 0xa9, + 0xfd, 0x31, 0x93, 0x8c, 0x0c, 0x71, 0xac, 0x68, 0x2b, 0xd1, 0xd9, 0x18, 0x28, 0x62, 0x15, 0x13, + 0x68, 0xa5, 0xea, 0x1f, 0x27, 0x69, 0xcd, 0x17, 0x52, 0x82, 0x28, 0xb3, 0xae, 0x6b, 0x6e, 0x66, + 0xb2, 0xe7, 0xcf, 0x9e, 0xec, 0x67, 0x48, 0x80, 0x8f, 0xb2, 0x70, 0x69, 0x4e, 0x6f, 0x7b, 0xd2, + 0xad, 0x8d, 0x0e, 0x3a, 0x7b, 0xca, 0x41, 0x2b, 0xa7, 0x1e, 0x74, 0x6e, 0xc6, 0x41, 0xc7, 0x25, + 0x39, 0x3f, 0x51, 0x92, 0xcb, 0xb0, 0xe8, 0x8f, 0x87, 0x61, 0x3f, 0xce, 0x81, 0x68, 0x49, 0x93, + 0xf3, 0x6d, 0xcf, 0x7f, 0xd8, 0x1f, 0xf6, 0x8c, 0xbe, 0x2f, 0x12, 0x40, 0xa2, 0x20, 0x0b, 0x80, + 0xf5, 0x69, 0xfe, 0xcc, 0x50, 0x64, 0xbd, 0x67, 0xfb, 0xc9, 0xbd, 0x9d, 0xd3, 0xa5, 0x47, 0x07, + 0x49, 0x02, 0xfd, 0xe8, 0x99, 0xd8, 0x3e, 0x6d, 0x02, 0x5d, 0x91, 0x27, 0xd0, 0xaf, 0x43, 0xb1, + 0xee, 0xf5, 0x38, 0xdf, 0xcb, 0x50, 0x8a, 0x9f, 0x86, 0xc4, 0xe0, 0x58, 0xd9, 0xe6, 0x6f, 0x43, + 0xdb, 0xd1, 0xdb, 0xd0, 0xb6, 0x1d, 0x21, 0x48, 0x02, 0x46, 0x1a, 0xe4, 0x5d, 0x69, 0x76, 0x8c, + 0xde, 0x84, 0xc4, 0x87, 0xbc, 0x9b, 0xee, 0x99, 0x8a, 0xd4, 0x33, 0xb5, 0x3b, 0xb0, 0xd6, 0x0a, + 0x5c, 0xdf, 0x1c, 0x86, 0x14, 0x2a, 0x5e, 0x85, 0x6e, 0x40, 0xa1, 0xcf, 0x08, 0xc2, 0x8a, 0x15, + 0x21, 0x4f, 0xa0, 0xc4, 0xa6, 0xf6, 0x45, 0x58, 0x15, 0xd3, 0x6f, 0xc4, 0xf8, 0x5c, 0xfa, 0x6d, + 0x2a, 0x1a, 0x71, 0x04, 0x2a, 0xf5, 0x44, 0x75, 0x0b, 0x96, 0x65, 0x32, 0xaa, 0xc0, 0xa2, 0xcb, + 0x92, 0x91, 0x3f, 0x29, 0x14, 0x6b, 0x0b, 0x24, 0x22, 0xec, 0xe6, 0x41, 0x79, 0xe4, 0x0c, 0xb4, + 0x7b, 0x50, 0xe0, 0x16, 0x50, 0x5f, 0x92, 0xd7, 0x87, 0x62, 0xf4, 0xce, 0x80, 0x20, 0x17, 0x9c, + 0x0c, 0x3b, 0x62, 0x3a, 0x67, 0xbf, 0x69, 0xea, 0x8a, 0xb7, 0x07, 0x85, 0x51, 0xc5, 0x4a, 0xeb, + 0x00, 0x24, 0x93, 0x06, 0x7a, 0x15, 0x56, 0x93, 0x59, 0x43, 0x9a, 0x6f, 0xd6, 0xa7, 0x86, 0x12, + 0x76, 0xe1, 0x26, 0xc0, 0x54, 0x09, 0xbf, 0x4c, 0x51, 0xbd, 0xe7, 0xab, 0x2d, 0x0f, 0x96, 0xa4, + 0x6f, 0x67, 0x54, 0x86, 0x0b, 0x2d, 0x6b, 0xdf, 0x6a, 0xbc, 0x6e, 0xb5, 0x77, 0x5b, 0x66, 0xdd, + 0xc0, 0xa4, 0x6d, 0xdf, 0x3f, 0xc4, 0xea, 0x02, 0x5a, 0x04, 0xe5, 0x9e, 0xb9, 0xab, 0x66, 0x50, + 0x09, 0xf2, 0xbb, 0xd5, 0x37, 0x71, 0x5d, 0xcd, 0xa2, 0x55, 0x00, 0x86, 0x3a, 0xac, 0xea, 0xfb, + 0x4d, 0x55, 0x41, 0x00, 0x05, 0xbd, 0xd5, 0xb4, 0x1b, 0x07, 0x6a, 0x8e, 0xfe, 0xde, 0xaf, 0x5a, + 0xe6, 0x7e, 0x43, 0xcd, 0xd3, 0xdf, 0x46, 0x43, 0xdf, 0xc7, 0x44, 0x2d, 0x6c, 0x19, 0x50, 0x8a, + 0x1f, 0x0a, 0xd0, 0x45, 0x40, 0x29, 0x75, 0x91, 0xb2, 0x25, 0x58, 0xd4, 0xeb, 0xad, 0xa6, 0x8d, + 0x89, 0x9a, 0xa1, 0x9a, 0xf7, 0xf4, 0x5d, 0x35, 0x4b, 0x35, 0xd7, 0x1b, 0x7a, 0xb5, 0xae, 0x2a, + 0x5b, 0x0d, 0x3a, 0x66, 0x26, 0x9f, 0xba, 0xe8, 0x29, 0x58, 0x8f, 0x04, 0x19, 0xf8, 0xb0, 0xde, + 0xb8, 0x9f, 0x18, 0x5e, 0x84, 0x5c, 0x0d, 0xd7, 0x0f, 0xd4, 0x0c, 0x5a, 0x81, 0xd2, 0x3e, 0x33, + 0xcf, 0x7c, 0x13, 0xab, 0x59, 0xaa, 0x64, 0xbf, 0xb5, 0x8b, 0x75, 0x9b, 0x0a, 0x34, 0x61, 0x49, + 0xfa, 0xe4, 0x96, 0xe3, 0x20, 0x0c, 0x89, 0xc4, 0x2d, 0x43, 0xf1, 0xc0, 0xb4, 0x4c, 0xca, 0x29, + 0x6c, 0xdb, 0xc7, 0xdc, 0xb6, 0x86, 0x5d, 0xc3, 0x44, 0x55, 0xb6, 0x1e, 0x97, 0x00, 0x92, 0xd2, + 0x87, 0x0a, 0x90, 0x6d, 0xec, 0xab, 0x0b, 0xa8, 0x0c, 0xe7, 0x9b, 0x76, 0xd5, 0x6e, 0x35, 0xf5, + 0x1a, 0xd6, 0xf7, 0xdb, 0xcd, 0x96, 0xae, 0xe3, 0x66, 0x53, 0xfd, 0x5d, 0x06, 0x21, 0x58, 0xe1, + 0xde, 0x47, 0xb4, 0xdf, 0x67, 0xd0, 0x15, 0x28, 0x73, 0xda, 0x61, 0xab, 0x59, 0x6b, 0x57, 0x19, + 0xbd, 0x6d, 0x60, 0xcb, 0xc4, 0x86, 0xea, 0xa2, 0xcb, 0x70, 0x49, 0xec, 0x92, 0xc6, 0x3d, 0xac, + 0xdb, 0x6d, 0xab, 0x61, 0xb7, 0xef, 0x36, 0x5a, 0x96, 0xa1, 0x1e, 0xa1, 0x6b, 0x50, 0x91, 0x15, + 0x99, 0x07, 0xd5, 0x3d, 0xdc, 0x3e, 0x6c, 0xd5, 0xeb, 0x6d, 0x4c, 0x88, 0xfa, 0x7e, 0x16, 0x7d, + 0x06, 0xae, 0xca, 0x00, 0xbd, 0x61, 0xd9, 0x55, 0xd3, 0xc2, 0xa4, 0xad, 0x13, 0x5c, 0xb5, 0x4d, + 0x6b, 0x4f, 0xfd, 0x69, 0x16, 0x69, 0xf0, 0xb4, 0x0c, 0x22, 0x2d, 0x4b, 0x02, 0x52, 0x41, 0x1f, + 0x64, 0xd1, 0x0d, 0xd8, 0x98, 0x2d, 0xc8, 0xc6, 0xe4, 0xc0, 0xb4, 0xaa, 0x36, 0x36, 0xd4, 0x9f, + 0x65, 0xd1, 0xf3, 0xb0, 0x29, 0xc3, 0xf8, 0x01, 0x1d, 0x60, 0xcb, 0x6e, 0x93, 0x46, 0xbd, 0xde, + 0x68, 0xd9, 0xed, 0x43, 0x6c, 0x19, 0x54, 0xef, 0xcf, 0x9f, 0x20, 0x93, 0xe0, 0xa6, 0x5d, 0x25, + 0xcc, 0xbc, 0xc7, 0x53, 0x30, 0xab, 0x61, 0xe0, 0xf6, 0x01, 0x3e, 0x68, 0x90, 0xfb, 0xed, 0x43, + 0x82, 0x9b, 0xcd, 0x16, 0xc1, 0xea, 0xb7, 0x94, 0x49, 0x57, 0x19, 0xcc, 0x30, 0x9b, 0xfb, 0x09, + 0xe8, 0xdb, 0x0a, 0x7a, 0x0e, 0xae, 0x4f, 0x81, 0x2c, 0x6c, 0xbf, 0xde, 0x20, 0xfb, 0xed, 0x96, + 0x55, 0x7d, 0xad, 0x6a, 0xd6, 0xab, 0xbb, 0x75, 0xac, 0x7e, 0x47, 0x99, 0x8c, 0x0a, 0x83, 0x1e, + 0x9a, 0x46, 0x22, 0xee, 0x9d, 0xd9, 0x3a, 0x5b, 0x16, 0x5d, 0x19, 0x2d, 0x2e, 0xe8, 0xbb, 0x0a, + 0x7a, 0x06, 0xae, 0xcc, 0x00, 0x11, 0x5c, 0xd5, 0x6b, 0x0c, 0xf2, 0xae, 0x32, 0x79, 0x8e, 0xdc, + 0xac, 0x86, 0xdd, 0x26, 0xb8, 0x6a, 0xdc, 0x57, 0xbf, 0x37, 0x65, 0xcc, 0xdd, 0xaa, 0x59, 0xc7, + 0x46, 0x5b, 0x28, 0xa2, 0x71, 0xfa, 0xbe, 0x82, 0x2a, 0xb0, 0x2e, 0x63, 0x5a, 0x56, 0x0d, 0x57, + 0xeb, 0x76, 0xed, 0xbe, 0xfa, 0x03, 0x05, 0x3d, 0x0b, 0x9a, 0xbc, 0x27, 0x2e, 0x03, 0x0d, 0xb9, + 0x85, 0x75, 0xdb, 0x6c, 0x58, 0xec, 0x9c, 0x7f, 0x38, 0xe5, 0x51, 0x04, 0xa4, 0x8e, 0xef, 0x9b, + 0xf5, 0x3a, 0x36, 0xd4, 0x1f, 0x29, 0x34, 0x8b, 0xa3, 0x2b, 0x83, 0x09, 0x69, 0x10, 0xf5, 0x23, + 0x65, 0x32, 0xe7, 0xc5, 0xbe, 0xfa, 0xb1, 0x82, 0x36, 0xe1, 0x99, 0x19, 0x3b, 0x13, 0x71, 0xfa, + 0x9b, 0x82, 0xb6, 0xe0, 0xc6, 0xec, 0x74, 0x78, 0xbd, 0x6a, 0xd2, 0x5c, 0x88, 0x65, 0xfe, 0x5d, + 0x41, 0x57, 0xe1, 0xa9, 0x59, 0x32, 0xf1, 0x6b, 0xd8, 0xb2, 0xd5, 0xff, 0x2a, 0xe8, 0x3c, 0xac, + 0xf2, 0xdc, 0x8b, 0x99, 0xfe, 0xa1, 0xa0, 0x35, 0x58, 0x6e, 0xde, 0xb7, 0xf4, 0x98, 0xf4, 0x4f, + 0x25, 0xb9, 0x8f, 0x11, 0xed, 0x5f, 0x0a, 0xba, 0x00, 0xe7, 0x0c, 0xfc, 0x9a, 0x69, 0x99, 0x76, + 0x4c, 0xfd, 0x37, 0xa3, 0xea, 0x75, 0x5c, 0xb5, 0x5a, 0x87, 0x31, 0xf5, 0x3f, 0x8c, 0xca, 0x44, + 0x32, 0x34, 0x8f, 0xc5, 0x9f, 0x72, 0x68, 0x03, 0x2e, 0x47, 0x12, 0x08, 0xde, 0x33, 0x59, 0x4d, + 0xe1, 0x6a, 0x0c, 0x7c, 0xd8, 0x54, 0x7f, 0x95, 0xa7, 0x07, 0x3e, 0x85, 0xb0, 0x71, 0xd3, 0xe6, + 0x80, 0x5f, 0xe7, 0x69, 0xd2, 0x4c, 0x01, 0x84, 0x47, 0x0c, 0xf2, 0x61, 0x7e, 0xa6, 0x16, 0xbd, + 0x61, 0xdd, 0x35, 0xf7, 0x28, 0x44, 0xfd, 0x4d, 0x7e, 0x32, 0x6b, 0x68, 0x44, 0xf1, 0x1b, 0x76, + 0x5b, 0xaf, 0x5a, 0x3a, 0x66, 0x67, 0xf9, 0x5e, 0x61, 0x12, 0x63, 0xe0, 0xaa, 0x51, 0x37, 0x2d, + 0xdc, 0xc6, 0x6f, 0xe8, 0x18, 0x1b, 0xd8, 0x50, 0x7f, 0x5c, 0xd8, 0x7a, 0x0a, 0x56, 0xd3, 0x3d, + 0x87, 0x16, 0x43, 0xcb, 0xac, 0xab, 0x0b, 0x2f, 0xfd, 0x22, 0x0f, 0xe7, 0x9a, 0xe2, 0xdf, 0x50, + 0x4d, 0xd7, 0x7f, 0xd4, 0xef, 0xb8, 0x48, 0x87, 0xe2, 0x9e, 0x1b, 0x8a, 0x27, 0xac, 0xa9, 0x91, + 0x01, 0x1f, 0x8f, 0xc2, 0x93, 0x4a, 0xea, 0x1f, 0x45, 0xda, 0xda, 0x37, 0xfe, 0xf0, 0xf8, 0x9d, + 0xec, 0x12, 0x2a, 0xed, 0x3c, 0xba, 0xb5, 0xc3, 0x3a, 0x32, 0xda, 0x83, 0x22, 0x1b, 0x18, 0xea, + 0x5e, 0x0f, 0x45, 0x1f, 0xce, 0xd1, 0x6c, 0x52, 0x99, 0x24, 0x68, 0xeb, 0x4c, 0xc0, 0x39, 0xb4, + 0x42, 0x05, 0xf0, 0x37, 0x8a, 0x81, 0xd7, 0xbb, 0x99, 0x79, 0x31, 0x83, 0xf6, 0xa0, 0xc0, 0x04, + 0x05, 0x73, 0x6d, 0x99, 0x92, 0x86, 0x98, 0xb4, 0x65, 0x04, 0xb1, 0xb4, 0xe0, 0xc5, 0x0c, 0x7a, + 0x03, 0x16, 0xf1, 0xd7, 0xdc, 0xce, 0x38, 0x74, 0x51, 0x59, 0x70, 0x4c, 0x0d, 0x2b, 0x95, 0x39, + 0x3a, 0xb4, 0xcb, 0x4c, 0xe4, 0xba, 0xb6, 0xc4, 0x44, 0x72, 0x31, 0x77, 0xc4, 0xe8, 0x82, 0x1c, + 0x28, 0x55, 0xc7, 0xa1, 0xc7, 0x9a, 0x25, 0x5a, 0x4f, 0x8f, 0x29, 0xa7, 0x09, 0xbe, 0xc1, 0x04, + 0x5f, 0xab, 0x5c, 0xa4, 0x82, 0xd9, 0xe4, 0xb1, 0xe3, 0x8c, 0x43, 0xaf, 0x1d, 0xe9, 0xe0, 0x03, + 0x0e, 0x6a, 0x43, 0x91, 0xaa, 0xa0, 0x1f, 0x0a, 0x67, 0xd5, 0x70, 0x9d, 0x69, 0xb8, 0x5a, 0x59, + 0x67, 0x87, 0x73, 0x32, 0xec, 0xcc, 0x54, 0xd0, 0x01, 0xa0, 0x0a, 0x78, 0xab, 0x3e, 0xab, 0x8a, + 0x4d, 0xa6, 0x62, 0xa3, 0x72, 0x89, 0xaa, 0xe0, 0x33, 0xd1, 0x4c, 0x25, 0x75, 0x28, 0xd4, 0x9c, + 0x61, 0x77, 0xe0, 0xa2, 0xd4, 0x50, 0x39, 0x57, 0xee, 0x15, 0x26, 0xf7, 0xa2, 0xb6, 0x96, 0x1c, + 0xe4, 0xce, 0x5b, 0x4c, 0xc0, 0x9d, 0xcc, 0xd6, 0x83, 0x02, 0x43, 0xdf, 0xfe, 0x5f, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x0d, 0xe9, 0x7f, 0x4a, 0x48, 0x1d, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/proto/skaffold.proto b/proto/skaffold.proto index 42e985633b1..da3e9931fae 100644 --- a/proto/skaffold.proto +++ b/proto/skaffold.proto @@ -472,6 +472,14 @@ enum StatusCode { DEVINIT_REGISTER_DEPLOY_DEPS = 703; // Failed to configure watcher for Skaffold configuration file. DEVINIT_REGISTER_CONFIG_DEP = 704; + + // Timeout or User Cancellation Errors + + // User cancelled the skaffold dev run + STATUSCHECK_CONTEXT_CANCELLED = 800; + + // Deadline for status check exceeded + STATUSCHECK_DEADLINE_EXCEEDED = 801; } // Enum for Suggestion codes