From f2261d7885c323ed64f6a0d0ab47b401d6c7776c Mon Sep 17 00:00:00 2001 From: tejal29 Date: Fri, 9 Oct 2020 19:30:25 -0700 Subject: [PATCH 1/7] warn and continue when ONBUILD image could not be retrieved --- pkg/skaffold/docker/parse.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/skaffold/docker/parse.go b/pkg/skaffold/docker/parse.go index 9269c3277b0..bcb0fee7d88 100644 --- a/pkg/skaffold/docker/parse.go +++ b/pkg/skaffold/docker/parse.go @@ -18,6 +18,7 @@ package docker import ( "context" + "errors" "fmt" "io" "os" @@ -62,6 +63,7 @@ type fromTo struct { var ( // RetrieveImage is overridden for unit testing RetrieveImage = retrieveImage + onBuildRetrieveErr = errors.New("error retrieving ONBUILD image") ) func readCopyCmdsFromDockerfile(onlyLastImage bool, absDockerfilePath, workspace string, buildArgs map[string]*string, cfg Config) ([]fromTo, error) { @@ -335,6 +337,11 @@ func expandOnbuildInstructions(nodes []*parser.Node, cfg Config) ([]*parser.Node } else if ons, err := parseOnbuild(from.image, cfg); err == nil { onbuildNodes = ons } else { + if errors.Is(err, onBuildRetrieveErr) { + // TODO: [4895] collect warning codes for warnings seen during a dev iteration. + logrus.Warnf("could not retrieve ONBUILD image %s. Will ignore files dependencies for all ONBUILD triggers", from.image) + return []*parser.Node{}, nil + } return nil, fmt.Errorf("parsing ONBUILD instructions: %w", err) } @@ -356,7 +363,7 @@ func parseOnbuild(image string, cfg Config) ([]*parser.Node, error) { // Image names are case SENSITIVE img, err := RetrieveImage(image, cfg) if err != nil { - return nil, fmt.Errorf("retrieving image %q: %w", image, err) + return nil, onBuildRetrieveErr } if len(img.Config.OnBuild) == 0 { From f3decfe5f495232859f3035e71c214efef3042ac Mon Sep 17 00:00:00 2001 From: tejal29 Date: Wed, 21 Oct 2020 15:38:58 -0700 Subject: [PATCH 2/7] wip --- pkg/skaffold/docker/dependencies.go | 24 +++++++++++++++++++++++- pkg/skaffold/docker/parse.go | 8 +++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/pkg/skaffold/docker/dependencies.go b/pkg/skaffold/docker/dependencies.go index d9ff2009469..796d39740a2 100644 --- a/pkg/skaffold/docker/dependencies.go +++ b/pkg/skaffold/docker/dependencies.go @@ -28,6 +28,18 @@ import ( "github.com/GoogleContainerTools/skaffold/pkg/skaffold/walk" ) + +// dockerDependencies describes +type dockerfileDependencies struct { + files []string + err error +} + +// dependencyCache is a cache for dependencies for each dockerfile. +var ( + dependencyCache = map[string]dockerfileDependencies{} +) + // NormalizeDockerfilePath returns the absolute path to the dockerfile. func NormalizeDockerfilePath(context, dockerfile string) (string, error) { // Expected case: should be found relative to the context directory. @@ -50,6 +62,17 @@ func GetDependencies(ctx context.Context, workspace string, dockerfilePath strin return nil, fmt.Errorf("normalizing dockerfile path: %w", err) } + if _, ok := dependencyCache[absDockerfilePath]; !ok { + paths, err := getDependencies(workspace, dockerfilePath, absDockerfilePath, buildArgs, cfg) + dependencyCache[absDockerfilePath] = dockerfileDependencies{ + files: paths, + err: err, + } + } + return dependencyCache[absDockerfilePath].files, dependencyCache[absDockerfilePath].err +} + +func getDependencies(workspace string, dockerfilePath string, absDockerfilePath string, buildArgs map[string]*string, cfg Config) ([]string, error){ // If the Dockerfile doesn't exist, we can't compute the dependencies. // But since we know the Dockerfile is a dependency, let's return a list // with only that file. It makes errors down the line more actionable @@ -93,7 +116,6 @@ func GetDependencies(ctx context.Context, workspace string, dockerfilePath strin dependencies = append(dependencies, file) } sort.Strings(dependencies) - return dependencies, nil } diff --git a/pkg/skaffold/docker/parse.go b/pkg/skaffold/docker/parse.go index bcb0fee7d88..6df6f3d87e2 100644 --- a/pkg/skaffold/docker/parse.go +++ b/pkg/skaffold/docker/parse.go @@ -63,9 +63,10 @@ type fromTo struct { var ( // RetrieveImage is overridden for unit testing RetrieveImage = retrieveImage - onBuildRetrieveErr = errors.New("error retrieving ONBUILD image") + unsupportedMediaTypeError = errors.New("unsupported MediaType error") ) + func readCopyCmdsFromDockerfile(onlyLastImage bool, absDockerfilePath, workspace string, buildArgs map[string]*string, cfg Config) ([]fromTo, error) { f, err := os.Open(absDockerfilePath) if err != nil { @@ -229,6 +230,7 @@ func extractCopyCommands(nodes []*parser.Node, onlyLastImage bool, cfg Config) ( if !stages[strings.ToLower(from.image)] { img, err := RetrieveImage(from.image, cfg) if err != nil { + if return nil, err } @@ -337,7 +339,7 @@ func expandOnbuildInstructions(nodes []*parser.Node, cfg Config) ([]*parser.Node } else if ons, err := parseOnbuild(from.image, cfg); err == nil { onbuildNodes = ons } else { - if errors.Is(err, onBuildRetrieveErr) { + if errors.Is(err, notSupportedManifestError) { // TODO: [4895] collect warning codes for warnings seen during a dev iteration. logrus.Warnf("could not retrieve ONBUILD image %s. Will ignore files dependencies for all ONBUILD triggers", from.image) return []*parser.Node{}, nil @@ -363,7 +365,7 @@ func parseOnbuild(image string, cfg Config) ([]*parser.Node, error) { // Image names are case SENSITIVE img, err := RetrieveImage(image, cfg) if err != nil { - return nil, onBuildRetrieveErr + return nil, } if len(img.Config.OnBuild) == 0 { From 838138f23ea911ee431cadc817ff319be2f20447 Mon Sep 17 00:00:00 2001 From: tejal29 Date: Thu, 22 Oct 2020 01:27:26 -0700 Subject: [PATCH 3/7] Cache results of getDependencies --- docs/content/en/api/skaffold.swagger.json | 42 +- docs/content/en/docs/references/api/grpc.md | 2 + pkg/skaffold/docker/dependencies.go | 24 +- pkg/skaffold/docker/dependencies_test.go | 67 ++++ pkg/skaffold/docker/parse.go | 23 +- pkg/skaffold/errors/err_map.go | 157 +++++--- pkg/skaffold/errors/errors.go | 15 +- proto/skaffold.pb.go | 403 ++++++++++---------- proto/skaffold.proto | 8 +- 9 files changed, 440 insertions(+), 301 deletions(-) diff --git a/docs/content/en/api/skaffold.swagger.json b/docs/content/en/api/skaffold.swagger.json index 0be362754d6..917ffd9f2f8 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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -199,6 +199,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -218,7 +219,7 @@ }, { "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -266,6 +267,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -303,7 +305,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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -351,6 +353,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -370,7 +373,7 @@ }, { "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -418,6 +421,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -517,7 +521,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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -565,6 +569,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -584,7 +589,7 @@ }, { "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -632,6 +637,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -681,7 +687,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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -729,6 +735,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -748,7 +755,7 @@ }, { "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -796,6 +803,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -846,7 +854,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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -894,6 +902,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -913,7 +922,7 @@ }, { "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -961,6 +970,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -1041,7 +1051,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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -1089,6 +1099,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -1120,7 +1131,7 @@ }, { "name": "event.terminationEvent.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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", + "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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster", "in": "query", "required": false, "type": "string", @@ -1168,6 +1179,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -1892,6 +1904,7 @@ "DEVINIT_REGISTER_TEST_DEPS", "DEVINIT_REGISTER_DEPLOY_DEPS", "DEVINIT_REGISTER_CONFIG_DEP", + "DEVINIT_UNSUPPORTED_V1_MANIFEST", "STATUSCHECK_USER_CANCELLED", "STATUSCHECK_DEADLINE_EXCEEDED", "BUILD_CANCELLED", @@ -1908,7 +1921,7 @@ "DEPLOY_CLUSTER_CONNECTION_ERR" ], "default": "OK", - "description": "Enum for Status codes\nThese error codes are prepended by Phase Name e.g.\nBUILD, DEPLOY, STATUSCHECK, DEVINIT\nFor Success Error codes, use range 200 to 250.\nFor Unknown error codes, use range 500 to 600.\nFor Cancelled Error code, use range 800 to 850.\n\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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster" + "description": "Enum for Status codes\nThese error codes are prepended by Phase Name e.g.\nBUILD, DEPLOY, STATUSCHECK, DEVINIT\nFor Success Error codes, use range 200 to 250.\nFor Unknown error codes, use range 500 to 600.\nFor Cancelled Error code, use range 800 to 850.\n\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 - DEPLOY_SUCCESS: Deploy 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_UNHEALTHY: Readiness probe failed\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_KUBECTL_CONNECTION_ERR: Kubectl connection error\n - STATUSCHECK_KUBECTL_PID_KILLED: Kubectl process killed error\n - STATUSCHECK_KUBECTL_CLIENT_FETCH_ERR: Kubectl client fetch err\n - STATUSCHECK_POD_INITIALIZING: Pod Initializing\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 - INIT_UNKNOWN: Initialization of the Skaffold session failed due to unknown reason(s)\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 - DEVINIT_UNSUPPORTED_V1_MANIFEST: Failed to configure watcher for build dependencies for a base image with v1 manifest.\n - STATUSCHECK_USER_CANCELLED: User cancelled the skaffold dev run\n - STATUSCHECK_DEADLINE_EXCEEDED: Deadline for status check exceeded\n - BUILD_CANCELLED: Build Cancelled\n - DEPLOY_CANCELLED: Deploy cancelled due to user cancellation or one or more deployers failed.\n - INIT_CREATE_TAGGER_ERROR: Skaffold was unable to create the configured tagger\n - INIT_MINIKUBE_PAUSED_ERROR: Skaffold was unable to start as Minikube appears to be paused\n - INIT_MINIKUBE_NOT_RUNNING_ERROR: Skaffold was unable to start as Minikube appears to be stopped\n - INIT_CREATE_BUILDER_ERROR: Skaffold was unable to create a configured image builder\n - INIT_CREATE_DEPLOYER_ERROR: Skaffold was unable to create a configured deployer\n - INIT_CREATE_TEST_DEP_ERROR: Skaffold was unable to create a configured test\n - INIT_CACHE_ERROR: Skaffold encountered an error validating the artifact cache\n - INIT_CREATE_WATCH_TRIGGER_ERROR: Skaffold encountered an error when configuring file watching\n - INIT_CREATE_ARTIFACT_DEP_ERROR: Skaffold encountered an error when evaluating artifact dependencies\n - DEPLOY_CLUSTER_CONNECTION_ERR: Unable to connect to cluster" }, "protoSuggestion": { "type": "object", @@ -1949,10 +1962,11 @@ "CHECK_HOST_CONNECTION", "START_MINIKUBE", "UNPAUSE_MINIKUBE", + "RUN_DOCKER_PULL", "OPEN_ISSUE" ], "default": "NIL", - "description": "Enum for Suggestion codes\n- NIL: default nil suggestion.\nThis is usually set when no error happens.\n - ADD_DEFAULT_REPO: Add Default Repo\n - CHECK_DEFAULT_REPO: Verify Default Repo\n - CHECK_DEFAULT_REPO_GLOBAL_CONFIG: Verify default repo in the global config\n - GCLOUD_DOCKER_AUTH_CONFIGURE: run gcloud docker auth configure\n - DOCKER_AUTH_CONFIGURE: Run docker auth configure\n - CHECK_GCLOUD_PROJECT: Verify Gcloud Project\n - CHECK_DOCKER_RUNNING: Check if docker is running\n - CHECK_CLUSTER_CONNECTION: Check cluster connection\n - CHECK_MINIKUBE_STATUS: Check minikube status\n - CHECK_CONTAINER_LOGS: Container run error\n - CHECK_READINESS_PROBE: Pod Health check error\n - CHECK_CONTAINER_IMAGE: Check Container image\n - ADDRESS_NODE_MEMORY_PRESSURE: Node pressure error\n - ADDRESS_NODE_DISK_PRESSURE: Node disk pressure error\n - ADDRESS_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - ADDRESS_NODE_PID_PRESSURE: Node PID pressure error\n - ADDRESS_NODE_UNSCHEDULABLE: Node unschedulable error\n - ADDRESS_NODE_UNREACHABLE: Node unreachable error\n - ADDRESS_NODE_NOT_READY: Node not ready error\n - ADDRESS_FAILED_SCHEDULING: Scheduler failure error\n - CHECK_HOST_CONNECTION: Cluster Connectivity error\n - START_MINIKUBE: Minikube is stopped: use `minikube start`\n - UNPAUSE_MINIKUBE: Minikube is paused: use `minikube unpause`\n - OPEN_ISSUE: Open an issue so this situation can be diagnosed" + "description": "Enum for Suggestion codes\n- NIL: default nil suggestion.\nThis is usually set when no error happens.\n - ADD_DEFAULT_REPO: Add Default Repo\n - CHECK_DEFAULT_REPO: Verify Default Repo\n - CHECK_DEFAULT_REPO_GLOBAL_CONFIG: Verify default repo in the global config\n - GCLOUD_DOCKER_AUTH_CONFIGURE: run gcloud docker auth configure\n - DOCKER_AUTH_CONFIGURE: Run docker auth configure\n - CHECK_GCLOUD_PROJECT: Verify Gcloud Project\n - CHECK_DOCKER_RUNNING: Check if docker is running\n - CHECK_CLUSTER_CONNECTION: Check cluster connection\n - CHECK_MINIKUBE_STATUS: Check minikube status\n - CHECK_CONTAINER_LOGS: Container run error\n - CHECK_READINESS_PROBE: Pod Health check error\n - CHECK_CONTAINER_IMAGE: Check Container image\n - ADDRESS_NODE_MEMORY_PRESSURE: Node pressure error\n - ADDRESS_NODE_DISK_PRESSURE: Node disk pressure error\n - ADDRESS_NODE_NETWORK_UNAVAILABLE: Node network unavailable error\n - ADDRESS_NODE_PID_PRESSURE: Node PID pressure error\n - ADDRESS_NODE_UNSCHEDULABLE: Node unschedulable error\n - ADDRESS_NODE_UNREACHABLE: Node unreachable error\n - ADDRESS_NODE_NOT_READY: Node not ready error\n - ADDRESS_FAILED_SCHEDULING: Scheduler failure error\n - CHECK_HOST_CONNECTION: Cluster Connectivity error\n - START_MINIKUBE: Minikube is stopped: use `minikube start`\n - UNPAUSE_MINIKUBE: Minikube is paused: use `minikube unpause`\n - RUN_DOCKER_PULL: Run Docker pull for the image with v1 manifest and try again.\n - OPEN_ISSUE: Open an issue so this situation can be diagnosed" }, "protoTerminationEvent": { "type": "object", diff --git a/docs/content/en/docs/references/api/grpc.md b/docs/content/en/docs/references/api/grpc.md index 2370540ddc4..83973d4f1a3 100644 --- a/docs/content/en/docs/references/api/grpc.md +++ b/docs/content/en/docs/references/api/grpc.md @@ -812,6 +812,7 @@ For Cancelled Error code, use range 800 to 850. | 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. | +| DEVINIT_UNSUPPORTED_V1_MANIFEST | 705 | Failed to configure watcher for build dependencies for a base image with v1 manifest. | | STATUSCHECK_USER_CANCELLED | 800 | User cancelled the skaffold dev run | | STATUSCHECK_DEADLINE_EXCEEDED | 801 | Deadline for status check exceeded | | BUILD_CANCELLED | 802 | Build Cancelled | @@ -860,6 +861,7 @@ Enum for Suggestion codes | CHECK_HOST_CONNECTION | 408 | Cluster Connectivity error | | START_MINIKUBE | 501 | Minikube is stopped: use `minikube start` | | UNPAUSE_MINIKUBE | 502 | Minikube is paused: use `minikube unpause` | +| RUN_DOCKER_PULL | 551 | Run Docker pull for the image with v1 manifest and try again. | | OPEN_ISSUE | 900 | Open an issue so this situation can be diagnosed | diff --git a/pkg/skaffold/docker/dependencies.go b/pkg/skaffold/docker/dependencies.go index 796d39740a2..4dba83cd177 100644 --- a/pkg/skaffold/docker/dependencies.go +++ b/pkg/skaffold/docker/dependencies.go @@ -28,16 +28,15 @@ import ( "github.com/GoogleContainerTools/skaffold/pkg/skaffold/walk" ) - -// dockerDependencies describes -type dockerfileDependencies struct { - files []string - err error +// dependency represents computed dependency for a dockerfile. +type dependency struct { + files []string + err error } -// dependencyCache is a cache for dependencies for each dockerfile. +// dependencyCache caches the results for `GetDependencies` for individual dockerfile. var ( - dependencyCache = map[string]dockerfileDependencies{} + dependencyCache = map[string]dependency{} ) // NormalizeDockerfilePath returns the absolute path to the dockerfile. @@ -54,7 +53,7 @@ func NormalizeDockerfilePath(context, dockerfile string) (string, error) { return filepath.Abs(rel) } -// GetDependencies finds the sources dependencies for the given docker artifact. +// GetDependencies finds the sources dependency for the given docker artifact. // All paths are relative to the workspace. func GetDependencies(ctx context.Context, workspace string, dockerfilePath string, buildArgs map[string]*string, cfg Config) ([]string, error) { absDockerfilePath, err := NormalizeDockerfilePath(workspace, dockerfilePath) @@ -64,16 +63,16 @@ func GetDependencies(ctx context.Context, workspace string, dockerfilePath strin if _, ok := dependencyCache[absDockerfilePath]; !ok { paths, err := getDependencies(workspace, dockerfilePath, absDockerfilePath, buildArgs, cfg) - dependencyCache[absDockerfilePath] = dockerfileDependencies{ + dependencyCache[absDockerfilePath] = dependency{ files: paths, - err: err, + err: err, } } return dependencyCache[absDockerfilePath].files, dependencyCache[absDockerfilePath].err } -func getDependencies(workspace string, dockerfilePath string, absDockerfilePath string, buildArgs map[string]*string, cfg Config) ([]string, error){ - // If the Dockerfile doesn't exist, we can't compute the dependencies. +func getDependencies(workspace string, dockerfilePath string, absDockerfilePath string, buildArgs map[string]*string, cfg Config) ([]string, error) { + // If the Dockerfile doesn't exist, we can't compute the dependency. // But since we know the Dockerfile is a dependency, let's return a list // with only that file. It makes errors down the line more actionable // than returning an error now. @@ -116,6 +115,7 @@ func getDependencies(workspace string, dockerfilePath string, absDockerfilePath dependencies = append(dependencies, file) } sort.Strings(dependencies) + return dependencies, nil } diff --git a/pkg/skaffold/docker/dependencies_test.go b/pkg/skaffold/docker/dependencies_test.go index 384e55a8bde..ae483c237f9 100644 --- a/pkg/skaffold/docker/dependencies_test.go +++ b/pkg/skaffold/docker/dependencies_test.go @@ -221,6 +221,11 @@ FROM COPY . / ` +const fromV1Manifest = ` +FROM library/ruby:2.3.0 +ADD ./file /etc/file +` + type fakeImageFetcher struct{} func (f *fakeImageFetcher) fetch(image string, _ Config) (*v1.ConfigFile, error) { @@ -235,6 +240,8 @@ func (f *fakeImageFetcher) fetch(image string, _ Config) (*v1.ConfigFile, error) }, }, }, nil + case "library/ruby:2.3.0": + return nil, fmt.Errorf("retrieving image \"library/ruby:2.3.0\": unsupported MediaType: \"application/vnd.docker.distribution.manifest.v1+prettyjws\", see https://github.com/google/go-containerregistry/issues/377") } return nil, fmt.Errorf("no image found for %s", image) @@ -541,6 +548,12 @@ func TestGetDependencies(t *testing.T) { workspace: ".", shouldErr: true, }, + { + description: "old manifest version - watch local file dependency.", + dockerfile: fromV1Manifest, + workspace: ".", + expected: []string{"Dockerfile", "file"}, + }, } for _, test := range tests { @@ -640,3 +653,57 @@ func checkSameFile(t *testutil.T, expected, result string) { t.Errorf("returned wrong file\n got: %s\nwanted: %s", result, expected) } } + +func TestGetDependenciesCached(t *testing.T) { + imageFetcher := fakeImageFetcher{} + tests := []struct { + description string + retrieveImgMock func(_ string, _ Config) (*v1.ConfigFile, error) + dependencyCache map[string]dependency + expected []string + shouldErr bool + }{ + { + description: "with no cached results, getDependencies will retrieve image", + retrieveImgMock: imageFetcher.fetch, + dependencyCache: map[string]dependency{}, + expected: []string{"Dockerfile", "server.go"}, + }, + { + description: "with cached results, getDependencies should read from cache", + retrieveImgMock: func(_ string, _ Config) (*v1.ConfigFile, error) { + return nil, fmt.Errorf("unexpected call") + }, + dependencyCache: map[string]dependency{"Dockerfile": {[]string{"random.go"}, nil}}, + expected: []string{"random.go"}, + }, + { + description: "with cached results for dockerfile in another app", + retrieveImgMock: imageFetcher.fetch, + dependencyCache: map[string]dependency{ + filepath.Join("app", "Dockerfile"): {[]string{"random.go"}, nil}}, + expected: []string{"Dockerfile", "server.go"}, + }, + } + + for _, test := range tests { + testutil.Run(t, test.description, func(t *testutil.T) { + t.Override(&RetrieveImage, test.retrieveImgMock) + t.Override(&util.OSEnviron, func() []string { return []string{} }) + + tmpDir := t.NewTempDir().Touch("server.go", "random.go") + tmpDir.Write("Dockerfile", copyServerGo) + // construct cache for abs dockerfile paths. + cache := map[string]dependency{} + for k, v := range test.dependencyCache { + cache[tmpDir.Path(k)] = v + } + t.Override(&dependencyCache, cache) + deps, err := GetDependencies(context.Background(), tmpDir.Root(), "Dockerfile", map[string]*string{}, nil) + t.CheckErrorAndDeepEqual(test.shouldErr, err, test.expected, deps) + if _, ok := dependencyCache[tmpDir.Path("Dockerfile")]; !ok { + t.Fatal("expected a cache entry for Dockerfile, did not found") + } + }) + } +} diff --git a/pkg/skaffold/docker/parse.go b/pkg/skaffold/docker/parse.go index 6df6f3d87e2..7af936cf8cf 100644 --- a/pkg/skaffold/docker/parse.go +++ b/pkg/skaffold/docker/parse.go @@ -18,7 +18,6 @@ package docker import ( "context" - "errors" "fmt" "io" "os" @@ -26,6 +25,7 @@ import ( "path/filepath" "strings" + sErrors "github.com/GoogleContainerTools/skaffold/pkg/skaffold/errors" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/command" "github.com/moby/buildkit/frontend/dockerfile/instructions" @@ -63,10 +63,8 @@ type fromTo struct { var ( // RetrieveImage is overridden for unit testing RetrieveImage = retrieveImage - unsupportedMediaTypeError = errors.New("unsupported MediaType error") ) - func readCopyCmdsFromDockerfile(onlyLastImage bool, absDockerfilePath, workspace string, buildArgs map[string]*string, cfg Config) ([]fromTo, error) { f, err := os.Open(absDockerfilePath) if err != nil { @@ -229,17 +227,15 @@ func extractCopyCommands(nodes []*parser.Node, onlyLastImage bool, cfg Config) ( // was already changed. if !stages[strings.ToLower(from.image)] { img, err := RetrieveImage(from.image, cfg) - if err != nil { - if + if err == nil { + workdir = img.Config.WorkingDir + } else if _, ok := sErrors.IsOldImageManifestProblem(err); !ok { return nil, err } - - workdir = img.Config.WorkingDir if workdir == "" { workdir = "/" } } - if onlyLastImage { copied = nil } @@ -338,12 +334,9 @@ func expandOnbuildInstructions(nodes []*parser.Node, cfg Config) ([]*parser.Node onbuildNodes = ons } else if ons, err := parseOnbuild(from.image, cfg); err == nil { onbuildNodes = ons - } else { - if errors.Is(err, notSupportedManifestError) { - // TODO: [4895] collect warning codes for warnings seen during a dev iteration. - logrus.Warnf("could not retrieve ONBUILD image %s. Will ignore files dependencies for all ONBUILD triggers", from.image) - return []*parser.Node{}, nil - } + } else if warnMsg, ok := sErrors.IsOldImageManifestProblem(err); ok && warnMsg != "" { + logrus.Warn(warnMsg) + } else if !ok { return nil, fmt.Errorf("parsing ONBUILD instructions: %w", err) } @@ -365,7 +358,7 @@ func parseOnbuild(image string, cfg Config) ([]*parser.Node, error) { // Image names are case SENSITIVE img, err := RetrieveImage(image, cfg) if err != nil { - return nil, + return nil, fmt.Errorf("retrieving image %q: %w", image, err) } if len(img.Config.OnBuild) == 0 { diff --git a/pkg/skaffold/errors/err_map.go b/pkg/skaffold/errors/err_map.go index b0710f51f41..cd1e646e531 100644 --- a/pkg/skaffold/errors/err_map.go +++ b/pkg/skaffold/errors/err_map.go @@ -27,6 +27,12 @@ import ( "github.com/GoogleContainerTools/skaffold/proto" ) +const ( + // Skaffold commands + dev = "dev" + debug = "debug" +) + // re is a shortcut around regexp.MustCompile func re(s string) *regexp.Regexp { return regexp.MustCompile(s) @@ -39,75 +45,104 @@ type problem struct { suggestion func(opts config.SkaffoldOptions) []*proto.Suggestion } -// Build Problems are Errors in build phase -var knownBuildProblems = []problem{ - { - regexp: re(fmt.Sprintf(".*%s.* denied: .*", PushImageErr)), - errCode: proto.StatusCode_BUILD_PUSH_ACCESS_DENIED, - description: func(error) string { - return "Build Failed. No push access to specified image repository" - }, - suggestion: suggestBuildPushAccessDeniedAction, - }, - { - regexp: re(BuildCancelled), - errCode: proto.StatusCode_BUILD_CANCELLED, - description: func(error) string { - return "Build Cancelled." +var ( + + // regex for detecting old manifest images + retrieveFailedOldManifest = `(.*retrieving image.*\"(.*)\")?.*unsupported MediaType.*manifest\.v1\+prettyjws.*` + + // Build Problems are Errors in build phase + knownBuildProblems = []problem{ + { + regexp: re(fmt.Sprintf(".*%s.* denied: .*", PushImageErr)), + errCode: proto.StatusCode_BUILD_PUSH_ACCESS_DENIED, + description: func(error) string { + return "Build Failed. No push access to specified image repository" + }, + suggestion: suggestBuildPushAccessDeniedAction, }, - suggestion: func(config.SkaffoldOptions) []*proto.Suggestion { - return nil + { + regexp: re(BuildCancelled), + errCode: proto.StatusCode_BUILD_CANCELLED, + description: func(error) string { + return "Build Cancelled." + }, + suggestion: func(config.SkaffoldOptions) []*proto.Suggestion { + return nil + }, }, - }, - { - regexp: re(fmt.Sprintf(".*%s.* unknown: Project", PushImageErr)), - description: func(error) string { - return "Build Failed" + { + regexp: re(fmt.Sprintf(".*%s.* unknown: Project", PushImageErr)), + description: func(error) string { + return "Build Failed" + }, + errCode: proto.StatusCode_BUILD_PROJECT_NOT_FOUND, + suggestion: func(config.SkaffoldOptions) []*proto.Suggestion { + return []*proto.Suggestion{{ + SuggestionCode: proto.SuggestionCode_CHECK_GCLOUD_PROJECT, + Action: "Check your GCR project", + }} + }, }, - errCode: proto.StatusCode_BUILD_PROJECT_NOT_FOUND, - suggestion: func(config.SkaffoldOptions) []*proto.Suggestion { - return []*proto.Suggestion{{ - SuggestionCode: proto.SuggestionCode_CHECK_GCLOUD_PROJECT, - Action: "Check your GCR project", - }} + { + regexp: re(DockerConnectionFailed), + errCode: proto.StatusCode_BUILD_DOCKER_DAEMON_NOT_RUNNING, + description: func(err error) string { + matchExp := re(DockerConnectionFailed) + if match := matchExp.FindStringSubmatch(fmt.Sprintf("%s", err)); len(match) >= 2 { + return fmt.Sprintf("Build Failed. %s", match[1]) + } + return "Build Failed. Could not connect to Docker daemon" + }, + suggestion: func(config.SkaffoldOptions) []*proto.Suggestion { + return []*proto.Suggestion{{ + SuggestionCode: proto.SuggestionCode_CHECK_DOCKER_RUNNING, + Action: "Check if docker is running", + }} + }, }, - }, - { - regexp: re(DockerConnectionFailed), - errCode: proto.StatusCode_BUILD_DOCKER_DAEMON_NOT_RUNNING, + } + + // error retrieving image with old manifest + oldImageManifest = problem{ + regexp: re(retrieveFailedOldManifest), description: func(err error) string { - matchExp := re(DockerConnectionFailed) + matchExp := re(retrieveFailedOldManifest) + imageName := "specified image" if match := matchExp.FindStringSubmatch(fmt.Sprintf("%s", err)); len(match) >= 2 { - return fmt.Sprintf("Build Failed. %s", match[1]) + imageName = fmt.Sprintf("image %s", match[1]) } - return "Build Failed. Could not connect to Docker daemon" + return fmt.Sprintf("Could not retrieve %s pushed with the deprecated manifest v1. Ignoring files dependencies for all ONBUILD triggers", imageName) }, - suggestion: func(config.SkaffoldOptions) []*proto.Suggestion { - return []*proto.Suggestion{{ - SuggestionCode: proto.SuggestionCode_CHECK_DOCKER_RUNNING, - Action: "Check if docker is running", - }} + errCode: proto.StatusCode_DEVINIT_UNSUPPORTED_V1_MANIFEST, + suggestion: func(opts config.SkaffoldOptions) []*proto.Suggestion { + if opts.Command == dev || opts.Command == debug { + return []*proto.Suggestion{{ + SuggestionCode: proto.SuggestionCode_RUN_DOCKER_PULL, + Action: "To avoid, hit Cntrl-C and run `docker pull` to fetch the specified image and retry", + }} + } + return nil }, - }, -} + } -// Deploy errors in deployment phase -var knownDeployProblems = []problem{ - { - regexp: re("(?i).*unable to connect.*: Get (.*)"), - errCode: proto.StatusCode_DEPLOY_CLUSTER_CONNECTION_ERR, - description: func(err error) string { - matchExp := re("(?i).*unable to connect.*Get (.*)") - kubeconfig, parsederr := kubectx.CurrentConfig() - if parsederr != nil { - logrus.Debugf("Error retrieving the config: %q", parsederr) - return fmt.Sprintf("Deploy failed. Could not connect to the cluster due to %s", err) - } - if match := matchExp.FindStringSubmatch(fmt.Sprintf("%s", err)); len(match) >= 2 { - return fmt.Sprintf("Deploy Failed. Could not connect to cluster %s due to %s", kubeconfig.CurrentContext, match[1]) - } - return fmt.Sprintf("Deploy Failed. Could not connect to %s cluster.", kubeconfig.CurrentContext) + // Deploy errors in deployment phase + knownDeployProblems = []problem{ + { + regexp: re("(?i).*unable to connect.*: Get (.*)"), + errCode: proto.StatusCode_DEPLOY_CLUSTER_CONNECTION_ERR, + description: func(err error) string { + matchExp := re("(?i).*unable to connect.*Get (.*)") + kubeconfig, parsederr := kubectx.CurrentConfig() + if parsederr != nil { + logrus.Debugf("Error retrieving the config: %q", parsederr) + return fmt.Sprintf("Deploy failed. Could not connect to the cluster due to %s", err) + } + if match := matchExp.FindStringSubmatch(fmt.Sprintf("%s", err)); len(match) >= 2 { + return fmt.Sprintf("Deploy Failed. Could not connect to cluster %s due to %s", kubeconfig.CurrentContext, match[1]) + } + return fmt.Sprintf("Deploy Failed. Could not connect to %s cluster.", kubeconfig.CurrentContext) + }, + suggestion: suggestDeployFailedAction, }, - suggestion: suggestDeployFailedAction, - }, -} + } +) diff --git a/pkg/skaffold/errors/errors.go b/pkg/skaffold/errors/errors.go index 55758382c76..c95f60bf385 100644 --- a/pkg/skaffold/errors/errors.go +++ b/pkg/skaffold/errors/errors.go @@ -25,8 +25,8 @@ import ( "github.com/GoogleContainerTools/skaffold/proto" ) -// These are phases in a DevLoop const ( + // These are phases in a Skaffolld Init = Phase("Init") Build = Phase("Build") Deploy = Phase("Deploy") @@ -88,6 +88,17 @@ func ShowAIError(err error) error { return err } +func IsOldImageManifestProblem(err error) (string, bool) { + if err != nil && oldImageManifest.regexp.MatchString(err.Error()) { + if s := oldImageManifest.suggestion(skaffoldOpts); s != nil { + return fmt.Sprintf("%s. %s", oldImageManifest.description(err), + concatSuggestions(oldImageManifest.suggestion(skaffoldOpts))), true + } + return "", true + } + return "", false +} + func getErrorCodeFromError(phase Phase, err error) (proto.StatusCode, []*proto.Suggestion) { if problems, ok := allErrors[phase]; ok { for _, v := range problems { @@ -137,7 +148,7 @@ var allErrors = map[Phase][]problem{ errCode: proto.StatusCode_SYNC_UNKNOWN, suggestion: reportIssueSuggestion, }}, - DevInit: {{ + DevInit: {oldImageManifest, { regexp: re(".*"), errCode: proto.StatusCode_DEVINIT_UNKNOWN, suggestion: reportIssueSuggestion, diff --git a/proto/skaffold.pb.go b/proto/skaffold.pb.go index 4ac47c09dd6..5bb9f3db755 100644 --- a/proto/skaffold.pb.go +++ b/proto/skaffold.pb.go @@ -277,6 +277,8 @@ const ( StatusCode_DEVINIT_REGISTER_DEPLOY_DEPS StatusCode = 703 // Failed to configure watcher for Skaffold configuration file. StatusCode_DEVINIT_REGISTER_CONFIG_DEP StatusCode = 704 + // Failed to configure watcher for build dependencies for a base image with v1 manifest. + StatusCode_DEVINIT_UNSUPPORTED_V1_MANIFEST StatusCode = 705 // User cancelled the skaffold dev run StatusCode_STATUSCHECK_USER_CANCELLED StatusCode = 800 // Deadline for status check exceeded @@ -351,6 +353,7 @@ var StatusCode_name = map[int32]string{ 702: "DEVINIT_REGISTER_TEST_DEPS", 703: "DEVINIT_REGISTER_DEPLOY_DEPS", 704: "DEVINIT_REGISTER_CONFIG_DEP", + 705: "DEVINIT_UNSUPPORTED_V1_MANIFEST", 800: "STATUSCHECK_USER_CANCELLED", 801: "STATUSCHECK_DEADLINE_EXCEEDED", 802: "BUILD_CANCELLED", @@ -411,6 +414,7 @@ var StatusCode_value = map[string]int32{ "DEVINIT_REGISTER_TEST_DEPS": 702, "DEVINIT_REGISTER_DEPLOY_DEPS": 703, "DEVINIT_REGISTER_CONFIG_DEP": 704, + "DEVINIT_UNSUPPORTED_V1_MANIFEST": 705, "STATUSCHECK_USER_CANCELLED": 800, "STATUSCHECK_DEADLINE_EXCEEDED": 801, "BUILD_CANCELLED": 802, @@ -488,6 +492,8 @@ const ( SuggestionCode_START_MINIKUBE SuggestionCode = 501 // Minikube is paused: use `minikube unpause` SuggestionCode_UNPAUSE_MINIKUBE SuggestionCode = 502 + // Run Docker pull for the image with v1 manifest and try again. + SuggestionCode_RUN_DOCKER_PULL SuggestionCode = 551 // Open an issue so this situation can be diagnosed SuggestionCode_OPEN_ISSUE SuggestionCode = 900 ) @@ -517,6 +523,7 @@ var SuggestionCode_name = map[int32]string{ 408: "CHECK_HOST_CONNECTION", 501: "START_MINIKUBE", 502: "UNPAUSE_MINIKUBE", + 551: "RUN_DOCKER_PULL", 900: "OPEN_ISSUE", } @@ -545,6 +552,7 @@ var SuggestionCode_value = map[string]int32{ "CHECK_HOST_CONNECTION": 408, "START_MINIKUBE": 501, "UNPAUSE_MINIKUBE": 502, + "RUN_DOCKER_PULL": 551, "OPEN_ISSUE": 900, } @@ -2591,202 +2599,205 @@ func init() { func init() { proto.RegisterFile("skaffold.proto", fileDescriptor_4f2d38e344f9dbf5) } var fileDescriptor_4f2d38e344f9dbf5 = []byte{ - // 3119 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x5b, 0x8c, 0x1b, 0x57, - 0xf9, 0x5f, 0x7b, 0x7c, 0xfd, 0xf6, 0x92, 0xc9, 0x49, 0x36, 0x71, 0x9c, 0x4d, 0xb2, 0x71, 0x93, - 0x34, 0xdd, 0xf6, 0xbf, 0x69, 0x9b, 0xbf, 0x50, 0x09, 0x2d, 0x68, 0x76, 0xe6, 0xec, 0x7a, 0xb2, - 0xb3, 0x33, 0xd6, 0x78, 0xdc, 0x34, 0x91, 0x90, 0xe5, 0xd8, 0xb3, 0xae, 0x89, 0xd7, 0x5e, 0xec, - 0x71, 0xca, 0xf2, 0xc0, 0x03, 0xe2, 0x5e, 0x90, 0x80, 0x52, 0xee, 0x42, 0x05, 0x84, 0xc4, 0x03, - 0xb7, 0x57, 0x84, 0xa0, 0x48, 0x3c, 0x70, 0x91, 0x78, 0x42, 0x42, 0xe2, 0x09, 0x21, 0xb5, 0x0f, - 0x7d, 0x6f, 0xcb, 0x1d, 0xa1, 0x73, 0x9b, 0x39, 0xe3, 0x4b, 0xb6, 0x29, 0x42, 0x3c, 0xc5, 0xf3, - 0x9d, 0xdf, 0x77, 0x3d, 0xdf, 0xf9, 0xbe, 0xef, 0x9c, 0x2c, 0x2c, 0x0d, 0xef, 0x34, 0x76, 0x77, - 0xfb, 0xdd, 0xd6, 0xfa, 0xfe, 0xa0, 0x1f, 0xf4, 0x51, 0x9a, 0xfe, 0x53, 0x5c, 0x69, 0xf7, 0xfb, - 0xed, 0xae, 0x7f, 0xa5, 0xb1, 0xdf, 0xb9, 0xd2, 0xe8, 0xf5, 0xfa, 0x41, 0x23, 0xe8, 0xf4, 0x7b, - 0x43, 0x06, 0x2a, 0x9e, 0xe3, 0xab, 0xf4, 0xeb, 0xf6, 0x68, 0xf7, 0x4a, 0xd0, 0xd9, 0xf3, 0x87, - 0x41, 0x63, 0x6f, 0x9f, 0x03, 0x4e, 0x8f, 0x03, 0xfc, 0xbd, 0xfd, 0xe0, 0x80, 0x2d, 0x96, 0xae, - 0xc2, 0x62, 0x35, 0x68, 0x04, 0xbe, 0xeb, 0x0f, 0xf7, 0xfb, 0xbd, 0xa1, 0x8f, 0x4a, 0x90, 0x1e, - 0x12, 0x42, 0x21, 0xb1, 0x9a, 0xb8, 0x3c, 0xff, 0xf8, 0x02, 0xc3, 0xad, 0x33, 0x10, 0x5b, 0x2a, - 0xad, 0x40, 0x2e, 0xc4, 0xab, 0xa0, 0xec, 0x0d, 0xdb, 0x14, 0x9d, 0x77, 0xc9, 0xcf, 0xd2, 0x19, - 0xc8, 0xba, 0xfe, 0xfb, 0x47, 0xfe, 0x30, 0x40, 0x08, 0x52, 0xbd, 0xc6, 0x9e, 0xcf, 0x57, 0xe9, - 0xef, 0xd2, 0x8b, 0x29, 0x48, 0x53, 0x69, 0xe8, 0x31, 0x80, 0xdb, 0xa3, 0x4e, 0xb7, 0x55, 0x95, - 0xf4, 0x1d, 0xe5, 0xfa, 0x36, 0xc2, 0x05, 0x57, 0x02, 0xa1, 0xff, 0x87, 0xf9, 0x96, 0xbf, 0xdf, - 0xed, 0x1f, 0x30, 0x9e, 0x24, 0xe5, 0x41, 0x9c, 0xc7, 0x88, 0x56, 0x5c, 0x19, 0x86, 0xca, 0xb0, - 0xb4, 0xdb, 0x1f, 0x3c, 0xd7, 0x18, 0xb4, 0xfc, 0x56, 0xa5, 0x3f, 0x08, 0x86, 0x85, 0xd4, 0xaa, - 0x72, 0x79, 0xfe, 0xf1, 0x55, 0xd9, 0xb9, 0xf5, 0xcd, 0x18, 0x04, 0xf7, 0x82, 0xc1, 0x81, 0x3b, - 0xc6, 0x87, 0x74, 0x50, 0x49, 0x08, 0x46, 0x43, 0xfd, 0x59, 0xbf, 0x79, 0x87, 0x19, 0x91, 0xa6, - 0x46, 0x9c, 0x94, 0x64, 0xc9, 0xcb, 0xee, 0x04, 0x03, 0xba, 0x06, 0x8b, 0xbb, 0x9d, 0xae, 0x5f, - 0x3d, 0xe8, 0x35, 0x99, 0x84, 0x0c, 0x95, 0x70, 0x9c, 0x4b, 0xd8, 0x94, 0xd7, 0xdc, 0x38, 0x14, - 0x55, 0xe0, 0x58, 0xcb, 0xbf, 0x3d, 0x6a, 0xb7, 0x3b, 0xbd, 0xb6, 0xde, 0xef, 0x05, 0x8d, 0x4e, - 0xcf, 0x1f, 0x0c, 0x0b, 0x59, 0xea, 0xcf, 0xd9, 0x30, 0x10, 0xe3, 0x08, 0x7c, 0xd7, 0xef, 0x05, - 0xee, 0x34, 0x56, 0xf4, 0x30, 0xe4, 0xf6, 0xfc, 0xa0, 0xd1, 0x6a, 0x04, 0x8d, 0x42, 0x8e, 0x1a, - 0x72, 0x84, 0x8b, 0xd9, 0xe1, 0x64, 0x37, 0x04, 0x14, 0xab, 0x70, 0x6c, 0x4a, 0x98, 0x48, 0x12, - 0xdc, 0xf1, 0x0f, 0xe8, 0x16, 0xa6, 0x5d, 0xf2, 0x13, 0x5d, 0x82, 0xf4, 0xdd, 0x46, 0x77, 0x24, - 0xb6, 0x48, 0xe5, 0x22, 0x09, 0x0f, 0xb3, 0x85, 0x2d, 0x5f, 0x4b, 0x3e, 0x91, 0xb8, 0x9e, 0xca, - 0x29, 0x6a, 0xaa, 0xf4, 0x6a, 0x02, 0x72, 0x42, 0x23, 0x5a, 0x83, 0x34, 0xdd, 0x75, 0x9e, 0x15, - 0xc7, 0xe5, 0xac, 0x08, 0xcd, 0x62, 0x10, 0xf4, 0x7f, 0x90, 0x61, 0x9b, 0xcd, 0x75, 0x2d, 0xc7, - 0xd2, 0x21, 0x44, 0x73, 0x10, 0x7a, 0x0f, 0x40, 0xa3, 0xd5, 0xea, 0x90, 0x23, 0xd4, 0xe8, 0x16, - 0x9a, 0x34, 0x70, 0xe7, 0xc6, 0x3c, 0x5e, 0xd7, 0x42, 0x04, 0xcb, 0x03, 0x89, 0xa5, 0xf8, 0x14, - 0x1c, 0x19, 0x5b, 0x96, 0xfd, 0xcf, 0x33, 0xff, 0x8f, 0xcb, 0xfe, 0xe7, 0x25, 0x6f, 0x4b, 0x6f, - 0x24, 0x61, 0x31, 0xe6, 0x07, 0x7a, 0x04, 0x8e, 0xf6, 0x46, 0x7b, 0xb7, 0xfd, 0x81, 0xb3, 0xab, - 0x0d, 0x82, 0xce, 0x6e, 0xa3, 0x19, 0x0c, 0x79, 0x2c, 0x27, 0x17, 0xd0, 0x53, 0x90, 0xa3, 0x7e, - 0x93, 0x6d, 0x4f, 0x52, 0xeb, 0xcf, 0x4f, 0x8b, 0xce, 0xba, 0xb9, 0xd7, 0x68, 0xfb, 0x1b, 0x0c, - 0xe9, 0x86, 0x2c, 0xe8, 0x02, 0xa4, 0x82, 0x83, 0x7d, 0xbf, 0xa0, 0xac, 0x26, 0x2e, 0x2f, 0x85, - 0xfb, 0x42, 0x71, 0xde, 0xc1, 0xbe, 0xef, 0xd2, 0x55, 0x64, 0x4c, 0x09, 0xd2, 0x85, 0xa9, 0x6a, - 0xee, 0x15, 0x29, 0x0b, 0x16, 0x64, 0x2b, 0xd0, 0x25, 0xae, 0x3b, 0x41, 0x75, 0x23, 0x59, 0x9e, - 0x3f, 0x90, 0xb4, 0x1f, 0x87, 0x74, 0xb3, 0x3f, 0xea, 0x05, 0x34, 0x78, 0x69, 0x97, 0x7d, 0xfc, - 0xa7, 0x71, 0xff, 0x65, 0x02, 0x96, 0xe2, 0x29, 0x81, 0x9e, 0x84, 0x3c, 0x4b, 0x0a, 0x12, 0xcb, - 0xc4, 0xd8, 0x11, 0x92, 0x91, 0xfc, 0xd3, 0x1f, 0xb8, 0x11, 0x03, 0x7a, 0x04, 0xb2, 0xcd, 0xee, - 0x68, 0x18, 0xf8, 0x03, 0xaa, 0x2c, 0x72, 0x48, 0x67, 0x54, 0xea, 0x90, 0x80, 0x14, 0x4d, 0xc8, - 0x09, 0x21, 0xe8, 0xc1, 0x58, 0x1c, 0x8e, 0xc5, 0x54, 0x1e, 0x1e, 0x88, 0xd2, 0x1f, 0x13, 0x00, - 0x51, 0x7d, 0x44, 0xef, 0x86, 0x7c, 0x43, 0x4a, 0x1b, 0xb9, 0xb0, 0x45, 0xa8, 0xf5, 0x30, 0x81, - 0xd8, 0x36, 0x45, 0x2c, 0x68, 0x15, 0xe6, 0x1b, 0xa3, 0xa0, 0xef, 0x0d, 0x3a, 0xed, 0x36, 0xf7, - 0x25, 0xe7, 0xca, 0x24, 0x52, 0xa8, 0x79, 0x11, 0xeb, 0xb7, 0x44, 0xe6, 0x1c, 0x8d, 0xd7, 0xbb, - 0x7e, 0xcb, 0x77, 0x25, 0x50, 0xf1, 0x49, 0x58, 0x8a, 0x6b, 0xbc, 0xaf, 0xbd, 0xfa, 0x20, 0xcc, - 0x4b, 0xc5, 0x1c, 0x9d, 0x80, 0x0c, 0x13, 0xcd, 0xb9, 0xf9, 0xd7, 0x7f, 0xc5, 0xf2, 0xd2, 0x9f, - 0x12, 0xa0, 0x8e, 0x17, 0xf1, 0x99, 0x16, 0x18, 0x90, 0x1f, 0xf8, 0xc3, 0xfe, 0x68, 0xd0, 0xf4, - 0xc5, 0x69, 0xbc, 0x34, 0xa3, 0x11, 0xac, 0xbb, 0x02, 0xc8, 0x77, 0x20, 0x64, 0x7c, 0x9b, 0xf1, - 0x8d, 0xcb, 0xbb, 0xaf, 0xf8, 0x9a, 0xb0, 0x18, 0xeb, 0x32, 0x6f, 0x3f, 0xc2, 0xa5, 0xef, 0xa6, - 0x21, 0x4d, 0x2b, 0x3a, 0x7a, 0x14, 0xf2, 0xa4, 0x4f, 0xd0, 0x0f, 0x5e, 0xb7, 0x55, 0xa9, 0xae, - 0x52, 0x7a, 0x79, 0xce, 0x8d, 0x40, 0xe8, 0x2a, 0x1f, 0x00, 0x18, 0x4b, 0x72, 0x72, 0x00, 0x10, - 0x3c, 0x12, 0x0c, 0xbd, 0x43, 0x8c, 0x00, 0x8c, 0x4b, 0x99, 0x32, 0x02, 0x08, 0x36, 0x19, 0x48, - 0xcc, 0xdb, 0x17, 0xdd, 0xa7, 0x90, 0x9a, 0xde, 0x95, 0x88, 0x79, 0x21, 0x08, 0xe1, 0x58, 0xb3, - 0x67, 0x8c, 0x33, 0x9b, 0xbd, 0xe0, 0x9f, 0x60, 0x41, 0xef, 0x85, 0x82, 0xd8, 0xea, 0x71, 0x3c, - 0xef, 0xfc, 0xa2, 0xfd, 0xb8, 0x33, 0x60, 0xe5, 0x39, 0x77, 0xa6, 0x08, 0xf4, 0x64, 0x34, 0x4d, - 0x30, 0x99, 0xd9, 0xa9, 0xd3, 0x84, 0x10, 0x14, 0x07, 0xa3, 0x5b, 0x70, 0xb2, 0x35, 0x7d, 0x5a, - 0xe0, 0xc3, 0xc0, 0x21, 0x33, 0x45, 0x79, 0xce, 0x9d, 0x25, 0x00, 0xbd, 0x13, 0x16, 0x5a, 0xfe, - 0x5d, 0xab, 0xdf, 0xdf, 0x67, 0x02, 0xf3, 0x54, 0x60, 0x54, 0xee, 0xa2, 0xa5, 0xf2, 0x9c, 0x1b, - 0x83, 0x92, 0xd0, 0x07, 0xfe, 0x60, 0xaf, 0xd3, 0xa3, 0xa3, 0x2e, 0x63, 0x87, 0x58, 0xe8, 0xbd, - 0xb1, 0x65, 0x12, 0xfa, 0x71, 0x96, 0x8d, 0x05, 0x00, 0x9f, 0xfc, 0xa8, 0x93, 0x6a, 0x5a, 0x72, - 0x41, 0x1d, 0xe7, 0x9a, 0x99, 0xf8, 0x97, 0x40, 0xf1, 0x07, 0x03, 0x9e, 0x93, 0x22, 0x96, 0x5a, - 0x93, 0x36, 0x9f, 0xdb, 0x5d, 0x1f, 0x0f, 0x06, 0x2e, 0x01, 0x94, 0xba, 0xb0, 0x20, 0x3b, 0x82, - 0x56, 0x20, 0xdf, 0x09, 0xfc, 0x01, 0xd5, 0xc0, 0x7b, 0x78, 0x44, 0x90, 0xb4, 0x25, 0xa7, 0x69, - 0x53, 0x0e, 0xd3, 0xf6, 0x7c, 0x02, 0x16, 0x63, 0x64, 0xf4, 0x30, 0x64, 0xfd, 0xc1, 0x80, 0xd6, - 0x8d, 0xc4, 0xac, 0xba, 0x21, 0x10, 0xa8, 0x00, 0xd9, 0x3d, 0x7f, 0x38, 0x6c, 0xb4, 0x45, 0x49, - 0x10, 0x9f, 0xe8, 0x2a, 0xcc, 0x0f, 0x47, 0xed, 0xb6, 0x3f, 0xa4, 0x37, 0x8b, 0x82, 0x42, 0x2b, - 0x59, 0x28, 0x2a, 0x5c, 0x71, 0x65, 0x54, 0xc9, 0x86, 0x7c, 0x78, 0xb0, 0x49, 0xb1, 0xf1, 0x49, - 0x1d, 0xe2, 0x71, 0x64, 0x1f, 0xb1, 0xe1, 0x32, 0x79, 0xc8, 0x70, 0x59, 0xfa, 0x89, 0xe8, 0x6b, - 0x4c, 0x62, 0x11, 0x72, 0xa2, 0x49, 0x71, 0xa1, 0xe1, 0xf7, 0xcc, 0x40, 0xaa, 0x51, 0x20, 0xf3, - 0x34, 0x64, 0x72, 0x80, 0x52, 0x87, 0x06, 0xe8, 0x1a, 0x2c, 0x36, 0xe4, 0xf0, 0xf2, 0xe3, 0x3e, - 0x7d, 0x47, 0xe2, 0xd0, 0xd2, 0x4b, 0x09, 0xd1, 0xb4, 0xee, 0x9d, 0x59, 0x6a, 0x94, 0x59, 0x93, - 0x26, 0x2a, 0xf7, 0x6f, 0x62, 0xea, 0xad, 0x9b, 0xf8, 0x72, 0xbc, 0xb5, 0xdd, 0xdb, 0xce, 0xd9, - 0xc9, 0xf2, 0x3f, 0x0c, 0xf2, 0x6b, 0x09, 0x28, 0xcc, 0xaa, 0x92, 0x24, 0x61, 0x44, 0x95, 0x14, - 0x09, 0x23, 0xbe, 0x67, 0x26, 0x8c, 0xe4, 0xa5, 0x32, 0xd5, 0xcb, 0x54, 0xe4, 0x65, 0xbc, 0x4d, - 0xa7, 0xdf, 0x42, 0x9b, 0x9e, 0xf4, 0x35, 0xf3, 0xd6, 0x7d, 0xfd, 0x4e, 0x12, 0xf2, 0x61, 0x67, - 0x22, 0x85, 0xa5, 0xdb, 0x6f, 0x36, 0xba, 0x84, 0x22, 0x0a, 0x4b, 0x48, 0x40, 0x67, 0x01, 0x06, - 0xfe, 0x5e, 0x3f, 0xf0, 0xe9, 0x32, 0x9b, 0x16, 0x25, 0x0a, 0x71, 0x73, 0xbf, 0xdf, 0xb2, 0xc9, - 0x5d, 0x9c, 0xbb, 0xc9, 0x3f, 0xd1, 0x05, 0x58, 0x6c, 0x8a, 0xb2, 0x4d, 0xd7, 0x99, 0xc3, 0x71, - 0x22, 0xd1, 0x4e, 0x2e, 0xef, 0xc3, 0xfd, 0x46, 0x93, 0x79, 0x9e, 0x77, 0x23, 0x02, 0x09, 0x3c, - 0xe9, 0x9a, 0x94, 0x3d, 0xc3, 0x02, 0x2f, 0xbe, 0x51, 0x09, 0x16, 0xc4, 0x26, 0x90, 0xc1, 0x96, - 0x76, 0xa7, 0xbc, 0x1b, 0xa3, 0xc9, 0x18, 0x2a, 0x23, 0x17, 0xc7, 0x50, 0x39, 0x05, 0xc8, 0x36, - 0x5a, 0xad, 0x81, 0x3f, 0x1c, 0xd2, 0x3e, 0x92, 0x77, 0xc5, 0x67, 0xe9, 0xf7, 0x89, 0x68, 0x9a, - 0x09, 0x63, 0x45, 0xba, 0x9c, 0x4e, 0x47, 0x67, 0x1e, 0xab, 0x90, 0x40, 0x2a, 0x55, 0x67, 0x2f, - 0x4a, 0x6b, 0xf6, 0x21, 0x25, 0x88, 0x32, 0xed, 0xb8, 0xa6, 0xa6, 0x26, 0x7b, 0xfa, 0xfe, 0x93, - 0xfd, 0x3e, 0x12, 0xe0, 0xf5, 0x24, 0x9c, 0x9c, 0xd1, 0x76, 0xef, 0x75, 0x6a, 0xc5, 0x46, 0x27, - 0x0f, 0xd9, 0x68, 0xe5, 0xd0, 0x8d, 0x4e, 0x4d, 0xd9, 0xe8, 0xb0, 0x24, 0xa7, 0xc7, 0x4a, 0x72, - 0x01, 0xb2, 0x83, 0x51, 0x2f, 0xe8, 0x84, 0x39, 0x20, 0x3e, 0x49, 0x72, 0x3e, 0xd7, 0x1f, 0xdc, - 0xe9, 0xf4, 0xda, 0x46, 0x67, 0xc0, 0x13, 0x40, 0xa2, 0x20, 0x1b, 0x80, 0x8e, 0x10, 0xec, 0x69, - 0x26, 0x47, 0x7b, 0xcf, 0xfa, 0xbd, 0xc7, 0x0e, 0x46, 0x97, 0x1e, 0x6a, 0x24, 0x09, 0xe4, 0xa2, - 0x38, 0xb6, 0x7c, 0xd8, 0x70, 0xbc, 0x28, 0x0f, 0xc7, 0x1f, 0x82, 0x9c, 0xd5, 0x6f, 0x33, 0xbe, - 0x27, 0x20, 0x1f, 0x3e, 0xa7, 0xf1, 0x99, 0xb6, 0xb8, 0xce, 0xde, 0xd3, 0xd6, 0xc5, 0x7b, 0xda, - 0xba, 0x27, 0x10, 0x6e, 0x04, 0x46, 0x25, 0x48, 0xfb, 0xd2, 0x58, 0x2b, 0xde, 0xd1, 0xf8, 0xe3, - 0x87, 0x1f, 0xef, 0x99, 0x8a, 0xd4, 0x33, 0x4b, 0xd7, 0xe0, 0x68, 0x6d, 0xe8, 0x0f, 0xcc, 0x5e, - 0x40, 0xa0, 0xfc, 0x25, 0xed, 0x22, 0x64, 0x3a, 0x94, 0xc0, 0xad, 0x58, 0xe4, 0xf2, 0x38, 0x8a, - 0x2f, 0x96, 0xde, 0x05, 0x4b, 0x7c, 0x30, 0x17, 0x8c, 0x0f, 0xc5, 0xdf, 0xf3, 0xc4, 0xf4, 0xc5, - 0x51, 0xb1, 0x67, 0xbd, 0xc7, 0x60, 0x41, 0x26, 0xa3, 0x22, 0x64, 0x7d, 0x9a, 0x8c, 0xec, 0x19, - 0x26, 0x57, 0x9e, 0x73, 0x05, 0x61, 0x23, 0x0d, 0xca, 0xdd, 0x46, 0xb7, 0x74, 0x1d, 0x32, 0xcc, - 0x02, 0xe2, 0x4b, 0xf4, 0x62, 0x93, 0x13, 0x6f, 0x33, 0x08, 0x52, 0xc3, 0x83, 0x5e, 0x93, 0x5f, - 0x1c, 0xe8, 0x6f, 0x92, 0xba, 0xfc, 0xbd, 0x46, 0xa1, 0x54, 0xfe, 0x55, 0x6a, 0x02, 0x44, 0x93, - 0x06, 0x7a, 0x0a, 0x96, 0xa2, 0x59, 0x43, 0x9a, 0x6f, 0x96, 0x27, 0x86, 0x12, 0x7a, 0xe0, 0xc6, - 0xc0, 0x44, 0x09, 0x3b, 0x4c, 0xa2, 0xde, 0xb3, 0xaf, 0xb5, 0x3e, 0xcc, 0x4b, 0xef, 0x0d, 0xa8, - 0x00, 0xc7, 0x6b, 0xf6, 0xb6, 0xed, 0xdc, 0xb0, 0xeb, 0x1b, 0x35, 0xd3, 0x32, 0xb0, 0x5b, 0xf7, - 0x6e, 0x56, 0xb0, 0x3a, 0x87, 0xb2, 0xa0, 0x5c, 0x37, 0x37, 0xd4, 0x04, 0xca, 0x43, 0x7a, 0x43, - 0xbb, 0x85, 0x2d, 0x35, 0x89, 0x96, 0x00, 0x28, 0xaa, 0xa2, 0xe9, 0xdb, 0x55, 0x55, 0x41, 0x00, - 0x19, 0xbd, 0x56, 0xf5, 0x9c, 0x1d, 0x35, 0x45, 0x7e, 0x6f, 0x6b, 0xb6, 0xb9, 0xed, 0xa8, 0x69, - 0xf2, 0xdb, 0x70, 0xf4, 0x6d, 0xec, 0xaa, 0x99, 0x35, 0x03, 0xf2, 0xe1, 0xe3, 0x0a, 0x3a, 0x01, - 0x28, 0xa6, 0x4e, 0x28, 0x9b, 0x87, 0xac, 0x6e, 0xd5, 0xaa, 0x1e, 0x76, 0xd5, 0x04, 0xd1, 0xbc, - 0xa5, 0x6f, 0xa8, 0x49, 0xa2, 0xd9, 0x72, 0x74, 0xcd, 0x52, 0x95, 0x35, 0x87, 0x8c, 0x99, 0xd1, - 0xf3, 0x00, 0x3a, 0x05, 0xcb, 0x42, 0x90, 0x81, 0x2b, 0x96, 0x73, 0x33, 0x32, 0x3c, 0x07, 0xa9, - 0x32, 0xb6, 0x76, 0xd4, 0x04, 0x5a, 0x84, 0xfc, 0x36, 0x35, 0xcf, 0xbc, 0x85, 0xd5, 0x24, 0x51, - 0xb2, 0x5d, 0xdb, 0xc0, 0xba, 0x47, 0x04, 0x9a, 0x30, 0x2f, 0x3d, 0x53, 0xc8, 0x71, 0xe0, 0x86, - 0x08, 0x71, 0x0b, 0x90, 0xdb, 0x31, 0x6d, 0x93, 0x70, 0x72, 0xdb, 0xb6, 0x31, 0xb3, 0xcd, 0xf1, - 0xca, 0xd8, 0x55, 0x95, 0xb5, 0x6f, 0x2c, 0x01, 0x44, 0xa5, 0x0f, 0x65, 0x20, 0xe9, 0x6c, 0xab, - 0x73, 0xa8, 0x00, 0xc7, 0xaa, 0x9e, 0xe6, 0xd5, 0xaa, 0x7a, 0x19, 0xeb, 0xdb, 0xf5, 0x6a, 0x4d, - 0xd7, 0x71, 0xb5, 0xaa, 0xfe, 0x2a, 0x81, 0x10, 0x2c, 0x32, 0xef, 0x05, 0xed, 0xd7, 0x09, 0x74, - 0x0c, 0x96, 0x98, 0x23, 0x21, 0xf1, 0x37, 0x09, 0xb4, 0x02, 0x05, 0x06, 0xac, 0xd4, 0xaa, 0xe5, - 0xba, 0x46, 0xe9, 0x75, 0x03, 0xdb, 0x26, 0x36, 0x54, 0x1f, 0x9d, 0x86, 0x93, 0x7c, 0xd5, 0x75, - 0xae, 0x63, 0xdd, 0xab, 0xdb, 0x8e, 0x57, 0xdf, 0x74, 0x6a, 0xb6, 0xa1, 0xee, 0xa2, 0x07, 0xe0, - 0x1c, 0x5b, 0x64, 0x1b, 0x51, 0x37, 0x34, 0xbc, 0xe3, 0xd8, 0x14, 0xe2, 0xd6, 0x6c, 0xdb, 0xb4, - 0xb7, 0xd4, 0x36, 0x3a, 0x07, 0x45, 0xd9, 0x44, 0x73, 0x47, 0xdb, 0xc2, 0xf5, 0x4a, 0xcd, 0xb2, - 0xea, 0xd8, 0x75, 0xd5, 0xef, 0x25, 0xd1, 0x03, 0x70, 0x56, 0x06, 0xe8, 0x8e, 0xed, 0x69, 0xa6, - 0x8d, 0xdd, 0xba, 0xee, 0x62, 0xcd, 0x23, 0x42, 0xbe, 0x9f, 0x44, 0x25, 0x38, 0x23, 0x83, 0xdc, - 0x9a, 0x2d, 0x01, 0x89, 0xa0, 0x1f, 0x24, 0xd1, 0x45, 0x58, 0x9d, 0x2e, 0xc8, 0xc3, 0xee, 0x8e, - 0x69, 0x6b, 0x1e, 0x36, 0xd4, 0x1f, 0x26, 0xd1, 0xc3, 0x70, 0x49, 0x86, 0xb1, 0x88, 0xec, 0x60, - 0xdb, 0xab, 0xbb, 0x8e, 0x65, 0x39, 0x35, 0xaf, 0x5e, 0xc1, 0xb6, 0x41, 0xf4, 0xfe, 0xe8, 0x1e, - 0x32, 0x5d, 0x5c, 0xf5, 0x34, 0x97, 0x9a, 0xf7, 0x4a, 0x12, 0x15, 0x61, 0x59, 0x86, 0xd5, 0xec, - 0x32, 0xd6, 0x2c, 0xaf, 0x7c, 0x53, 0x7d, 0x75, 0x42, 0x84, 0xed, 0x18, 0xb8, 0xbe, 0x83, 0x77, - 0x1c, 0xf7, 0x66, 0xbd, 0xe2, 0xe2, 0x6a, 0xb5, 0xe6, 0x62, 0xf5, 0xb3, 0xca, 0x78, 0x18, 0x28, - 0xcc, 0x30, 0xab, 0xdb, 0x11, 0xe8, 0x73, 0x0a, 0x7a, 0x08, 0x2e, 0x4c, 0x80, 0x6c, 0xec, 0xdd, - 0x70, 0x5c, 0xa2, 0x54, 0x7b, 0x5a, 0x33, 0x2d, 0x6d, 0xc3, 0xc2, 0xea, 0xe7, 0x95, 0xf1, 0x88, - 0x51, 0x68, 0xc5, 0x34, 0x22, 0x71, 0x2f, 0x4c, 0xd7, 0x59, 0xb3, 0xc9, 0x97, 0x51, 0x63, 0x82, - 0xbe, 0xa0, 0xa0, 0xf3, 0xb0, 0x32, 0x05, 0xe4, 0x62, 0x4d, 0x2f, 0x53, 0xc8, 0x8b, 0xca, 0xf8, - 0x1e, 0x33, 0xb3, 0x48, 0x16, 0x60, 0xcd, 0xb8, 0xa9, 0x7e, 0x71, 0xc2, 0x98, 0x4d, 0xcd, 0xb4, - 0xb0, 0x51, 0xe7, 0x8a, 0x48, 0x0c, 0xbf, 0xa4, 0xa0, 0x07, 0xa1, 0x24, 0x63, 0xf8, 0x31, 0x22, - 0x21, 0xb7, 0xb1, 0xee, 0x99, 0x8e, 0x4d, 0xf7, 0xf9, 0x2b, 0x13, 0x56, 0x0b, 0x20, 0x71, 0x6e, - 0xdb, 0xb4, 0x2c, 0x6c, 0xa8, 0x5f, 0x9d, 0x88, 0x54, 0x28, 0xcd, 0x32, 0xc9, 0x4e, 0x6f, 0x62, - 0x4f, 0x2f, 0x53, 0x79, 0x5f, 0x53, 0xc6, 0x37, 0x48, 0x4a, 0x88, 0x08, 0xf6, 0xf5, 0x89, 0x38, - 0x54, 0x1c, 0xa3, 0x6e, 0xda, 0xa6, 0x67, 0x6a, 0x96, 0x79, 0x8b, 0xb8, 0xf0, 0x0b, 0x85, 0x1c, - 0x3a, 0x71, 0xc2, 0xb1, 0xeb, 0x3a, 0xae, 0xfa, 0xba, 0x32, 0x7e, 0x44, 0xf9, 0xba, 0xfa, 0x86, - 0x82, 0x2e, 0xc1, 0xf9, 0x29, 0x2b, 0x63, 0x1b, 0xf0, 0xa6, 0x82, 0xd6, 0xe0, 0xe2, 0xf4, 0x1c, - 0xbc, 0xa1, 0x99, 0x24, 0x01, 0x43, 0x99, 0x7f, 0x56, 0xd0, 0x59, 0x38, 0x35, 0x4d, 0x26, 0x7e, - 0x1a, 0xdb, 0x9e, 0xfa, 0x4f, 0x45, 0x2a, 0x01, 0x82, 0xe9, 0x2f, 0x0a, 0x3a, 0x0a, 0x0b, 0xd5, - 0x9b, 0xb6, 0x1e, 0x92, 0xfe, 0xaa, 0x44, 0xe5, 0x43, 0xd0, 0xfe, 0xa6, 0xa0, 0xe3, 0x70, 0xc4, - 0xc0, 0x4f, 0x13, 0x9f, 0x43, 0xea, 0xdf, 0x29, 0x55, 0xb7, 0xb0, 0x66, 0xd7, 0x2a, 0x21, 0xf5, - 0x1f, 0x54, 0x64, 0x0c, 0xf8, 0x2f, 0x0a, 0xa4, 0x5a, 0x28, 0x9d, 0x85, 0xe7, 0x0f, 0x29, 0xb4, - 0x0a, 0xa7, 0x85, 0x50, 0x17, 0x6f, 0x99, 0xb4, 0x2a, 0xf2, 0xa2, 0x82, 0x2b, 0x55, 0xf5, 0xa7, - 0x69, 0x92, 0x5c, 0x13, 0x08, 0x0f, 0x57, 0x3d, 0x06, 0xf8, 0x59, 0x9a, 0x6c, 0xcc, 0x04, 0x80, - 0x3b, 0x49, 0x21, 0x2f, 0xa7, 0xa7, 0x6a, 0xd1, 0x1d, 0x7b, 0xd3, 0xdc, 0x22, 0x10, 0xf5, 0xe7, - 0xe9, 0xf1, 0x14, 0xae, 0x55, 0x09, 0x42, 0xb3, 0x75, 0x4c, 0x13, 0xea, 0xa5, 0xcc, 0x78, 0x0a, - 0x1b, 0x58, 0x33, 0x2c, 0xd3, 0xc6, 0x75, 0xfc, 0x8c, 0x8e, 0xb1, 0x81, 0x0d, 0xf5, 0x9b, 0x19, - 0xe2, 0x22, 0xb3, 0x3d, 0xe2, 0xfc, 0x56, 0x06, 0x2d, 0x83, 0xca, 0xcd, 0x89, 0xc8, 0xdf, 0xce, - 0xa0, 0x33, 0x50, 0xa0, 0x06, 0xd1, 0x32, 0x87, 0xeb, 0x9e, 0xb6, 0xb5, 0xc5, 0x6a, 0x99, 0xe3, - 0xaa, 0x1f, 0xcd, 0x12, 0x83, 0xe8, 0xb2, 0x68, 0x0c, 0xf5, 0x8a, 0x56, 0xab, 0x62, 0x83, 0x03, - 0x3e, 0x96, 0x45, 0x17, 0xe0, 0x5c, 0x1c, 0x20, 0xd5, 0x5d, 0x8e, 0xfa, 0x78, 0x96, 0x24, 0x84, - 0xac, 0x45, 0x34, 0x60, 0xb6, 0xfe, 0x89, 0x48, 0x0d, 0x5f, 0x0f, 0x1b, 0x1d, 0x03, 0x7c, 0x72, - 0x02, 0x20, 0x22, 0xcf, 0x01, 0x9f, 0xca, 0x12, 0xf7, 0x18, 0x40, 0xd3, 0xcb, 0x98, 0x93, 0x9f, - 0x8f, 0xcc, 0xe3, 0x7c, 0x37, 0x34, 0x72, 0x94, 0x3c, 0xd7, 0x94, 0xbc, 0xfc, 0x74, 0x96, 0x9c, - 0x65, 0x19, 0x45, 0x2a, 0xea, 0xa6, 0xa6, 0xcb, 0x1a, 0x3e, 0x93, 0x25, 0xa1, 0x17, 0x01, 0xe4, - 0x7d, 0x73, 0xac, 0x28, 0xbc, 0x96, 0x5d, 0xfb, 0x6d, 0x1a, 0x96, 0xe2, 0xe3, 0x0a, 0xe9, 0xa3, - 0xb6, 0x69, 0xa9, 0x73, 0xe8, 0x38, 0xa8, 0x9a, 0x41, 0x12, 0x6a, 0x53, 0xab, 0x59, 0x24, 0x03, - 0x2a, 0x8e, 0xda, 0x22, 0x73, 0x82, 0xd8, 0x4a, 0x89, 0x4e, 0x66, 0xf8, 0xd5, 0x49, 0x7a, 0x7d, - 0xcb, 0x72, 0x36, 0x34, 0x8b, 0x27, 0x8d, 0xba, 0x8b, 0x56, 0x61, 0x65, 0x4b, 0xb7, 0x9c, 0x5a, - 0xd8, 0xfc, 0xb4, 0x9a, 0x57, 0xe6, 0xcb, 0xa4, 0xba, 0xb6, 0xc9, 0xf8, 0x30, 0x7d, 0xe9, 0x59, - 0x32, 0x09, 0x30, 0x15, 0x5c, 0x04, 0x6f, 0xae, 0x6a, 0x27, 0x5a, 0xe1, 0xac, 0xa2, 0x8f, 0xbe, - 0x8f, 0xa4, 0x0b, 0x3f, 0xff, 0x13, 0x31, 0x20, 0xbd, 0xbd, 0x08, 0xcb, 0x6c, 0x39, 0x4c, 0x07, - 0x96, 0xad, 0xa4, 0xc5, 0x9f, 0x12, 0x42, 0xa3, 0xd2, 0x61, 0x39, 0x5b, 0x55, 0xd2, 0x57, 0x43, - 0x36, 0x52, 0xaa, 0x4d, 0x9b, 0xf4, 0xfe, 0x8a, 0xeb, 0x6c, 0x60, 0xd2, 0x4f, 0xc3, 0xb5, 0x88, - 0x8d, 0x76, 0x6f, 0xd2, 0x44, 0xcf, 0xc3, 0x8a, 0x66, 0x18, 0xa4, 0x95, 0xcc, 0x6c, 0x68, 0xe7, - 0xa0, 0x18, 0x83, 0x4c, 0x34, 0xb3, 0x8b, 0xb0, 0x1a, 0x03, 0xcc, 0x68, 0x64, 0x67, 0xe1, 0x54, - 0x0c, 0x36, 0xde, 0xc4, 0xc6, 0xf5, 0x4c, 0x34, 0xb0, 0x33, 0x50, 0x18, 0x03, 0xc4, 0x9a, 0xd7, - 0x69, 0x38, 0x11, 0x37, 0x43, 0x6e, 0x5c, 0x92, 0xf2, 0xa9, 0x4d, 0x2b, 0x8c, 0x51, 0xd9, 0xa9, - 0x7a, 0xf2, 0x96, 0x7c, 0x99, 0xd6, 0x5a, 0x3a, 0x23, 0x84, 0x5b, 0x42, 0x8a, 0xfe, 0x32, 0xa8, - 0x35, 0x9b, 0x1e, 0xe5, 0x88, 0xfc, 0xa6, 0x82, 0x8e, 0x00, 0x38, 0x15, 0x6c, 0xd7, 0xcd, 0x6a, - 0xb5, 0x86, 0xd5, 0x8f, 0x64, 0x1f, 0xff, 0x71, 0x1a, 0x8e, 0x54, 0xf9, 0x5f, 0x2a, 0x54, 0xfd, - 0xc1, 0xdd, 0x4e, 0xd3, 0x47, 0x3a, 0xe4, 0xb6, 0xfc, 0x80, 0xff, 0x67, 0xc2, 0xc4, 0x0d, 0x09, - 0xef, 0xed, 0x07, 0x07, 0xc5, 0xd8, 0xdf, 0x12, 0x94, 0x8e, 0x7e, 0xf8, 0x77, 0xaf, 0xbc, 0x90, - 0x9c, 0x47, 0xf9, 0x2b, 0x77, 0x1f, 0xbb, 0x42, 0x2f, 0x20, 0x68, 0x0b, 0x72, 0xf4, 0x7e, 0x64, - 0xf5, 0xdb, 0x48, 0xbc, 0x13, 0x8a, 0xab, 0x58, 0x71, 0x9c, 0x50, 0x5a, 0xa6, 0x02, 0x8e, 0xa0, - 0x45, 0x22, 0x80, 0x3d, 0xf3, 0x76, 0xfb, 0xed, 0xcb, 0x89, 0x47, 0x13, 0x68, 0x0b, 0x32, 0x54, - 0xd0, 0x70, 0xa6, 0x2d, 0x13, 0xd2, 0x10, 0x95, 0xb6, 0x80, 0x20, 0x94, 0x36, 0x7c, 0x34, 0x81, - 0x9e, 0x81, 0x2c, 0xfe, 0x80, 0xdf, 0x1c, 0x05, 0x3e, 0x2a, 0x70, 0x8e, 0x89, 0xbb, 0x59, 0x71, - 0x86, 0x8e, 0xd2, 0x69, 0x2a, 0x72, 0xb9, 0x34, 0x4f, 0x45, 0x32, 0x31, 0xd7, 0xf8, 0x4d, 0x0d, - 0x35, 0x20, 0xaf, 0x8d, 0x82, 0x3e, 0xbd, 0x1b, 0xa0, 0xe5, 0xf8, 0xad, 0xec, 0x30, 0xc1, 0x17, - 0xa9, 0xe0, 0x73, 0xc5, 0x13, 0x44, 0x30, 0xbd, 0x68, 0x5d, 0x69, 0x8c, 0x82, 0x7e, 0x5d, 0xe8, - 0x60, 0xf7, 0x39, 0x54, 0x87, 0x1c, 0x51, 0x51, 0x25, 0x97, 0xae, 0xfb, 0xd4, 0x70, 0x81, 0x6a, - 0x38, 0x5b, 0x5c, 0xa6, 0x9b, 0x73, 0xd0, 0x6b, 0x4e, 0x55, 0xd0, 0x04, 0x20, 0x0a, 0xd8, 0xcd, - 0xe4, 0x7e, 0x55, 0x5c, 0xa2, 0x2a, 0x56, 0x8b, 0x27, 0x89, 0x0a, 0x76, 0x05, 0x9c, 0xaa, 0xc4, - 0x82, 0x4c, 0xb9, 0xd1, 0x6b, 0x75, 0x7d, 0x14, 0xbb, 0x43, 0xcf, 0x94, 0xbb, 0x42, 0xe5, 0x9e, - 0x28, 0x1d, 0x8d, 0x36, 0xf2, 0xca, 0xb3, 0x54, 0xc0, 0xb5, 0xc4, 0xda, 0xed, 0x0c, 0x45, 0x5f, - 0xfd, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0xac, 0xcd, 0xd6, 0xb8, 0x6b, 0x23, 0x00, 0x00, + // 3159 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x5b, 0x8c, 0xdb, 0xd6, + 0x99, 0x1e, 0x89, 0xba, 0xfe, 0x73, 0x31, 0x7d, 0xec, 0xb1, 0x65, 0x79, 0x6c, 0x8f, 0x15, 0xdb, + 0x71, 0x26, 0xd9, 0x71, 0x1c, 0x2f, 0x16, 0x59, 0x6f, 0xb2, 0x0b, 0x0e, 0x79, 0x66, 0x44, 0x0f, + 0x87, 0x14, 0x48, 0xca, 0x8e, 0x0d, 0x2c, 0x04, 0x59, 0xe2, 0x28, 0x5a, 0x6b, 0xa4, 0x59, 0x8a, + 0x72, 0x76, 0xf6, 0x61, 0x1f, 0x16, 0xbd, 0xa7, 0x05, 0xda, 0xa6, 0xe9, 0xfd, 0x21, 0x6d, 0x51, + 0xb4, 0x0f, 0xbd, 0xbd, 0x16, 0x45, 0x9b, 0x16, 0x2d, 0xd0, 0xcb, 0x6b, 0x81, 0x02, 0x7d, 0x2a, + 0x8a, 0x26, 0x0f, 0x79, 0x4f, 0xd2, 0x7b, 0x51, 0x9c, 0x0b, 0xc9, 0x43, 0x5d, 0x3c, 0x71, 0x8a, + 0xa2, 0x4f, 0xd6, 0xf9, 0xcf, 0xf7, 0x5f, 0xcf, 0xcf, 0xff, 0xff, 0xcf, 0xf1, 0xc0, 0xd2, 0xf0, + 0x5e, 0x73, 0x77, 0x77, 0xd0, 0x6b, 0xaf, 0xef, 0xfb, 0x83, 0x60, 0x80, 0xb2, 0xf4, 0x9f, 0xf2, + 0x4a, 0x67, 0x30, 0xe8, 0xf4, 0xbc, 0x2b, 0xcd, 0xfd, 0xee, 0x95, 0x66, 0xbf, 0x3f, 0x08, 0x9a, + 0x41, 0x77, 0xd0, 0x1f, 0x32, 0x50, 0xf9, 0x1c, 0xdf, 0xa5, 0xab, 0xbb, 0xa3, 0xdd, 0x2b, 0x41, + 0x77, 0xcf, 0x1b, 0x06, 0xcd, 0xbd, 0x7d, 0x0e, 0x38, 0x3d, 0x0e, 0xf0, 0xf6, 0xf6, 0x83, 0x03, + 0xb6, 0x59, 0xb9, 0x06, 0x8b, 0x4e, 0xd0, 0x0c, 0x3c, 0xdb, 0x1b, 0xee, 0x0f, 0xfa, 0x43, 0x0f, + 0x55, 0x20, 0x3b, 0x24, 0x84, 0x52, 0x6a, 0x35, 0x75, 0x79, 0xfe, 0xa9, 0x05, 0x86, 0x5b, 0x67, + 0x20, 0xb6, 0x55, 0x59, 0x81, 0x42, 0x84, 0x97, 0x41, 0xda, 0x1b, 0x76, 0x28, 0xba, 0x68, 0x93, + 0x9f, 0x95, 0x33, 0x90, 0xb7, 0xbd, 0xff, 0x1e, 0x79, 0xc3, 0x00, 0x21, 0xc8, 0xf4, 0x9b, 0x7b, + 0x1e, 0xdf, 0xa5, 0xbf, 0x2b, 0x2f, 0x67, 0x20, 0x4b, 0xa5, 0xa1, 0xab, 0x00, 0x77, 0x47, 0xdd, + 0x5e, 0xdb, 0x11, 0xf4, 0x1d, 0xe5, 0xfa, 0x36, 0xa2, 0x0d, 0x5b, 0x00, 0xa1, 0x7f, 0x86, 0xf9, + 0xb6, 0xb7, 0xdf, 0x1b, 0x1c, 0x30, 0x9e, 0x34, 0xe5, 0x41, 0x9c, 0x47, 0x8b, 0x77, 0x6c, 0x11, + 0x86, 0xaa, 0xb0, 0xb4, 0x3b, 0xf0, 0x5f, 0x68, 0xfa, 0x6d, 0xaf, 0x5d, 0x1b, 0xf8, 0xc1, 0xb0, + 0x94, 0x59, 0x95, 0x2e, 0xcf, 0x3f, 0xb5, 0x2a, 0x3a, 0xb7, 0xbe, 0x99, 0x80, 0xe0, 0x7e, 0xe0, + 0x1f, 0xd8, 0x63, 0x7c, 0x48, 0x05, 0x99, 0x84, 0x60, 0x34, 0x54, 0x9f, 0xf7, 0x5a, 0xf7, 0x98, + 0x11, 0x59, 0x6a, 0xc4, 0x49, 0x41, 0x96, 0xb8, 0x6d, 0x4f, 0x30, 0xa0, 0xeb, 0xb0, 0xb8, 0xdb, + 0xed, 0x79, 0xce, 0x41, 0xbf, 0xc5, 0x24, 0xe4, 0xa8, 0x84, 0xe3, 0x5c, 0xc2, 0xa6, 0xb8, 0x67, + 0x27, 0xa1, 0xa8, 0x06, 0xc7, 0xda, 0xde, 0xdd, 0x51, 0xa7, 0xd3, 0xed, 0x77, 0xd4, 0x41, 0x3f, + 0x68, 0x76, 0xfb, 0x9e, 0x3f, 0x2c, 0xe5, 0xa9, 0x3f, 0x67, 0xa3, 0x40, 0x8c, 0x23, 0xf0, 0x7d, + 0xaf, 0x1f, 0xd8, 0xd3, 0x58, 0xd1, 0xe3, 0x50, 0xd8, 0xf3, 0x82, 0x66, 0xbb, 0x19, 0x34, 0x4b, + 0x05, 0x6a, 0xc8, 0x11, 0x2e, 0x66, 0x87, 0x93, 0xed, 0x08, 0x50, 0x76, 0xe0, 0xd8, 0x94, 0x30, + 0x91, 0x24, 0xb8, 0xe7, 0x1d, 0xd0, 0x23, 0xcc, 0xda, 0xe4, 0x27, 0xba, 0x04, 0xd9, 0xfb, 0xcd, + 0xde, 0x28, 0x3c, 0x22, 0x99, 0x8b, 0x24, 0x3c, 0xcc, 0x16, 0xb6, 0x7d, 0x3d, 0xfd, 0x74, 0xea, + 0x46, 0xa6, 0x20, 0xc9, 0x99, 0xca, 0xeb, 0x29, 0x28, 0x84, 0x1a, 0xd1, 0x1a, 0x64, 0xe9, 0xa9, + 0xf3, 0xac, 0x38, 0x2e, 0x66, 0x45, 0x64, 0x16, 0x83, 0xa0, 0x7f, 0x82, 0x1c, 0x3b, 0x6c, 0xae, + 0x6b, 0x39, 0x91, 0x0e, 0x11, 0x9a, 0x83, 0xd0, 0x7f, 0x00, 0x34, 0xdb, 0xed, 0x2e, 0xf9, 0x84, + 0x9a, 0xbd, 0x52, 0x8b, 0x06, 0xee, 0xdc, 0x98, 0xc7, 0xeb, 0x4a, 0x84, 0x60, 0x79, 0x20, 0xb0, + 0x94, 0x9f, 0x85, 0x23, 0x63, 0xdb, 0xa2, 0xff, 0x45, 0xe6, 0xff, 0x71, 0xd1, 0xff, 0xa2, 0xe0, + 0x6d, 0xe5, 0xad, 0x34, 0x2c, 0x26, 0xfc, 0x40, 0x4f, 0xc0, 0xd1, 0xfe, 0x68, 0xef, 0xae, 0xe7, + 0x5b, 0xbb, 0x8a, 0x1f, 0x74, 0x77, 0x9b, 0xad, 0x60, 0xc8, 0x63, 0x39, 0xb9, 0x81, 0x9e, 0x85, + 0x02, 0xf5, 0x9b, 0x1c, 0x7b, 0x9a, 0x5a, 0x7f, 0x7e, 0x5a, 0x74, 0xd6, 0xf5, 0xbd, 0x66, 0xc7, + 0xdb, 0x60, 0x48, 0x3b, 0x62, 0x41, 0x17, 0x20, 0x13, 0x1c, 0xec, 0x7b, 0x25, 0x69, 0x35, 0x75, + 0x79, 0x29, 0x3a, 0x17, 0x8a, 0x73, 0x0f, 0xf6, 0x3d, 0x9b, 0xee, 0x22, 0x6d, 0x4a, 0x90, 0x2e, + 0x4c, 0x55, 0xf3, 0xa0, 0x48, 0x19, 0xb0, 0x20, 0x5a, 0x81, 0x2e, 0x71, 0xdd, 0x29, 0xaa, 0x1b, + 0x89, 0xf2, 0x3c, 0x5f, 0xd0, 0x7e, 0x1c, 0xb2, 0xad, 0xc1, 0xa8, 0x1f, 0xd0, 0xe0, 0x65, 0x6d, + 0xb6, 0xf8, 0x5b, 0xe3, 0xfe, 0xe3, 0x14, 0x2c, 0x25, 0x53, 0x02, 0x3d, 0x03, 0x45, 0x96, 0x14, + 0x24, 0x96, 0xa9, 0xb1, 0x4f, 0x48, 0x44, 0xf2, 0xa5, 0xe7, 0xdb, 0x31, 0x03, 0x7a, 0x02, 0xf2, + 0xad, 0xde, 0x68, 0x18, 0x78, 0x3e, 0x55, 0x16, 0x3b, 0xa4, 0x32, 0x2a, 0x75, 0x28, 0x84, 0x94, + 0x75, 0x28, 0x84, 0x42, 0xd0, 0xa3, 0x89, 0x38, 0x1c, 0x4b, 0xa8, 0x3c, 0x3c, 0x10, 0x95, 0x5f, + 0xa5, 0x00, 0xe2, 0xfa, 0x88, 0xfe, 0x1d, 0x8a, 0x4d, 0x21, 0x6d, 0xc4, 0xc2, 0x16, 0xa3, 0xd6, + 0xa3, 0x04, 0x62, 0xc7, 0x14, 0xb3, 0xa0, 0x55, 0x98, 0x6f, 0x8e, 0x82, 0x81, 0xeb, 0x77, 0x3b, + 0x1d, 0xee, 0x4b, 0xc1, 0x16, 0x49, 0xa4, 0x50, 0xf3, 0x22, 0x36, 0x68, 0x87, 0x99, 0x73, 0x34, + 0x59, 0xef, 0x06, 0x6d, 0xcf, 0x16, 0x40, 0xe5, 0x67, 0x60, 0x29, 0xa9, 0xf1, 0xa1, 0xce, 0xea, + 0x7f, 0x61, 0x5e, 0x28, 0xe6, 0xe8, 0x04, 0xe4, 0x98, 0x68, 0xce, 0xcd, 0x57, 0x7f, 0x17, 0xcb, + 0x2b, 0xbf, 0x4e, 0x81, 0x3c, 0x5e, 0xc4, 0x67, 0x5a, 0xa0, 0x41, 0xd1, 0xf7, 0x86, 0x83, 0x91, + 0xdf, 0xf2, 0xc2, 0xaf, 0xf1, 0xd2, 0x8c, 0x46, 0xb0, 0x6e, 0x87, 0x40, 0x7e, 0x02, 0x11, 0xe3, + 0xbb, 0x8c, 0x6f, 0x52, 0xde, 0x43, 0xc5, 0x57, 0x87, 0xc5, 0x44, 0x97, 0x79, 0xf7, 0x11, 0xae, + 0x7c, 0x35, 0x0b, 0x59, 0x5a, 0xd1, 0xd1, 0x93, 0x50, 0x24, 0x7d, 0x82, 0x2e, 0x78, 0xdd, 0x96, + 0x85, 0xba, 0x4a, 0xe9, 0xd5, 0x39, 0x3b, 0x06, 0xa1, 0x6b, 0x7c, 0x00, 0x60, 0x2c, 0xe9, 0xc9, + 0x01, 0x20, 0xe4, 0x11, 0x60, 0xe8, 0x5f, 0xc2, 0x11, 0x80, 0x71, 0x49, 0x53, 0x46, 0x80, 0x90, + 0x4d, 0x04, 0x12, 0xf3, 0xf6, 0xc3, 0xee, 0x53, 0xca, 0x4c, 0xef, 0x4a, 0xc4, 0xbc, 0x08, 0x84, + 0x70, 0xa2, 0xd9, 0x33, 0xc6, 0x99, 0xcd, 0x3e, 0xe4, 0x9f, 0x60, 0x41, 0xff, 0x09, 0xa5, 0xf0, + 0xa8, 0xc7, 0xf1, 0xbc, 0xf3, 0x87, 0xed, 0xc7, 0x9e, 0x01, 0xab, 0xce, 0xd9, 0x33, 0x45, 0xa0, + 0x67, 0xe2, 0x69, 0x82, 0xc9, 0xcc, 0x4f, 0x9d, 0x26, 0x42, 0x41, 0x49, 0x30, 0xba, 0x03, 0x27, + 0xdb, 0xd3, 0xa7, 0x05, 0x3e, 0x0c, 0x1c, 0x32, 0x53, 0x54, 0xe7, 0xec, 0x59, 0x02, 0xd0, 0xbf, + 0xc2, 0x42, 0xdb, 0xbb, 0x6f, 0x0c, 0x06, 0xfb, 0x4c, 0x60, 0x91, 0x0a, 0x8c, 0xcb, 0x5d, 0xbc, + 0x55, 0x9d, 0xb3, 0x13, 0x50, 0x12, 0xfa, 0xc0, 0xf3, 0xf7, 0xba, 0x7d, 0x3a, 0xea, 0x32, 0x76, + 0x48, 0x84, 0xde, 0x1d, 0xdb, 0x26, 0xa1, 0x1f, 0x67, 0xd9, 0x58, 0x00, 0xf0, 0xc8, 0x8f, 0x06, + 0xa9, 0xa6, 0x15, 0x1b, 0xe4, 0x71, 0xae, 0x99, 0x89, 0x7f, 0x09, 0x24, 0xcf, 0xf7, 0x79, 0x4e, + 0x86, 0xb1, 0x54, 0x5a, 0xb4, 0xf9, 0xdc, 0xed, 0x79, 0xd8, 0xf7, 0x6d, 0x02, 0xa8, 0xf4, 0x60, + 0x41, 0x74, 0x04, 0xad, 0x40, 0xb1, 0x1b, 0x78, 0x3e, 0xd5, 0xc0, 0x7b, 0x78, 0x4c, 0x10, 0xb4, + 0xa5, 0xa7, 0x69, 0x93, 0x0e, 0xd3, 0xf6, 0x62, 0x0a, 0x16, 0x13, 0x64, 0xf4, 0x38, 0xe4, 0x3d, + 0xdf, 0xa7, 0x75, 0x23, 0x35, 0xab, 0x6e, 0x84, 0x08, 0x54, 0x82, 0xfc, 0x9e, 0x37, 0x1c, 0x36, + 0x3b, 0x61, 0x49, 0x08, 0x97, 0xe8, 0x1a, 0xcc, 0x0f, 0x47, 0x9d, 0x8e, 0x37, 0xa4, 0x37, 0x8b, + 0x92, 0x44, 0x2b, 0x59, 0x24, 0x2a, 0xda, 0xb1, 0x45, 0x54, 0xc5, 0x84, 0x62, 0xf4, 0x61, 0x93, + 0x62, 0xe3, 0x91, 0x3a, 0xc4, 0xe3, 0xc8, 0x16, 0x89, 0xe1, 0x32, 0x7d, 0xc8, 0x70, 0x59, 0xf9, + 0x4e, 0xd8, 0xd7, 0x98, 0xc4, 0x32, 0x14, 0xc2, 0x26, 0xc5, 0x85, 0x46, 0xeb, 0x99, 0x81, 0x94, + 0xe3, 0x40, 0x16, 0x69, 0xc8, 0xc4, 0x00, 0x65, 0x0e, 0x0d, 0xd0, 0x75, 0x58, 0x6c, 0x8a, 0xe1, + 0xe5, 0x9f, 0xfb, 0xf4, 0x13, 0x49, 0x42, 0x2b, 0xaf, 0xa4, 0xc2, 0xa6, 0xf5, 0xe0, 0xcc, 0x92, + 0xe3, 0xcc, 0x9a, 0x34, 0x51, 0x7a, 0x78, 0x13, 0x33, 0xef, 0xdc, 0xc4, 0x57, 0x93, 0xad, 0xed, + 0xc1, 0x76, 0xce, 0x4e, 0x96, 0x7f, 0x60, 0x90, 0xdf, 0x48, 0x41, 0x69, 0x56, 0x95, 0x24, 0x09, + 0x13, 0x56, 0xc9, 0x30, 0x61, 0xc2, 0xf5, 0xcc, 0x84, 0x11, 0xbc, 0x94, 0xa6, 0x7a, 0x99, 0x89, + 0xbd, 0x4c, 0xb6, 0xe9, 0xec, 0x3b, 0x68, 0xd3, 0x93, 0xbe, 0xe6, 0xde, 0xb9, 0xaf, 0x5f, 0x4e, + 0x43, 0x31, 0xea, 0x4c, 0xa4, 0xb0, 0xf4, 0x06, 0xad, 0x66, 0x8f, 0x50, 0xc2, 0xc2, 0x12, 0x11, + 0xd0, 0x59, 0x00, 0xdf, 0xdb, 0x1b, 0x04, 0x1e, 0xdd, 0x66, 0xd3, 0xa2, 0x40, 0x21, 0x6e, 0xee, + 0x0f, 0xda, 0x26, 0xb9, 0x8b, 0x73, 0x37, 0xf9, 0x12, 0x5d, 0x80, 0xc5, 0x56, 0x58, 0xb6, 0xe9, + 0x3e, 0x73, 0x38, 0x49, 0x24, 0xda, 0xc9, 0xe5, 0x7d, 0xb8, 0xdf, 0x6c, 0x31, 0xcf, 0x8b, 0x76, + 0x4c, 0x20, 0x81, 0x27, 0x5d, 0x93, 0xb2, 0xe7, 0x58, 0xe0, 0xc3, 0x35, 0xaa, 0xc0, 0x42, 0x78, + 0x08, 0x64, 0xb0, 0xa5, 0xdd, 0xa9, 0x68, 0x27, 0x68, 0x22, 0x86, 0xca, 0x28, 0x24, 0x31, 0x54, + 0x4e, 0x09, 0xf2, 0xcd, 0x76, 0xdb, 0xf7, 0x86, 0x43, 0xda, 0x47, 0x8a, 0x76, 0xb8, 0xac, 0xfc, + 0x22, 0x15, 0x4f, 0x33, 0x51, 0xac, 0x48, 0x97, 0x53, 0xe9, 0xe8, 0xcc, 0x63, 0x15, 0x11, 0x48, + 0xa5, 0xea, 0xee, 0xc5, 0x69, 0xcd, 0x16, 0x42, 0x82, 0x48, 0xd3, 0x3e, 0xd7, 0xcc, 0xd4, 0x64, + 0xcf, 0x3e, 0x7c, 0xb2, 0x3f, 0x44, 0x02, 0xbc, 0x99, 0x86, 0x93, 0x33, 0xda, 0xee, 0x83, 0xbe, + 0xda, 0xf0, 0xa0, 0xd3, 0x87, 0x1c, 0xb4, 0x74, 0xe8, 0x41, 0x67, 0xa6, 0x1c, 0x74, 0x54, 0x92, + 0xb3, 0x63, 0x25, 0xb9, 0x04, 0x79, 0x7f, 0xd4, 0x0f, 0xba, 0x51, 0x0e, 0x84, 0x4b, 0x92, 0x9c, + 0x2f, 0x0c, 0xfc, 0x7b, 0xdd, 0x7e, 0x47, 0xeb, 0xfa, 0x3c, 0x01, 0x04, 0x0a, 0x32, 0x01, 0xe8, + 0x08, 0xc1, 0x9e, 0x66, 0x0a, 0xb4, 0xf7, 0xac, 0x3f, 0x78, 0xec, 0x60, 0x74, 0xe1, 0xa1, 0x46, + 0x90, 0x40, 0x2e, 0x8a, 0x63, 0xdb, 0x87, 0x0d, 0xc7, 0x8b, 0xe2, 0x70, 0xfc, 0x7f, 0x50, 0x30, + 0x06, 0x1d, 0xc6, 0xf7, 0x34, 0x14, 0xa3, 0xe7, 0x34, 0x3e, 0xd3, 0x96, 0xd7, 0xd9, 0x7b, 0xda, + 0x7a, 0xf8, 0x9e, 0xb6, 0xee, 0x86, 0x08, 0x3b, 0x06, 0xa3, 0x0a, 0x64, 0x3d, 0x61, 0xac, 0x0d, + 0xdf, 0xd1, 0xf8, 0xe3, 0x87, 0x97, 0xec, 0x99, 0x92, 0xd0, 0x33, 0x2b, 0xd7, 0xe1, 0x68, 0x7d, + 0xe8, 0xf9, 0x7a, 0x3f, 0x20, 0x50, 0xfe, 0x92, 0x76, 0x11, 0x72, 0x5d, 0x4a, 0xe0, 0x56, 0x2c, + 0x72, 0x79, 0x1c, 0xc5, 0x37, 0x2b, 0xff, 0x06, 0x4b, 0x7c, 0x30, 0x0f, 0x19, 0x1f, 0x4b, 0xbe, + 0xe7, 0x85, 0xd3, 0x17, 0x47, 0x25, 0x9e, 0xf5, 0xae, 0xc2, 0x82, 0x48, 0x46, 0x65, 0xc8, 0x7b, + 0x34, 0x19, 0xd9, 0x33, 0x4c, 0xa1, 0x3a, 0x67, 0x87, 0x84, 0x8d, 0x2c, 0x48, 0xf7, 0x9b, 0xbd, + 0xca, 0x0d, 0xc8, 0x31, 0x0b, 0x88, 0x2f, 0xf1, 0x8b, 0x4d, 0x21, 0x7c, 0x9b, 0x41, 0x90, 0x19, + 0x1e, 0xf4, 0x5b, 0xfc, 0xe2, 0x40, 0x7f, 0x93, 0xd4, 0xe5, 0xef, 0x35, 0x12, 0xa5, 0xf2, 0x55, + 0xa5, 0x05, 0x10, 0x4f, 0x1a, 0xe8, 0x59, 0x58, 0x8a, 0x67, 0x0d, 0x61, 0xbe, 0x59, 0x9e, 0x18, + 0x4a, 0xe8, 0x07, 0x37, 0x06, 0x26, 0x4a, 0xd8, 0xc7, 0x14, 0xd6, 0x7b, 0xb6, 0x5a, 0x1b, 0xc0, + 0xbc, 0xf0, 0xde, 0x80, 0x4a, 0x70, 0xbc, 0x6e, 0x6e, 0x9b, 0xd6, 0x2d, 0xb3, 0xb1, 0x51, 0xd7, + 0x0d, 0x0d, 0xdb, 0x0d, 0xf7, 0x76, 0x0d, 0xcb, 0x73, 0x28, 0x0f, 0xd2, 0x0d, 0x7d, 0x43, 0x4e, + 0xa1, 0x22, 0x64, 0x37, 0x94, 0x3b, 0xd8, 0x90, 0xd3, 0x68, 0x09, 0x80, 0xa2, 0x6a, 0x8a, 0xba, + 0xed, 0xc8, 0x12, 0x02, 0xc8, 0xa9, 0x75, 0xc7, 0xb5, 0x76, 0xe4, 0x0c, 0xf9, 0xbd, 0xad, 0x98, + 0xfa, 0xb6, 0x25, 0x67, 0xc9, 0x6f, 0xcd, 0x52, 0xb7, 0xb1, 0x2d, 0xe7, 0xd6, 0x34, 0x28, 0x46, + 0x8f, 0x2b, 0xe8, 0x04, 0xa0, 0x84, 0xba, 0x50, 0xd9, 0x3c, 0xe4, 0x55, 0xa3, 0xee, 0xb8, 0xd8, + 0x96, 0x53, 0x44, 0xf3, 0x96, 0xba, 0x21, 0xa7, 0x89, 0x66, 0xc3, 0x52, 0x15, 0x43, 0x96, 0xd6, + 0x2c, 0x32, 0x66, 0xc6, 0xcf, 0x03, 0xe8, 0x14, 0x2c, 0x87, 0x82, 0x34, 0x5c, 0x33, 0xac, 0xdb, + 0xb1, 0xe1, 0x05, 0xc8, 0x54, 0xb1, 0xb1, 0x23, 0xa7, 0xd0, 0x22, 0x14, 0xb7, 0xa9, 0x79, 0xfa, + 0x1d, 0x2c, 0xa7, 0x89, 0x92, 0xed, 0xfa, 0x06, 0x56, 0x5d, 0x22, 0x50, 0x87, 0x79, 0xe1, 0x99, + 0x42, 0x8c, 0x03, 0x37, 0x24, 0x14, 0xb7, 0x00, 0x85, 0x1d, 0xdd, 0xd4, 0x09, 0x27, 0xb7, 0x6d, + 0x1b, 0x33, 0xdb, 0x2c, 0xb7, 0x8a, 0x6d, 0x59, 0x5a, 0xfb, 0xd1, 0x12, 0x40, 0x5c, 0xfa, 0x50, + 0x0e, 0xd2, 0xd6, 0xb6, 0x3c, 0x87, 0x4a, 0x70, 0xcc, 0x71, 0x15, 0xb7, 0xee, 0xa8, 0x55, 0xac, + 0x6e, 0x37, 0x9c, 0xba, 0xaa, 0x62, 0xc7, 0x91, 0x7f, 0x92, 0x42, 0x08, 0x16, 0x99, 0xf7, 0x21, + 0xed, 0xa7, 0x29, 0x74, 0x0c, 0x96, 0x98, 0x23, 0x11, 0xf1, 0x67, 0x29, 0xb4, 0x02, 0x25, 0x06, + 0xac, 0xd5, 0x9d, 0x6a, 0x43, 0xa1, 0xf4, 0x86, 0x86, 0x4d, 0x1d, 0x6b, 0xb2, 0x87, 0x4e, 0xc3, + 0x49, 0xbe, 0x6b, 0x5b, 0x37, 0xb0, 0xea, 0x36, 0x4c, 0xcb, 0x6d, 0x6c, 0x5a, 0x75, 0x53, 0x93, + 0x77, 0xd1, 0x23, 0x70, 0x8e, 0x6d, 0xb2, 0x83, 0x68, 0x68, 0x0a, 0xde, 0xb1, 0x4c, 0x0a, 0xb1, + 0xeb, 0xa6, 0xa9, 0x9b, 0x5b, 0x72, 0x07, 0x9d, 0x83, 0xb2, 0x68, 0xa2, 0xbe, 0xa3, 0x6c, 0xe1, + 0x46, 0xad, 0x6e, 0x18, 0x0d, 0x6c, 0xdb, 0xf2, 0xd7, 0xd2, 0xe8, 0x11, 0x38, 0x2b, 0x02, 0x54, + 0xcb, 0x74, 0x15, 0xdd, 0xc4, 0x76, 0x43, 0xb5, 0xb1, 0xe2, 0x12, 0x21, 0x5f, 0x4f, 0xa3, 0x0a, + 0x9c, 0x11, 0x41, 0x76, 0xdd, 0x14, 0x80, 0x44, 0xd0, 0x37, 0xd2, 0xe8, 0x22, 0xac, 0x4e, 0x17, + 0xe4, 0x62, 0x7b, 0x47, 0x37, 0x15, 0x17, 0x6b, 0xf2, 0x37, 0xd3, 0xe8, 0x71, 0xb8, 0x24, 0xc2, + 0x58, 0x44, 0x76, 0xb0, 0xe9, 0x36, 0x6c, 0xcb, 0x30, 0xac, 0xba, 0xdb, 0xa8, 0x61, 0x53, 0x23, + 0x7a, 0xbf, 0xf5, 0x00, 0x99, 0x36, 0x76, 0x5c, 0xc5, 0xa6, 0xe6, 0xbd, 0x96, 0x46, 0x65, 0x58, + 0x16, 0x61, 0x75, 0xb3, 0x8a, 0x15, 0xc3, 0xad, 0xde, 0x96, 0x5f, 0x9f, 0x10, 0x61, 0x5a, 0x1a, + 0x6e, 0xec, 0xe0, 0x1d, 0xcb, 0xbe, 0xdd, 0xa8, 0xd9, 0xd8, 0x71, 0xea, 0x36, 0x96, 0x3f, 0x2a, + 0x8d, 0x87, 0x81, 0xc2, 0x34, 0xdd, 0xd9, 0x8e, 0x41, 0x1f, 0x93, 0xd0, 0x63, 0x70, 0x61, 0x02, + 0x64, 0x62, 0xf7, 0x96, 0x65, 0x13, 0xa5, 0xca, 0x4d, 0x45, 0x37, 0x94, 0x0d, 0x03, 0xcb, 0x1f, + 0x97, 0xc6, 0x23, 0x46, 0xa1, 0x35, 0x5d, 0x8b, 0xc5, 0xbd, 0x34, 0x5d, 0x67, 0xdd, 0x24, 0x2b, + 0xad, 0xce, 0x04, 0x7d, 0x42, 0x42, 0xe7, 0x61, 0x65, 0x0a, 0xc8, 0xc6, 0x8a, 0x5a, 0xa5, 0x90, + 0x97, 0xa5, 0xf1, 0x33, 0x66, 0x66, 0x91, 0x2c, 0xc0, 0x8a, 0x76, 0x5b, 0xfe, 0xe4, 0x84, 0x31, + 0x9b, 0x8a, 0x6e, 0x60, 0xad, 0xc1, 0x15, 0x91, 0x18, 0x7e, 0x4a, 0x42, 0x8f, 0x42, 0x45, 0xc4, + 0xf0, 0xcf, 0x88, 0x84, 0xdc, 0xc4, 0xaa, 0xab, 0x5b, 0x26, 0x3d, 0xe7, 0xcf, 0x4c, 0x58, 0x1d, + 0x02, 0x89, 0x73, 0xdb, 0xba, 0x61, 0x60, 0x4d, 0xfe, 0xec, 0x44, 0xa4, 0x22, 0x69, 0x86, 0x4e, + 0x4e, 0x7a, 0x13, 0xbb, 0x6a, 0x95, 0xca, 0xfb, 0x9c, 0x34, 0x7e, 0x40, 0x42, 0x42, 0xc4, 0xb0, + 0xcf, 0x4f, 0xc4, 0xa1, 0x66, 0x69, 0x0d, 0xdd, 0xd4, 0x5d, 0x5d, 0x31, 0xf4, 0x3b, 0xc4, 0x85, + 0x1f, 0x4a, 0xe4, 0xa3, 0x0b, 0xbf, 0x70, 0x6c, 0xdb, 0x96, 0x2d, 0xbf, 0x29, 0x8d, 0x7f, 0xa2, + 0x7c, 0x5f, 0x7e, 0x4b, 0x42, 0x97, 0xe0, 0xfc, 0x94, 0x9d, 0xb1, 0x03, 0x78, 0x5b, 0x42, 0x6b, + 0x70, 0x71, 0x7a, 0x0e, 0xde, 0x52, 0x74, 0x92, 0x80, 0x91, 0xcc, 0xdf, 0x4a, 0xe8, 0x2c, 0x9c, + 0x9a, 0x26, 0x13, 0xdf, 0xc4, 0xa6, 0x2b, 0xff, 0x59, 0x12, 0x4a, 0x40, 0xc8, 0xf4, 0x3b, 0x09, + 0x1d, 0x85, 0x05, 0xe7, 0xb6, 0xa9, 0x46, 0xa4, 0xdf, 0x4b, 0x71, 0xf9, 0x08, 0x69, 0x7f, 0x90, + 0xd0, 0x71, 0x38, 0xa2, 0xe1, 0x9b, 0xc4, 0xe7, 0x88, 0xfa, 0x47, 0x4a, 0x55, 0x0d, 0xac, 0x98, + 0xf5, 0x5a, 0x44, 0xfd, 0x13, 0x15, 0x99, 0x00, 0xfe, 0x85, 0x02, 0xa9, 0x16, 0x4a, 0x67, 0xe1, + 0xf9, 0x65, 0x06, 0xad, 0xc2, 0xe9, 0x50, 0xa8, 0x8d, 0xb7, 0x74, 0x5a, 0x15, 0x79, 0x51, 0xc1, + 0x35, 0x47, 0xfe, 0x6e, 0x96, 0x24, 0xd7, 0x04, 0xc2, 0xc5, 0x8e, 0xcb, 0x00, 0xdf, 0xcb, 0x92, + 0x83, 0x99, 0x00, 0x70, 0x27, 0x29, 0xe4, 0xd5, 0xec, 0x54, 0x2d, 0xaa, 0x65, 0x6e, 0xea, 0x5b, + 0x04, 0x22, 0x7f, 0x3f, 0x8b, 0x2e, 0xc0, 0xb9, 0xd8, 0x39, 0xa7, 0x5e, 0xab, 0x59, 0xb6, 0x8b, + 0xb5, 0xc6, 0xcd, 0xab, 0x8d, 0x1d, 0xc5, 0xd4, 0x37, 0xb1, 0xe3, 0xca, 0x3f, 0xc8, 0x8e, 0x27, + 0x7a, 0xdd, 0x21, 0x72, 0x14, 0x53, 0xc5, 0x34, 0xed, 0x5e, 0xc9, 0x8d, 0x27, 0xba, 0x86, 0x15, + 0xcd, 0xd0, 0x4d, 0xdc, 0xc0, 0xcf, 0xa9, 0x18, 0x6b, 0x58, 0x93, 0xbf, 0x90, 0x23, 0x81, 0x60, + 0x1e, 0xc6, 0x9c, 0x5f, 0xcc, 0xa1, 0x65, 0x90, 0xb9, 0xd1, 0x31, 0xf9, 0x4b, 0x39, 0x74, 0x06, + 0x4a, 0xd4, 0x28, 0x5a, 0x0c, 0x71, 0xc3, 0x55, 0xb6, 0xb6, 0x58, 0xc5, 0xb3, 0x6c, 0xf9, 0xbd, + 0x79, 0x62, 0x10, 0xdd, 0x0e, 0xdb, 0x47, 0xa3, 0xa6, 0xd4, 0x1d, 0xac, 0x71, 0xc0, 0xfb, 0xf2, + 0xc4, 0xaf, 0x24, 0x40, 0xa8, 0xce, 0x1c, 0xf5, 0xfe, 0x3c, 0x49, 0x1b, 0x51, 0x4b, 0xd8, 0xa6, + 0xd9, 0xfe, 0x07, 0x62, 0x35, 0x7c, 0x3f, 0x6a, 0x87, 0x0c, 0xf0, 0xc1, 0x09, 0x40, 0x78, 0x3e, + 0x1c, 0xf0, 0xa1, 0x3c, 0x71, 0x8f, 0x01, 0x14, 0xb5, 0x8a, 0x39, 0xf9, 0xc5, 0xd8, 0x3c, 0xce, + 0x77, 0x4b, 0x21, 0x1f, 0x9c, 0x6b, 0xeb, 0x82, 0x97, 0x1f, 0xce, 0x93, 0x2f, 0x5e, 0x44, 0x91, + 0xba, 0xbb, 0xa9, 0xa8, 0xa2, 0x86, 0x8f, 0xe4, 0x49, 0xe8, 0xc3, 0x00, 0xf2, 0xee, 0x3a, 0x56, + 0x3a, 0xde, 0xc8, 0xaf, 0xfd, 0x26, 0x0b, 0x4b, 0xc9, 0xa1, 0x86, 0x74, 0x5b, 0x53, 0x37, 0xe4, + 0x39, 0x74, 0x1c, 0x64, 0x45, 0x23, 0x69, 0xb7, 0xa9, 0xd4, 0x0d, 0x92, 0x27, 0x35, 0x4b, 0x6e, + 0x93, 0x69, 0x22, 0x3c, 0x4a, 0x81, 0x4e, 0x26, 0xfd, 0xd5, 0x49, 0x7a, 0x63, 0xcb, 0xb0, 0x36, + 0x14, 0x83, 0xa7, 0x96, 0xbc, 0x8b, 0x56, 0x61, 0x65, 0x4b, 0x35, 0xac, 0x7a, 0xd4, 0x22, 0x95, + 0xba, 0x5b, 0xe5, 0xdb, 0xa4, 0x06, 0x77, 0xc8, 0x90, 0x31, 0x7d, 0xeb, 0x79, 0x32, 0x2f, 0x30, + 0x15, 0x5c, 0x04, 0x6f, 0xc1, 0x72, 0x37, 0xde, 0xe1, 0xac, 0x61, 0xb7, 0xfd, 0x2f, 0x92, 0x2e, + 0xbc, 0x4a, 0x4c, 0xc4, 0x80, 0x4c, 0x00, 0x65, 0x58, 0x66, 0xdb, 0x51, 0x3a, 0xb0, 0x6c, 0x25, + 0x83, 0xc0, 0xa9, 0x50, 0x68, 0x5c, 0x60, 0x0c, 0x6b, 0xcb, 0x21, 0xdd, 0x37, 0x62, 0x23, 0x05, + 0x5d, 0x37, 0xc9, 0x84, 0x50, 0xb3, 0xad, 0x0d, 0x4c, 0xba, 0x6e, 0xb4, 0x17, 0xb3, 0xd1, 0x1e, + 0x4f, 0x5a, 0xed, 0x79, 0x58, 0x51, 0x34, 0x8d, 0x34, 0x9c, 0x99, 0x6d, 0xef, 0x1c, 0x94, 0x13, + 0x90, 0x89, 0x96, 0x77, 0x11, 0x56, 0x13, 0x80, 0x19, 0xed, 0xee, 0x2c, 0x9c, 0x4a, 0xc0, 0xc6, + 0x5b, 0xdd, 0xb8, 0x9e, 0x89, 0x36, 0x77, 0x06, 0x4a, 0x63, 0x80, 0x44, 0x8b, 0x3b, 0x0d, 0x27, + 0x92, 0x66, 0x88, 0xed, 0x4d, 0x50, 0x3e, 0xb5, 0xb5, 0x45, 0x31, 0xaa, 0x5a, 0x8e, 0x2b, 0x1e, + 0xc9, 0xa7, 0x69, 0x45, 0xa6, 0x93, 0x44, 0x74, 0x24, 0xa4, 0x35, 0x2c, 0x83, 0x5c, 0x37, 0xe9, + 0xa7, 0x1c, 0x93, 0xdf, 0xa6, 0x25, 0x94, 0x4c, 0x3e, 0xfc, 0xd4, 0xc9, 0x10, 0x25, 0x7f, 0x25, + 0x83, 0x8e, 0x00, 0x58, 0x35, 0x6c, 0x36, 0x74, 0xc7, 0xa9, 0x63, 0xf9, 0x3d, 0xf9, 0xa7, 0xbe, + 0x9d, 0x85, 0x23, 0x0e, 0xff, 0x2b, 0x07, 0xc7, 0xf3, 0xef, 0x77, 0x5b, 0x1e, 0x52, 0xa1, 0xb0, + 0xe5, 0x05, 0xfc, 0x3f, 0x22, 0x26, 0x6e, 0x57, 0x78, 0x6f, 0x3f, 0x38, 0x28, 0x27, 0xfe, 0x0e, + 0xa1, 0x72, 0xf4, 0xff, 0x7f, 0xfe, 0xda, 0x4b, 0xe9, 0x79, 0x54, 0xbc, 0x72, 0xff, 0xea, 0x15, + 0x7a, 0x79, 0x41, 0x5b, 0x50, 0xa0, 0x77, 0x2b, 0x63, 0xd0, 0x41, 0xe1, 0x1b, 0x63, 0x78, 0x8d, + 0x2b, 0x8f, 0x13, 0x2a, 0xcb, 0x54, 0xc0, 0x11, 0xb4, 0x48, 0x04, 0xb0, 0x27, 0xe2, 0xde, 0xa0, + 0x73, 0x39, 0xf5, 0x64, 0x0a, 0x6d, 0x41, 0x8e, 0x0a, 0x1a, 0xce, 0xb4, 0x65, 0x42, 0x1a, 0xa2, + 0xd2, 0x16, 0x10, 0x44, 0xd2, 0x86, 0x4f, 0xa6, 0xd0, 0x73, 0x90, 0xc7, 0xff, 0xe3, 0xb5, 0x46, + 0x81, 0x87, 0x4a, 0x9c, 0x63, 0xe2, 0x5e, 0x57, 0x9e, 0xa1, 0xa3, 0x72, 0x9a, 0x8a, 0x5c, 0xae, + 0xcc, 0x53, 0x91, 0x4c, 0xcc, 0x75, 0x7e, 0xcb, 0x43, 0x4d, 0x28, 0x2a, 0xa3, 0x60, 0x40, 0xef, + 0x15, 0x68, 0x39, 0x79, 0xa3, 0x3b, 0x4c, 0xf0, 0x45, 0x2a, 0xf8, 0x5c, 0xf9, 0x04, 0x11, 0x4c, + 0x2f, 0x69, 0x57, 0x9a, 0xa3, 0x60, 0xd0, 0x08, 0x75, 0xb0, 0xbb, 0x20, 0x6a, 0x40, 0x81, 0xa8, + 0x70, 0xc8, 0x85, 0xed, 0x21, 0x35, 0x5c, 0xa0, 0x1a, 0xce, 0x96, 0x97, 0xe9, 0xe1, 0x1c, 0xf4, + 0x5b, 0x53, 0x15, 0xb4, 0x00, 0x88, 0x02, 0x76, 0xab, 0x79, 0x58, 0x15, 0x97, 0xa8, 0x8a, 0xd5, + 0xf2, 0x49, 0xa2, 0x82, 0x5d, 0x1f, 0xa7, 0x2a, 0x31, 0x20, 0x57, 0x6d, 0xf6, 0xdb, 0x3d, 0x0f, + 0x25, 0xee, 0xdf, 0x33, 0xe5, 0xae, 0x50, 0xb9, 0x27, 0x2a, 0x47, 0xe3, 0x83, 0xbc, 0xf2, 0x3c, + 0x15, 0x70, 0x3d, 0xb5, 0x76, 0x37, 0x47, 0xd1, 0xd7, 0xfe, 0x1a, 0x00, 0x00, 0xff, 0xff, 0x00, + 0x60, 0x5f, 0xb3, 0xa7, 0x23, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/proto/skaffold.proto b/proto/skaffold.proto index 6a8c8feb5b9..772b74e5260 100644 --- a/proto/skaffold.proto +++ b/proto/skaffold.proto @@ -500,6 +500,8 @@ enum StatusCode { DEVINIT_REGISTER_DEPLOY_DEPS = 703; // Failed to configure watcher for Skaffold configuration file. DEVINIT_REGISTER_CONFIG_DEP = 704; + // Failed to configure watcher for build dependencies for a base image with v1 manifest. + DEVINIT_UNSUPPORTED_V1_MANIFEST = 705; // Timeout or User Cancellation Errors @@ -604,11 +606,15 @@ enum SuggestionCode { // Minikube is stopped: use `minikube start` START_MINIKUBE = 501; - // Minikube is paused: use `minikube unpause` UNPAUSE_MINIKUBE = 502; + // Dev Phase error suggestions + + // Run Docker pull for the image with v1 manifest and try again. + RUN_DOCKER_PULL = 551; + // Open an issue so this situation can be diagnosed OPEN_ISSUE = 900; } From 2d4ab59181f3eb3aac3f42c6359a23b2633000d7 Mon Sep 17 00:00:00 2001 From: tejal29 Date: Thu, 22 Oct 2020 11:39:44 -0700 Subject: [PATCH 4/7] fix race condition --- pkg/skaffold/docker/dependencies.go | 15 ++++-- pkg/skaffold/docker/dependencies_test.go | 8 +-- pkg/skaffold/docker/parse.go | 2 +- pkg/skaffold/errors/err_map.go | 9 ++-- pkg/skaffold/errors/errors_test.go | 66 ++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 14 deletions(-) diff --git a/pkg/skaffold/docker/dependencies.go b/pkg/skaffold/docker/dependencies.go index 4dba83cd177..952c5c4c1a0 100644 --- a/pkg/skaffold/docker/dependencies.go +++ b/pkg/skaffold/docker/dependencies.go @@ -22,6 +22,7 @@ import ( "os" "path/filepath" "sort" + "sync" "github.com/docker/docker/builder/dockerignore" @@ -36,7 +37,7 @@ type dependency struct { // dependencyCache caches the results for `GetDependencies` for individual dockerfile. var ( - dependencyCache = map[string]dependency{} + dependencyCache = sync.Map{} ) // NormalizeDockerfilePath returns the absolute path to the dockerfile. @@ -61,14 +62,18 @@ func GetDependencies(ctx context.Context, workspace string, dockerfilePath strin return nil, fmt.Errorf("normalizing dockerfile path: %w", err) } - if _, ok := dependencyCache[absDockerfilePath]; !ok { + if v, ok := dependencyCache.Load(absDockerfilePath); !ok { paths, err := getDependencies(workspace, dockerfilePath, absDockerfilePath, buildArgs, cfg) - dependencyCache[absDockerfilePath] = dependency{ + dependencyCache.Store(absDockerfilePath, dependency{ files: paths, err: err, - } + }) + return paths, err + } else if cv, ok := v.(dependency); ok { + return cv.files, cv.err } - return dependencyCache[absDockerfilePath].files, dependencyCache[absDockerfilePath].err + // TODO: tejaldesai + return nil, fmt.Errorf("unexpected skaffold internal error encountered") } func getDependencies(workspace string, dockerfilePath string, absDockerfilePath string, buildArgs map[string]*string, cfg Config) ([]string, error) { diff --git a/pkg/skaffold/docker/dependencies_test.go b/pkg/skaffold/docker/dependencies_test.go index ae483c237f9..c172100492f 100644 --- a/pkg/skaffold/docker/dependencies_test.go +++ b/pkg/skaffold/docker/dependencies_test.go @@ -21,6 +21,7 @@ import ( "fmt" "os" "path/filepath" + "sync" "testing" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -694,14 +695,13 @@ func TestGetDependenciesCached(t *testing.T) { tmpDir := t.NewTempDir().Touch("server.go", "random.go") tmpDir.Write("Dockerfile", copyServerGo) // construct cache for abs dockerfile paths. - cache := map[string]dependency{} + defer func() { dependencyCache = sync.Map{} }() for k, v := range test.dependencyCache { - cache[tmpDir.Path(k)] = v + dependencyCache.Store(tmpDir.Path(k), v) } - t.Override(&dependencyCache, cache) deps, err := GetDependencies(context.Background(), tmpDir.Root(), "Dockerfile", map[string]*string{}, nil) t.CheckErrorAndDeepEqual(test.shouldErr, err, test.expected, deps) - if _, ok := dependencyCache[tmpDir.Path("Dockerfile")]; !ok { + if _, ok := dependencyCache.Load(tmpDir.Path("Dockerfile")); !ok { t.Fatal("expected a cache entry for Dockerfile, did not found") } }) diff --git a/pkg/skaffold/docker/parse.go b/pkg/skaffold/docker/parse.go index 7af936cf8cf..02828685f80 100644 --- a/pkg/skaffold/docker/parse.go +++ b/pkg/skaffold/docker/parse.go @@ -25,7 +25,6 @@ import ( "path/filepath" "strings" - sErrors "github.com/GoogleContainerTools/skaffold/pkg/skaffold/errors" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/moby/buildkit/frontend/dockerfile/command" "github.com/moby/buildkit/frontend/dockerfile/instructions" @@ -33,6 +32,7 @@ import ( "github.com/moby/buildkit/frontend/dockerfile/shell" "github.com/sirupsen/logrus" + sErrors "github.com/GoogleContainerTools/skaffold/pkg/skaffold/errors" "github.com/GoogleContainerTools/skaffold/pkg/skaffold/util" ) diff --git a/pkg/skaffold/errors/err_map.go b/pkg/skaffold/errors/err_map.go index cd1e646e531..b867a74ec7c 100644 --- a/pkg/skaffold/errors/err_map.go +++ b/pkg/skaffold/errors/err_map.go @@ -107,11 +107,12 @@ var ( regexp: re(retrieveFailedOldManifest), description: func(err error) string { matchExp := re(retrieveFailedOldManifest) - imageName := "specified image" - if match := matchExp.FindStringSubmatch(fmt.Sprintf("%s", err)); len(match) >= 2 { - imageName = fmt.Sprintf("image %s", match[1]) + match := matchExp.FindStringSubmatch(fmt.Sprintf("%s", err)) + pre := "Could not retrieve image pushed with the deprecated manifest v1" + if len(match) >= 3 && match[2] != "" { + pre = fmt.Sprintf("Could not retrieve image %s pushed with the deprecated manifest v1", match[2]) } - return fmt.Sprintf("Could not retrieve %s pushed with the deprecated manifest v1. Ignoring files dependencies for all ONBUILD triggers", imageName) + return fmt.Sprintf("%s. Ignoring files dependencies for all ONBUILD triggers", pre) }, errCode: proto.StatusCode_DEVINIT_UNSUPPORTED_V1_MANIFEST, suggestion: func(opts config.SkaffoldOptions) []*proto.Suggestion { diff --git a/pkg/skaffold/errors/errors_test.go b/pkg/skaffold/errors/errors_test.go index 0ee3fd38ec9..4d4051b1c08 100644 --- a/pkg/skaffold/errors/errors_test.go +++ b/pkg/skaffold/errors/errors_test.go @@ -277,6 +277,72 @@ func TestShowAIError(t *testing.T) { } } +func TestIsOldImageManifestProblem(t *testing.T) { + tests := []struct { + description string + command string + err error + expectedMsg string + expected bool + }{ + { + description: "dev command older manifest with image name", + command: "dev", + err: fmt.Errorf(`listing files: parsing ONBUILD instructions: retrieving image "library/ruby:2.3.0": unsupported MediaType: "application/vnd.docker.distribution.manifest.v1+prettyjws", see https://github.com/google/go-containerregistry/issues/377`), + expectedMsg: "Could not retrieve image library/ruby:2.3.0 pushed with the deprecated manifest v1. Ignoring files dependencies for all ONBUILD triggers. To avoid, hit Cntrl-C and run `docker pull` to fetch the specified image and retry.", + expected: true, + }, + { + description: "dev command older manifest without image name", + command: "dev", + err: fmt.Errorf(`unsupported MediaType: "application/vnd.docker.distribution.manifest.v1+prettyjws", see https://github.com/google/go-containerregistry/issues/377`), + expectedMsg: "Could not retrieve image pushed with the deprecated manifest v1. Ignoring files dependencies for all ONBUILD triggers. To avoid, hit Cntrl-C and run `docker pull` to fetch the specified image and retry.", + expected: true, + }, + { + description: "dev command with random name", + command: "dev", + err: fmt.Errorf(`listing files: parsing ONBUILD instructions: retrieve image "noimage" image does not exits`), + }, + { + description: "debug command older manifest", + command: "debug", + err: fmt.Errorf(`unsupported MediaType: "application/vnd.docker.distribution.manifest.v1+prettyjws", see https://github.com/google/go-containerregistry/issues/377`), + expectedMsg: "Could not retrieve image pushed with the deprecated manifest v1. Ignoring files dependencies for all ONBUILD triggers. To avoid, hit Cntrl-C and run `docker pull` to fetch the specified image and retry.", + expected: true, + }, + { + description: "build command older manifest", + command: "build", + err: fmt.Errorf(`unsupported MediaType: "application/vnd.docker.distribution.manifest.v1+prettyjws", see https://github.com/google/go-containerregistry/issues/377`), + expected: true, + }, + { + description: "run command older manifest", + command: "run", + err: fmt.Errorf(`unsupported MediaType: "application/vnd.docker.distribution.manifest.v1+prettyjws", see https://github.com/google/go-containerregistry/issues/377`), + expected: true, + }, + { + description: "deploy command older manifest", + command: "deploy", + err: fmt.Errorf(`unsupported MediaType: "application/vnd.docker.distribution.manifest.v1+prettyjws", see https://github.com/google/go-containerregistry/issues/377`), + expected: true, + }, + } + for _, test := range tests { + testutil.Run(t, test.description, func(t *testutil.T) { + skaffoldOpts = config.SkaffoldOptions{ + Command: test.command, + } + actualMsg, actual := IsOldImageManifestProblem(test.err) + fmt.Println(actualMsg) + t.CheckDeepEqual(test.expectedMsg, actualMsg) + t.CheckDeepEqual(test.expected, actual) + }) + } +} + func stringOrUndefined(s string) config.StringOrUndefined { c := &config.StringOrUndefined{} c.Set(s) From 2629f23aec86205f098d8e41b3b304ef42ec0d36 Mon Sep 17 00:00:00 2001 From: tejal29 Date: Tue, 3 Nov 2020 12:34:44 -0800 Subject: [PATCH 5/7] use go singleflight to ensure getDependency is called once and only once for every artifact --- pkg/skaffold/docker/dependencies.go | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/pkg/skaffold/docker/dependencies.go b/pkg/skaffold/docker/dependencies.go index 952c5c4c1a0..1e49c059c0d 100644 --- a/pkg/skaffold/docker/dependencies.go +++ b/pkg/skaffold/docker/dependencies.go @@ -22,9 +22,9 @@ import ( "os" "path/filepath" "sort" - "sync" "github.com/docker/docker/builder/dockerignore" + "github.com/golang/groupcache/singleflight" "github.com/GoogleContainerTools/skaffold/pkg/skaffold/walk" ) @@ -35,9 +35,9 @@ type dependency struct { err error } -// dependencyCache caches the results for `GetDependencies` for individual dockerfile. +// sfDependencyCache ensures `GetDependencies` is called only once for individual dockerfile. var ( - dependencyCache = sync.Map{} + sfDependencyCache = singleflight.Group{} ) // NormalizeDockerfilePath returns the absolute path to the dockerfile. @@ -62,18 +62,16 @@ func GetDependencies(ctx context.Context, workspace string, dockerfilePath strin return nil, fmt.Errorf("normalizing dockerfile path: %w", err) } - if v, ok := dependencyCache.Load(absDockerfilePath); !ok { + if paths, err := sfDependencyCache.Do(absDockerfilePath, func() (interface{}, error) { paths, err := getDependencies(workspace, dockerfilePath, absDockerfilePath, buildArgs, cfg) - dependencyCache.Store(absDockerfilePath, dependency{ - files: paths, - err: err, - }) return paths, err - } else if cv, ok := v.(dependency); ok { - return cv.files, cv.err + }); err != nil { + return nil, err + } else if s, ok := paths.([]string); !ok { + return nil, fmt.Errorf("unexpected skaffold internal error encountered converting dependencies to []string") + } else { + return s, nil } - // TODO: tejaldesai - return nil, fmt.Errorf("unexpected skaffold internal error encountered") } func getDependencies(workspace string, dockerfilePath string, absDockerfilePath string, buildArgs map[string]*string, cfg Config) ([]string, error) { From 416a600ede0274a8cfc92ff7fb10636a94e9c699 Mon Sep 17 00:00:00 2001 From: tejal29 Date: Tue, 3 Nov 2020 12:39:16 -0800 Subject: [PATCH 6/7] vendor go/singleflight --- go.mod | 1 + .../groupcache/singleflight/singleflight.go | 64 +++++++++++++++++++ vendor/modules.txt | 2 + 3 files changed, 67 insertions(+) create mode 100644 vendor/github.com/golang/groupcache/singleflight/singleflight.go diff --git a/go.mod b/go.mod index 9ee5211347e..2ca5c9a035c 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( github.com/ghodss/yaml v1.0.0 github.com/go-git/go-git/v5 v5.0.0 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e github.com/golang/protobuf v1.4.2 github.com/google/go-cmp v0.4.1 github.com/google/go-containerregistry v0.1.1 diff --git a/vendor/github.com/golang/groupcache/singleflight/singleflight.go b/vendor/github.com/golang/groupcache/singleflight/singleflight.go new file mode 100644 index 00000000000..ff2c2ee4f3d --- /dev/null +++ b/vendor/github.com/golang/groupcache/singleflight/singleflight.go @@ -0,0 +1,64 @@ +/* +Copyright 2012 Google Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package singleflight provides a duplicate function call suppression +// mechanism. +package singleflight + +import "sync" + +// call is an in-flight or completed Do call +type call struct { + wg sync.WaitGroup + val interface{} + err error +} + +// Group represents a class of work and forms a namespace in which +// units of work can be executed with duplicate suppression. +type Group struct { + mu sync.Mutex // protects m + m map[string]*call // lazily initialized +} + +// Do executes and returns the results of the given function, making +// sure that only one execution is in-flight for a given key at a +// time. If a duplicate comes in, the duplicate caller waits for the +// original to complete and receives the same results. +func (g *Group) Do(key string, fn func() (interface{}, error)) (interface{}, error) { + g.mu.Lock() + if g.m == nil { + g.m = make(map[string]*call) + } + if c, ok := g.m[key]; ok { + g.mu.Unlock() + c.wg.Wait() + return c.val, c.err + } + c := new(call) + c.wg.Add(1) + g.m[key] = c + g.mu.Unlock() + + c.val, c.err = fn() + c.wg.Done() + + g.mu.Lock() + delete(g.m, key) + g.mu.Unlock() + + return c.val, c.err +} diff --git a/vendor/modules.txt b/vendor/modules.txt index ebba377b25b..5b29ce023ff 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -269,7 +269,9 @@ github.com/gogo/protobuf/sortkeys ## explicit github.com/golang/glog # github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e +## explicit github.com/golang/groupcache/lru +github.com/golang/groupcache/singleflight # github.com/golang/protobuf v1.4.2 ## explicit github.com/golang/protobuf/descriptor From 00557b09afa59d0b8d50bbcf837c3c5a3babcfbc Mon Sep 17 00:00:00 2001 From: tejal29 Date: Tue, 3 Nov 2020 14:30:44 -0800 Subject: [PATCH 7/7] use singleflight and sync.Map --- pkg/skaffold/docker/dependencies.go | 49 +++++++++++++----------- pkg/skaffold/docker/dependencies_test.go | 25 +++++++----- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/pkg/skaffold/docker/dependencies.go b/pkg/skaffold/docker/dependencies.go index 1e49c059c0d..0ce36a28226 100644 --- a/pkg/skaffold/docker/dependencies.go +++ b/pkg/skaffold/docker/dependencies.go @@ -22,6 +22,7 @@ import ( "os" "path/filepath" "sort" + "sync" "github.com/docker/docker/builder/dockerignore" "github.com/golang/groupcache/singleflight" @@ -29,15 +30,14 @@ import ( "github.com/GoogleContainerTools/skaffold/pkg/skaffold/walk" ) -// dependency represents computed dependency for a dockerfile. -type dependency struct { - files []string - err error -} - -// sfDependencyCache ensures `GetDependencies` is called only once for individual dockerfile. var ( - sfDependencyCache = singleflight.Group{} + // sfGetDependencies ensures `GetDependencies` is called only once at any time + // for a given dockerfile. + // sfGetDependencies along with sync.Map will ensure no two concurrent processes read or + // write dependencies for a given dockerfile. + sfGetDependencies = singleflight.Group{} + + dependencyCache = sync.Map{} ) // NormalizeDockerfilePath returns the absolute path to the dockerfile. @@ -62,35 +62,40 @@ func GetDependencies(ctx context.Context, workspace string, dockerfilePath strin return nil, fmt.Errorf("normalizing dockerfile path: %w", err) } - if paths, err := sfDependencyCache.Do(absDockerfilePath, func() (interface{}, error) { - paths, err := getDependencies(workspace, dockerfilePath, absDockerfilePath, buildArgs, cfg) - return paths, err - }); err != nil { + deps, _ := sfGetDependencies.Do(absDockerfilePath, func() (interface{}, error) { + if dep, ok := dependencyCache.Load(absDockerfilePath); ok { + return dep, nil + } + dep := getDependencies(workspace, dockerfilePath, absDockerfilePath, buildArgs, cfg) + dependencyCache.Store(absDockerfilePath, dep) + return dep, nil + }) + + if paths, ok := deps.([]string); ok { + return paths, nil + } else if err, ok := deps.(error); ok { return nil, err - } else if s, ok := paths.([]string); !ok { - return nil, fmt.Errorf("unexpected skaffold internal error encountered converting dependencies to []string") - } else { - return s, nil } + return nil, fmt.Errorf("unexpected skaffold internal error encountered converting dependencies to []string") } -func getDependencies(workspace string, dockerfilePath string, absDockerfilePath string, buildArgs map[string]*string, cfg Config) ([]string, error) { +func getDependencies(workspace string, dockerfilePath string, absDockerfilePath string, buildArgs map[string]*string, cfg Config) interface{} { // If the Dockerfile doesn't exist, we can't compute the dependency. // But since we know the Dockerfile is a dependency, let's return a list // with only that file. It makes errors down the line more actionable // than returning an error now. if _, err := os.Stat(absDockerfilePath); os.IsNotExist(err) { - return []string{dockerfilePath}, nil + return []string{dockerfilePath} } fts, err := readCopyCmdsFromDockerfile(false, absDockerfilePath, workspace, buildArgs, cfg) if err != nil { - return nil, err + return err } excludes, err := readDockerignore(workspace, absDockerfilePath) if err != nil { - return nil, fmt.Errorf("reading .dockerignore: %w", err) + return fmt.Errorf("reading .dockerignore: %w", err) } deps := make([]string, 0, len(fts)) @@ -100,7 +105,7 @@ func getDependencies(workspace string, dockerfilePath string, absDockerfilePath files, err := WalkWorkspace(workspace, excludes, deps) if err != nil { - return nil, fmt.Errorf("walking workspace: %w", err) + return fmt.Errorf("walking workspace: %w", err) } // Always add dockerfile even if it's .dockerignored. The daemon will need it anyways. @@ -119,7 +124,7 @@ func getDependencies(workspace string, dockerfilePath string, absDockerfilePath } sort.Strings(dependencies) - return dependencies, nil + return dependencies } // readDockerignore reads patterns to ignore diff --git a/pkg/skaffold/docker/dependencies_test.go b/pkg/skaffold/docker/dependencies_test.go index c172100492f..7e7ba1aeb05 100644 --- a/pkg/skaffold/docker/dependencies_test.go +++ b/pkg/skaffold/docker/dependencies_test.go @@ -660,29 +660,37 @@ func TestGetDependenciesCached(t *testing.T) { tests := []struct { description string retrieveImgMock func(_ string, _ Config) (*v1.ConfigFile, error) - dependencyCache map[string]dependency + dependencyCache map[string]interface{} expected []string shouldErr bool }{ { - description: "with no cached results, getDependencies will retrieve image", + description: "with no cached results getDependencies will retrieve image", retrieveImgMock: imageFetcher.fetch, - dependencyCache: map[string]dependency{}, + dependencyCache: map[string]interface{}{}, expected: []string{"Dockerfile", "server.go"}, }, { - description: "with cached results, getDependencies should read from cache", + description: "with cached results getDependencies should read from cache", retrieveImgMock: func(_ string, _ Config) (*v1.ConfigFile, error) { return nil, fmt.Errorf("unexpected call") }, - dependencyCache: map[string]dependency{"Dockerfile": {[]string{"random.go"}, nil}}, + dependencyCache: map[string]interface{}{"Dockerfile": []string{"random.go"}}, expected: []string{"random.go"}, }, + { + description: "with cached results is error getDependencies should read from cache", + retrieveImgMock: func(_ string, _ Config) (*v1.ConfigFile, error) { + return &v1.ConfigFile{}, nil + }, + dependencyCache: map[string]interface{}{"Dockerfile": fmt.Errorf("remote manifest fetch")}, + shouldErr: true, + }, { description: "with cached results for dockerfile in another app", retrieveImgMock: imageFetcher.fetch, - dependencyCache: map[string]dependency{ - filepath.Join("app", "Dockerfile"): {[]string{"random.go"}, nil}}, + dependencyCache: map[string]interface{}{ + filepath.Join("app", "Dockerfile"): []string{"random.go"}}, expected: []string{"Dockerfile", "server.go"}, }, } @@ -701,9 +709,6 @@ func TestGetDependenciesCached(t *testing.T) { } deps, err := GetDependencies(context.Background(), tmpDir.Root(), "Dockerfile", map[string]*string{}, nil) t.CheckErrorAndDeepEqual(test.shouldErr, err, test.expected, deps) - if _, ok := dependencyCache.Load(tmpDir.Path("Dockerfile")); !ok { - t.Fatal("expected a cache entry for Dockerfile, did not found") - } }) } }