From 795dd28b76ebc9aca939cc3572802dc31372ea2b Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Thu, 17 Feb 2022 14:30:00 +0100 Subject: [PATCH 01/10] Implement Secret storage backend as gRPC server --- Makefile | 8 +- cmd/k8s-engine/README.md | 40 +- cmd/secret-storage-backend/README.md | 58 + cmd/secret-storage-backend/example_test.go | 166 +++ cmd/secret-storage-backend/main.go | 103 ++ docs/proposal/20211207-delegated-storage.md | 107 +- go.mod | 19 +- go.sum | 380 +++++- hack/gen-grpc-resources.sh | 96 ++ hack/lib/const.sh | 1 + .../fake_provider_test.go | 98 ++ internal/secret-storage-backend/server.go | 304 +++++ .../secret-storage-backend/server_test.go | 715 ++++++++++ pkg/hub/api/grpc/storage_backend.proto | 88 ++ .../storage_backend/storage_backend.pb.go | 1207 +++++++++++++++++ .../storage_backend_grpc.pb.go | 325 +++++ 16 files changed, 3600 insertions(+), 115 deletions(-) create mode 100644 cmd/secret-storage-backend/README.md create mode 100644 cmd/secret-storage-backend/example_test.go create mode 100644 cmd/secret-storage-backend/main.go create mode 100755 hack/gen-grpc-resources.sh create mode 100644 internal/secret-storage-backend/fake_provider_test.go create mode 100644 internal/secret-storage-backend/server.go create mode 100644 internal/secret-storage-backend/server_test.go create mode 100644 pkg/hub/api/grpc/storage_backend.proto create mode 100644 pkg/hub/api/grpc/storage_backend/storage_backend.pb.go create mode 100644 pkg/hub/api/grpc/storage_backend/storage_backend_grpc.pb.go diff --git a/Makefile b/Makefile index d6e002788..af7a96c8a 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ all: generate build-all-images test-unit test-lint ## Default: generate all, bui # Building # ############ -APPS = gateway k8s-engine hub-js argo-runner helm-runner cloudsql-runner populator terraform-runner argo-actions gitlab-api-runner +APPS = gateway k8s-engine hub-js argo-runner helm-runner cloudsql-runner populator terraform-runner argo-actions gitlab-api-runner secret-storage-backend TESTS = e2e INFRA = json-go-gen graphql-schema-linter jinja2 merger @@ -148,7 +148,7 @@ image-security-scan: build-all-images ## Build the docker images and check for v # Generating # ############## -generate: gen-go-api-from-ocf-spec gen-k8s-resources gen-graphql-resources gen-go-source-code gen-docs ## Run all generators +generate: gen-go-api-from-ocf-spec gen-k8s-resources gen-graphql-resources gen-go-source-code gen-docs gen-grpc-resources ## Run all generators .PHONY: generate gen-go-api-from-ocf-spec: ## Generate Go code from OCF JSON Schemas @@ -163,6 +163,10 @@ gen-graphql-resources: ## Generate code from GraphQL schema ./hack/gen-graphql-resources.sh .PHONY: gen-graphql-resources +gen-grpc-resources: ## Generate gRPC + ProtoBuf Go code for client and server + ./hack/gen-grpc-resources.sh +.PHONY: gen-proto-source-code + gen-go-source-code: go generate -x ./... .PHONY: gen-go-source-code diff --git a/cmd/k8s-engine/README.md b/cmd/k8s-engine/README.md index fd93730b0..478d77938 100644 --- a/cmd/k8s-engine/README.md +++ b/cmd/k8s-engine/README.md @@ -41,26 +41,26 @@ query { ## Configuration -| Name | Required | Default | Description | -|---------------------------------|----------|----------------------------------|--------------------------------------------------------------------------------------------------------------| -| APP_ENABLE_LEADER_ELECTION | no | `false` | Enable leader election for Kubernetes controller. This ensures only 1 controller is active at any time point | -| APP_LEADER_ELECTION_NAMESPACE | no | | Set the Kubernetes namespace, in which the leader election ConfigMap is created | -| APP_GRAPHQL_ADDR | no | `:8080` | TCP address the metrics endpoint binds to | -| APP_GRAPHQL_ADDR | no | `8081` | TCP address the metrics endpoint binds to | -| APP_HEALTHZ_ADDR | no | `:8082` | TCP address the health probes endpoint binds to | -| APP_LOGGER_DEV_MODE | no | `false` | Enable development mode logging | -| APP_MAX_CONCURRENT_RECONCILES | no | `1` | Maximum number of concurrent reconcile loops in the controller | -| APP_MAX_RETRY_FOR_FAILED_ACTION | no | `15` | Maximum number of retries for failed Action reconcile process | -| APP_GRAPHQLGATEWAY_ENDPOINT | no | `http://capact-gateway/graphql` | Endpoint of the Capact Gateway | -| APP_GRAPHQLGATEWAY_USERNAME | yes | | Basic auth username used to authenticate at the Capact Gateway | -| APP_GRAPHQLGATEWAY_PASSWORD | yes | | Basic auth password used to authenticate at the Capact Gateway | -| APP_BUILTIN_RUNNER_TIMEOUT | no | `30m` | Set the timeout for the workflow execution of the builtin runners | -| APP_BUILTIN_RUNNER_IMAGE | yes | | Set the image of the builtin runner | -| APP_CLUSTER_POLICY_NAME | no | `capact-engine-cluster-policy` | Name of the ConfigMap with cluster policy | -| APP_CLUSTER_POLICY_NAMESPACE | no | `capact-system` | Namespace of the ConfigMap with cluster policy | -| APP_RENDERER_RENDER_TIMEOUT | no | `10m` | Maximum time for rendering process. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". | -| APP_RENDERER_MAX_DEPTH | no | `50` | Maximum number of allowed nested workflows to be processed. | -| KUBECONFIG | no | `~/.kube/config` | Path to kubeconfig file | +| Name | Required | Default | Description | +|---------------------------------|----------|---------------------------------|--------------------------------------------------------------------------------------------------------------| +| APP_ENABLE_LEADER_ELECTION | no | `false` | Enable leader election for Kubernetes controller. This ensures only 1 controller is active at any time point | +| APP_LEADER_ELECTION_NAMESPACE | no | | Set the Kubernetes namespace, in which the leader election ConfigMap is created | +| APP_GRAPHQL_ADDR | no | `:8080` | TCP address the GraphQL endpoint binds to | +| APP_METRICS_ADDR | no | `:8081` | TCP address the metrics endpoint binds to | +| APP_HEALTHZ_ADDR | no | `:8082` | TCP address the health probes endpoint binds to | +| APP_LOGGER_DEV_MODE | no | `false` | Enable development mode logging | +| APP_MAX_CONCURRENT_RECONCILES | no | `1` | Maximum number of concurrent reconcile loops in the controller | +| APP_MAX_RETRY_FOR_FAILED_ACTION | no | `15` | Maximum number of retries for failed Action reconcile process | +| APP_GRAPHQLGATEWAY_ENDPOINT | no | `http://capact-gateway/graphql` | Endpoint of the Capact Gateway | +| APP_GRAPHQLGATEWAY_USERNAME | yes | | Basic auth username used to authenticate at the Capact Gateway | +| APP_GRAPHQLGATEWAY_PASSWORD | yes | | Basic auth password used to authenticate at the Capact Gateway | +| APP_BUILTIN_RUNNER_TIMEOUT | no | `30m` | Set the timeout for the workflow execution of the builtin runners | +| APP_BUILTIN_RUNNER_IMAGE | yes | | Set the image of the builtin runner | +| APP_CLUSTER_POLICY_NAME | no | `capact-engine-cluster-policy` | Name of the ConfigMap with cluster policy | +| APP_CLUSTER_POLICY_NAMESPACE | no | `capact-system` | Namespace of the ConfigMap with cluster policy | +| APP_RENDERER_RENDER_TIMEOUT | no | `10m` | Maximum time for rendering process. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". | +| APP_RENDERER_MAX_DEPTH | no | `50` | Maximum number of allowed nested workflows to be processed. | +| KUBECONFIG | no | `~/.kube/config` | Path to kubeconfig file | ## Development diff --git a/cmd/secret-storage-backend/README.md b/cmd/secret-storage-backend/README.md new file mode 100644 index 000000000..bc1421b15 --- /dev/null +++ b/cmd/secret-storage-backend/README.md @@ -0,0 +1,58 @@ +# Secret Storage Backend + +## Overview + +Secret Storage Backend is a service which handles multiple secret storages for TypeInstances. + +This service is implemented according to the [Delegated Storage](../../docs/proposal/20211207-delegated-storage.md) concept. + +## Prerequisites + +- [Go](https://golang.org) + +## Usage + +### AWS Secrets Manager provider + +By default, the Secret Storage Backend has the `aws_secretsmanager` provider enabled. + +1. Create AWS security credentials with `SecretsManagerReadWrite` policy. +2. Export environment variables: + + ```bash + export AWS_ACCESS_KEY_ID="{accessKey}" + export AWS_SECRET_ACCESS_KEY="{secretKey}" + ``` +3. Run the server: + + ```bash + APP_LOGGER_DEV_MODE=true go run ./cmd/secret-storage-backend/main.go + ``` + +The server will listen to gRPC calls according to the [Storage Backend Protocol Buffers schema](../../pkg/hub/api/grpc/storage_backend.proto). +To perform such calls, you can use e.g. [Insomnia](https://insomnia.rest/) tool. + +### Dotenv provider + +To run the server with `dotenv` provider enabled, which stores data in files, execute: + +```bash +APP_SUPPORTED_PROVIDERS=dotenv APP_LOGGER_DEV_MODE=true go run ./cmd/secret-storage-backend/main.go +``` + +> **NOTE:** You can enable multiple providers, separating them by comma, such as: `APP_SUPPORTED_PROVIDERS=aws_secretsmanager,dotenv`. + +## Configuration + +| Name | Required | Default | Description | +|-------------------------|----------|----------------------|-------------------------------------------------------------------------------------------------------------------------------| +| APP_GRPC_ADDR | no | `:50051` | TCP address the gRPC server binds to | +| APP_HEALTHZ_ADDR | no | `:8082` | TCP address the health probes endpoint binds to | +| APP_SUPPORTED_PROVIDERS | no | `aws_secretsmanager` | Supported secret providers separated by `,`. A given provider must be passed in additional parameters of gRPC request inputs. | +| APP_LOGGER_DEV_MODE | no | `false` | Enable development mode logging | + +To configure providers, use environmental variables described in the [Providers](https://github.com/SpectralOps/teller#providers) paragraph for Teller's Readme. + +## Development + +To read more about development, see the [Development guide](https://capact.io/community/development/development-guide). diff --git a/cmd/secret-storage-backend/example_test.go b/cmd/secret-storage-backend/example_test.go new file mode 100644 index 000000000..55372fa10 --- /dev/null +++ b/cmd/secret-storage-backend/example_test.go @@ -0,0 +1,166 @@ +package main_test + +import ( + "context" + "fmt" + utilrand "k8s.io/apimachinery/pkg/util/rand" + "testing" + + pb "capact.io/capact/pkg/hub/api/grpc/storage_backend" + "google.golang.org/grpc" +) + +func Test(t *testing.T) { + valueBytes := []byte(`{"key": true}`) + typeInstanceID := utilrand.String(10) // temp + + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"dotenv"}`)) + + conn, err := grpc.Dial(":50051", grpc.WithInsecure()) + if err != nil { + panic(err) + } + + ctx := context.Background() + client := pb.NewStorageBackendClient(conn) + + // create + fmt.Println("create TI", typeInstanceID) + + _, err = client.OnCreate(ctx, &pb.OnCreateRequest{ + TypeinstanceId: typeInstanceID, + Value: valueBytes, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + // get value + + res, err := client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: 1, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + fmt.Println("first get - resource version 1", string(res.Value)) + + // update + fmt.Println("update TI", typeInstanceID) + + newValueBytes := []byte(`{"key": "updated"}`) + _, err = client.OnUpdate(ctx, &pb.OnUpdateRequest{ + TypeinstanceId: typeInstanceID, + NewResourceVersion: 2, + NewValue: newValueBytes, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + // get value + + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: 1, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + fmt.Println("get after update - resource version 1", string(res.Value)) + + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: 2, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + fmt.Println("get after update - resource version 2", string(res.Value)) + + // lock + + fmt.Println("locking") + + _, err = client.OnLock(ctx, &pb.OnLockRequest{ + TypeinstanceId: typeInstanceID, + AdditionalParameters: reqAdditionalParams, + LockedBy: "test/sample", + }) + if err != nil { + panic(err) + } + + // get lockedBy + + lockedByRes, err := client.GetLockedBy(ctx, &pb.GetLockedByRequest{ + TypeinstanceId: typeInstanceID, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + if lockedByRes.LockedBy == nil { + panic("lockedBy cannot be nil") + } + + fmt.Println("first get - lockedBy", *lockedByRes.LockedBy) + + // unlock + + fmt.Println("unlocking") + + _, err = client.OnUnlock(ctx, &pb.OnUnlockRequest{ + TypeinstanceId: typeInstanceID, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + // get lockedBy + + lockedByRes, err = client.GetLockedBy(ctx, &pb.GetLockedByRequest{ + TypeinstanceId: typeInstanceID, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + fmt.Println("second get - lockedBy", lockedByRes.LockedBy) + + // delete + fmt.Println("delete TI", typeInstanceID) + + _, err = client.OnDelete(ctx, &pb.OnDeleteRequest{ + TypeinstanceId: typeInstanceID, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + // last get + + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: 1, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + fmt.Println("last get after delete - value", string(res.Value)) +} diff --git a/cmd/secret-storage-backend/main.go b/cmd/secret-storage-backend/main.go new file mode 100644 index 000000000..6e957ada5 --- /dev/null +++ b/cmd/secret-storage-backend/main.go @@ -0,0 +1,103 @@ +package main + +import ( + "log" + "net" + + "capact.io/capact/internal/healthz" + "capact.io/capact/internal/logger" + secret_storage_backend "capact.io/capact/internal/secret-storage-backend" + "capact.io/capact/pkg/hub/api/grpc/storage_backend" + "github.com/pkg/errors" + tellerpkg "github.com/spectralops/teller/pkg" + tellercore "github.com/spectralops/teller/pkg/core" + "github.com/vrischmann/envconfig" + "go.uber.org/zap" + "golang.org/x/sync/errgroup" + "google.golang.org/grpc" + "sigs.k8s.io/controller-runtime/pkg/manager/signals" +) + +// Config holds application related configuration. +type Config struct { + // Address is the TCP address the gRPC server binds to. + GRPCAddr string `envconfig:"default=:50051"` + + // HealthzAddr is the TCP address the health probes endpoint binds to. + HealthzAddr string `envconfig:"default=:8082"` + + SupportedProviders []string `envconfig:"default=aws_secretsmanager"` + + Logger logger.Config +} + +const appName = "secret-storage-backend" + +func main() { + var cfg Config + err := envconfig.InitWithPrefix(&cfg, "APP") + exitOnError(err, "while loading configuration") + + ctx := signals.SetupSignalHandler() + + // setup logger + unnamedLogger, err := logger.New(cfg.Logger) + exitOnError(err, "while creating zap logger") + + logger := unnamedLogger.Named(appName) + + // setup servers + parallelServers := new(errgroup.Group) + + healthzServer := healthz.NewHTTPServer(logger, cfg.HealthzAddr, appName) + parallelServers.Go(func() error { return healthzServer.Start(ctx) }) + + providers, err := loadProviders(cfg.SupportedProviders) + exitOnError(err, "while loading providers") + + handler := secret_storage_backend.NewHandler(logger, providers) + exitOnError(err, "while creating new handler") + + listenCfg := net.ListenConfig{} + listener, err := listenCfg.Listen(ctx, "tcp", cfg.GRPCAddr) + exitOnError(err, "while listening") + + srv := grpc.NewServer() + storage_backend.RegisterStorageBackendServer(srv, handler) + + go func() { + <-ctx.Done() + logger.Info("Stopping server gracefully") + srv.GracefulStop() + }() + + parallelServers.Go(func() error { + logger.Info("Starting TCP server", zap.String("addr", cfg.GRPCAddr)) + return srv.Serve(listener) + }) + + err = parallelServers.Wait() + exitOnError(err, "while waiting for servers to finish gracefully") +} + +func exitOnError(err error, context string) { + if err != nil { + log.Fatalf("%s: %v", context, err) + } +} + +func loadProviders(providerNames []string) (map[string]tellercore.Provider, error) { + builtInProviders := tellerpkg.BuiltinProviders{} + providersMap := map[string]tellercore.Provider{} + + for _, providerName := range providerNames { + provider, err := builtInProviders.GetProvider(providerName) + if err != nil { + return nil, errors.Wrapf(err, "while loading provider %q", provider) + } + + providersMap[providerName] = provider + } + + return providersMap, nil +} diff --git a/docs/proposal/20211207-delegated-storage.md b/docs/proposal/20211207-delegated-storage.md index 65f1f7061..a8965515b 100644 --- a/docs/proposal/20211207-delegated-storage.md +++ b/docs/proposal/20211207-delegated-storage.md @@ -475,100 +475,95 @@ Capact Local Hub calls proper storage backend service while accessing the TypeIn
Protocol Buffers definition - ```proto + ```protobuf syntax = "proto3"; - option go_package = "./"; - package storagebackend; - - import "google/protobuf/any.proto"; - - message TypeInstanceResourceVersion { - uint32 resource_version = 1; - google.protobuf.Any value = 2; - } - - message TypeInstance { - string id = 1; - - TypeInstanceResourceVersion resource_version = 2; - } - + option go_package = "./storage_backend"; + package storage_backend; + message OnCreateRequest { - TypeInstance typeinstance = 1; - google.protobuf.Any additional_parameters = 2; + string typeinstance_id = 1; + bytes value = 2; + bytes additional_parameters = 3; } - + message OnCreateResponse { - google.protobuf.Any additional_parameters = 1; + optional bytes additional_parameters = 1; } - - message OnUpdateData { - TypeInstanceResourceVersion resource_version = 1; - google.protobuf.Any additional_parameters = 2; + + message TypeInstanceResourceVersion { + uint32 resource_version = 1; + bytes value = 2; } - + message OnUpdateRequest { string typeinstance_id = 1; - - OnUpdateData old_data = 2; - OnUpdateData new_data = 3; + uint32 new_resource_version = 2; + bytes new_value = 3; + optional bytes additional_parameters = 4; } - + message OnUpdateResponse { - google.protobuf.Any additional_parameters = 1; + optional bytes additional_parameters = 1; } - + message OnDeleteRequest { string typeinstance_id = 1; - google.protobuf.Any additional_parameters = 2; + bytes additional_parameters = 2; } - + message OnDeleteResponse {} - + message GetValueRequest { string typeinstance_id = 1; - string resource_version_id = 2; - google.protobuf.Any additional_parameters = 3; + uint32 resource_version = 2; + bytes additional_parameters = 3; } - + message GetValueResponse { - google.protobuf.Any value = 1; + optional bytes value = 1; } - - + + // lock messages - + message GetLockedByRequest { string typeinstance_id = 1; - google.protobuf.Any additional_parameters = 2; + bytes additional_parameters = 2; } - + message GetLockedByResponse { - string locked_by = 1; + optional string locked_by = 1; } - - message OnLockUnlockRequest { + + message OnLockRequest { string typeinstance_id = 1; - google.protobuf.Any additional_parameters = 2; + bytes additional_parameters = 2; string locked_by = 3; } - - message OnLockUnlockResponse {} - + + message OnLockResponse {} + + message OnUnlockRequest { + string typeinstance_id = 1; + bytes additional_parameters = 2; + } + + message OnUnlockResponse {} + // services - + service StorageBackend { // value rpc GetValue(GetValueRequest) returns (GetValueResponse); rpc OnCreate(OnCreateRequest) returns (OnCreateResponse); rpc OnUpdate(OnUpdateRequest) returns (OnUpdateResponse); rpc OnDelete(OnDeleteRequest) returns (OnDeleteResponse); - + // lock rpc GetLockedBy(GetLockedByRequest) returns (GetLockedByResponse); - rpc OnLock(OnLockUnlockRequest) returns (OnLockUnlockResponse); - rpc OnUnlock(OnLockUnlockRequest) returns (OnLockUnlockResponse); - } + rpc OnLock(OnLockRequest) returns (OnLockRequest); + rpc OnUnlock(OnUnlockRequest) returns (OnUnlockRequest); + } ```
diff --git a/go.mod b/go.mod index 1ecbb3b11..87749fc84 100644 --- a/go.mod +++ b/go.mod @@ -18,22 +18,21 @@ require ( github.com/aws/aws-sdk-go v1.37.0 // indirect github.com/briandowns/spinner v1.12.0 github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 - github.com/containerd/containerd v1.4.11 // indirect github.com/docker/cli v20.10.9+incompatible github.com/docker/docker v20.10.9+incompatible github.com/docker/go-connections v0.4.0 github.com/dustin/go-humanize v1.0.0 github.com/evanphx/json-patch/v5 v5.5.0 // indirect github.com/fatih/camelcase v1.0.0 - github.com/fatih/color v1.12.0 + github.com/fatih/color v1.13.0 github.com/fatih/structs v1.1.0 github.com/gitchander/permutation v0.0.0-20210517125447-a5d73722e1b1 github.com/go-logr/logr v0.4.0 github.com/go-logr/zapr v0.4.0 - github.com/google/uuid v1.1.2 + github.com/google/uuid v1.2.0 github.com/gorilla/mux v1.8.0 github.com/hashicorp/go-getter v1.5.5 - github.com/hashicorp/go-multierror v1.0.0 + github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/hcl/v2 v2.9.1 github.com/hashicorp/hcl2 v0.0.0-20191002203319-fb75b3253c80 // indirect github.com/hashicorp/terraform v0.11.12-beta1 @@ -44,12 +43,12 @@ require ( github.com/jetstack/cert-manager v1.4.4 github.com/machinebox/graphql v0.2.2 github.com/matryer/is v1.4.0 // indirect - github.com/mattn/go-isatty v0.0.13 + github.com/mattn/go-isatty v0.0.14 github.com/mitchellh/mapstructure v1.4.1 github.com/nautilus/gateway v0.1.16 github.com/nautilus/graphql v0.0.16 github.com/neo4j/neo4j-go-driver/v4 v4.2.2 - github.com/olekukonko/tablewriter v0.0.4 + github.com/olekukonko/tablewriter v0.0.5 github.com/onsi/ginkgo v1.16.4 github.com/onsi/gomega v1.14.0 github.com/opencontainers/runc v1.0.3 // indirect @@ -59,6 +58,7 @@ require ( github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371 github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0 github.com/sirupsen/logrus v1.8.1 + github.com/spectralops/teller v1.4.1-0.20220220074628-10ea63fb3d8e github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 @@ -71,10 +71,11 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/zclconf/go-cty v1.8.1 go.uber.org/zap v1.18.1 - golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e // indirect google.golang.org/api v0.44.0 + google.golang.org/grpc v1.38.0 + google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gotest.tools v2.2.0+incompatible helm.sh/helm/v3 v3.6.3 @@ -99,4 +100,6 @@ replace ( github.com/go-openapi/spec => github.com/go-openapi/spec v0.19.8 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 + + github.com/spectralops/teller => github.com/pkosiec/teller v1.4.1-0.20220223143025-e3f18e5c70c2 ) diff --git a/go.sum b/go.sum index ec069cd98..f601ab318 100644 --- a/go.sum +++ b/go.sum @@ -41,12 +41,20 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/age v1.0.0 h1:V6q14n0mqYU3qKFkZ6oOaF9oXneOviS3ubXsSVBRSzc= +filippo.io/age v1.0.0/go.mod h1:PaX+Si/Sd5G8LgfCwldsSba3H1DDQZhIhFGkhbHaBq8= +filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= +filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +github.com/1Password/connect-sdk-go v1.2.0 h1:WbIvmbDUpA89nyH0l3LF2iRSFJAv86d2D7IjVNjw6iw= +github.com/1Password/connect-sdk-go v1.2.0/go.mod h1:qK2bF/GweAq812xj+HGfbauaE6cKX1MXfKhpAvoHEq8= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/gqlgen v0.13.0 h1:haLTcUp3Vwp80xMVEg5KRNwzfUrgFdRmtBY8fuB8scA= github.com/99designs/gqlgen v0.13.0/go.mod h1:NV130r6f4tpRWuAI+zsrSdooO/eWUv+Gyyoi3rEfXIk= github.com/99designs/keyring v1.1.6 h1:kVDC2uCgVwecxCk+9zoCt2uEL6dt+dfVzMvGgnVcIuM= github.com/99designs/keyring v1.1.6/go.mod h1:16e0ds7LGQQcT59QqkTg72Hh5ShM51Byv5PEmW6uoRU= +github.com/AlecAivazis/survey/v2 v2.0.8/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= +github.com/AlecAivazis/survey/v2 v2.2.8/go.mod h1:9DYvHgXtiXm6nCn+jXnOXLKbH+Yo9u8fAS/SduGdoPk= github.com/AlecAivazis/survey/v2 v2.2.16 h1:KJ4fLFqY/NfR5OaFLcf4pThxrlV2YCHGCnCHAKLsJ+U= github.com/AlecAivazis/survey/v2 v2.2.16/go.mod h1:TH2kPCDU3Kqq7pLbnCWwZXDBjnhZtmsCle5EiYDJ2fg= github.com/Azure/azure-amqp-common-go/v3 v3.0.1/go.mod h1:PBIGdzcO1teYoufTKMcGibdKaYZv4avS+O6LNIp8bq0= @@ -58,6 +66,8 @@ github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9mo github.com/Azure/azure-sdk-for-go v37.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v51.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v52.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v52.6.0+incompatible h1:F/feBa+/Oxbu+Zprnsiq0b6rvUVlOEx3jSqCSNdtF3U= github.com/Azure/azure-sdk-for-go v52.6.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-storage-blob-go v0.6.0/go.mod h1:oGfmITT1V6x//CswqY2gtAHND+xIP64/qL7a5QJix0Y= github.com/Azure/go-amqp v0.13.0/go.mod h1:qj+o8xPCz9tMSbQ83Vp8boHahuRDl5mkNHyt1xlxUTs= @@ -74,6 +84,7 @@ github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdA github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.3/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest v0.11.18 h1:90Y4srNYrwOtAgVo3ndrQkTYn6kf1Eg/AjTFJ8Is2aM= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= @@ -82,10 +93,15 @@ github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMl github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= github.com/Azure/go-autorest/autorest/adal v0.9.13 h1:Mp5hbtOePIzM8pJVRa3YLrWWmZtoxRXqUEzCfJt3+/Q= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.7 h1:8DQB8yl7aLQuP+nuR5e2RO6454OvFlSTXXaNHshc16s= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.7/go.mod h1:AkzUsqkrdmNhfP2i54HqINVQopw0CLDnvHpJ88Zz1eI= github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2 h1:dMOmEJfkLKW/7JsokJqkyoYSgmR08hi9KrhjZb+JALY= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= @@ -98,9 +114,11 @@ github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPu github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= +github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac= github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= @@ -117,6 +135,10 @@ github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DopplerHQ/cli v0.0.0-20210309042056-414bede8a50e h1:X5yHJzv4R12/zF9PR6OlroESbv6Bbz+L5LlZWY+qGkw= +github.com/DopplerHQ/cli v0.0.0-20210309042056-414bede8a50e/go.mod h1:BYiWQL3TJGl8TjMYVeWYxJJK46arOR4J/2urnIJE/jE= +github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -137,13 +159,21 @@ github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFP github.com/Masterminds/squirrel v1.5.0 h1:JukIZisrUXadA9pl3rMkjhiamxiB0cXiu+HGp/Y8cY8= github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Masterminds/vcs v1.13.1/go.mod h1:N09YCmOQr6RLxC6UNHzuVwAdodYbbnycGHSmwVJjcKA= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3 h1:mw6pDQqv38/WGF1cO/jF5t/jyAJ2yi7CmtFLLO5tGFI= github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.14 h1:lbPVK25c1cu5xTLITwpUcxoA9vKrKErASPYygvouJns= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15 h1:Aof83YILRs2Vx3GhHqlvvfyx1asRJKMFIMeVlHsZKtI= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= @@ -184,8 +214,15 @@ github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3 github.com/akamai/AkamaiOPEN-edgegrid-golang v1.1.0/go.mod h1:kX6YddBkXqqywAe8c9LyvgTCyFuZCTMF4cRPQhc3Fy8= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= +github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= +github.com/alecthomas/colour v0.1.0 h1:nOE9rJm6dsZ66RGWYSFrXw461ZIt9A6+nHgL7FRrDUk= +github.com/alecthomas/colour v0.1.0/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/jsonschema v0.0.0-20210526225647-edb03dcab7bc h1:mT8qSzuyEAkxbv4GBln7yeuQZpBnfikr3PTuiPs6Z3k= github.com/alecthomas/jsonschema v0.0.0-20210526225647-edb03dcab7bc/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= +github.com/alecthomas/kong v0.2.15/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= +github.com/alecthomas/repr v0.0.0-20201120212035-bb82daffcca2 h1:G5TeG64Ox4OWq2YwlsxS7nOedU8vbGgNRTRDAjGvDCk= +github.com/alecthomas/repr v0.0.0-20201120212035-bb82daffcca2/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -193,6 +230,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible h1:hLUNPbx10wawWW7DeNExvTrlb90db3UnnNTFKHZEFhE= github.com/aliyun/aliyun-oss-go-sdk v2.1.8+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= @@ -227,8 +265,10 @@ github.com/argoproj/pkg v0.11.0/go.mod h1:ra+bQPmbVAoEL+gYSKesuigt4m49i3Qa3mE/xQ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= @@ -237,6 +277,9 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= +github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHSxpiH9JdtuBj0= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/awalterschulze/gographviz v0.0.0-20200901124122-0eecad45bd71/go.mod h1:/ynarkO/43wP/JM2Okn61e8WFMtdbtA8he7GJxW+SFM= @@ -249,18 +292,40 @@ github.com/aws/aws-sdk-go v1.34.30/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/ github.com/aws/aws-sdk-go v1.37.0 h1:GzFnhOIsrGyQ69s7VgqtrG2BG8v7X7vwB3Xpbd/DBBk= github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= +github.com/aws/aws-sdk-go-v2 v1.2.0/go.mod h1:zEQs02YRBw1DjK0PoJv3ygDYOFTre1ejlJWl8FwAuQo= +github.com/aws/aws-sdk-go-v2 v1.9.0 h1:+S+dSqQCN3MSU5vJRu1HqHrq00cJn6heIMU7X9hcsoo= github.com/aws/aws-sdk-go-v2 v1.9.0/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2/config v1.1.1/go.mod h1:0XsVy9lBI/BCXm+2Tuvt39YmdHwS5unDQmxZOYe8F5Y= +github.com/aws/aws-sdk-go-v2/config v1.7.0 h1:J2cZ7qe+3IpqBEXnHUrFrOjoB9BlsXg7j53vxcl5IVg= github.com/aws/aws-sdk-go-v2/config v1.7.0/go.mod h1:w9+nMZ7soXCe5nT46Ri354SNhXDQ6v+V5wqDjnZE+GY= +github.com/aws/aws-sdk-go-v2/credentials v1.1.1/go.mod h1:mM2iIjwl7LULWtS6JCACyInboHirisUUdkBPoTHMOUo= +github.com/aws/aws-sdk-go-v2/credentials v1.4.0 h1:kmvesfjY861FzlCU9mvAfe01D9aeXcG2ZuC+k9F2YLM= github.com/aws/aws-sdk-go-v2/credentials v1.4.0/go.mod h1:dgGR+Qq7Wjcd4AOAW5Rf5Tnv3+x7ed6kETXyS9WCuAY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.0.2/go.mod h1:3hGg3PpiEjHnrkrlasTfxFqUsZ2GCk/fMUn4CbKgSkM= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0 h1:OxTAgH8Y4BXHD6PGCJ8DHx2kaZPCQfSTqmDsdRZFezE= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.5.0/go.mod h1:CpNzHK9VEFUCknu50kkB8z58AH2B5DvPP7ea1LHve/Y= +github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2 h1:d95cddM3yTm4qffj3P6EnP+TzX1SSkWaQypXSgT/hpA= github.com/aws/aws-sdk-go-v2/internal/ini v1.2.2/go.mod h1:BQV0agm+JEhqR+2RT5e1XTFIDcAAV0eW6z2trp+iduw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0/go.mod h1:v8ygadNyATSm6elwJ/4gzJwcFhri9RqS8skgHKiwXPU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0 h1:VNJ5NLBteVXEwE2F1zEXVmyIH58mZ6kIQGJoC7C+vkg= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.3.0/go.mod h1:R1KK+vY8AfalhG1AOu5e35pOD2SdoPKQCFLTvnxiohk= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.6.0/go.mod h1:LKb3cKNQIMh+itGnEpKGcnL/6OIjPZqrtYah1w5f+3o= github.com/aws/aws-sdk-go-v2/service/s3 v1.14.0/go.mod h1:Qit9H3zjAmF7CLHOkrepE9b2ndX/2l3scstsM5g2jSk= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.1.1 h1:tOZVE/wpwnCH6zMCvDi8WsuXLV1p5PG/WOhHu8LWphE= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.1.1/go.mod h1:ytf+Mop8BTUFmWJSCI/U33FawS9A8UWwybOdNOXU6zE= +github.com/aws/aws-sdk-go-v2/service/ssm v1.1.1 h1:7KkZoTdApfXlU7boQG3/DpdfsbYJiJKIpglGitlGL0o= +github.com/aws/aws-sdk-go-v2/service/ssm v1.1.1/go.mod h1:351FC4X3HnrPJ8/RwHuFRr6uLq1LrXFfh8V5vBhT6/Q= +github.com/aws/aws-sdk-go-v2/service/sso v1.1.1/go.mod h1:SuZJxklHxLAXgLTc1iFXbEWkXs7QRTQpCLGaKIprQW0= +github.com/aws/aws-sdk-go-v2/service/sso v1.4.0 h1:sHXMIKYS6YiLPzmKSvDpPmOpJDHxmAUgbiF49YNVztg= github.com/aws/aws-sdk-go-v2/service/sso v1.4.0/go.mod h1:+1fpWnL96DL23aXPpMGbsmKe8jLTEfbjuQoA4WS1VaA= +github.com/aws/aws-sdk-go-v2/service/sts v1.1.1/go.mod h1:Wi0EBZwiz/K44YliU0EKxqTCJGUfYTWXrrBwkq736bM= +github.com/aws/aws-sdk-go-v2/service/sts v1.7.0 h1:1at4e5P+lvHNl2nUktdM2/v+rpICg/QSEr9TO/uW9vU= github.com/aws/aws-sdk-go-v2/service/sts v1.7.0/go.mod h1:0qcSMCyASQPN2sk/1KQLQ2Fh6yq8wm0HSDAimPhzCoM= +github.com/aws/smithy-go v1.1.0/go.mod h1:EzMw8dbp/YJL4A5/sbhGddag+NPT7q084agLbB9LgIw= +github.com/aws/smithy-go v1.8.0 h1:AEwwwXQZtUwP5Mz506FeXXrKBe0jA8gVM+1gEcSRooc= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/axw/gocov v1.0.0/go.mod h1:LvQpEYiwwIb2nYkXY2fDWhg9/AsYqkhmrCshjlUJECE= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f h1:ZNv7On9kyUzm7fvRZumSyy/IUiSC7AzL0I1jKKtwooA= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beefsack/go-rate v0.0.0-20180408011153-efa7637bb9b6/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA= @@ -280,8 +345,12 @@ github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngE github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/blushft/go-diagrams v0.0.0-20201006005127-c78c821223d9/go.mod h1:nDeXEIaeDV+mAK1gBD3/RJH67DYPC0GdaznWN7sB07s= github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= @@ -294,6 +363,7 @@ github.com/briandowns/spinner v1.12.0/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bsm/go-vlq v0.0.0-20150828105119-ec6e8d4f5f4e/go.mod h1:N+BjUcTjSxc2mtRGSCPsat1kze3CUtvJN3/jTXlp29k= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0 h1:s7+5BfS4WFJoVF9pnB8kBk03S7pZXRdKamnV0FOl5Sc= github.com/bugsnag/bugsnag-go v1.0.5-0.20150529004307-13fd6b8acda0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= @@ -304,6 +374,10 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3k github.com/capactio/argo-workflows/v3 v3.2.2-for-capact h1:L8OLBL45GeOXIrCV3fr7EcgdMRAMXvl4mRsEbVzZqac= github.com/capactio/argo-workflows/v3 v3.2.2-for-capact/go.mod h1:MDF/vAfXQspq/D6Cjxf9kcEmFy+GNVsHNSwJiWX1QB8= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/caspr-io/yamlpath v0.0.0-20200722075116-502e8d113a9b h1:2K3B6Xm7/lnhOugeGB3nIk50bZ9zhuJvXCEfUuL68ik= +github.com/caspr-io/yamlpath v0.0.0-20200722075116-502e8d113a9b/go.mod h1:4rP9T6iHCuPAIDKdNaZfTuuqSIoQQvFctNWIAUI1rlg= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= @@ -318,6 +392,7 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= @@ -328,6 +403,8 @@ github.com/cloudevents/sdk-go/v2 v2.1.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoa github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004 h1:lkAMpLVBDaj17e85keuznYcH5rqI438v41pKcBl4ZxQ= github.com/cloudflare/cfssl v0.0.0-20180223231731-4e2dcbde5004/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlKDg4bd8LWlu7oKeZvM= +github.com/cloudflare/cloudflare-go v0.25.0 h1:GwyKwGq8ciGNjKiTpjj6RvU3+uJNuPBNjlUkeQRx0yU= +github.com/cloudflare/cloudflare-go v0.25.0/go.mod h1:sPWL/lIC6biLEdyGZwBQ1rGQKF1FhM7N60fuNiFdYTI= github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21/go.mod h1:po7NpZ/QiTKzBKyrsEAxwnTamCoh8uDk/egRpQ7siIc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -339,39 +416,79 @@ github.com/colinmarc/hdfs v1.1.4-0.20180805212432-9746310a4d31 h1:ow7T77012NSZVW github.com/colinmarc/hdfs v1.1.4-0.20180805212432-9746310a4d31/go.mod h1:vSBumefK4HA5uiRSwNP+3ofgrEoScpCS2MMWcWXEuQ4= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2 h1:tjT4Jp4gxECvsJcYpAMtW2I3YqzBTPuB67OejxXs86s= github.com/common-nighthawk/go-figure v0.0.0-20200609044655-c4b36f998cf2/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68 h1:hkGVFjz+plgr5UfxZUTPFbUFIF/Km6/s+RVRIRHLrrY= github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.11 h1:QCGOUN+i70jEEL/A6JVIbhy4f4fanzAzSR4kNG7SlcE= -github.com/containerd/containerd v1.4.11/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1 h1:IK6yirB4X7wpKyFSikWiT++nZsyIxGAAgNEv3fEGuls= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e h1:6JKvHHt396/qabvMhnhUZvWaHZzfVfldxE60TK8YLhg= github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc/v3 v3.1.0 h1:6avEvcdvTa1qYsOZ6I5PRkSYHzpTNWgKYmaJfaYbrRw= github.com/coreos/go-oidc/v3 v3.1.0/go.mod h1:rEJ/idjfUyfkBit1eI1fvyr+64/g9dcKpAm8MJMesvo= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -380,16 +497,24 @@ github.com/cpu/goacmedns v0.0.3/go.mod h1:4MipLkI+qScwqtVxcNO6okBhbgRrr7/tKXUSgS github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyberark/conjur-api-go v0.7.1 h1:nMWB1s0d8a8fGTeAkQIb8KLY9kTFwevgNg6tE2lMcao= +github.com/cyberark/conjur-api-go v0.7.1/go.mod h1:HZ5RoBhAB2KwnxyXbQ29DwpviRVg7SMRq7QhwtFjN3Q= github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= +github.com/danieljoos/wincred v1.1.0 h1:3RNcEpBg4IhIChZdFRSdlQt1QjCp1sMAPIrOnm7Yf8g= +github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg= github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -402,6 +527,8 @@ github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xb github.com/denisenkom/go-mssqldb v0.0.0-20191128021309-1d7a30a10f73/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/devigned/tab v0.1.1/go.mod h1:XG9mPq0dFghrYvoBF3xdRrJzSTX1b7IQrvaL9mzjeJY= +github.com/dghubble/sling v1.3.0 h1:pZHjCJq4zJvc6qVQ5wN1jo5oNZlNE0+8T/h0XeXBUKU= +github.com/dghubble/sling v1.3.0/go.mod h1:XXShWaBWKzNLhu2OxikSNFrlsvowtz4kyRuXUG7oQKY= github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -410,6 +537,8 @@ github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+ github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/digitalocean/godo v1.44.0/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU= github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= github.com/dimfeld/httptreemux v5.0.1+incompatible/go.mod h1:rbUlSV+CCpv/SuqUTP/8Bk2O3LyUV436/yaRGkhP6Z0= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/docker/cli v20.10.5+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= @@ -417,11 +546,14 @@ github.com/docker/cli v20.10.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHv github.com/docker/cli v20.10.9+incompatible h1:OJ7YkwQA+k2Oi51lmCojpjiygKpi76P7bg91b2eJxYU= github.com/docker/cli v20.10.9+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v17.12.0-ce-rc1.0.20200618181300-9dc6525e6118+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v20.10.9+incompatible h1:JlsVnETOjM2RLQa0Cc1XCIspUdXW3Zenq9P54uXBm6k= github.com/docker/docker v20.10.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= @@ -431,8 +563,11 @@ github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916 h1:yWHOI+vFjEsAakUTSrtqc/SAHrhSkmn48pqjidZX3QA= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= @@ -494,8 +629,8 @@ github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= @@ -509,10 +644,12 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= +github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7 h1:LofdAjjjqCSXMwLGgOgnE+rdPuvX9DxCqaHwKy7i/ko= @@ -626,6 +763,7 @@ github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbN github.com/go-python/gpython v0.0.3 h1:QNFZ0h540Lajx7Pi/os06XzzdYUQG+2sV7IvPo/Mvmg= github.com/go-python/gpython v0.0.3/go.mod h1:bmk0l57W/7Cs67MMnz4U28SoYyvz5NTMYyJvUqytJhs= github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= github.com/go-sql-driver/mysql v1.3.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -692,21 +830,30 @@ github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY9 github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/glob v0.2.4-0.20181002190808-e7a84e9525fe h1:zn8tqiUbec4wR94o7Qj3LZCAT6uGobhEgnDRg6isG5U= github.com/gobwas/glob v0.2.4-0.20181002190808-e7a84e9525fe/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus v0.0.0-20190623212516-8a1682060722/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg= github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gokyle/twofactor v1.0.1/go.mod h1:4gxzH1eaE/F3Pct/sCDNOylP0ClofUO5j4XZN9tKtLE= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -724,6 +871,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -786,9 +934,13 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-github/v33 v33.0.0/go.mod h1:GMdDnVZY/2TsWgp/lkYnpSAh6TrzhANBBwm6k6TTEXg= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -814,8 +966,9 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -826,6 +979,10 @@ github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2c github.com/googleapis/gnostic v0.5.4/go.mod h1:TRWw1s4gxBGjSe301Dai3c7wXJAZy57+/6tawkOvqHQ= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= +github.com/gopasspw/gopass v1.13.1 h1:RJT+lVoRcG3Jnjo4VkJQ6yoRnnLDtUt6eMnh19xnbZs= +github.com/gopasspw/gopass v1.13.1/go.mod h1:d5NovqLyuZQm1/vpkmT10ZTuJ6xuKwh0Cq4cbk9VSFs= +github.com/gopasspw/pinentry v0.0.2 h1:6OmkoTYMU05PmAJSIZSRjjhiQX15AstdgNa2KimH5XA= +github.com/gopasspw/pinentry v0.0.2/go.mod h1:lR1WuNI96rXXBCgM601Ima3acnX3ZSPthIAuG6lHa68= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -880,11 +1037,17 @@ github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.8.1 h1:BOEQaMWoGMhmQ29fC26bi0qb7/rId9JzZP2V0Xmx7m8= +github.com/hashicorp/consul/api v1.8.1/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.7.0 h1:H6R9d008jDcHPQPAqPNuydAshJ4v5/8URdFnUvK/+sc= +github.com/hashicorp/consul/sdk v0.7.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v0.0.0-20180715044906-d6c0cd880357/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= @@ -895,15 +1058,21 @@ github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9 github.com/hashicorp/go-hclog v0.8.0/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.1/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.14.1 h1:nQcJDQwIAGnmoUWp8ubocEX40cCml/17YkF6csQLReU= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-multierror v0.0.0-20180717150148-3d5d8f294aa0/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= @@ -911,9 +1080,12 @@ github.com/hashicorp/go-retryablehttp v0.6.4 h1:BbgctKO892xEyOXnGiaAwIoSq1QZ/SS4 github.com/hashicorp/go-retryablehttp v0.6.4/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -922,8 +1094,9 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -941,21 +1114,30 @@ github.com/hashicorp/hcl2 v0.0.0-20191002203319-fb75b3253c80 h1:PFfGModn55JA0oBs github.com/hashicorp/hcl2 v0.0.0-20191002203319-fb75b3253c80/go.mod h1:Cxv+IJLuBiEhQ7pBYGEuORa0nr4U994pE8mYLuFd7v0= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft v1.2.0/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/terraform v0.11.12-beta1 h1:fJPJO6oahPiYKYXnTBYQsnCJxCILwv8ok6up5nL2+s8= github.com/hashicorp/terraform v0.11.12-beta1/go.mod h1:uN1KUiT7Wdg61fPwsGXQwK3c8PmpIVZrt5Vcb1VrSoM= github.com/hashicorp/terraform-config-inspect v0.0.0-20210625153042-09f34846faab h1:P08dNG+lM+gjaaMk8SsMi/mIPs8z7jrkEmnpcCwy/U0= github.com/hashicorp/terraform-config-inspect v0.0.0-20210625153042-09f34846faab/go.mod h1:Z0Nnk4+3Cy89smEbrq+sl1bxc9198gIP4I7wcQF6Kqs= +github.com/hashicorp/vault/api v1.0.4 h1:j08Or/wryXT4AcHj1oCbMd7IijXcKzYUGw59LGu9onU= github.com/hashicorp/vault/api v1.0.4/go.mod h1:gDcqh3WGcR1cpF5AJz/B1UFheUEneMoIospckxBxk6Q= +github.com/hashicorp/vault/sdk v0.1.13 h1:mOEPeOhT7jl0J4AMl1E705+BcmeRs1VmKNb9F0sMLy8= github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvhkWnjtSYCaS2M= github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5 h1:6ZR6HQ+P9ZUwHlYq+bU7e9wqAImxKUguq8fp2gZSgCo= github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5/go.mod h1:Yho0S7KhsnHQRCC5lDraYF1SsLMeWtf/tKdufKu3TJA= +github.com/heroku/heroku-go/v5 v5.2.1 h1:5g379GyHuOI3qhb1ujFwQ13Kjt96M+KMkV8s7omg+do= +github.com/heroku/heroku-go/v5 v5.2.1/go.mod h1:d+1QrZyjbnQJG1f8xIoVvMQRFLt3XRVZOdlm26Sr73U= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hokaccha/go-prettyjson v0.0.0-20190818114111-108c894c2c0e/go.mod h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI= @@ -975,6 +1157,7 @@ github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5N github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -984,6 +1167,8 @@ github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/C github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/interagent/schematic v0.0.0-20180830170528-b5e8ba7aa570/go.mod h1:4X9u5iNUePRrRDdwjok6skjlQBXTcNfWa4C3uS1+5SQ= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/jawher/mow.cli v1.0.4/go.mod h1:5hQj2V8g+qYmLUVWqu4Wuja1pI57M83EChYLVZ0sMKk= github.com/jawher/mow.cli v1.1.0/go.mod h1:aNaQlc7ozF3vw6IJ2dHjp2ZFiA4ozMIYY6PyuRJwlUg= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -996,10 +1181,13 @@ github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/U github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jedib0t/go-pretty v4.3.0+incompatible/go.mod h1:XemHduiw8R651AF9Pt4FwCTKeG3oo7hrHJAoznj9nag= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jetstack/cert-manager v1.4.4 h1:J+RsohEuey8sqIhcoO4QjX2dnwV1wWpINW+c9Ch2rDw= github.com/jetstack/cert-manager v1.4.4/go.mod h1:ZwlTcZLU4ClMNQ9UVT5m4Uds1Essnus6s/d1+8f6wAw= +github.com/jftuga/ellipsis v1.0.0 h1:ERi1XBFERM2YpadkvM1P9bxQKgOC40Hr6TCKkvLBDtY= +github.com/jftuga/ellipsis v1.0.0/go.mod h1:phJ3vQPi8MPrtRKdo0aESNJdw56f09SLVX0k/FY+jr0= github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8 h1:CZkYfurY6KGhVtlalI4QwQ6T0Cu6iuY3e0x5RLu96WE= github.com/jinzhu/gorm v0.0.0-20170222002820-5409931a1bb8/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= github.com/jinzhu/inflection v0.0.0-20170102125226-1c35d901db3d h1:jRQLvyVGL+iVtDElaEIDdKwpPqUIZJfzkNLV34htpEc= @@ -1021,9 +1209,11 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/joncalhoun/qson v0.0.0-20200422171543-84433dcd3da0/go.mod h1:DFXrEwSRX0p/aSvxE21319menCBFeQO0jXpRj7LEZUA= github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jsimonetti/pwscheme v0.0.0-20160922125227-76804708ecad/go.mod h1:alT8eQtqtVCsVweGnMnfJcjNkTcmWbuVn+lYaBtBl9E= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -1042,6 +1232,8 @@ github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q github.com/karrick/godirwalk v1.7.8/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= +github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= @@ -1059,6 +1251,7 @@ github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.9.8/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.8/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.1 h1:wXr2uRxZTJXHLly6qhJabee5JqIhTRoLBhDOA74hDEQ= @@ -1077,8 +1270,9 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= @@ -1133,6 +1327,7 @@ github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsI github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/martinhoefling/goxkcdpwgen v0.0.0-20190331205820-7dc3d102eca3/go.mod h1:4HvZROUEazha3RDnoBcxQlwcIbQfwx035roFOMnICSE= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/matryer/moq v0.0.0-20200106131100-75d0ddfc0007/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= @@ -1140,23 +1335,28 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= +github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= -github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-oci8 v0.0.7/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.5/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.11/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/mattn/go-sqlite3 v1.6.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -1169,7 +1369,10 @@ github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182aff github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/pkcs11 v1.0.2 h1:CIBkOawOtzJNE0B+EpRiUBzuVW7JEQAwdwhSS6YhIeg= github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= @@ -1180,7 +1383,9 @@ github.com/minio/minio-go/v7 v7.0.2 h1:P/7wFd4KrRBHVo7AKdcqO+9ReoS+XpMjfRFoE5quH github.com/minio/minio-go/v7 v7.0.2/go.mod h1:dJ80Mv2HeGkYLH1sqS/ksz07ON6csH3S6JUMSQ2zAns= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -1190,6 +1395,7 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -1218,6 +1424,7 @@ github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7s github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= @@ -1231,12 +1438,14 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= +github.com/muesli/crunchy v0.4.0/go.mod h1:9k4x6xdSbb7WwtAVy0iDjaiDjIk6Wa5AgUIqp+HqOpU= github.com/munnerz/crd-schema-fuzz v1.0.0/go.mod h1:4z/rcm37JxUkSsExFcLL6ZIT1SgDRdLiu7qq1evdVS0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -1272,6 +1481,7 @@ github.com/nautilus/graphql v0.0.16/go.mod h1:UYcs/gBtuFrZyX591SuYboby4xFNG9ZkaT github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/neo4j/neo4j-go-driver/v4 v4.2.2 h1:trN+8bbxn2qDVG54E9P/oyMZC4M/LPit4gQd6fnu9Sg= github.com/neo4j/neo4j-go-driver/v4 v4.2.2/go.mod h1:4e45lVy4oHcgLEQQrGHcc4MbyCeEPIQ33DhXqxf9AT4= @@ -1288,16 +1498,19 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852 h1:Yl0tPBa8QPjGmesFh1D0rDy+q1Twx6FyU7VWHi8wZbI= github.com/oliveagle/jsonpath v0.0.0-20180606110733-2e52cf6e6852/go.mod h1:eqOVx5Vwu4gd2mmMZvVZsgIqNSaW3xxRThUJ0k/TPk4= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= @@ -1306,6 +1519,7 @@ github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISq github.com/onsi/ginkgo v1.16.1/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -1324,6 +1538,7 @@ github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWEr github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= @@ -1331,12 +1546,19 @@ github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVo github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= github.com/opencontainers/runc v1.0.3 h1:1hbqejyQWCJBvtKAfdO0b1FmaEf2z/bxnjqbARass5k= github.com/opencontainers/runc v1.0.3/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= @@ -1351,11 +1573,13 @@ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pavel-v-chernykh/keystore-go v2.1.0+incompatible/go.mod h1:xlUlxe/2ItGlQyMTstqeDv9r3U4obH7xYd26TbDQutY= github.com/pavel-v-chernykh/keystore-go/v4 v4.1.0/go.mod h1:2ejgys4qY+iNVW1IittZhyRYA6MNv8TgM6VHqojbB9g= github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -1375,17 +1599,23 @@ github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.4.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkosiec/teller v1.4.1-0.20220223143025-e3f18e5c70c2 h1:bcWuKCL54vNtNkD1MEBKmSfqdernUCCTjlwSkFBpV1g= +github.com/pkosiec/teller v1.4.1-0.20220223143025-e3f18e5c70c2/go.mod h1:x2B4YYysArnF/yH+IWmEwSef+5kK+CFD/ySgQHEboC0= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1395,7 +1625,9 @@ github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4 github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= @@ -1414,7 +1646,9 @@ github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7q github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= @@ -1424,7 +1658,10 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -1452,24 +1689,31 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.4.0 h1:LUa41nrWTQNGhzdsZ5lTnkwbNjj6rXTdazA1cSdjkOY= github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351 h1:HXr/qUllAWv9riaI4zh2eXWKmCSDqVS/XH1MRHLKRwk= github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/savsgio/gotils v0.0.0-20200117113501-90175b0fbe3f/go.mod h1:lHhJedqxCoHN+zMtwGNTXWmF0u9Jt363FYRhV6g0CdY= +github.com/schollz/closestmatch v0.0.0-20190308193919-1fbe626be92e/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= @@ -1485,10 +1729,10 @@ github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxr github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371 h1:SWV2fHctRpRrp49VXJ6UZja7gU9QLHwRpIPBN89SKEo= github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0 h1:JJV9CsgM9EC9w2iVkwuz+sMx8yRFe89PJRUrv6hPCIA= github.com/shurcooL/vfsgen v0.0.0-20180121065927-ffb13db8def0/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -1499,6 +1743,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= +github.com/skratchdot/open-golang v0.0.0-20190402232053-79abb63cd66e/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA= github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= github.com/slack-go/slack v0.7.4/go.mod h1:FGqNzJBmxIsZURAxh2a8D21AnOVvvXZvGligs4npPUM= @@ -1565,11 +1811,14 @@ github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3 github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1582,9 +1831,15 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stripe/stripe-go v70.15.0+incompatible/go.mod h1:A1dQZmO/QypXmsL0T8axYZkSN/uA/T/A64pfKdBAMiY= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/testcontainers/testcontainers-go v0.10.1-0.20210331130832-54854fb15ccb/go.mod h1:zFYk0JndthnMHEwtVRHCpLwIP/Ik1G7mvIAQ2MdZ+Ig= github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/thoas/go-funk v0.7.0 h1:GmirKrs6j6zJbhJIficOsz2aAI7700KsU/5YrdHRM1Y= +github.com/thoas/go-funk v0.7.0/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tidwall/gjson v1.6.0/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.7.5/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= @@ -1598,18 +1853,26 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.29.1+incompatible h1:R9ec3zO3sGpzs0abd43Y+fBZRJ9uiH6lXyR/+u6brW4= github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ulikunitz/xz v0.5.8 h1:ERv8V6GKqVi23rgu5cj9pVfVzJbOqAY2Ntl88O6c2nQ= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= @@ -1629,13 +1892,16 @@ github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv github.com/vektah/gqlparser/v2 v2.0.1/go.mod h1:SyUiHgLATUR8BiYURfTirrTcGpcE+4XkV2se04Px1Ms= github.com/vektah/gqlparser/v2 v2.1.0 h1:uiKJ+T5HMGGQM2kRKQ8Pxw8+Zq9qhhZhz/lieYvCMns= github.com/vektah/gqlparser/v2 v2.1.0/go.mod h1:SyUiHgLATUR8BiYURfTirrTcGpcE+4XkV2se04Px1Ms= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vrischmann/envconfig v1.3.0 h1:4XIvQTXznxmWMnjouj0ST5lFo/WAYf5Exgl3x82crEk= github.com/vrischmann/envconfig v1.3.0/go.mod h1:bbvxFYJdRSpXrhS63mBFtKJzkDiNkyArOLXtY6q0kuI= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/xanzy/go-gitlab v0.33.0 h1:MUJZknbLhVXSFzBA5eqGGhQ2yHSu8tPbGBPeB3sN4B0= github.com/xanzy/go-gitlab v0.33.0/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= @@ -1652,6 +1918,7 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMc github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -1659,6 +1926,8 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20170218160415-a3153f7040e9/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yahoo/athenz v1.8.55/go.mod h1:G7LLFUH7Z/r4QAB7FfudfuA7Am/eCzO1GlzBhDL6Kv0= github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= @@ -1676,6 +1945,8 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMzt github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zalando/go-keyring v0.1.1-0.20210112083600-4d37811583ad h1:aGgLtBPvZSG8l+Uo7Ko23p44iVOcrmZsZO2shJZHer8= +github.com/zalando/go-keyring v0.1.1-0.20210112083600-4d37811583ad/go.mod h1:OIC+OZ28XbmwFxU/Rp9V7eKzZjamBJwRzC8UFJH9+L8= github.com/zclconf/go-cty v1.0.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= github.com/zclconf/go-cty v1.1.0/go.mod h1:xnAOWiHeOqg2nWS62VtQ7pbOu17FtxJNW8RLEih+O3s= github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= @@ -1690,10 +1961,17 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0-alpha.0/go.mod h1:mPcW6aZJukV6Aa81LSKpBjQXTWlXB5r74ymPoSWa3Sw= +go.etcd.io/etcd/api/v3 v3.5.0 h1:GsV3S+OfZEOCNXdtNkBSR7kgLobAa/SO6tCxRa0GAYw= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0-alpha.0 h1:dr1EOILak2pu4Nf5XbRIOCNIBjcz6UmkQd7hHRXwxaM= +go.etcd.io/etcd/client/v3 v3.5.0-alpha.0/go.mod h1:wKt7jgDgf/OfKiYmCq5WFGxOFAkVMLxiiXgLDFhECr8= +go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0 h1:3yLUEC0nFCxw/RArImOyRUI4OAFbg4PFpBbAhSNzKNY= +go.etcd.io/etcd/pkg/v3 v3.5.0-alpha.0/go.mod h1:tV31atvwzcybuqejDoY3oaNRTtlD2l/Ot78Pc9w7DMY= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -1739,9 +2017,11 @@ go4.org/intern v0.0.0-20210108033219-3eb7198706b2/go.mod h1:vLqJ+12kCw61iCWsPto0 go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222175341-b30ae309168e/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 h1:1tk03FUNpulq2cuWpXZWj649rwJpk0d20rxWiopKRmc= go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190128193316-c7b33c32a30b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1762,6 +2042,7 @@ golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1781,8 +2062,10 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa h1:idItI2DDfCokpg0N51B2VtiLdJ4vAuXC9fnCb2gACo4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1836,6 +2119,7 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180921000356-2f5d2388922f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181108082009-03003ca0c849/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1894,8 +2178,10 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1908,8 +2194,9 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1951,8 +2238,11 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1962,10 +2252,13 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1976,6 +2269,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1998,6 +2292,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2006,9 +2301,11 @@ golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201005172224-997123666555/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2029,13 +2326,17 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02 h1:7NCfEGl0sfUojmX78nK9pBJuUlSZWEJA/TwASvfiPLo= +golang.org/x/sys v0.0.0-20211113001501-0c823b97ae02/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56 h1:b8jxX3zqjpqb2LklXPzKSGJhzyxCOZSz8ncv8Nv+y7w= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2054,6 +2355,7 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2097,6 +2399,7 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190808195139-e713427fea3f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2205,6 +2508,7 @@ google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= @@ -2214,6 +2518,7 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -2259,6 +2564,7 @@ google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -2268,6 +2574,7 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= @@ -2289,8 +2596,9 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d/go.mod h1:cuepJuh7vyXfUyUwEgHQXw849cJrilpS5NeIjOWESAw= @@ -2312,6 +2620,8 @@ gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/webhooks.v5 v5.15.0 h1:vnD8c5hN/w8qs0K3fQvIDAeYAHBnCclJHPnxNSJeBCw= gopkg.in/go-playground/webhooks.v5 v5.15.0/go.mod h1:LZbya/qLVdbqDR1aKrGuWV6qbia2zCYSR5dpom2SInQ= +gopkg.in/gookit/color.v1 v1.1.6 h1:5fB10p6AUFjhd2ayq9JgmJWr9WlTrguFdw3qlYtKNHk= +gopkg.in/gookit/color.v1 v1.1.6/go.mod h1:IcEkFGaveVShJ+j8ew+jwe9epHyGpJ9IrptHmW3laVY= gopkg.in/gorp.v1 v1.7.2 h1:j3DWlAyGVv8whO7AcIWznQ2Yj7yJkn34B8s63GViAAw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= @@ -2370,6 +2680,8 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -2398,6 +2710,7 @@ k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= k8s.io/api v0.19.2/go.mod h1:IQpK0zFQ1xc5iNIQPqzgoOwuFugaYHK4iCknlAQP9nI= k8s.io/api v0.19.6/go.mod h1:Plxx44Nh4zVblkJrIgxVPgPre1mvng6tXf1Sj3bs0fU= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU= k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= @@ -2414,6 +2727,7 @@ k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftc k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= k8s.io/apimachinery v0.19.2/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apimachinery v0.19.6/go.mod h1:6sRbGRAVY5DOCuZwB5XkqguBqpqLU6q/kOaOdk29z6Q= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= @@ -2423,6 +2737,7 @@ k8s.io/apimachinery v0.21.5/go.mod h1:3PfBV+4PPXNs0aueD+7fHcGyhdkFFYqXeshQtsKCi+ k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw= k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw= k8s.io/apiserver v0.19.2/go.mod h1:FreAq0bJ2vtZFj9Ago/X0oNGC51GfubKK/ViOKfVAOA= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= k8s.io/apiserver v0.21.3 h1:QxAgE1ZPQG5cPlHScHTnLxP9H/kU3zjH1Vnd8G+n5OI= k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU= @@ -2433,6 +2748,7 @@ k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU= k8s.io/client-go v0.19.2/go.mod h1:S5wPhCqyDNAlzM9CnEdgTGV4OqhsW3jGO1UM1epwfJA= k8s.io/client-go v0.19.6/go.mod h1:gEiS+efRlXYUEQ9Oz4lmNXlxAl5JZ8y2zbTDGhvXXnk= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA= k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= @@ -2448,10 +2764,13 @@ k8s.io/code-generator v0.21.5/go.mod h1:0K1k6o2ef8JD/j8LF3ZuqWLGFMHvO5psNzLLmxf7 k8s.io/component-base v0.18.0/go.mod h1:u3BCg0z1uskkzrnAKFzulmYaEpZF7XC9Pf/uFyb1v2c= k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM= k8s.io/component-base v0.19.2/go.mod h1:g5LrsiTiabMLZ40AR6Hl45f088DevyGY+cCE2agEIVo= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= k8s.io/component-base v0.21.3 h1:4WuuXY3Npa+iFfi2aDRiOz+anhNvRfye0859ZgfC5Og= k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ= k8s.io/component-helpers v0.21.0/go.mod h1:tezqefP7lxfvJyR+0a+6QtVrkZ/wIkyMLK4WcQ3Cj8U= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= @@ -2478,6 +2797,7 @@ k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7Br k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= k8s.io/kubectl v0.21.0 h1:WZXlnG/yjcE4LWO2g6ULjFxtzK6H1TKzsfaBFuVIhNg= k8s.io/kubectl v0.21.0/go.mod h1:EU37NukZRXn1TpAkMUoy8Z/B2u6wjHDS4aInsDzVvks= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/metrics v0.21.0/go.mod h1:L3Ji9EGPP1YBbfm9sPfEXSpnj8i24bfQbAFAsW0NueQ= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= @@ -2496,10 +2816,12 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-runtime v0.7.0/go.mod h1:pJ3YBrJiAqMAZKi6UVGuE98ZrroV1p+pIhoHsMm9wdU= diff --git a/hack/gen-grpc-resources.sh b/hack/gen-grpc-resources.sh new file mode 100755 index 000000000..b79c997cc --- /dev/null +++ b/hack/gen-grpc-resources.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash +# +# This script generates gRPC + ProtoBuf Go code for client and server. +# +# Dependencies such as `protoc` binary can be installed on demand. + +# standard bash error handling +set -o nounset # treat unset variables as an error and exit immediately. +set -o errexit # exit immediately when a command fails. +set -E # needs to be set if we want the ERR trap + +CURRENT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +REPO_ROOT_DIR=$(cd "${CURRENT_DIR}/.." && pwd) +TMP_DIR=$(mktemp -d) +readonly CURRENT_DIR +readonly REPO_ROOT_DIR +readonly TMP_DIR + +SKIP_DEPS_INSTALLATION=${SKIP_DEPS_INSTALLATION:-true} + +# shellcheck source=./hack/lib/utilities.sh +source "${CURRENT_DIR}/lib/utilities.sh" || { echo 'Cannot load CI utilities.' exit 1; } +# shellcheck source=./hack/lib/const.sh +source "${CURRENT_DIR}/lib/const.sh" || { echo 'Cannot load constant values.' exit 1; } + +cleanup() { + rm -rf "${TMP_DIR}" +} + +trap cleanup EXIT + +# protoc uses different naming pattern for binary than what we have in the utilities.sh +host::os() { + local host_os + case "$(uname -s)" in + Darwin) + host_os=osx + ;; + Linux) + host_os=linux + ;; + *) + echo "Unsupported host OS. Must be Linux or Mac OS X." + exit 1 + ;; + esac + echo "${host_os}" +} + +host::install::protoc() { + shout "Install the protoc ${STABLE_PROTOC_VERSION} locally to a tempdir..." + mkdir -p "${TMP_DIR}/bin" + + export PATH="${TMP_DIR}/bin:${PATH}" + pushd "$TMP_DIR" >/dev/null + + os=$(host::os) + arch=$(uname -m) + version_without_v=${STABLE_PROTOC_VERSION#"v"} + name="protoc-${version_without_v}-${os}-${arch}" + + # download the release + curl -L -O "https://github.com/protocolbuffers/protobuf/releases/download/${STABLE_PROTOC_VERSION}/${name}.zip" + + # extract the archive + unzip "${name}".zip + + popd >/dev/null + + echo -e "${GREEN}√ install protoc${NC}" +} + +main() { + if [[ "${SKIP_DEPS_INSTALLATION}" == "false" ]]; then + host::install::protoc + else + echo "Skipping protoc installation cause SKIP_DEPS_INSTALLATION is set to true." + fi + + shout "Generating Capact gRPC related resources..." + + readonly apiPaths=( + "/pkg/hub/api/grpc" + ) + + for path in "${apiPaths[@]}"; do + echo "- Processing ${path}..." + pushd "${REPO_ROOT_DIR}$path" > /dev/null + protoc -I=. --go_out=. --go-grpc_out=. ./*.proto + popd > /dev/null + done + + shout "Generation completed successfully." +} + +main diff --git a/hack/lib/const.sh b/hack/lib/const.sh index 00f670cfe..a913d077d 100644 --- a/hack/lib/const.sh +++ b/hack/lib/const.sh @@ -11,6 +11,7 @@ readonly STABLE_CONTROLLER_GEN_VERSION=v0.6.2 readonly STABLE_KUBEBUILDER_VERSION=2.3.2 readonly STABLE_GQLGEN_VERSION=v0.13.0 readonly STABLE_HELM_VERSION=v3.6.3 +readonly STABLE_PROTOC_VERSION=v3.19.4 # # Kubernetes installation diff --git a/internal/secret-storage-backend/fake_provider_test.go b/internal/secret-storage-backend/fake_provider_test.go new file mode 100644 index 000000000..83728cebf --- /dev/null +++ b/internal/secret-storage-backend/fake_provider_test.go @@ -0,0 +1,98 @@ +package secret_storage_backend_test + +import ( + "sort" + + tellercore "github.com/spectralops/teller/pkg/core" + tellerutils "github.com/spectralops/teller/pkg/utils" +) + +var _ tellercore.Provider = &fakeProvider{} + +type fakeProvider struct { + secrets map[string]map[string]string +} + +func (f *fakeProvider) Name() string { + return "fake" +} + +func (f *fakeProvider) GetMapping(kp tellercore.KeyPath) ([]tellercore.EnvEntry, error) { + kvs, err := f.getSecret(kp) + if err != nil { + return nil, err + } + + var entries []tellercore.EnvEntry + for k, v := range kvs { + entries = append(entries, kp.FoundWithKey(k, v)) + } + sort.Sort(tellercore.EntriesByKey(entries)) + return entries, nil +} + +func (f *fakeProvider) Get(kp tellercore.KeyPath) (*tellercore.EnvEntry, error) { + kvs, err := f.getSecret(kp) + if err != nil { + return nil, err + } + + k := kp.EffectiveKey() + val, ok := kvs[k] + if !ok { + ent := kp.Missing() + return &ent, nil + } + + ent := kp.Found(val) + return &ent, nil +} + +func (f *fakeProvider) PutMapping(kp tellercore.KeyPath, m map[string]string) error { + secrets, err := f.getSecret(kp) + if err != nil { + return err + } + + tellerutils.Merge(m, secrets) + + f.secrets[kp.Path] = secrets + + return nil +} + +func (f *fakeProvider) Put(kp tellercore.KeyPath, val string) error { + k := kp.EffectiveKey() + return f.PutMapping(kp, map[string]string{k: val}) +} + +func (f *fakeProvider) Delete(kp tellercore.KeyPath) error { + kvs, err := f.getSecret(kp) + if err != nil { + return err + } + + k := kp.EffectiveKey() + delete(kvs, k) + + if len(kvs) == 0 { + return f.DeleteMapping(kp) + } + + f.secrets[kp.Path] = kvs + return nil +} + +func (f *fakeProvider) DeleteMapping(kp tellercore.KeyPath) error { + delete(f.secrets, kp.Path) + return nil +} + +func (f *fakeProvider) getSecret(kp tellercore.KeyPath) (map[string]string, error) { + secret, ok := f.secrets[kp.Path] + if !ok { + return map[string]string{}, nil + } + + return secret, nil +} diff --git a/internal/secret-storage-backend/server.go b/internal/secret-storage-backend/server.go new file mode 100644 index 000000000..6be34a1bb --- /dev/null +++ b/internal/secret-storage-backend/server.go @@ -0,0 +1,304 @@ +package secret_storage_backend + +import ( + "context" + "encoding/json" + "fmt" + "strconv" + + "capact.io/capact/internal/ptr" + pb "capact.io/capact/pkg/hub/api/grpc/storage_backend" + "github.com/pkg/errors" + tellercore "github.com/spectralops/teller/pkg/core" + "go.uber.org/zap" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +type AdditionalParameters struct { + Provider string `json:"provider"` +} + +var _ pb.StorageBackendServer = &Handler{} + +type Handler struct { + pb.UnimplementedStorageBackendServer + + log *zap.Logger + + providers map[string]tellercore.Provider +} + +const ( + lockedByField = "locked_by" + firstResourceVersion = 1 +) + +var ( + NilRequestInputError = status.Error(codes.InvalidArgument, "request data cannot be nil") +) + +func NewHandler(log *zap.Logger, providers map[string]tellercore.Provider) *Handler { + return &Handler{ + log: log, + providers: providers, + } +} + +func (h *Handler) GetValue(_ context.Context, request *pb.GetValueRequest) (*pb.GetValueResponse, error) { + if request == nil { + return nil, NilRequestInputError + } + + provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + if err != nil { + return nil, err + } + + key := h.storageKeyForTypeInstanceValue(provider, request.TypeinstanceId, request.ResourceVersion) + entry, err := h.getEntry(provider, key) + if err != nil { + return nil, err + } + + var value []byte + if entry.IsFound { + value = []byte(entry.Value) + } + + return &pb.GetValueResponse{ + Value: value, + }, nil +} + +func (h *Handler) GetLockedBy(_ context.Context, request *pb.GetLockedByRequest) (*pb.GetLockedByResponse, error) { + if request == nil { + return nil, NilRequestInputError + } + + provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + if err != nil { + return nil, err + } + + key := h.storageKeyForLockedBy(provider, request.TypeinstanceId) + entry, err := h.getEntry(provider, key) + if err != nil { + return nil, err + } + + var lockedBy *string + if entry.IsFound && entry.Value != "" { + lockedBy = ptr.String(entry.Value) + } + + return &pb.GetLockedByResponse{ + LockedBy: lockedBy, + }, nil +} + +func (h *Handler) OnCreate(_ context.Context, request *pb.OnCreateRequest) (*pb.OnCreateResponse, error) { + if request == nil { + return nil, NilRequestInputError + } + + err := h.handlePutValue( + request.AdditionalParameters, + request.TypeinstanceId, + firstResourceVersion, + request.Value, + ) + if err != nil { + return nil, err + } + + return &pb.OnCreateResponse{}, nil +} + +func (h *Handler) OnUpdate(_ context.Context, request *pb.OnUpdateRequest) (*pb.OnUpdateResponse, error) { + if request == nil { + return nil, NilRequestInputError + } + + err := h.handlePutValue( + request.AdditionalParameters, + request.TypeinstanceId, + request.NewResourceVersion, + request.NewValue, + ) + if err != nil { + return nil, err + } + + return &pb.OnUpdateResponse{}, nil +} + +// OnLock doesn't check whether a given TypeInstance is already locked, but overrides the value in place +// TODO(review): Is that valid assumption? Is there a need to complicate the flow here? +func (h *Handler) OnLock(_ context.Context, request *pb.OnLockRequest) (*pb.OnLockResponse, error) { + if request == nil { + return nil, NilRequestInputError + } + + provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + if err != nil { + return nil, err + } + + key := h.storageKeyForLockedBy(provider, request.TypeinstanceId) + err = h.putEntry(provider, key, []byte(request.LockedBy)) + if err != nil { + return nil, err + } + + return &pb.OnLockResponse{}, nil +} + +func (h *Handler) OnUnlock(_ context.Context, request *pb.OnUnlockRequest) (*pb.OnUnlockResponse, error) { + if request == nil { + return nil, NilRequestInputError + } + + provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + if err != nil { + return nil, err + } + + key := h.storageKeyForLockedBy(provider, request.TypeinstanceId) + err = h.deleteEntry(provider, key) + if err != nil { + return nil, err + } + + return &pb.OnUnlockResponse{}, nil +} + +// OnDelete doesn't check whether a given TypeInstance is locked. It assumes the caller ensured it's unlocked state. +// TODO(review): Is that a valid assumption? +func (h *Handler) OnDelete(_ context.Context, request *pb.OnDeleteRequest) (*pb.OnDeleteResponse, error) { + if request == nil { + return nil, NilRequestInputError + } + + provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + if err != nil { + return nil, err + } + + err = provider.DeleteMapping(tellercore.KeyPath{ + Path: h.storagePathForTypeInstance(provider, request.TypeinstanceId), + }) + if err != nil { + return nil, h.internalError(errors.Wrapf(err, "while deleting TypeInstance %q", request.TypeinstanceId)) + } + + return &pb.OnDeleteResponse{}, nil +} + +func (h *Handler) handlePutValue(additionalParamsBytes []byte, typeInstanceID string, resourceVersion uint32, value []byte) error { + provider, err := h.getProviderFromAdditionalParams(additionalParamsBytes) + if err != nil { + return err + } + + key := h.storageKeyForTypeInstanceValue(provider, typeInstanceID, resourceVersion) + + if err := h.ensureEntryDoesNotExist(provider, key); err != nil { + return err + } + + err = h.putEntry(provider, key, value) + if err != nil { + return err + } + + return nil +} + +func (h *Handler) getProviderFromAdditionalParams(additionalParamsBytes []byte) (tellercore.Provider, error) { + var additionalParams AdditionalParameters + err := json.Unmarshal(additionalParamsBytes, &additionalParams) + if err != nil { + return nil, h.internalError(errors.Wrap(err, "while unmarshaling additional parameters")) + } + + provider, ok := h.providers[additionalParams.Provider] + if !ok { + return nil, h.internalError(fmt.Errorf("missing loaded provider with name %q", additionalParams.Provider)) + } + + return provider, nil +} + +func (h *Handler) getEntry(provider tellercore.Provider, key tellercore.KeyPath) (*tellercore.EnvEntry, error) { + h.log.Info("getting entry", zap.String("path", key.Path), zap.String("provider", provider.Name())) + entry, err := provider.Get(key) + if err != nil { + return nil, h.internalError(errors.Wrapf(err, "while getting value by key %q", key.Path)) + } + + return entry, nil +} + +func (h *Handler) putEntry(provider tellercore.Provider, key tellercore.KeyPath, value []byte) error { + h.log.Info("putting entry", zap.String("path", key.Path), zap.String("field", key.Field), zap.String("provider", provider.Name())) + err := provider.Put(key, string(value)) + if err != nil { + return h.internalError(errors.Wrapf(err, "while putting value for key %q", key.Path)) + } + + return nil +} + +func (h *Handler) deleteEntry(provider tellercore.Provider, key tellercore.KeyPath) error { + h.log.Info("deleting entry", zap.String("path", key.Path), zap.String("field", key.Field), zap.String("provider", provider.Name())) + err := provider.Delete(key) + if err != nil { + return h.internalError(errors.Wrapf(err, "while deleting %q for key %q", key.Field, key.Path)) + } + + return nil +} + +func (h *Handler) storageKeyForTypeInstanceValue(provider tellercore.Provider, tiID string, tiResourceVersion uint32) tellercore.KeyPath { + return tellercore.KeyPath{ + Path: h.storagePathForTypeInstance(provider, tiID), + Field: strconv.Itoa(int(tiResourceVersion)), + } +} + +func (h *Handler) storageKeyForLockedBy(provider tellercore.Provider, tiID string) tellercore.KeyPath { + return tellercore.KeyPath{ + Path: h.storagePathForTypeInstance(provider, tiID), + Field: lockedByField, + } +} + +func (h *Handler) storagePathForTypeInstance(provider tellercore.Provider, tiID string) string { + // depending on provider there might be a different path format + // e.g. see https://github.com/SpectralOps/teller#google-secret-manager + + var prefix string + switch provider.Name() { + case "dotenv": + prefix = "/tmp/" + } + + return fmt.Sprintf("%s/capact/%s", prefix, tiID) +} + +func (h *Handler) ensureEntryDoesNotExist(provider tellercore.Provider, key tellercore.KeyPath) error { + entry, err := h.getEntry(provider, key) + if err != nil { + return h.internalError(errors.Wrapf(err, "while getting entry for path %q", key.Path)) + } + if entry.IsFound { + return status.Error(codes.AlreadyExists, fmt.Sprintf("entry %q in provider %q already exist", key.Path, provider.Name())) + } + + return nil +} + +func (h *Handler) internalError(err error) error { + return status.Error(codes.Internal, err.Error()) +} diff --git a/internal/secret-storage-backend/server_test.go b/internal/secret-storage-backend/server_test.go new file mode 100644 index 000000000..475a7364f --- /dev/null +++ b/internal/secret-storage-backend/server_test.go @@ -0,0 +1,715 @@ +package secret_storage_backend_test + +import ( + "context" + "fmt" + "net" + "testing" + + "capact.io/capact/internal/logger" + "capact.io/capact/internal/ptr" + secret_storage_backend "capact.io/capact/internal/secret-storage-backend" + "capact.io/capact/pkg/hub/api/grpc/storage_backend" + tellercore "github.com/spectralops/teller/pkg/core" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" +) + +func TestHandler_GetValue(t *testing.T) { + // given + providerName := "fake" + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + req := &storage_backend.GetValueRequest{ + TypeinstanceId: "uuid", + ResourceVersion: 2, + AdditionalParameters: reqAdditionalParams, + } + path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) + + testCases := []struct { + Name string + InputProvider tellercore.Provider + ExpectedValue []byte + }{ + { + Name: "No secret", + InputProvider: &fakeProvider{}, + ExpectedValue: nil, + }, + { + Name: "Success", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "2": `{"key":true}`, + }, + }, + }, + ExpectedValue: []byte(`{"key":true}`), + }, + { + Name: "Empty value", // empty value is also a valid one + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "2": "", + }, + }, + }, + ExpectedValue: []byte{}, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + srv, listener := setupServerAndListener(t, map[string]tellercore.Provider{ + providerName: testCase.InputProvider, + }) + defer srv.Stop() + + ctx := context.Background() + conn, err := grpc.DialContext(ctx, "", dialOpts(listener)...) + require.NoError(t, err) + defer conn.Close() + + client := storage_backend.NewStorageBackendClient(conn) + + // when + res, err := client.GetValue(ctx, req) + + // then + require.NoError(t, err) + require.NotNil(t, res) + assert.Equal(t, testCase.ExpectedValue, res.Value) + }) + } +} + +func TestHandler_GetLockedBy(t *testing.T) { + // given + providerName := "fake" + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + req := &storage_backend.GetLockedByRequest{ + TypeinstanceId: "uuid", + AdditionalParameters: reqAdditionalParams, + } + path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) + + testCases := []struct { + Name string + InputProvider tellercore.Provider + ExpectedLockedBy *string + }{ + { + Name: "No data", + InputProvider: &fakeProvider{}, + ExpectedLockedBy: nil, + }, + { + Name: "Empty value", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: {}, + }, + }, + ExpectedLockedBy: nil, + }, + { + Name: "Success", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "locked_by": "service/foo", + }, + }, + }, + ExpectedLockedBy: ptr.String("service/foo"), + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + srv, listener := setupServerAndListener(t, map[string]tellercore.Provider{ + providerName: testCase.InputProvider, + }) + defer srv.Stop() + + ctx := context.Background() + conn, err := grpc.DialContext(ctx, "", dialOpts(listener)...) + require.NoError(t, err) + defer conn.Close() + + client := storage_backend.NewStorageBackendClient(conn) + + // when + res, err := client.GetLockedBy(ctx, req) + + // then + require.NoError(t, err) + require.NotNil(t, res) + + if testCase.ExpectedLockedBy == nil { + assert.Nil(t, res.LockedBy) + return + } + + require.NotNil(t, res.LockedBy) + assert.Equal(t, *testCase.ExpectedLockedBy, *res.LockedBy) + }) + } +} + +func TestHandler_OnCreate(t *testing.T) { + // given + providerName := "fake" + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + valueBytes := []byte(`{"key": true}`) + req := &storage_backend.OnCreateRequest{ + TypeinstanceId: "uuid", + Value: valueBytes, + AdditionalParameters: reqAdditionalParams, + } + path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) + + testCases := []struct { + Name string + InputProvider *fakeProvider + ExpectedProviderState map[string]map[string]string + ExpectedErrorMessage *string + }{ + { + Name: "No data", + InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, + ExpectedProviderState: map[string]map[string]string{ + path: { + "1": string(valueBytes), + }, + }, + }, + { + Name: "Empty value", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: {}, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "1": string(valueBytes), + }, + }, + }, + { + Name: "Already existing without conflict", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "locked_by": "service/foo", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "1": string(valueBytes), + "locked_by": "service/foo", + }, + }, + }, + { + Name: "Already existing with conflict", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "1": "original", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "1": "original", + }, + }, + ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = entry \"/capact/uuid\" in provider \"fake\" already exist"), + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + srv, listener := setupServerAndListener(t, map[string]tellercore.Provider{ + providerName: testCase.InputProvider, + }) + defer srv.Stop() + + ctx := context.Background() + conn, err := grpc.DialContext(ctx, "", dialOpts(listener)...) + require.NoError(t, err) + defer conn.Close() + + client := storage_backend.NewStorageBackendClient(conn) + + // when + res, err := client.OnCreate(ctx, req) + + // no modification of additional params, asserting nil + assert.Equal(t, testCase.ExpectedProviderState, testCase.InputProvider.secrets) + + // then + if testCase.ExpectedErrorMessage != nil { + assert.Nil(t, res) + require.Error(t, err) + assert.EqualError(t, err, *testCase.ExpectedErrorMessage) + return + } + + require.NoError(t, err) + require.NotNil(t, res) + assert.Nil(t, res.AdditionalParameters) + }) + } +} + +func TestHandler_OnUpdate(t *testing.T) { + // given + providerName := "fake" + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + valueBytes := []byte(`{"key": true}`) + req := &storage_backend.OnUpdateRequest{ + TypeinstanceId: "uuid", + NewResourceVersion: 3, + NewValue: valueBytes, + AdditionalParameters: reqAdditionalParams, + } + + path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) + + testCases := []struct { + Name string + InputProvider *fakeProvider + ExpectedProviderState map[string]map[string]string + ExpectedErrorMessage *string + }{ + { + Name: "No data", // data for a give nrevision could reside in different storage backend + InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, + ExpectedProviderState: map[string]map[string]string{ + path: { + "3": string(valueBytes), + }, + }, + }, + { + Name: "Empty value", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: {}, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "3": string(valueBytes), + }, + }, + }, + { + Name: "Already existing without conflict", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "1": "original", + "locked_by": "service/foo", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "1": "original", + "3": string(valueBytes), + "locked_by": "service/foo", + }, + }, + }, + { + Name: "Already existing with conflict", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "3": "original", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "3": "original", + }, + }, + ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = entry \"/capact/uuid\" in provider \"fake\" already exist"), + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + srv, listener := setupServerAndListener(t, map[string]tellercore.Provider{ + providerName: testCase.InputProvider, + }) + defer srv.Stop() + + ctx := context.Background() + conn, err := grpc.DialContext(ctx, "", dialOpts(listener)...) + require.NoError(t, err) + defer conn.Close() + + client := storage_backend.NewStorageBackendClient(conn) + + // when + res, err := client.OnUpdate(ctx, req) + + // no modification of additional params, asserting nil + assert.Equal(t, testCase.ExpectedProviderState, testCase.InputProvider.secrets) + + // then + if testCase.ExpectedErrorMessage != nil { + assert.Nil(t, res) + require.Error(t, err) + assert.EqualError(t, err, *testCase.ExpectedErrorMessage) + return + } + + require.NoError(t, err) + require.NotNil(t, res) + assert.Nil(t, res.AdditionalParameters) + }) + } +} + +func TestHandler_OnLock(t *testing.T) { + // given + providerName := "fake" + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + req := &storage_backend.OnLockRequest{ + TypeinstanceId: "uuid", + LockedBy: "foo/sample", + AdditionalParameters: reqAdditionalParams, + } + + path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) + + testCases := []struct { + Name string + InputProvider *fakeProvider + ExpectedProviderState map[string]map[string]string + ExpectedErrorMessage *string + }{ + { + Name: "No data", // data for a give nrevision could reside in different storage backend + InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, + ExpectedProviderState: map[string]map[string]string{ + path: { + "locked_by": "foo/sample", + }, + }, + }, + { + Name: "Empty value", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: {}, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "locked_by": "foo/sample", + }, + }, + }, + { + Name: "Already existing without conflict", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "1": "original", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "1": "original", + "locked_by": "foo/sample", + }, + }, + }, + { + Name: "Already existing with conflict", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "3": "original", + "locked_by": "previous", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "3": "original", + "locked_by": "foo/sample", + }, + }, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + srv, listener := setupServerAndListener(t, map[string]tellercore.Provider{ + providerName: testCase.InputProvider, + }) + defer srv.Stop() + + ctx := context.Background() + conn, err := grpc.DialContext(ctx, "", dialOpts(listener)...) + require.NoError(t, err) + defer conn.Close() + + client := storage_backend.NewStorageBackendClient(conn) + + // when + res, err := client.OnLock(ctx, req) + + // no modification of additional params, asserting nil + assert.Equal(t, testCase.ExpectedProviderState, testCase.InputProvider.secrets) + + // then + if testCase.ExpectedErrorMessage != nil { + assert.Nil(t, res) + require.Error(t, err) + assert.EqualError(t, err, *testCase.ExpectedErrorMessage) + return + } + + require.NoError(t, err) + require.NotNil(t, res) + }) + } +} + +func TestHandler_OnUnlock(t *testing.T) { + // given + providerName := "fake" + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + req := &storage_backend.OnUnlockRequest{ + TypeinstanceId: "uuid", + AdditionalParameters: reqAdditionalParams, + } + + path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) + + testCases := []struct { + Name string + InputProvider *fakeProvider + ExpectedProviderState map[string]map[string]string + ExpectedErrorMessage *string + }{ + { + Name: "No data", // data for a give nrevision could reside in different storage backend + InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, + ExpectedProviderState: map[string]map[string]string{}, + }, + { + Name: "Already existing without conflict", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "1": "original", + "locked_by": "foo/bar", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "1": "original", + }, + }, + }, + { + Name: "Already existing empty property", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "3": "original", + "locked_by": "", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "3": "original", + }, + }, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + srv, listener := setupServerAndListener(t, map[string]tellercore.Provider{ + providerName: testCase.InputProvider, + }) + defer srv.Stop() + + ctx := context.Background() + conn, err := grpc.DialContext(ctx, "", dialOpts(listener)...) + require.NoError(t, err) + defer conn.Close() + + client := storage_backend.NewStorageBackendClient(conn) + + // when + res, err := client.OnUnlock(ctx, req) + + // no modification of additional params, asserting nil + assert.Equal(t, testCase.ExpectedProviderState, testCase.InputProvider.secrets) + + // then + if testCase.ExpectedErrorMessage != nil { + assert.Nil(t, res) + require.Error(t, err) + assert.EqualError(t, err, *testCase.ExpectedErrorMessage) + return + } + + require.NoError(t, err) + require.NotNil(t, res) + }) + } +} + +func TestHandler_OnDelete(t *testing.T) { + // given + providerName := "fake" + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + req := &storage_backend.OnDeleteRequest{ + TypeinstanceId: "uuid", + AdditionalParameters: reqAdditionalParams, + } + + path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) + + testCases := []struct { + Name string + InputProvider *fakeProvider + ExpectedProviderState map[string]map[string]string + ExpectedErrorMessage *string + }{ + { + Name: "No data", // data for a give nrevision could reside in different storage backend + InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, + ExpectedProviderState: map[string]map[string]string{}, + }, + { + Name: "Empty value", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: {}, + }, + }, + ExpectedProviderState: map[string]map[string]string{}, + }, + { + Name: "Already existing", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "1": "original", + "locked_by": "foo/bar", + }, + "cant-touch-this": { + "Music": "hits me so hard", + "Makes me say": "Oh, my Lord", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + "cant-touch-this": { + "Music": "hits me so hard", + "Makes me say": "Oh, my Lord", + }, + }, + }, + { + Name: "Other data", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + "cant-touch-this": { + "Music": "hits me so hard", + "Makes me say": "Oh, my Lord", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + "cant-touch-this": { + "Music": "hits me so hard", + "Makes me say": "Oh, my Lord", + }, + }, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Name, func(t *testing.T) { + srv, listener := setupServerAndListener(t, map[string]tellercore.Provider{ + providerName: testCase.InputProvider, + }) + defer srv.Stop() + + ctx := context.Background() + conn, err := grpc.DialContext(ctx, "", dialOpts(listener)...) + require.NoError(t, err) + defer conn.Close() + + client := storage_backend.NewStorageBackendClient(conn) + + // when + res, err := client.OnDelete(ctx, req) + + // no modification of additional params, asserting nil + assert.Equal(t, testCase.ExpectedProviderState, testCase.InputProvider.secrets) + + // then + if testCase.ExpectedErrorMessage != nil { + assert.Nil(t, res) + require.Error(t, err) + assert.EqualError(t, err, *testCase.ExpectedErrorMessage) + return + } + + require.NoError(t, err) + require.NotNil(t, res) + }) + } +} + +const bufSize = 1024 * 1024 + +func setupServerAndListener(t *testing.T, providersMap map[string]tellercore.Provider) (*grpc.Server, *bufconn.Listener) { + t.Helper() + handler := secret_storage_backend.NewHandler(logger.Noop(), providersMap) + + listener := bufconn.Listen(bufSize) + srv := grpc.NewServer() + storage_backend.RegisterStorageBackendServer(srv, handler) + + go func() { + err := srv.Serve(listener) + require.NoError(t, err) + }() + + return srv, listener +} + +func dialOpts(listener *bufconn.Listener) []grpc.DialOption { + return []grpc.DialOption{ + grpc.WithContextDialer(func(ctx context.Context, s string) (net.Conn, error) { + return listener.Dial() + }), + grpc.WithInsecure(), + } +} diff --git a/pkg/hub/api/grpc/storage_backend.proto b/pkg/hub/api/grpc/storage_backend.proto new file mode 100644 index 000000000..0925df3db --- /dev/null +++ b/pkg/hub/api/grpc/storage_backend.proto @@ -0,0 +1,88 @@ +syntax = "proto3"; +option go_package = "./storage_backend"; +package storage_backend; + +message OnCreateRequest { + string typeinstance_id = 1; + bytes value = 2; + bytes additional_parameters = 3; +} + +message OnCreateResponse { + optional bytes additional_parameters = 1; +} + +message TypeInstanceResourceVersion { + uint32 resource_version = 1; + bytes value = 2; +} + +message OnUpdateRequest { + string typeinstance_id = 1; + uint32 new_resource_version = 2; + bytes new_value = 3; + optional bytes additional_parameters = 4; +} + +message OnUpdateResponse { + optional bytes additional_parameters = 1; +} + +message OnDeleteRequest { + string typeinstance_id = 1; + bytes additional_parameters = 2; +} + +message OnDeleteResponse {} + +message GetValueRequest { + string typeinstance_id = 1; + uint32 resource_version = 2; + bytes additional_parameters = 3; +} + +message GetValueResponse { + optional bytes value = 1; +} + + +// lock messages + +message GetLockedByRequest { + string typeinstance_id = 1; + bytes additional_parameters = 2; +} + +message GetLockedByResponse { + optional string locked_by = 1; +} + +message OnLockRequest { + string typeinstance_id = 1; + bytes additional_parameters = 2; + string locked_by = 3; +} + +message OnLockResponse {} + +message OnUnlockRequest { + string typeinstance_id = 1; + bytes additional_parameters = 2; +} + +message OnUnlockResponse {} + +// services + +service StorageBackend { + // value + rpc GetValue(GetValueRequest) returns (GetValueResponse); + rpc OnCreate(OnCreateRequest) returns (OnCreateResponse); + rpc OnUpdate(OnUpdateRequest) returns (OnUpdateResponse); + rpc OnDelete(OnDeleteRequest) returns (OnDeleteResponse); + + // lock + rpc GetLockedBy(GetLockedByRequest) returns (GetLockedByResponse); + rpc OnLock(OnLockRequest) returns (OnLockResponse); + rpc OnUnlock(OnUnlockRequest) returns (OnUnlockResponse); +} diff --git a/pkg/hub/api/grpc/storage_backend/storage_backend.pb.go b/pkg/hub/api/grpc/storage_backend/storage_backend.pb.go new file mode 100644 index 000000000..f3edab4c0 --- /dev/null +++ b/pkg/hub/api/grpc/storage_backend/storage_backend.pb.go @@ -0,0 +1,1207 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc v3.19.4 +// source: storage_backend.proto + +package storage_backend + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type OnCreateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + AdditionalParameters []byte `protobuf:"bytes,3,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` +} + +func (x *OnCreateRequest) Reset() { + *x = OnCreateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnCreateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnCreateRequest) ProtoMessage() {} + +func (x *OnCreateRequest) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnCreateRequest.ProtoReflect.Descriptor instead. +func (*OnCreateRequest) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{0} +} + +func (x *OnCreateRequest) GetTypeinstanceId() string { + if x != nil { + return x.TypeinstanceId + } + return "" +} + +func (x *OnCreateRequest) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +func (x *OnCreateRequest) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type OnCreateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalParameters []byte `protobuf:"bytes,1,opt,name=additional_parameters,json=additionalParameters,proto3,oneof" json:"additional_parameters,omitempty"` +} + +func (x *OnCreateResponse) Reset() { + *x = OnCreateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnCreateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnCreateResponse) ProtoMessage() {} + +func (x *OnCreateResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnCreateResponse.ProtoReflect.Descriptor instead. +func (*OnCreateResponse) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{1} +} + +func (x *OnCreateResponse) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type TypeInstanceResourceVersion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ResourceVersion uint32 `protobuf:"varint,1,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *TypeInstanceResourceVersion) Reset() { + *x = TypeInstanceResourceVersion{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TypeInstanceResourceVersion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TypeInstanceResourceVersion) ProtoMessage() {} + +func (x *TypeInstanceResourceVersion) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TypeInstanceResourceVersion.ProtoReflect.Descriptor instead. +func (*TypeInstanceResourceVersion) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{2} +} + +func (x *TypeInstanceResourceVersion) GetResourceVersion() uint32 { + if x != nil { + return x.ResourceVersion + } + return 0 +} + +func (x *TypeInstanceResourceVersion) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +type OnUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + NewResourceVersion uint32 `protobuf:"varint,2,opt,name=new_resource_version,json=newResourceVersion,proto3" json:"new_resource_version,omitempty"` + NewValue []byte `protobuf:"bytes,3,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + AdditionalParameters []byte `protobuf:"bytes,4,opt,name=additional_parameters,json=additionalParameters,proto3,oneof" json:"additional_parameters,omitempty"` +} + +func (x *OnUpdateRequest) Reset() { + *x = OnUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnUpdateRequest) ProtoMessage() {} + +func (x *OnUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnUpdateRequest.ProtoReflect.Descriptor instead. +func (*OnUpdateRequest) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{3} +} + +func (x *OnUpdateRequest) GetTypeinstanceId() string { + if x != nil { + return x.TypeinstanceId + } + return "" +} + +func (x *OnUpdateRequest) GetNewResourceVersion() uint32 { + if x != nil { + return x.NewResourceVersion + } + return 0 +} + +func (x *OnUpdateRequest) GetNewValue() []byte { + if x != nil { + return x.NewValue + } + return nil +} + +func (x *OnUpdateRequest) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type OnUpdateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AdditionalParameters []byte `protobuf:"bytes,1,opt,name=additional_parameters,json=additionalParameters,proto3,oneof" json:"additional_parameters,omitempty"` +} + +func (x *OnUpdateResponse) Reset() { + *x = OnUpdateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnUpdateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnUpdateResponse) ProtoMessage() {} + +func (x *OnUpdateResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnUpdateResponse.ProtoReflect.Descriptor instead. +func (*OnUpdateResponse) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{4} +} + +func (x *OnUpdateResponse) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type OnDeleteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` +} + +func (x *OnDeleteRequest) Reset() { + *x = OnDeleteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnDeleteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnDeleteRequest) ProtoMessage() {} + +func (x *OnDeleteRequest) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnDeleteRequest.ProtoReflect.Descriptor instead. +func (*OnDeleteRequest) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{5} +} + +func (x *OnDeleteRequest) GetTypeinstanceId() string { + if x != nil { + return x.TypeinstanceId + } + return "" +} + +func (x *OnDeleteRequest) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type OnDeleteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *OnDeleteResponse) Reset() { + *x = OnDeleteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnDeleteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnDeleteResponse) ProtoMessage() {} + +func (x *OnDeleteResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnDeleteResponse.ProtoReflect.Descriptor instead. +func (*OnDeleteResponse) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{6} +} + +type GetValueRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + ResourceVersion uint32 `protobuf:"varint,2,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + AdditionalParameters []byte `protobuf:"bytes,3,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` +} + +func (x *GetValueRequest) Reset() { + *x = GetValueRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetValueRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetValueRequest) ProtoMessage() {} + +func (x *GetValueRequest) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetValueRequest.ProtoReflect.Descriptor instead. +func (*GetValueRequest) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{7} +} + +func (x *GetValueRequest) GetTypeinstanceId() string { + if x != nil { + return x.TypeinstanceId + } + return "" +} + +func (x *GetValueRequest) GetResourceVersion() uint32 { + if x != nil { + return x.ResourceVersion + } + return 0 +} + +func (x *GetValueRequest) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type GetValueResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Value []byte `protobuf:"bytes,1,opt,name=value,proto3,oneof" json:"value,omitempty"` +} + +func (x *GetValueResponse) Reset() { + *x = GetValueResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetValueResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetValueResponse) ProtoMessage() {} + +func (x *GetValueResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetValueResponse.ProtoReflect.Descriptor instead. +func (*GetValueResponse) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{8} +} + +func (x *GetValueResponse) GetValue() []byte { + if x != nil { + return x.Value + } + return nil +} + +type GetLockedByRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` +} + +func (x *GetLockedByRequest) Reset() { + *x = GetLockedByRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLockedByRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLockedByRequest) ProtoMessage() {} + +func (x *GetLockedByRequest) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLockedByRequest.ProtoReflect.Descriptor instead. +func (*GetLockedByRequest) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{9} +} + +func (x *GetLockedByRequest) GetTypeinstanceId() string { + if x != nil { + return x.TypeinstanceId + } + return "" +} + +func (x *GetLockedByRequest) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type GetLockedByResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LockedBy *string `protobuf:"bytes,1,opt,name=locked_by,json=lockedBy,proto3,oneof" json:"locked_by,omitempty"` +} + +func (x *GetLockedByResponse) Reset() { + *x = GetLockedByResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLockedByResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLockedByResponse) ProtoMessage() {} + +func (x *GetLockedByResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLockedByResponse.ProtoReflect.Descriptor instead. +func (*GetLockedByResponse) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{10} +} + +func (x *GetLockedByResponse) GetLockedBy() string { + if x != nil && x.LockedBy != nil { + return *x.LockedBy + } + return "" +} + +type OnLockRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` + LockedBy string `protobuf:"bytes,3,opt,name=locked_by,json=lockedBy,proto3" json:"locked_by,omitempty"` +} + +func (x *OnLockRequest) Reset() { + *x = OnLockRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnLockRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnLockRequest) ProtoMessage() {} + +func (x *OnLockRequest) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnLockRequest.ProtoReflect.Descriptor instead. +func (*OnLockRequest) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{11} +} + +func (x *OnLockRequest) GetTypeinstanceId() string { + if x != nil { + return x.TypeinstanceId + } + return "" +} + +func (x *OnLockRequest) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +func (x *OnLockRequest) GetLockedBy() string { + if x != nil { + return x.LockedBy + } + return "" +} + +type OnLockResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *OnLockResponse) Reset() { + *x = OnLockResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnLockResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnLockResponse) ProtoMessage() {} + +func (x *OnLockResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnLockResponse.ProtoReflect.Descriptor instead. +func (*OnLockResponse) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{12} +} + +type OnUnlockRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` +} + +func (x *OnUnlockRequest) Reset() { + *x = OnUnlockRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnUnlockRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnUnlockRequest) ProtoMessage() {} + +func (x *OnUnlockRequest) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnUnlockRequest.ProtoReflect.Descriptor instead. +func (*OnUnlockRequest) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{13} +} + +func (x *OnUnlockRequest) GetTypeinstanceId() string { + if x != nil { + return x.TypeinstanceId + } + return "" +} + +func (x *OnUnlockRequest) GetAdditionalParameters() []byte { + if x != nil { + return x.AdditionalParameters + } + return nil +} + +type OnUnlockResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *OnUnlockResponse) Reset() { + *x = OnUnlockResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_storage_backend_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OnUnlockResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OnUnlockResponse) ProtoMessage() {} + +func (x *OnUnlockResponse) ProtoReflect() protoreflect.Message { + mi := &file_storage_backend_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OnUnlockResponse.ProtoReflect.Descriptor instead. +func (*OnUnlockResponse) Descriptor() ([]byte, []int) { + return file_storage_backend_proto_rawDescGZIP(), []int{14} +} + +var File_storage_backend_proto protoreflect.FileDescriptor + +var file_storage_backend_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x0f, 0x4f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x66, 0x0a, 0x10, 0x4f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, + 0x0a, 0x16, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x5e, 0x0a, 0x1b, 0x54, 0x79, 0x70, 0x65, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x0f, 0x4f, 0x6e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, + 0x0a, 0x16, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x66, 0x0a, 0x10, 0x4f, 0x6e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x15, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x14, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x22, 0x6f, 0x0a, 0x0f, 0x4f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, + 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x15, + 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, + 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, + 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x22, 0x37, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x72, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, + 0x45, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x42, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x0d, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x42, 0x79, 0x22, 0x10, 0x0a, 0x0e, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x0f, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, + 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xca, 0x04, 0x0a, 0x0e, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4f, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x20, 0x2e, 0x73, 0x74, 0x6f, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x47, 0x65, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, + 0x0a, 0x08, 0x4f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4f, 0x0a, 0x08, 0x4f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, + 0x4f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4f, 0x0a, 0x08, 0x4f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, + 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x2e, 0x4f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x58, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, + 0x12, 0x23, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x42, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x4f, + 0x6e, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x1e, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x20, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x13, 0x5a, 0x11, 0x2e, 0x2f, 0x73, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_storage_backend_proto_rawDescOnce sync.Once + file_storage_backend_proto_rawDescData = file_storage_backend_proto_rawDesc +) + +func file_storage_backend_proto_rawDescGZIP() []byte { + file_storage_backend_proto_rawDescOnce.Do(func() { + file_storage_backend_proto_rawDescData = protoimpl.X.CompressGZIP(file_storage_backend_proto_rawDescData) + }) + return file_storage_backend_proto_rawDescData +} + +var file_storage_backend_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_storage_backend_proto_goTypes = []interface{}{ + (*OnCreateRequest)(nil), // 0: storage_backend.OnCreateRequest + (*OnCreateResponse)(nil), // 1: storage_backend.OnCreateResponse + (*TypeInstanceResourceVersion)(nil), // 2: storage_backend.TypeInstanceResourceVersion + (*OnUpdateRequest)(nil), // 3: storage_backend.OnUpdateRequest + (*OnUpdateResponse)(nil), // 4: storage_backend.OnUpdateResponse + (*OnDeleteRequest)(nil), // 5: storage_backend.OnDeleteRequest + (*OnDeleteResponse)(nil), // 6: storage_backend.OnDeleteResponse + (*GetValueRequest)(nil), // 7: storage_backend.GetValueRequest + (*GetValueResponse)(nil), // 8: storage_backend.GetValueResponse + (*GetLockedByRequest)(nil), // 9: storage_backend.GetLockedByRequest + (*GetLockedByResponse)(nil), // 10: storage_backend.GetLockedByResponse + (*OnLockRequest)(nil), // 11: storage_backend.OnLockRequest + (*OnLockResponse)(nil), // 12: storage_backend.OnLockResponse + (*OnUnlockRequest)(nil), // 13: storage_backend.OnUnlockRequest + (*OnUnlockResponse)(nil), // 14: storage_backend.OnUnlockResponse +} +var file_storage_backend_proto_depIdxs = []int32{ + 7, // 0: storage_backend.StorageBackend.GetValue:input_type -> storage_backend.GetValueRequest + 0, // 1: storage_backend.StorageBackend.OnCreate:input_type -> storage_backend.OnCreateRequest + 3, // 2: storage_backend.StorageBackend.OnUpdate:input_type -> storage_backend.OnUpdateRequest + 5, // 3: storage_backend.StorageBackend.OnDelete:input_type -> storage_backend.OnDeleteRequest + 9, // 4: storage_backend.StorageBackend.GetLockedBy:input_type -> storage_backend.GetLockedByRequest + 11, // 5: storage_backend.StorageBackend.OnLock:input_type -> storage_backend.OnLockRequest + 13, // 6: storage_backend.StorageBackend.OnUnlock:input_type -> storage_backend.OnUnlockRequest + 8, // 7: storage_backend.StorageBackend.GetValue:output_type -> storage_backend.GetValueResponse + 1, // 8: storage_backend.StorageBackend.OnCreate:output_type -> storage_backend.OnCreateResponse + 4, // 9: storage_backend.StorageBackend.OnUpdate:output_type -> storage_backend.OnUpdateResponse + 6, // 10: storage_backend.StorageBackend.OnDelete:output_type -> storage_backend.OnDeleteResponse + 10, // 11: storage_backend.StorageBackend.GetLockedBy:output_type -> storage_backend.GetLockedByResponse + 12, // 12: storage_backend.StorageBackend.OnLock:output_type -> storage_backend.OnLockResponse + 14, // 13: storage_backend.StorageBackend.OnUnlock:output_type -> storage_backend.OnUnlockResponse + 7, // [7:14] is the sub-list for method output_type + 0, // [0:7] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_storage_backend_proto_init() } +func file_storage_backend_proto_init() { + if File_storage_backend_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_storage_backend_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnCreateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnCreateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TypeInstanceResourceVersion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnUpdateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnDeleteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnDeleteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetValueRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetValueResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLockedByRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLockedByResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnLockRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnLockResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnUnlockRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_storage_backend_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OnUnlockResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_storage_backend_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_storage_backend_proto_msgTypes[3].OneofWrappers = []interface{}{} + file_storage_backend_proto_msgTypes[4].OneofWrappers = []interface{}{} + file_storage_backend_proto_msgTypes[8].OneofWrappers = []interface{}{} + file_storage_backend_proto_msgTypes[10].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_storage_backend_proto_rawDesc, + NumEnums: 0, + NumMessages: 15, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_storage_backend_proto_goTypes, + DependencyIndexes: file_storage_backend_proto_depIdxs, + MessageInfos: file_storage_backend_proto_msgTypes, + }.Build() + File_storage_backend_proto = out.File + file_storage_backend_proto_rawDesc = nil + file_storage_backend_proto_goTypes = nil + file_storage_backend_proto_depIdxs = nil +} diff --git a/pkg/hub/api/grpc/storage_backend/storage_backend_grpc.pb.go b/pkg/hub/api/grpc/storage_backend/storage_backend_grpc.pb.go new file mode 100644 index 000000000..f7e997e60 --- /dev/null +++ b/pkg/hub/api/grpc/storage_backend/storage_backend_grpc.pb.go @@ -0,0 +1,325 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.19.4 +// source: storage_backend.proto + +package storage_backend + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// StorageBackendClient is the client API for StorageBackend service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type StorageBackendClient interface { + // value + GetValue(ctx context.Context, in *GetValueRequest, opts ...grpc.CallOption) (*GetValueResponse, error) + OnCreate(ctx context.Context, in *OnCreateRequest, opts ...grpc.CallOption) (*OnCreateResponse, error) + OnUpdate(ctx context.Context, in *OnUpdateRequest, opts ...grpc.CallOption) (*OnUpdateResponse, error) + OnDelete(ctx context.Context, in *OnDeleteRequest, opts ...grpc.CallOption) (*OnDeleteResponse, error) + // lock + GetLockedBy(ctx context.Context, in *GetLockedByRequest, opts ...grpc.CallOption) (*GetLockedByResponse, error) + OnLock(ctx context.Context, in *OnLockRequest, opts ...grpc.CallOption) (*OnLockResponse, error) + OnUnlock(ctx context.Context, in *OnUnlockRequest, opts ...grpc.CallOption) (*OnUnlockResponse, error) +} + +type storageBackendClient struct { + cc grpc.ClientConnInterface +} + +func NewStorageBackendClient(cc grpc.ClientConnInterface) StorageBackendClient { + return &storageBackendClient{cc} +} + +func (c *storageBackendClient) GetValue(ctx context.Context, in *GetValueRequest, opts ...grpc.CallOption) (*GetValueResponse, error) { + out := new(GetValueResponse) + err := c.cc.Invoke(ctx, "/storage_backend.StorageBackend/GetValue", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageBackendClient) OnCreate(ctx context.Context, in *OnCreateRequest, opts ...grpc.CallOption) (*OnCreateResponse, error) { + out := new(OnCreateResponse) + err := c.cc.Invoke(ctx, "/storage_backend.StorageBackend/OnCreate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageBackendClient) OnUpdate(ctx context.Context, in *OnUpdateRequest, opts ...grpc.CallOption) (*OnUpdateResponse, error) { + out := new(OnUpdateResponse) + err := c.cc.Invoke(ctx, "/storage_backend.StorageBackend/OnUpdate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageBackendClient) OnDelete(ctx context.Context, in *OnDeleteRequest, opts ...grpc.CallOption) (*OnDeleteResponse, error) { + out := new(OnDeleteResponse) + err := c.cc.Invoke(ctx, "/storage_backend.StorageBackend/OnDelete", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageBackendClient) GetLockedBy(ctx context.Context, in *GetLockedByRequest, opts ...grpc.CallOption) (*GetLockedByResponse, error) { + out := new(GetLockedByResponse) + err := c.cc.Invoke(ctx, "/storage_backend.StorageBackend/GetLockedBy", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageBackendClient) OnLock(ctx context.Context, in *OnLockRequest, opts ...grpc.CallOption) (*OnLockResponse, error) { + out := new(OnLockResponse) + err := c.cc.Invoke(ctx, "/storage_backend.StorageBackend/OnLock", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *storageBackendClient) OnUnlock(ctx context.Context, in *OnUnlockRequest, opts ...grpc.CallOption) (*OnUnlockResponse, error) { + out := new(OnUnlockResponse) + err := c.cc.Invoke(ctx, "/storage_backend.StorageBackend/OnUnlock", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// StorageBackendServer is the server API for StorageBackend service. +// All implementations must embed UnimplementedStorageBackendServer +// for forward compatibility +type StorageBackendServer interface { + // value + GetValue(context.Context, *GetValueRequest) (*GetValueResponse, error) + OnCreate(context.Context, *OnCreateRequest) (*OnCreateResponse, error) + OnUpdate(context.Context, *OnUpdateRequest) (*OnUpdateResponse, error) + OnDelete(context.Context, *OnDeleteRequest) (*OnDeleteResponse, error) + // lock + GetLockedBy(context.Context, *GetLockedByRequest) (*GetLockedByResponse, error) + OnLock(context.Context, *OnLockRequest) (*OnLockResponse, error) + OnUnlock(context.Context, *OnUnlockRequest) (*OnUnlockResponse, error) + mustEmbedUnimplementedStorageBackendServer() +} + +// UnimplementedStorageBackendServer must be embedded to have forward compatible implementations. +type UnimplementedStorageBackendServer struct { +} + +func (UnimplementedStorageBackendServer) GetValue(context.Context, *GetValueRequest) (*GetValueResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetValue not implemented") +} +func (UnimplementedStorageBackendServer) OnCreate(context.Context, *OnCreateRequest) (*OnCreateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnCreate not implemented") +} +func (UnimplementedStorageBackendServer) OnUpdate(context.Context, *OnUpdateRequest) (*OnUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnUpdate not implemented") +} +func (UnimplementedStorageBackendServer) OnDelete(context.Context, *OnDeleteRequest) (*OnDeleteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnDelete not implemented") +} +func (UnimplementedStorageBackendServer) GetLockedBy(context.Context, *GetLockedByRequest) (*GetLockedByResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLockedBy not implemented") +} +func (UnimplementedStorageBackendServer) OnLock(context.Context, *OnLockRequest) (*OnLockResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnLock not implemented") +} +func (UnimplementedStorageBackendServer) OnUnlock(context.Context, *OnUnlockRequest) (*OnUnlockResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method OnUnlock not implemented") +} +func (UnimplementedStorageBackendServer) mustEmbedUnimplementedStorageBackendServer() {} + +// UnsafeStorageBackendServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to StorageBackendServer will +// result in compilation errors. +type UnsafeStorageBackendServer interface { + mustEmbedUnimplementedStorageBackendServer() +} + +func RegisterStorageBackendServer(s grpc.ServiceRegistrar, srv StorageBackendServer) { + s.RegisterService(&StorageBackend_ServiceDesc, srv) +} + +func _StorageBackend_GetValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetValueRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageBackendServer).GetValue(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/storage_backend.StorageBackend/GetValue", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageBackendServer).GetValue(ctx, req.(*GetValueRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _StorageBackend_OnCreate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OnCreateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageBackendServer).OnCreate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/storage_backend.StorageBackend/OnCreate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageBackendServer).OnCreate(ctx, req.(*OnCreateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _StorageBackend_OnUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OnUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageBackendServer).OnUpdate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/storage_backend.StorageBackend/OnUpdate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageBackendServer).OnUpdate(ctx, req.(*OnUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _StorageBackend_OnDelete_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OnDeleteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageBackendServer).OnDelete(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/storage_backend.StorageBackend/OnDelete", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageBackendServer).OnDelete(ctx, req.(*OnDeleteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _StorageBackend_GetLockedBy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetLockedByRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageBackendServer).GetLockedBy(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/storage_backend.StorageBackend/GetLockedBy", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageBackendServer).GetLockedBy(ctx, req.(*GetLockedByRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _StorageBackend_OnLock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OnLockRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageBackendServer).OnLock(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/storage_backend.StorageBackend/OnLock", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageBackendServer).OnLock(ctx, req.(*OnLockRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _StorageBackend_OnUnlock_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(OnUnlockRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StorageBackendServer).OnUnlock(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/storage_backend.StorageBackend/OnUnlock", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StorageBackendServer).OnUnlock(ctx, req.(*OnUnlockRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// StorageBackend_ServiceDesc is the grpc.ServiceDesc for StorageBackend service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var StorageBackend_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "storage_backend.StorageBackend", + HandlerType: (*StorageBackendServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetValue", + Handler: _StorageBackend_GetValue_Handler, + }, + { + MethodName: "OnCreate", + Handler: _StorageBackend_OnCreate_Handler, + }, + { + MethodName: "OnUpdate", + Handler: _StorageBackend_OnUpdate_Handler, + }, + { + MethodName: "OnDelete", + Handler: _StorageBackend_OnDelete_Handler, + }, + { + MethodName: "GetLockedBy", + Handler: _StorageBackend_GetLockedBy_Handler, + }, + { + MethodName: "OnLock", + Handler: _StorageBackend_OnLock_Handler, + }, + { + MethodName: "OnUnlock", + Handler: _StorageBackend_OnUnlock_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "storage_backend.proto", +} From 38640199de17187a0d2ad95662173514e9b2459f Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Thu, 24 Feb 2022 09:41:15 +0100 Subject: [PATCH 02/10] Move the Go gRPC client example to `pkg/hub/api/grpc` and fix lint issues --- cmd/secret-storage-backend/README.md | 6 ++-- .../fake_provider_test.go | 28 ++++++------------- internal/secret-storage-backend/server.go | 2 +- .../secret-storage-backend/server_test.go | 2 +- .../api/grpc/storage_backend}/example_test.go | 18 ++++++++---- 5 files changed, 25 insertions(+), 31 deletions(-) rename {cmd/secret-storage-backend => pkg/hub/api/grpc/storage_backend}/example_test.go (86%) diff --git a/cmd/secret-storage-backend/README.md b/cmd/secret-storage-backend/README.md index bc1421b15..3e566a6e0 100644 --- a/cmd/secret-storage-backend/README.md +++ b/cmd/secret-storage-backend/README.md @@ -36,9 +36,9 @@ To perform such calls, you can use e.g. [Insomnia](https://insomnia.rest/) tool. To run the server with `dotenv` provider enabled, which stores data in files, execute: -```bash -APP_SUPPORTED_PROVIDERS=dotenv APP_LOGGER_DEV_MODE=true go run ./cmd/secret-storage-backend/main.go -``` + ```bash + APP_SUPPORTED_PROVIDERS=dotenv,aws_secretsmanager APP_LOGGER_DEV_MODE=true go run ./cmd/secret-storage-backend/main.go + ``` > **NOTE:** You can enable multiple providers, separating them by comma, such as: `APP_SUPPORTED_PROVIDERS=aws_secretsmanager,dotenv`. diff --git a/internal/secret-storage-backend/fake_provider_test.go b/internal/secret-storage-backend/fake_provider_test.go index 83728cebf..31a813935 100644 --- a/internal/secret-storage-backend/fake_provider_test.go +++ b/internal/secret-storage-backend/fake_provider_test.go @@ -1,4 +1,4 @@ -package secret_storage_backend_test +package secretstoragebackend_test import ( "sort" @@ -18,10 +18,7 @@ func (f *fakeProvider) Name() string { } func (f *fakeProvider) GetMapping(kp tellercore.KeyPath) ([]tellercore.EnvEntry, error) { - kvs, err := f.getSecret(kp) - if err != nil { - return nil, err - } + kvs := f.getSecret(kp) var entries []tellercore.EnvEntry for k, v := range kvs { @@ -32,10 +29,7 @@ func (f *fakeProvider) GetMapping(kp tellercore.KeyPath) ([]tellercore.EnvEntry, } func (f *fakeProvider) Get(kp tellercore.KeyPath) (*tellercore.EnvEntry, error) { - kvs, err := f.getSecret(kp) - if err != nil { - return nil, err - } + kvs := f.getSecret(kp) k := kp.EffectiveKey() val, ok := kvs[k] @@ -49,10 +43,7 @@ func (f *fakeProvider) Get(kp tellercore.KeyPath) (*tellercore.EnvEntry, error) } func (f *fakeProvider) PutMapping(kp tellercore.KeyPath, m map[string]string) error { - secrets, err := f.getSecret(kp) - if err != nil { - return err - } + secrets := f.getSecret(kp) tellerutils.Merge(m, secrets) @@ -67,10 +58,7 @@ func (f *fakeProvider) Put(kp tellercore.KeyPath, val string) error { } func (f *fakeProvider) Delete(kp tellercore.KeyPath) error { - kvs, err := f.getSecret(kp) - if err != nil { - return err - } + kvs := f.getSecret(kp) k := kp.EffectiveKey() delete(kvs, k) @@ -88,11 +76,11 @@ func (f *fakeProvider) DeleteMapping(kp tellercore.KeyPath) error { return nil } -func (f *fakeProvider) getSecret(kp tellercore.KeyPath) (map[string]string, error) { +func (f *fakeProvider) getSecret(kp tellercore.KeyPath) map[string]string { secret, ok := f.secrets[kp.Path] if !ok { - return map[string]string{}, nil + return map[string]string{} } - return secret, nil + return secret } diff --git a/internal/secret-storage-backend/server.go b/internal/secret-storage-backend/server.go index 6be34a1bb..6c4f94f85 100644 --- a/internal/secret-storage-backend/server.go +++ b/internal/secret-storage-backend/server.go @@ -1,4 +1,4 @@ -package secret_storage_backend +package secretstoragebackend import ( "context" diff --git a/internal/secret-storage-backend/server_test.go b/internal/secret-storage-backend/server_test.go index 475a7364f..5687ab849 100644 --- a/internal/secret-storage-backend/server_test.go +++ b/internal/secret-storage-backend/server_test.go @@ -1,4 +1,4 @@ -package secret_storage_backend_test +package secretstoragebackend_test import ( "context" diff --git a/cmd/secret-storage-backend/example_test.go b/pkg/hub/api/grpc/storage_backend/example_test.go similarity index 86% rename from cmd/secret-storage-backend/example_test.go rename to pkg/hub/api/grpc/storage_backend/example_test.go index 55372fa10..bcb04c7c8 100644 --- a/cmd/secret-storage-backend/example_test.go +++ b/pkg/hub/api/grpc/storage_backend/example_test.go @@ -1,22 +1,28 @@ -package main_test +package storage_backend_test import ( "context" "fmt" - utilrand "k8s.io/apimachinery/pkg/util/rand" - "testing" pb "capact.io/capact/pkg/hub/api/grpc/storage_backend" "google.golang.org/grpc" + utilrand "k8s.io/apimachinery/pkg/util/rand" ) -func Test(t *testing.T) { +// This example illustrates how to use gRPC Go client against real gRPC Storage Backend server. +// +// NOTE: Before running this example, make sure that the server is running under the `srvAddr` address +// and the `provider` is enabled on this server. +func ExampleNewStorageBackendClient() { + provider := "dotenv" + srvAddr := ":50051" // server address + valueBytes := []byte(`{"key": true}`) typeInstanceID := utilrand.String(10) // temp - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"dotenv"}`)) + reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, provider)) - conn, err := grpc.Dial(":50051", grpc.WithInsecure()) + conn, err := grpc.Dial(srvAddr, grpc.WithInsecure()) if err != nil { panic(err) } From 64747952dc5717bfe96c7fc39b88c113258ee7b7 Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Thu, 24 Feb 2022 12:56:06 +0100 Subject: [PATCH 03/10] Update teller and example --- go.mod | 2 +- go.sum | 4 +-- internal/secret-storage-backend/server.go | 19 ++++++++--- .../api/grpc/storage_backend/example_test.go | 33 ++++++++++--------- 4 files changed, 36 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 87749fc84..d66656406 100644 --- a/go.mod +++ b/go.mod @@ -101,5 +101,5 @@ replace ( github.com/go-openapi/spec => github.com/go-openapi/spec v0.19.8 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 - github.com/spectralops/teller => github.com/pkosiec/teller v1.4.1-0.20220223143025-e3f18e5c70c2 + github.com/spectralops/teller => github.com/pkosiec/teller v1.4.1-0.20220224131849-7cde9fef3b6c ) diff --git a/go.sum b/go.sum index f601ab318..75c95e408 100644 --- a/go.sum +++ b/go.sum @@ -1609,8 +1609,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkosiec/teller v1.4.1-0.20220223143025-e3f18e5c70c2 h1:bcWuKCL54vNtNkD1MEBKmSfqdernUCCTjlwSkFBpV1g= -github.com/pkosiec/teller v1.4.1-0.20220223143025-e3f18e5c70c2/go.mod h1:x2B4YYysArnF/yH+IWmEwSef+5kK+CFD/ySgQHEboC0= +github.com/pkosiec/teller v1.4.1-0.20220224131849-7cde9fef3b6c h1:RBLmCK5i8F2OWoUybUSjDx61xW1AbMUa/uVOp51GkAs= +github.com/pkosiec/teller v1.4.1-0.20220224131849-7cde9fef3b6c/go.mod h1:x2B4YYysArnF/yH+IWmEwSef+5kK+CFD/ySgQHEboC0= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/internal/secret-storage-backend/server.go b/internal/secret-storage-backend/server.go index 6c4f94f85..2a471e5cd 100644 --- a/internal/secret-storage-backend/server.go +++ b/internal/secret-storage-backend/server.go @@ -15,12 +15,14 @@ import ( "google.golang.org/grpc/status" ) +// AdditionalParameters holds Secret storage backend specific parameters. type AdditionalParameters struct { Provider string `json:"provider"` } var _ pb.StorageBackendServer = &Handler{} +// Handler handles incoming requests to the Secret storage backend gRPC server. type Handler struct { pb.UnimplementedStorageBackendServer @@ -35,9 +37,11 @@ const ( ) var ( + // NilRequestInputError describes an error with an invalid request. NilRequestInputError = status.Error(codes.InvalidArgument, "request data cannot be nil") ) +// NewHandler returns new Handler. func NewHandler(log *zap.Logger, providers map[string]tellercore.Provider) *Handler { return &Handler{ log: log, @@ -45,6 +49,7 @@ func NewHandler(log *zap.Logger, providers map[string]tellercore.Provider) *Hand } } +// GetValue returns a value for a given TypeInstance. It returns nil as value if a given secret is not found. func (h *Handler) GetValue(_ context.Context, request *pb.GetValueRequest) (*pb.GetValueResponse, error) { if request == nil { return nil, NilRequestInputError @@ -71,6 +76,7 @@ func (h *Handler) GetValue(_ context.Context, request *pb.GetValueRequest) (*pb. }, nil } +// GetLockedBy returns a locked by data for a given TypeInstance. It returns nil as value if a given secret is not found. func (h *Handler) GetLockedBy(_ context.Context, request *pb.GetLockedByRequest) (*pb.GetLockedByResponse, error) { if request == nil { return nil, NilRequestInputError @@ -97,6 +103,7 @@ func (h *Handler) GetLockedBy(_ context.Context, request *pb.GetLockedByRequest) }, nil } +// OnCreate handles TypeInstance creation by creating secret in a given provider. func (h *Handler) OnCreate(_ context.Context, request *pb.OnCreateRequest) (*pb.OnCreateResponse, error) { if request == nil { return nil, NilRequestInputError @@ -115,6 +122,7 @@ func (h *Handler) OnCreate(_ context.Context, request *pb.OnCreateRequest) (*pb. return &pb.OnCreateResponse{}, nil } +// OnUpdate handles TypeInstance update by updating secret in a given provider. func (h *Handler) OnUpdate(_ context.Context, request *pb.OnUpdateRequest) (*pb.OnUpdateResponse, error) { if request == nil { return nil, NilRequestInputError @@ -133,7 +141,8 @@ func (h *Handler) OnUpdate(_ context.Context, request *pb.OnUpdateRequest) (*pb. return &pb.OnUpdateResponse{}, nil } -// OnLock doesn't check whether a given TypeInstance is already locked, but overrides the value in place +// OnLock handles TypeInstance locking by setting a secret entry in a given provider. +// It doesn't check whether a given TypeInstance is already locked, but overrides the value in place // TODO(review): Is that valid assumption? Is there a need to complicate the flow here? func (h *Handler) OnLock(_ context.Context, request *pb.OnLockRequest) (*pb.OnLockResponse, error) { if request == nil { @@ -154,6 +163,7 @@ func (h *Handler) OnLock(_ context.Context, request *pb.OnLockRequest) (*pb.OnLo return &pb.OnLockResponse{}, nil } +// OnUnlock handles TypeInstance unlocking by removing secret entry in a given provider. func (h *Handler) OnUnlock(_ context.Context, request *pb.OnUnlockRequest) (*pb.OnUnlockResponse, error) { if request == nil { return nil, NilRequestInputError @@ -173,7 +183,8 @@ func (h *Handler) OnUnlock(_ context.Context, request *pb.OnUnlockRequest) (*pb. return &pb.OnUnlockResponse{}, nil } -// OnDelete doesn't check whether a given TypeInstance is locked. It assumes the caller ensured it's unlocked state. +// OnDelete handles TypeInstance deletion by removing a secret in a given provider. +// It doesn't check whether a given TypeInstance is locked. It assumes the caller ensured it's unlocked state. // TODO(review): Is that a valid assumption? func (h *Handler) OnDelete(_ context.Context, request *pb.OnDeleteRequest) (*pb.OnDeleteResponse, error) { if request == nil { @@ -290,10 +301,10 @@ func (h *Handler) storagePathForTypeInstance(provider tellercore.Provider, tiID func (h *Handler) ensureEntryDoesNotExist(provider tellercore.Provider, key tellercore.KeyPath) error { entry, err := h.getEntry(provider, key) if err != nil { - return h.internalError(errors.Wrapf(err, "while getting entry for path %q", key.Path)) + return h.internalError(errors.Wrapf(err, "while getting field %q for path %q", key.Field, key.Path)) } if entry.IsFound { - return status.Error(codes.AlreadyExists, fmt.Sprintf("entry %q in provider %q already exist", key.Path, provider.Name())) + return status.Error(codes.AlreadyExists, fmt.Sprintf("field %q for path %q in provider %q already exist", key.Field, key.Path, provider.Name())) } return nil diff --git a/pkg/hub/api/grpc/storage_backend/example_test.go b/pkg/hub/api/grpc/storage_backend/example_test.go index bcb04c7c8..d55f99cf1 100644 --- a/pkg/hub/api/grpc/storage_backend/example_test.go +++ b/pkg/hub/api/grpc/storage_backend/example_test.go @@ -31,7 +31,7 @@ func ExampleNewStorageBackendClient() { client := pb.NewStorageBackendClient(conn) // create - fmt.Println("create TI", typeInstanceID) + fmt.Printf("Creating TI %q...\n", typeInstanceID) _, err = client.OnCreate(ctx, &pb.OnCreateRequest{ TypeinstanceId: typeInstanceID, @@ -44,19 +44,20 @@ func ExampleNewStorageBackendClient() { // get value + var resourceVersion uint32 = 1 res, err := client.GetValue(ctx, &pb.GetValueRequest{ TypeinstanceId: typeInstanceID, - ResourceVersion: 1, + ResourceVersion: resourceVersion, AdditionalParameters: reqAdditionalParams, }) if err != nil { panic(err) } - fmt.Println("first get - resource version 1", string(res.Value)) + fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) // update - fmt.Println("update TI", typeInstanceID) + fmt.Printf("Updating TI %q...\n", typeInstanceID) newValueBytes := []byte(`{"key": "updated"}`) _, err = client.OnUpdate(ctx, &pb.OnUpdateRequest{ @@ -73,29 +74,30 @@ func ExampleNewStorageBackendClient() { res, err = client.GetValue(ctx, &pb.GetValueRequest{ TypeinstanceId: typeInstanceID, - ResourceVersion: 1, + ResourceVersion: resourceVersion, AdditionalParameters: reqAdditionalParams, }) if err != nil { panic(err) } - fmt.Println("get after update - resource version 1", string(res.Value)) + fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + resourceVersion = 2 res, err = client.GetValue(ctx, &pb.GetValueRequest{ TypeinstanceId: typeInstanceID, - ResourceVersion: 2, + ResourceVersion: resourceVersion, AdditionalParameters: reqAdditionalParams, }) if err != nil { panic(err) } - fmt.Println("get after update - resource version 2", string(res.Value)) + fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) // lock - fmt.Println("locking") + fmt.Printf("Locking TI %q...\n", typeInstanceID) _, err = client.OnLock(ctx, &pb.OnLockRequest{ TypeinstanceId: typeInstanceID, @@ -120,11 +122,11 @@ func ExampleNewStorageBackendClient() { panic("lockedBy cannot be nil") } - fmt.Println("first get - lockedBy", *lockedByRes.LockedBy) + fmt.Printf("Getting TI %q: locked by %q\n", typeInstanceID, *lockedByRes.LockedBy) // unlock - fmt.Println("unlocking") + fmt.Printf("Unlocking TI %q...\n", typeInstanceID) _, err = client.OnUnlock(ctx, &pb.OnUnlockRequest{ TypeinstanceId: typeInstanceID, @@ -144,10 +146,10 @@ func ExampleNewStorageBackendClient() { panic(err) } - fmt.Println("second get - lockedBy", lockedByRes.LockedBy) + fmt.Printf("Getting TI %q: locked by: %v\n", typeInstanceID, lockedByRes.LockedBy) // delete - fmt.Println("delete TI", typeInstanceID) + fmt.Printf("Deleting TI %q...\n", typeInstanceID) _, err = client.OnDelete(ctx, &pb.OnDeleteRequest{ TypeinstanceId: typeInstanceID, @@ -159,14 +161,15 @@ func ExampleNewStorageBackendClient() { // last get + resourceVersion = 1 res, err = client.GetValue(ctx, &pb.GetValueRequest{ TypeinstanceId: typeInstanceID, - ResourceVersion: 1, + ResourceVersion: resourceVersion, AdditionalParameters: reqAdditionalParams, }) if err != nil { panic(err) } - fmt.Println("last get after delete - value", string(res.Value)) + fmt.Printf("Getting TI %q: resource version %d: is nil: %v\n", typeInstanceID, resourceVersion, res.Value == nil) } From 90d53dc240bdc1ce567fae5c62e6204a866c0536 Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Thu, 24 Feb 2022 15:01:21 +0100 Subject: [PATCH 04/10] Include secret storage backend in build --- hack/ci/setup-env.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/ci/setup-env.sh b/hack/ci/setup-env.sh index 19bd4128d..bf22e3b20 100755 --- a/hack/ci/setup-env.sh +++ b/hack/ci/setup-env.sh @@ -36,7 +36,7 @@ fi # TODO: Read components to build in automated way, e.g. from directory structure cat <>"$GITHUB_ENV" -APPS=name=matrix::{"include":[{"APP":"gateway"},{"APP":"k8s-engine"},{"APP":"hub-js"},{"APP":"argo-runner"},{"APP":"helm-runner"},{"APP":"populator"},{"APP":"terraform-runner"},{"APP":"argo-actions"},{"APP":"gitlab-api-runner"}]} +APPS=name=matrix::{"include":[{"APP":"gateway"},{"APP":"k8s-engine"},{"APP":"hub-js"},{"APP":"argo-runner"},{"APP":"helm-runner"},{"APP":"populator"},{"APP":"terraform-runner"},{"APP":"argo-actions"},{"APP":"gitlab-api-runner"},{"APP":"secret-storage-backend"}]} TESTS=name=matrix::{"include":[{"TEST":"e2e"}]} INFRAS=name=matrix::{"include":[{"INFRA":"json-go-gen"},{"INFRA":"graphql-schema-linter"},{"INFRA":"jinja2"},{"INFRA":"merger"}]} EOT From 591b54350e46b1d6953c07f923397ca3270848fd Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Thu, 24 Feb 2022 15:22:54 +0100 Subject: [PATCH 05/10] Add additional value printing to example --- .../api/grpc/storage_backend/example_test.go | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pkg/hub/api/grpc/storage_backend/example_test.go b/pkg/hub/api/grpc/storage_backend/example_test.go index d55f99cf1..6f198579b 100644 --- a/pkg/hub/api/grpc/storage_backend/example_test.go +++ b/pkg/hub/api/grpc/storage_backend/example_test.go @@ -148,6 +148,32 @@ func ExampleNewStorageBackendClient() { fmt.Printf("Getting TI %q: locked by: %v\n", typeInstanceID, lockedByRes.LockedBy) + // get value + + resourceVersion = 1 + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + + resourceVersion = 2 + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + AdditionalParameters: reqAdditionalParams, + }) + if err != nil { + panic(err) + } + + fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + // delete fmt.Printf("Deleting TI %q...\n", typeInstanceID) From bc2b57b1425dd3b0a6dc840e895e9aef5ee68124 Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Thu, 24 Feb 2022 15:53:50 +0100 Subject: [PATCH 06/10] Fix tests --- internal/secret-storage-backend/fake_provider_test.go | 4 +--- internal/secret-storage-backend/server_test.go | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/internal/secret-storage-backend/fake_provider_test.go b/internal/secret-storage-backend/fake_provider_test.go index 31a813935..e0b891526 100644 --- a/internal/secret-storage-backend/fake_provider_test.go +++ b/internal/secret-storage-backend/fake_provider_test.go @@ -45,9 +45,7 @@ func (f *fakeProvider) Get(kp tellercore.KeyPath) (*tellercore.EnvEntry, error) func (f *fakeProvider) PutMapping(kp tellercore.KeyPath, m map[string]string) error { secrets := f.getSecret(kp) - tellerutils.Merge(m, secrets) - - f.secrets[kp.Path] = secrets + f.secrets[kp.Path] = tellerutils.Merge(secrets, m) return nil } diff --git a/internal/secret-storage-backend/server_test.go b/internal/secret-storage-backend/server_test.go index 5687ab849..83e83642b 100644 --- a/internal/secret-storage-backend/server_test.go +++ b/internal/secret-storage-backend/server_test.go @@ -231,7 +231,7 @@ func TestHandler_OnCreate(t *testing.T) { "1": "original", }, }, - ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = entry \"/capact/uuid\" in provider \"fake\" already exist"), + ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = field \"1\" for path \"/capact/uuid\" in provider \"fake\" already exist"), }, } @@ -344,7 +344,7 @@ func TestHandler_OnUpdate(t *testing.T) { "3": "original", }, }, - ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = entry \"/capact/uuid\" in provider \"fake\" already exist"), + ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = field \"3\" for path \"/capact/uuid\" in provider \"fake\" already exist"), }, } From fcdccf342ea467895731a5d72ea3b14119c23fed Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Fri, 25 Feb 2022 08:40:42 +0100 Subject: [PATCH 07/10] Increase lint timeout, update Teller --- go.mod | 2 +- go.sum | 4 ++-- hack/lint.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index d66656406..e643038b1 100644 --- a/go.mod +++ b/go.mod @@ -101,5 +101,5 @@ replace ( github.com/go-openapi/spec => github.com/go-openapi/spec v0.19.8 github.com/keybase/go-keychain => github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 - github.com/spectralops/teller => github.com/pkosiec/teller v1.4.1-0.20220224131849-7cde9fef3b6c + github.com/spectralops/teller => github.com/pkosiec/teller v1.4.1-0.20220225072420-11c5a1dd402f ) diff --git a/go.sum b/go.sum index 75c95e408..ddc8ed34e 100644 --- a/go.sum +++ b/go.sum @@ -1609,8 +1609,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkosiec/teller v1.4.1-0.20220224131849-7cde9fef3b6c h1:RBLmCK5i8F2OWoUybUSjDx61xW1AbMUa/uVOp51GkAs= -github.com/pkosiec/teller v1.4.1-0.20220224131849-7cde9fef3b6c/go.mod h1:x2B4YYysArnF/yH+IWmEwSef+5kK+CFD/ySgQHEboC0= +github.com/pkosiec/teller v1.4.1-0.20220225072420-11c5a1dd402f h1:6pOhYy2XJhyNPDWJJhafxG50AyBUE7buJ3nMYEFeaWE= +github.com/pkosiec/teller v1.4.1-0.20220225072420-11c5a1dd402f/go.mod h1:x2B4YYysArnF/yH+IWmEwSef+5kK+CFD/ySgQHEboC0= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/hack/lint.sh b/hack/lint.sh index a6a8becc6..2e716d6ee 100755 --- a/hack/lint.sh +++ b/hack/lint.sh @@ -17,7 +17,7 @@ readonly CURRENT_DIR readonly REPO_ROOT_DIR readonly GOLANGCI_LINT_VERSION="v1.41.1" -LINT_TIMEOUT=${LINT_TIMEOUT:-5m} +LINT_TIMEOUT=${LINT_TIMEOUT:-10m} SKIP_DEPS_INSTALLATION=${SKIP_DEPS_INSTALLATION:-true} # shellcheck source=./hack/lib/utilities.sh From 0f3c7b2b889192af54b9cd38dc45e26ce7315560 Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Fri, 25 Feb 2022 09:22:16 +0100 Subject: [PATCH 08/10] Install missing binaries for gRPC generation --- hack/gen-grpc-resources.sh | 4 ++++ hack/lib/const.sh | 2 ++ 2 files changed, 6 insertions(+) diff --git a/hack/gen-grpc-resources.sh b/hack/gen-grpc-resources.sh index b79c997cc..034f21df6 100755 --- a/hack/gen-grpc-resources.sh +++ b/hack/gen-grpc-resources.sh @@ -65,6 +65,10 @@ host::install::protoc() { # extract the archive unzip "${name}".zip + go mod init tmp + go install "google.golang.org/protobuf/cmd/protoc-gen-go@${STABLE_PROTOC_GEN_GO_VERSION}" + go install "google.golang.org/grpc/cmd/protoc-gen-go-grpc@${STABLE_PROTOC_GEN_GO_GRPC_VERSION}" + popd >/dev/null echo -e "${GREEN}√ install protoc${NC}" diff --git a/hack/lib/const.sh b/hack/lib/const.sh index a913d077d..c8708de81 100644 --- a/hack/lib/const.sh +++ b/hack/lib/const.sh @@ -12,6 +12,8 @@ readonly STABLE_KUBEBUILDER_VERSION=2.3.2 readonly STABLE_GQLGEN_VERSION=v0.13.0 readonly STABLE_HELM_VERSION=v3.6.3 readonly STABLE_PROTOC_VERSION=v3.19.4 +readonly STABLE_PROTOC_GEN_GO_VERSION=v1.27.1 +readonly STABLE_PROTOC_GEN_GO_GRPC_VERSION=v1.2.0 # # Kubernetes installation From 397b49ff515b4ee75b597e74d3349a3e8bc90883 Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Fri, 25 Feb 2022 19:05:59 +0100 Subject: [PATCH 09/10] Introduce improvements requested in review --- cmd/secret-storage-backend/README.md | 11 +- cmd/secret-storage-backend/main.go | 3 +- docs/proposal/20211207-delegated-storage.md | 24 +- hack/gen-graphql-resources.sh | 1 - hack/gen-grpc-resources.sh | 5 +- hack/gen-k8s-resources.sh | 1 - internal/secret-storage-backend/server.go | 225 ++++++++++++----- .../secret-storage-backend/server_test.go | 203 +++++++-------- pkg/hub/api/grpc/storage_backend.proto | 18 +- .../api/grpc/storage_backend/client_test.go | 189 ++++++++++++++ .../api/grpc/storage_backend/example_test.go | 201 --------------- .../storage_backend/storage_backend.pb.go | 238 ++++++++---------- 12 files changed, 597 insertions(+), 522 deletions(-) create mode 100644 pkg/hub/api/grpc/storage_backend/client_test.go delete mode 100644 pkg/hub/api/grpc/storage_backend/example_test.go diff --git a/cmd/secret-storage-backend/README.md b/cmd/secret-storage-backend/README.md index 3e566a6e0..642f4e9a9 100644 --- a/cmd/secret-storage-backend/README.md +++ b/cmd/secret-storage-backend/README.md @@ -4,11 +4,10 @@ Secret Storage Backend is a service which handles multiple secret storages for TypeInstances. -This service is implemented according to the [Delegated Storage](../../docs/proposal/20211207-delegated-storage.md) concept. - ## Prerequisites - [Go](https://golang.org) +- (Optional - if AWS Secrets Manager provider should be used) an AWS account with **AdministratorAccess** permissions on it ## Usage @@ -29,7 +28,7 @@ By default, the Secret Storage Backend has the `aws_secretsmanager` provider ena APP_LOGGER_DEV_MODE=true go run ./cmd/secret-storage-backend/main.go ``` -The server will listen to gRPC calls according to the [Storage Backend Protocol Buffers schema](../../pkg/hub/api/grpc/storage_backend.proto). +The server listens to gRPC calls according to the [Storage Backend Protocol Buffers schema](../../pkg/hub/api/grpc/storage_backend.proto). To perform such calls, you can use e.g. [Insomnia](https://insomnia.rest/) tool. ### Dotenv provider @@ -46,10 +45,10 @@ To run the server with `dotenv` provider enabled, which stores data in files, ex | Name | Required | Default | Description | |-------------------------|----------|----------------------|-------------------------------------------------------------------------------------------------------------------------------| -| APP_GRPC_ADDR | no | `:50051` | TCP address the gRPC server binds to | -| APP_HEALTHZ_ADDR | no | `:8082` | TCP address the health probes endpoint binds to | +| APP_GRPC_ADDR | no | `:50051` | TCP address the gRPC server binds to. | +| APP_HEALTHZ_ADDR | no | `:8082` | TCP address the health probes endpoint binds to. | | APP_SUPPORTED_PROVIDERS | no | `aws_secretsmanager` | Supported secret providers separated by `,`. A given provider must be passed in additional parameters of gRPC request inputs. | -| APP_LOGGER_DEV_MODE | no | `false` | Enable development mode logging | +| APP_LOGGER_DEV_MODE | no | `false` | Enable development mode logging. | To configure providers, use environmental variables described in the [Providers](https://github.com/SpectralOps/teller#providers) paragraph for Teller's Readme. diff --git a/cmd/secret-storage-backend/main.go b/cmd/secret-storage-backend/main.go index 6e957ada5..05c8455d4 100644 --- a/cmd/secret-storage-backend/main.go +++ b/cmd/secret-storage-backend/main.go @@ -20,12 +20,13 @@ import ( // Config holds application related configuration. type Config struct { - // Address is the TCP address the gRPC server binds to. + // GRPCAddr is the TCP address the gRPC server binds to. GRPCAddr string `envconfig:"default=:50051"` // HealthzAddr is the TCP address the health probes endpoint binds to. HealthzAddr string `envconfig:"default=:8082"` + // SupportedProviders holds enabled secret providers separated by comma. SupportedProviders []string `envconfig:"default=aws_secretsmanager"` Logger logger.Config diff --git a/docs/proposal/20211207-delegated-storage.md b/docs/proposal/20211207-delegated-storage.md index a8965515b..274a6a885 100644 --- a/docs/proposal/20211207-delegated-storage.md +++ b/docs/proposal/20211207-delegated-storage.md @@ -417,16 +417,16 @@ Also, the additional, nice-to-have goals are: ```proto message TypeInstanceData { string id = 1; - google.protobuf.Any value = 2; + bytes value = 2; } message OnCreateRequest { TypeInstanceData typeinstance = 1; - google.protobuf.Any additional_parameters = 2; + bytes context = 2; } message OnCreateResponse { - google.protobuf.Any additional_parameters = 1; + optional bytes context = 1; } service SearchService { @@ -483,11 +483,11 @@ Capact Local Hub calls proper storage backend service while accessing the TypeIn message OnCreateRequest { string typeinstance_id = 1; bytes value = 2; - bytes additional_parameters = 3; + bytes context = 3; } message OnCreateResponse { - optional bytes additional_parameters = 1; + optional bytes context = 1; } message TypeInstanceResourceVersion { @@ -499,16 +499,16 @@ Capact Local Hub calls proper storage backend service while accessing the TypeIn string typeinstance_id = 1; uint32 new_resource_version = 2; bytes new_value = 3; - optional bytes additional_parameters = 4; + optional bytes context = 4; } message OnUpdateResponse { - optional bytes additional_parameters = 1; + optional bytes context = 1; } message OnDeleteRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; } message OnDeleteResponse {} @@ -516,7 +516,7 @@ Capact Local Hub calls proper storage backend service while accessing the TypeIn message GetValueRequest { string typeinstance_id = 1; uint32 resource_version = 2; - bytes additional_parameters = 3; + bytes context = 3; } message GetValueResponse { @@ -528,7 +528,7 @@ Capact Local Hub calls proper storage backend service while accessing the TypeIn message GetLockedByRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; } message GetLockedByResponse { @@ -537,7 +537,7 @@ Capact Local Hub calls proper storage backend service while accessing the TypeIn message OnLockRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; string locked_by = 3; } @@ -545,7 +545,7 @@ Capact Local Hub calls proper storage backend service while accessing the TypeIn message OnUnlockRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; } message OnUnlockResponse {} diff --git a/hack/gen-graphql-resources.sh b/hack/gen-graphql-resources.sh index b41b36812..f10d7c479 100755 --- a/hack/gen-graphql-resources.sh +++ b/hack/gen-graphql-resources.sh @@ -38,7 +38,6 @@ host::install::gqlgen() { pushd "$TMP_DIR" >/dev/null - go mod init tmp go install "github.com/99designs/gqlgen@${STABLE_GQLGEN_VERSION}" popd >/dev/null diff --git a/hack/gen-grpc-resources.sh b/hack/gen-grpc-resources.sh index 034f21df6..6985b3d8c 100755 --- a/hack/gen-grpc-resources.sh +++ b/hack/gen-grpc-resources.sh @@ -51,7 +51,9 @@ host::install::protoc() { shout "Install the protoc ${STABLE_PROTOC_VERSION} locally to a tempdir..." mkdir -p "${TMP_DIR}/bin" - export PATH="${TMP_DIR}/bin:${PATH}" + export GOBIN="${TMP_DIR}/bin" + export PATH="${GOBIN}:${PATH}" + pushd "$TMP_DIR" >/dev/null os=$(host::os) @@ -65,7 +67,6 @@ host::install::protoc() { # extract the archive unzip "${name}".zip - go mod init tmp go install "google.golang.org/protobuf/cmd/protoc-gen-go@${STABLE_PROTOC_GEN_GO_VERSION}" go install "google.golang.org/grpc/cmd/protoc-gen-go-grpc@${STABLE_PROTOC_GEN_GO_GRPC_VERSION}" diff --git a/hack/gen-k8s-resources.sh b/hack/gen-k8s-resources.sh index 59208c1ee..3c6c4716e 100755 --- a/hack/gen-k8s-resources.sh +++ b/hack/gen-k8s-resources.sh @@ -41,7 +41,6 @@ host::install::controller-gen() { pushd "$TMP_DIR" >/dev/null - go mod init tmp go install sigs.k8s.io/controller-tools/cmd/controller-gen@$STABLE_CONTROLLER_GEN_VERSION popd >/dev/null diff --git a/internal/secret-storage-backend/server.go b/internal/secret-storage-backend/server.go index 2a471e5cd..5aebd6855 100644 --- a/internal/secret-storage-backend/server.go +++ b/internal/secret-storage-backend/server.go @@ -15,8 +15,8 @@ import ( "google.golang.org/grpc/status" ) -// AdditionalParameters holds Secret storage backend specific parameters. -type AdditionalParameters struct { +// Context holds Secret storage backend specific parameters. +type Context struct { Provider string `json:"provider"` } @@ -55,7 +55,7 @@ func (h *Handler) GetValue(_ context.Context, request *pb.GetValueRequest) (*pb. return nil, NilRequestInputError } - provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + provider, err := h.getProviderFromContext(request.Context) if err != nil { return nil, err } @@ -66,13 +66,12 @@ func (h *Handler) GetValue(_ context.Context, request *pb.GetValueRequest) (*pb. return nil, err } - var value []byte - if entry.IsFound { - value = []byte(entry.Value) + if !entry.IsFound { + return nil, status.Error(codes.NotFound, fmt.Sprintf("TypeInstance %q in revision %d was not found", request.TypeinstanceId, request.ResourceVersion)) } return &pb.GetValueResponse{ - Value: value, + Value: []byte(entry.Value), }, nil } @@ -82,20 +81,28 @@ func (h *Handler) GetLockedBy(_ context.Context, request *pb.GetLockedByRequest) return nil, NilRequestInputError } - provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + provider, err := h.getProviderFromContext(request.Context) if err != nil { return nil, err } - key := h.storageKeyForLockedBy(provider, request.TypeinstanceId) - entry, err := h.getEntry(provider, key) + key := tellercore.KeyPath{ + Path: h.storagePathForTypeInstance(provider, request.TypeinstanceId), + } + entries, err := h.getEntriesForPath(provider, key) if err != nil { return nil, err } + if len(entries) == 0 { + return nil, status.Error(codes.NotFound, fmt.Sprintf("TypeInstance %q not found: secret from path %q is empty", request.TypeinstanceId, key.Path)) + } + var lockedBy *string - if entry.IsFound && entry.Value != "" { - lockedBy = ptr.String(entry.Value) + for _, entry := range entries { + if entry.Key == lockedByField && entry.Value != "" { + lockedBy = ptr.String(entry.Value) + } } return &pb.GetLockedByResponse{ @@ -109,12 +116,17 @@ func (h *Handler) OnCreate(_ context.Context, request *pb.OnCreateRequest) (*pb. return nil, NilRequestInputError } - err := h.handlePutValue( - request.AdditionalParameters, - request.TypeinstanceId, - firstResourceVersion, - request.Value, - ) + provider, err := h.getProviderFromContext(request.Context) + if err != nil { + return nil, err + } + + key := h.storageKeyForTypeInstanceValue(provider, request.TypeinstanceId, firstResourceVersion) + if err := h.ensureSecretCanBeCreated(provider, key); err != nil { + return nil, err + } + + err = h.putEntry(provider, key, request.Value) if err != nil { return nil, err } @@ -128,12 +140,18 @@ func (h *Handler) OnUpdate(_ context.Context, request *pb.OnUpdateRequest) (*pb. return nil, NilRequestInputError } - err := h.handlePutValue( - request.AdditionalParameters, - request.TypeinstanceId, - request.NewResourceVersion, - request.NewValue, - ) + provider, err := h.getProviderFromContext(request.Context) + if err != nil { + return nil, err + } + + key := h.storageKeyForTypeInstanceValue(provider, request.TypeinstanceId, request.NewResourceVersion) + + if err := h.ensureSecretCanBeUpdated(provider, key); err != nil { + return nil, err + } + + err = h.putEntry(provider, key, request.NewValue) if err != nil { return nil, err } @@ -143,18 +161,23 @@ func (h *Handler) OnUpdate(_ context.Context, request *pb.OnUpdateRequest) (*pb. // OnLock handles TypeInstance locking by setting a secret entry in a given provider. // It doesn't check whether a given TypeInstance is already locked, but overrides the value in place -// TODO(review): Is that valid assumption? Is there a need to complicate the flow here? func (h *Handler) OnLock(_ context.Context, request *pb.OnLockRequest) (*pb.OnLockResponse, error) { if request == nil { return nil, NilRequestInputError } - provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + provider, err := h.getProviderFromContext(request.Context) + if err != nil { + return nil, err + } + + err = h.ensureSecretIsNotLocked(provider, request.TypeinstanceId) if err != nil { return nil, err } key := h.storageKeyForLockedBy(provider, request.TypeinstanceId) + err = h.putEntry(provider, key, []byte(request.LockedBy)) if err != nil { return nil, err @@ -169,13 +192,21 @@ func (h *Handler) OnUnlock(_ context.Context, request *pb.OnUnlockRequest) (*pb. return nil, NilRequestInputError } - provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + provider, err := h.getProviderFromContext(request.Context) if err != nil { return nil, err } - key := h.storageKeyForLockedBy(provider, request.TypeinstanceId) - err = h.deleteEntry(provider, key) + key := tellercore.KeyPath{ + Path: h.storagePathForTypeInstance(provider, request.TypeinstanceId), + } + err = h.ensureSecretCanBeUnlocked(provider, key) + if err != nil { + return nil, err + } + + lockedByKey := h.storageKeyForLockedBy(provider, request.TypeinstanceId) + err = h.deleteEntry(provider, lockedByKey) if err != nil { return nil, err } @@ -184,58 +215,43 @@ func (h *Handler) OnUnlock(_ context.Context, request *pb.OnUnlockRequest) (*pb. } // OnDelete handles TypeInstance deletion by removing a secret in a given provider. -// It doesn't check whether a given TypeInstance is locked. It assumes the caller ensured it's unlocked state. -// TODO(review): Is that a valid assumption? +// It checks whether a given TypeInstance is locked before doing such operation. func (h *Handler) OnDelete(_ context.Context, request *pb.OnDeleteRequest) (*pb.OnDeleteResponse, error) { if request == nil { return nil, NilRequestInputError } - provider, err := h.getProviderFromAdditionalParams(request.AdditionalParameters) + provider, err := h.getProviderFromContext(request.Context) if err != nil { return nil, err } - err = provider.DeleteMapping(tellercore.KeyPath{ + key := tellercore.KeyPath{ Path: h.storagePathForTypeInstance(provider, request.TypeinstanceId), - }) - if err != nil { - return nil, h.internalError(errors.Wrapf(err, "while deleting TypeInstance %q", request.TypeinstanceId)) } - - return &pb.OnDeleteResponse{}, nil -} - -func (h *Handler) handlePutValue(additionalParamsBytes []byte, typeInstanceID string, resourceVersion uint32, value []byte) error { - provider, err := h.getProviderFromAdditionalParams(additionalParamsBytes) + err = h.ensureSecretCanBeDeleted(provider, key) if err != nil { - return err - } - - key := h.storageKeyForTypeInstanceValue(provider, typeInstanceID, resourceVersion) - - if err := h.ensureEntryDoesNotExist(provider, key); err != nil { - return err + return nil, err } - err = h.putEntry(provider, key, value) + err = provider.DeleteMapping(key) if err != nil { - return err + return nil, h.internalError(errors.Wrapf(err, "while deleting TypeInstance %q", request.TypeinstanceId)) } - return nil + return &pb.OnDeleteResponse{}, nil } -func (h *Handler) getProviderFromAdditionalParams(additionalParamsBytes []byte) (tellercore.Provider, error) { - var additionalParams AdditionalParameters - err := json.Unmarshal(additionalParamsBytes, &additionalParams) +func (h *Handler) getProviderFromContext(contextBytes []byte) (tellercore.Provider, error) { + var context Context + err := json.Unmarshal(contextBytes, &context) if err != nil { return nil, h.internalError(errors.Wrap(err, "while unmarshaling additional parameters")) } - provider, ok := h.providers[additionalParams.Provider] + provider, ok := h.providers[context.Provider] if !ok { - return nil, h.internalError(fmt.Errorf("missing loaded provider with name %q", additionalParams.Provider)) + return nil, h.internalError(fmt.Errorf("missing loaded provider with name %q", context.Provider)) } return provider, nil @@ -251,6 +267,16 @@ func (h *Handler) getEntry(provider tellercore.Provider, key tellercore.KeyPath) return entry, nil } +func (h *Handler) getEntriesForPath(provider tellercore.Provider, key tellercore.KeyPath) ([]tellercore.EnvEntry, error) { + h.log.Info("getting whole secret", zap.String("path", key.Path), zap.String("provider", provider.Name())) + entries, err := provider.GetMapping(key) + if err != nil { + return nil, h.internalError(errors.Wrapf(err, "while getting value by path %q", key.Path)) + } + + return entries, nil +} + func (h *Handler) putEntry(provider tellercore.Provider, key tellercore.KeyPath, value []byte) error { h.log.Info("putting entry", zap.String("path", key.Path), zap.String("field", key.Field), zap.String("provider", provider.Name())) err := provider.Put(key, string(value)) @@ -293,18 +319,89 @@ func (h *Handler) storagePathForTypeInstance(provider tellercore.Provider, tiID switch provider.Name() { case "dotenv": prefix = "/tmp/" + default: + prefix = "/" } - return fmt.Sprintf("%s/capact/%s", prefix, tiID) + return fmt.Sprintf("%scapact/%s", prefix, tiID) } -func (h *Handler) ensureEntryDoesNotExist(provider tellercore.Provider, key tellercore.KeyPath) error { +func (h *Handler) ensureSecretCanBeCreated(provider tellercore.Provider, key tellercore.KeyPath) error { + entries, err := h.getEntriesForPath(provider, key) + if err != nil { + return h.internalError(err) + } + + if len(entries) != 0 { + return status.Error(codes.AlreadyExists, fmt.Sprintf("path %q in provider %q already exist", key.Path, provider.Name())) + } + + return nil +} + +func (h *Handler) ensureSecretCanBeUpdated(provider tellercore.Provider, key tellercore.KeyPath) error { + entries, err := h.getEntriesForPath(provider, key) + if err != nil { + return h.internalError(err) + } + + if len(entries) == 0 { + return status.Error(codes.NotFound, fmt.Sprintf("path %q in provider %q not found", key.Path, provider.Name())) + } + + for _, entry := range entries { + if entry.Key == lockedByField { + return h.typeInstanceLockedError(key.Path, entry.Value) + } + if entry.Key == key.Field { + return status.Error(codes.AlreadyExists, fmt.Sprintf("field %q for path %q in provider %q already exist", key.Field, key.Path, provider.Name())) + } + } + + return nil +} + +func (h *Handler) ensureSecretIsNotLocked(provider tellercore.Provider, typeInstanceID string) error { + key := h.storageKeyForLockedBy(provider, typeInstanceID) entry, err := h.getEntry(provider, key) if err != nil { - return h.internalError(errors.Wrapf(err, "while getting field %q for path %q", key.Field, key.Path)) + return h.internalError(errors.Wrapf(err, "while getting entry")) + } + if entry.IsFound && entry.Value != "" { + return h.typeInstanceLockedError(key.Path, entry.Value) + } + + return nil +} + +func (h *Handler) ensureSecretCanBeDeleted(provider tellercore.Provider, key tellercore.KeyPath) error { + entries, err := h.getEntriesForPath(provider, key) + if err != nil { + return h.internalError(err) + } + + if len(entries) == 0 { + return status.Error(codes.NotFound, fmt.Sprintf("path %q in provider %q not found", key.Path, provider.Name())) + } + + for _, entry := range entries { + if entry.Key != lockedByField { + continue + } + return h.typeInstanceLockedError(key.Path, entry.Value) + } + + return nil +} + +func (h *Handler) ensureSecretCanBeUnlocked(provider tellercore.Provider, key tellercore.KeyPath) error { + entries, err := h.getEntriesForPath(provider, key) + if err != nil { + return h.internalError(err) } - if entry.IsFound { - return status.Error(codes.AlreadyExists, fmt.Sprintf("field %q for path %q in provider %q already exist", key.Field, key.Path, provider.Name())) + + if len(entries) == 0 { + return status.Error(codes.NotFound, fmt.Sprintf("path %q in provider %q not found", key.Path, provider.Name())) } return nil @@ -313,3 +410,7 @@ func (h *Handler) ensureEntryDoesNotExist(provider tellercore.Provider, key tell func (h *Handler) internalError(err error) error { return status.Error(codes.Internal, err.Error()) } + +func (h *Handler) typeInstanceLockedError(path, lockedByValue string) error { + return status.Error(codes.FailedPrecondition, fmt.Sprintf("typeInstance locked: path %q contains %q property with value %q", path, lockedByField, lockedByValue)) +} diff --git a/internal/secret-storage-backend/server_test.go b/internal/secret-storage-backend/server_test.go index 83e83642b..bcccb8509 100644 --- a/internal/secret-storage-backend/server_test.go +++ b/internal/secret-storage-backend/server_test.go @@ -20,23 +20,25 @@ import ( func TestHandler_GetValue(t *testing.T) { // given providerName := "fake" - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) req := &storage_backend.GetValueRequest{ - TypeinstanceId: "uuid", - ResourceVersion: 2, - AdditionalParameters: reqAdditionalParams, + TypeinstanceId: "uuid", + ResourceVersion: 2, + Context: reqContext, } path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) testCases := []struct { - Name string - InputProvider tellercore.Provider - ExpectedValue []byte + Name string + InputProvider tellercore.Provider + ExpectedValue []byte + ExpectedErrorMessage *string }{ { - Name: "No secret", - InputProvider: &fakeProvider{}, - ExpectedValue: nil, + Name: "No secret", + InputProvider: &fakeProvider{}, + ExpectedValue: nil, + ExpectedErrorMessage: ptr.String("rpc error: code = NotFound desc = TypeInstance \"uuid\" in revision 2 was not found"), }, { Name: "Success", @@ -80,8 +82,14 @@ func TestHandler_GetValue(t *testing.T) { res, err := client.GetValue(ctx, req) // then + if testCase.ExpectedErrorMessage != nil { + assert.Nil(t, res) + require.Error(t, err) + assert.EqualError(t, err, *testCase.ExpectedErrorMessage) + return + } + require.NoError(t, err) - require.NotNil(t, res) assert.Equal(t, testCase.ExpectedValue, res.Value) }) } @@ -90,28 +98,32 @@ func TestHandler_GetValue(t *testing.T) { func TestHandler_GetLockedBy(t *testing.T) { // given providerName := "fake" - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) req := &storage_backend.GetLockedByRequest{ - TypeinstanceId: "uuid", - AdditionalParameters: reqAdditionalParams, + TypeinstanceId: "uuid", + Context: reqContext, } path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) testCases := []struct { - Name string - InputProvider tellercore.Provider - ExpectedLockedBy *string + Name string + InputProvider tellercore.Provider + ExpectedLockedBy *string + ExpectedErrorMessage *string }{ { - Name: "No data", - InputProvider: &fakeProvider{}, - ExpectedLockedBy: nil, + Name: "No data", + InputProvider: &fakeProvider{}, + ExpectedLockedBy: nil, + ExpectedErrorMessage: ptr.String("rpc error: code = NotFound desc = TypeInstance \"uuid\" not found: secret from path \"/capact/uuid\" is empty"), }, { Name: "Empty value", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ - path: {}, + path: { + "1": "bar", + }, }, }, ExpectedLockedBy: nil, @@ -147,16 +159,16 @@ func TestHandler_GetLockedBy(t *testing.T) { res, err := client.GetLockedBy(ctx, req) // then - require.NoError(t, err) - require.NotNil(t, res) - - if testCase.ExpectedLockedBy == nil { - assert.Nil(t, res.LockedBy) + if testCase.ExpectedErrorMessage != nil { + assert.Nil(t, res) + require.Error(t, err) + assert.EqualError(t, err, *testCase.ExpectedErrorMessage) return } - require.NotNil(t, res.LockedBy) - assert.Equal(t, *testCase.ExpectedLockedBy, *res.LockedBy) + require.NoError(t, err) + require.NotNil(t, res) + assert.Equal(t, testCase.ExpectedLockedBy, res.LockedBy) }) } } @@ -164,12 +176,12 @@ func TestHandler_GetLockedBy(t *testing.T) { func TestHandler_OnCreate(t *testing.T) { // given providerName := "fake" - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) valueBytes := []byte(`{"key": true}`) req := &storage_backend.OnCreateRequest{ - TypeinstanceId: "uuid", - Value: valueBytes, - AdditionalParameters: reqAdditionalParams, + TypeinstanceId: "uuid", + Value: valueBytes, + Context: reqContext, } path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) @@ -202,23 +214,7 @@ func TestHandler_OnCreate(t *testing.T) { }, }, { - Name: "Already existing without conflict", - InputProvider: &fakeProvider{ - secrets: map[string]map[string]string{ - path: { - "locked_by": "service/foo", - }, - }, - }, - ExpectedProviderState: map[string]map[string]string{ - path: { - "1": string(valueBytes), - "locked_by": "service/foo", - }, - }, - }, - { - Name: "Already existing with conflict", + Name: "Already existing", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ path: { @@ -231,7 +227,7 @@ func TestHandler_OnCreate(t *testing.T) { "1": "original", }, }, - ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = field \"1\" for path \"/capact/uuid\" in provider \"fake\" already exist"), + ExpectedErrorMessage: ptr.String("rpc error: code = AlreadyExists desc = path \"/capact/uuid\" in provider \"fake\" already exist"), }, } @@ -265,7 +261,7 @@ func TestHandler_OnCreate(t *testing.T) { require.NoError(t, err) require.NotNil(t, res) - assert.Nil(t, res.AdditionalParameters) + assert.Nil(t, res.Context) }) } } @@ -273,13 +269,13 @@ func TestHandler_OnCreate(t *testing.T) { func TestHandler_OnUpdate(t *testing.T) { // given providerName := "fake" - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) valueBytes := []byte(`{"key": true}`) req := &storage_backend.OnUpdateRequest{ - TypeinstanceId: "uuid", - NewResourceVersion: 3, - NewValue: valueBytes, - AdditionalParameters: reqAdditionalParams, + TypeinstanceId: "uuid", + NewResourceVersion: 3, + NewValue: valueBytes, + Context: reqContext, } path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) @@ -291,29 +287,19 @@ func TestHandler_OnUpdate(t *testing.T) { ExpectedErrorMessage *string }{ { - Name: "No data", // data for a give nrevision could reside in different storage backend - InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, - ExpectedProviderState: map[string]map[string]string{ - path: { - "3": string(valueBytes), - }, - }, - }, - { - Name: "Empty value", + Name: "Non-existing secret", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ path: {}, }, }, ExpectedProviderState: map[string]map[string]string{ - path: { - "3": string(valueBytes), - }, + path: {}, }, + ExpectedErrorMessage: ptr.String("rpc error: code = NotFound desc = path \"/capact/uuid\" in provider \"fake\" not found"), }, { - Name: "Already existing without conflict", + Name: "Already existing locked", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ path: { @@ -325,13 +311,13 @@ func TestHandler_OnUpdate(t *testing.T) { ExpectedProviderState: map[string]map[string]string{ path: { "1": "original", - "3": string(valueBytes), "locked_by": "service/foo", }, }, + ExpectedErrorMessage: ptr.String("rpc error: code = FailedPrecondition desc = typeInstance locked: path \"/capact/uuid\" contains \"locked_by\" property with value \"service/foo\""), }, { - Name: "Already existing with conflict", + Name: "Already existing not locked", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ path: { @@ -378,7 +364,7 @@ func TestHandler_OnUpdate(t *testing.T) { require.NoError(t, err) require.NotNil(t, res) - assert.Nil(t, res.AdditionalParameters) + assert.Nil(t, res.Context) }) } } @@ -386,11 +372,11 @@ func TestHandler_OnUpdate(t *testing.T) { func TestHandler_OnLock(t *testing.T) { // given providerName := "fake" - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) req := &storage_backend.OnLockRequest{ - TypeinstanceId: "uuid", - LockedBy: "foo/sample", - AdditionalParameters: reqAdditionalParams, + TypeinstanceId: "uuid", + LockedBy: "foo/sample", + Context: reqContext, } path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) @@ -402,7 +388,7 @@ func TestHandler_OnLock(t *testing.T) { ExpectedErrorMessage *string }{ { - Name: "No data", // data for a give nrevision could reside in different storage backend + Name: "No data", InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, ExpectedProviderState: map[string]map[string]string{ path: { @@ -440,7 +426,7 @@ func TestHandler_OnLock(t *testing.T) { }, }, { - Name: "Already existing with conflict", + Name: "Already existing locked", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ path: { @@ -452,9 +438,10 @@ func TestHandler_OnLock(t *testing.T) { ExpectedProviderState: map[string]map[string]string{ path: { "3": "original", - "locked_by": "foo/sample", + "locked_by": "previous", }, }, + ExpectedErrorMessage: ptr.String("rpc error: code = FailedPrecondition desc = typeInstance locked: path \"/capact/uuid\" contains \"locked_by\" property with value \"previous\""), }, } @@ -495,10 +482,10 @@ func TestHandler_OnLock(t *testing.T) { func TestHandler_OnUnlock(t *testing.T) { // given providerName := "fake" - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) req := &storage_backend.OnUnlockRequest{ - TypeinstanceId: "uuid", - AdditionalParameters: reqAdditionalParams, + TypeinstanceId: "uuid", + Context: reqContext, } path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) @@ -510,9 +497,10 @@ func TestHandler_OnUnlock(t *testing.T) { ExpectedErrorMessage *string }{ { - Name: "No data", // data for a give nrevision could reside in different storage backend + Name: "No data", InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, ExpectedProviderState: map[string]map[string]string{}, + ExpectedErrorMessage: ptr.String("rpc error: code = NotFound desc = path \"/capact/uuid\" in provider \"fake\" not found"), }, { Name: "Already existing without conflict", @@ -546,6 +534,21 @@ func TestHandler_OnUnlock(t *testing.T) { }, }, }, + { + Name: "Already existing without lockedBy property", + InputProvider: &fakeProvider{ + secrets: map[string]map[string]string{ + path: { + "3": "original", + }, + }, + }, + ExpectedProviderState: map[string]map[string]string{ + path: { + "3": "original", + }, + }, + }, } for _, testCase := range testCases { @@ -585,10 +588,10 @@ func TestHandler_OnUnlock(t *testing.T) { func TestHandler_OnDelete(t *testing.T) { // given providerName := "fake" - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, providerName)) req := &storage_backend.OnDeleteRequest{ - TypeinstanceId: "uuid", - AdditionalParameters: reqAdditionalParams, + TypeinstanceId: "uuid", + Context: reqContext, } path := fmt.Sprintf("/capact/%s", req.TypeinstanceId) @@ -600,9 +603,10 @@ func TestHandler_OnDelete(t *testing.T) { ExpectedErrorMessage *string }{ { - Name: "No data", // data for a give nrevision could reside in different storage backend + Name: "No data", InputProvider: &fakeProvider{secrets: map[string]map[string]string{}}, ExpectedProviderState: map[string]map[string]string{}, + ExpectedErrorMessage: ptr.String("rpc error: code = NotFound desc = path \"/capact/uuid\" in provider \"fake\" not found"), }, { Name: "Empty value", @@ -611,15 +615,15 @@ func TestHandler_OnDelete(t *testing.T) { path: {}, }, }, - ExpectedProviderState: map[string]map[string]string{}, + ExpectedProviderState: map[string]map[string]string{path: {}}, + ExpectedErrorMessage: ptr.String("rpc error: code = NotFound desc = path \"/capact/uuid\" in provider \"fake\" not found"), }, { - Name: "Already existing", + Name: "Already existing not locked", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ path: { - "1": "original", - "locked_by": "foo/bar", + "1": "original", }, "cant-touch-this": { "Music": "hits me so hard", @@ -635,21 +639,22 @@ func TestHandler_OnDelete(t *testing.T) { }, }, { - Name: "Other data", + Name: "Already existing locked", InputProvider: &fakeProvider{ secrets: map[string]map[string]string{ - "cant-touch-this": { - "Music": "hits me so hard", - "Makes me say": "Oh, my Lord", + path: { + "1": "original", + "locked_by": "foo/bar", }, }, }, ExpectedProviderState: map[string]map[string]string{ - "cant-touch-this": { - "Music": "hits me so hard", - "Makes me say": "Oh, my Lord", + path: { + "1": "original", + "locked_by": "foo/bar", }, }, + ExpectedErrorMessage: ptr.String("rpc error: code = FailedPrecondition desc = typeInstance locked: path \"/capact/uuid\" contains \"locked_by\" property with value \"foo/bar\""), }, } diff --git a/pkg/hub/api/grpc/storage_backend.proto b/pkg/hub/api/grpc/storage_backend.proto index 0925df3db..083040fd6 100644 --- a/pkg/hub/api/grpc/storage_backend.proto +++ b/pkg/hub/api/grpc/storage_backend.proto @@ -5,11 +5,11 @@ package storage_backend; message OnCreateRequest { string typeinstance_id = 1; bytes value = 2; - bytes additional_parameters = 3; + bytes context = 3; } message OnCreateResponse { - optional bytes additional_parameters = 1; + optional bytes context = 1; } message TypeInstanceResourceVersion { @@ -21,16 +21,16 @@ message OnUpdateRequest { string typeinstance_id = 1; uint32 new_resource_version = 2; bytes new_value = 3; - optional bytes additional_parameters = 4; + optional bytes context = 4; } message OnUpdateResponse { - optional bytes additional_parameters = 1; + optional bytes context = 1; } message OnDeleteRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; } message OnDeleteResponse {} @@ -38,7 +38,7 @@ message OnDeleteResponse {} message GetValueRequest { string typeinstance_id = 1; uint32 resource_version = 2; - bytes additional_parameters = 3; + bytes context = 3; } message GetValueResponse { @@ -50,7 +50,7 @@ message GetValueResponse { message GetLockedByRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; } message GetLockedByResponse { @@ -59,7 +59,7 @@ message GetLockedByResponse { message OnLockRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; string locked_by = 3; } @@ -67,7 +67,7 @@ message OnLockResponse {} message OnUnlockRequest { string typeinstance_id = 1; - bytes additional_parameters = 2; + bytes context = 2; } message OnUnlockResponse {} diff --git a/pkg/hub/api/grpc/storage_backend/client_test.go b/pkg/hub/api/grpc/storage_backend/client_test.go new file mode 100644 index 000000000..6e093230d --- /dev/null +++ b/pkg/hub/api/grpc/storage_backend/client_test.go @@ -0,0 +1,189 @@ +package storage_backend_test + +import ( + "context" + "fmt" + "os" + "testing" + + pb "capact.io/capact/pkg/hub/api/grpc/storage_backend" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" +) + +// #nosec G101 +const secretStorageBackendAddr = "GRPC_SECRET_STORAGE_BACKEND_ADDR" + +// This test illustrates how to use gRPC Go client against real gRPC Storage Backend server. +// +// NOTE: Before running this test, make sure that the server is running under the `srvAddr` address +// and the `provider` is enabled on this server. +// +// To run this test, execute: +// GRPC_SECRET_STORAGE_BACKEND_ADDR=":50051" go test ./pkg/hub/api/grpc/storage_backend -v +func TestNewStorageBackendClient(t *testing.T) { + srvAddr := os.Getenv(secretStorageBackendAddr) + if srvAddr == "" { + t.Skipf("skipping storage backend gRPC client test as the env %s is not provided", secretStorageBackendAddr) + } + provider := "dotenv" + + valueBytes := []byte(`{"key": true}`) + typeInstanceID := "id" + + reqContext := []byte(fmt.Sprintf(`{"provider":"%s"}`, provider)) + + conn, err := grpc.Dial(srvAddr, grpc.WithInsecure()) + require.NoError(t, err) + + ctx := context.Background() + client := pb.NewStorageBackendClient(conn) + + // create + t.Logf("Creating TI %q...\n", typeInstanceID) + + _, err = client.OnCreate(ctx, &pb.OnCreateRequest{ + TypeinstanceId: typeInstanceID, + Value: valueBytes, + Context: reqContext, + }) + require.NoError(t, err) + + // get value + + var resourceVersion uint32 = 1 + res, err := client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + Context: reqContext, + }) + require.NoError(t, err) + + t.Logf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + assert.Equal(t, valueBytes, res.Value) + + // update + t.Logf("Updating TI %q...\n", typeInstanceID) + + newValueBytes := []byte(`{"key": "updated"}`) + _, err = client.OnUpdate(ctx, &pb.OnUpdateRequest{ + TypeinstanceId: typeInstanceID, + NewResourceVersion: 2, + NewValue: newValueBytes, + Context: reqContext, + }) + require.NoError(t, err) + + // get value + + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + Context: reqContext, + }) + require.NoError(t, err) + + t.Logf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + assert.Equal(t, valueBytes, res.Value) + + resourceVersion = 2 + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + Context: reqContext, + }) + require.NoError(t, err) + + t.Logf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + assert.Equal(t, newValueBytes, res.Value) + + // lock + + t.Logf("Locking TI %q...\n", typeInstanceID) + + _, err = client.OnLock(ctx, &pb.OnLockRequest{ + TypeinstanceId: typeInstanceID, + Context: reqContext, + LockedBy: "test/sample", + }) + require.NoError(t, err) + + // get lockedBy + + lockedByRes, err := client.GetLockedBy(ctx, &pb.GetLockedByRequest{ + TypeinstanceId: typeInstanceID, + Context: reqContext, + }) + require.NoError(t, err) + + require.NotNil(t, lockedByRes.LockedBy) + assert.Equal(t, "test/sample", *lockedByRes.LockedBy) + t.Logf("Getting TI %q: locked by %q\n", typeInstanceID, *lockedByRes.LockedBy) + + // unlock + + t.Logf("Unlocking TI %q...\n", typeInstanceID) + + _, err = client.OnUnlock(ctx, &pb.OnUnlockRequest{ + TypeinstanceId: typeInstanceID, + Context: reqContext, + }) + require.NoError(t, err) + + // get lockedBy + + lockedByRes, err = client.GetLockedBy(ctx, &pb.GetLockedByRequest{ + TypeinstanceId: typeInstanceID, + Context: reqContext, + }) + require.NoError(t, err) + + t.Logf("Getting TI %q: locked by: %v\n", typeInstanceID, lockedByRes.LockedBy) + assert.Nil(t, lockedByRes.LockedBy) + + // get value + + resourceVersion = 1 + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + Context: reqContext, + }) + require.NoError(t, err) + + t.Logf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + assert.Equal(t, valueBytes, res.Value) + + resourceVersion = 2 + res, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + Context: reqContext, + }) + require.NoError(t, err) + + t.Logf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) + assert.Equal(t, newValueBytes, res.Value) + + // delete + t.Logf("Deleting TI %q...\n", typeInstanceID) + + _, err = client.OnDelete(ctx, &pb.OnDeleteRequest{ + TypeinstanceId: typeInstanceID, + Context: reqContext, + }) + require.NoError(t, err) + + // last get + + resourceVersion = 1 + _, err = client.GetValue(ctx, &pb.GetValueRequest{ + TypeinstanceId: typeInstanceID, + ResourceVersion: resourceVersion, + Context: reqContext, + }) + require.Error(t, err) + assert.EqualError(t, err, "rpc error: code = NotFound desc = TypeInstance \"id\" in revision 1 was not found") + t.Logf("Getting TI %q: resource version %d: error: %v\n", typeInstanceID, resourceVersion, err) +} diff --git a/pkg/hub/api/grpc/storage_backend/example_test.go b/pkg/hub/api/grpc/storage_backend/example_test.go deleted file mode 100644 index 6f198579b..000000000 --- a/pkg/hub/api/grpc/storage_backend/example_test.go +++ /dev/null @@ -1,201 +0,0 @@ -package storage_backend_test - -import ( - "context" - "fmt" - - pb "capact.io/capact/pkg/hub/api/grpc/storage_backend" - "google.golang.org/grpc" - utilrand "k8s.io/apimachinery/pkg/util/rand" -) - -// This example illustrates how to use gRPC Go client against real gRPC Storage Backend server. -// -// NOTE: Before running this example, make sure that the server is running under the `srvAddr` address -// and the `provider` is enabled on this server. -func ExampleNewStorageBackendClient() { - provider := "dotenv" - srvAddr := ":50051" // server address - - valueBytes := []byte(`{"key": true}`) - typeInstanceID := utilrand.String(10) // temp - - reqAdditionalParams := []byte(fmt.Sprintf(`{"provider":"%s"}`, provider)) - - conn, err := grpc.Dial(srvAddr, grpc.WithInsecure()) - if err != nil { - panic(err) - } - - ctx := context.Background() - client := pb.NewStorageBackendClient(conn) - - // create - fmt.Printf("Creating TI %q...\n", typeInstanceID) - - _, err = client.OnCreate(ctx, &pb.OnCreateRequest{ - TypeinstanceId: typeInstanceID, - Value: valueBytes, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - // get value - - var resourceVersion uint32 = 1 - res, err := client.GetValue(ctx, &pb.GetValueRequest{ - TypeinstanceId: typeInstanceID, - ResourceVersion: resourceVersion, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) - - // update - fmt.Printf("Updating TI %q...\n", typeInstanceID) - - newValueBytes := []byte(`{"key": "updated"}`) - _, err = client.OnUpdate(ctx, &pb.OnUpdateRequest{ - TypeinstanceId: typeInstanceID, - NewResourceVersion: 2, - NewValue: newValueBytes, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - // get value - - res, err = client.GetValue(ctx, &pb.GetValueRequest{ - TypeinstanceId: typeInstanceID, - ResourceVersion: resourceVersion, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) - - resourceVersion = 2 - res, err = client.GetValue(ctx, &pb.GetValueRequest{ - TypeinstanceId: typeInstanceID, - ResourceVersion: resourceVersion, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) - - // lock - - fmt.Printf("Locking TI %q...\n", typeInstanceID) - - _, err = client.OnLock(ctx, &pb.OnLockRequest{ - TypeinstanceId: typeInstanceID, - AdditionalParameters: reqAdditionalParams, - LockedBy: "test/sample", - }) - if err != nil { - panic(err) - } - - // get lockedBy - - lockedByRes, err := client.GetLockedBy(ctx, &pb.GetLockedByRequest{ - TypeinstanceId: typeInstanceID, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - if lockedByRes.LockedBy == nil { - panic("lockedBy cannot be nil") - } - - fmt.Printf("Getting TI %q: locked by %q\n", typeInstanceID, *lockedByRes.LockedBy) - - // unlock - - fmt.Printf("Unlocking TI %q...\n", typeInstanceID) - - _, err = client.OnUnlock(ctx, &pb.OnUnlockRequest{ - TypeinstanceId: typeInstanceID, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - // get lockedBy - - lockedByRes, err = client.GetLockedBy(ctx, &pb.GetLockedByRequest{ - TypeinstanceId: typeInstanceID, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - fmt.Printf("Getting TI %q: locked by: %v\n", typeInstanceID, lockedByRes.LockedBy) - - // get value - - resourceVersion = 1 - res, err = client.GetValue(ctx, &pb.GetValueRequest{ - TypeinstanceId: typeInstanceID, - ResourceVersion: resourceVersion, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) - - resourceVersion = 2 - res, err = client.GetValue(ctx, &pb.GetValueRequest{ - TypeinstanceId: typeInstanceID, - ResourceVersion: resourceVersion, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - fmt.Printf("Getting TI %q: resource version %d: %s\n", typeInstanceID, resourceVersion, string(res.Value)) - - // delete - fmt.Printf("Deleting TI %q...\n", typeInstanceID) - - _, err = client.OnDelete(ctx, &pb.OnDeleteRequest{ - TypeinstanceId: typeInstanceID, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - // last get - - resourceVersion = 1 - res, err = client.GetValue(ctx, &pb.GetValueRequest{ - TypeinstanceId: typeInstanceID, - ResourceVersion: resourceVersion, - AdditionalParameters: reqAdditionalParams, - }) - if err != nil { - panic(err) - } - - fmt.Printf("Getting TI %q: resource version %d: is nil: %v\n", typeInstanceID, resourceVersion, res.Value == nil) -} diff --git a/pkg/hub/api/grpc/storage_backend/storage_backend.pb.go b/pkg/hub/api/grpc/storage_backend/storage_backend.pb.go index f3edab4c0..7df258ba8 100644 --- a/pkg/hub/api/grpc/storage_backend/storage_backend.pb.go +++ b/pkg/hub/api/grpc/storage_backend/storage_backend.pb.go @@ -25,9 +25,9 @@ type OnCreateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - AdditionalParameters []byte `protobuf:"bytes,3,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Context []byte `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` } func (x *OnCreateRequest) Reset() { @@ -76,9 +76,9 @@ func (x *OnCreateRequest) GetValue() []byte { return nil } -func (x *OnCreateRequest) GetAdditionalParameters() []byte { +func (x *OnCreateRequest) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -88,7 +88,7 @@ type OnCreateResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AdditionalParameters []byte `protobuf:"bytes,1,opt,name=additional_parameters,json=additionalParameters,proto3,oneof" json:"additional_parameters,omitempty"` + Context []byte `protobuf:"bytes,1,opt,name=context,proto3,oneof" json:"context,omitempty"` } func (x *OnCreateResponse) Reset() { @@ -123,9 +123,9 @@ func (*OnCreateResponse) Descriptor() ([]byte, []int) { return file_storage_backend_proto_rawDescGZIP(), []int{1} } -func (x *OnCreateResponse) GetAdditionalParameters() []byte { +func (x *OnCreateResponse) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -190,10 +190,10 @@ type OnUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` - NewResourceVersion uint32 `protobuf:"varint,2,opt,name=new_resource_version,json=newResourceVersion,proto3" json:"new_resource_version,omitempty"` - NewValue []byte `protobuf:"bytes,3,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` - AdditionalParameters []byte `protobuf:"bytes,4,opt,name=additional_parameters,json=additionalParameters,proto3,oneof" json:"additional_parameters,omitempty"` + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + NewResourceVersion uint32 `protobuf:"varint,2,opt,name=new_resource_version,json=newResourceVersion,proto3" json:"new_resource_version,omitempty"` + NewValue []byte `protobuf:"bytes,3,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"` + Context []byte `protobuf:"bytes,4,opt,name=context,proto3,oneof" json:"context,omitempty"` } func (x *OnUpdateRequest) Reset() { @@ -249,9 +249,9 @@ func (x *OnUpdateRequest) GetNewValue() []byte { return nil } -func (x *OnUpdateRequest) GetAdditionalParameters() []byte { +func (x *OnUpdateRequest) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -261,7 +261,7 @@ type OnUpdateResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AdditionalParameters []byte `protobuf:"bytes,1,opt,name=additional_parameters,json=additionalParameters,proto3,oneof" json:"additional_parameters,omitempty"` + Context []byte `protobuf:"bytes,1,opt,name=context,proto3,oneof" json:"context,omitempty"` } func (x *OnUpdateResponse) Reset() { @@ -296,9 +296,9 @@ func (*OnUpdateResponse) Descriptor() ([]byte, []int) { return file_storage_backend_proto_rawDescGZIP(), []int{4} } -func (x *OnUpdateResponse) GetAdditionalParameters() []byte { +func (x *OnUpdateResponse) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -308,8 +308,8 @@ type OnDeleteRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` - AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + Context []byte `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` } func (x *OnDeleteRequest) Reset() { @@ -351,9 +351,9 @@ func (x *OnDeleteRequest) GetTypeinstanceId() string { return "" } -func (x *OnDeleteRequest) GetAdditionalParameters() []byte { +func (x *OnDeleteRequest) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -401,9 +401,9 @@ type GetValueRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` - ResourceVersion uint32 `protobuf:"varint,2,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` - AdditionalParameters []byte `protobuf:"bytes,3,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + ResourceVersion uint32 `protobuf:"varint,2,opt,name=resource_version,json=resourceVersion,proto3" json:"resource_version,omitempty"` + Context []byte `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"` } func (x *GetValueRequest) Reset() { @@ -452,9 +452,9 @@ func (x *GetValueRequest) GetResourceVersion() uint32 { return 0 } -func (x *GetValueRequest) GetAdditionalParameters() []byte { +func (x *GetValueRequest) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -511,8 +511,8 @@ type GetLockedByRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` - AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + Context []byte `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` } func (x *GetLockedByRequest) Reset() { @@ -554,9 +554,9 @@ func (x *GetLockedByRequest) GetTypeinstanceId() string { return "" } -func (x *GetLockedByRequest) GetAdditionalParameters() []byte { +func (x *GetLockedByRequest) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -613,9 +613,9 @@ type OnLockRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` - AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` - LockedBy string `protobuf:"bytes,3,opt,name=locked_by,json=lockedBy,proto3" json:"locked_by,omitempty"` + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + Context []byte `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` + LockedBy string `protobuf:"bytes,3,opt,name=locked_by,json=lockedBy,proto3" json:"locked_by,omitempty"` } func (x *OnLockRequest) Reset() { @@ -657,9 +657,9 @@ func (x *OnLockRequest) GetTypeinstanceId() string { return "" } -func (x *OnLockRequest) GetAdditionalParameters() []byte { +func (x *OnLockRequest) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -714,8 +714,8 @@ type OnUnlockRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` - AdditionalParameters []byte `protobuf:"bytes,2,opt,name=additional_parameters,json=additionalParameters,proto3" json:"additional_parameters,omitempty"` + TypeinstanceId string `protobuf:"bytes,1,opt,name=typeinstance_id,json=typeinstanceId,proto3" json:"typeinstance_id,omitempty"` + Context []byte `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` } func (x *OnUnlockRequest) Reset() { @@ -757,9 +757,9 @@ func (x *OnUnlockRequest) GetTypeinstanceId() string { return "" } -func (x *OnUnlockRequest) GetAdditionalParameters() []byte { +func (x *OnUnlockRequest) GetContext() []byte { if x != nil { - return x.AdditionalParameters + return x.Context } return nil } @@ -807,99 +807,81 @@ var File_storage_backend_proto protoreflect.FileDescriptor var file_storage_backend_proto_rawDesc = []byte{ 0x0a, 0x15, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x85, 0x01, 0x0a, 0x0f, 0x4f, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x22, 0x6a, 0x0a, 0x0f, 0x4f, 0x6e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, + 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x3d, 0x0a, 0x10, 0x4f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x5e, 0x0a, 0x1b, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0xb4, 0x01, 0x0a, 0x0f, 0x4f, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, + 0x6e, 0x65, 0x77, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1d, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x48, 0x00, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x3d, 0x0a, 0x10, 0x4f, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, + 0x00, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x54, 0x0a, 0x0f, 0x4f, 0x6e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x61, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x22, 0x66, 0x0a, 0x10, 0x4f, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, - 0x0a, 0x16, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x5e, 0x0a, 0x1b, 0x54, 0x79, 0x70, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xdd, 0x01, 0x0a, 0x0f, 0x4f, 0x6e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, - 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x38, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, - 0x0a, 0x16, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x66, 0x0a, 0x10, 0x4f, 0x6e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x15, - 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x14, 0x61, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x22, 0x6f, 0x0a, 0x0f, 0x4f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, + 0x12, 0x0a, 0x10, 0x4f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x7f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x22, 0x37, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x88, 0x01, 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x57, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, + 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x45, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, + 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x88, 0x01, 0x01, 0x42, + 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x22, 0x6f, 0x0a, + 0x0d, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x22, 0x10, + 0x0a, 0x0e, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x54, 0x0a, 0x0f, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, - 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x15, - 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4f, 0x6e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, - 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x0a, - 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x22, 0x37, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, - 0x01, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x72, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, - 0x45, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x5f, 0x62, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x42, 0x79, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x0d, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x5f, 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x42, 0x79, 0x22, 0x10, 0x0a, 0x0e, 0x4f, 0x6e, 0x4c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x0f, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x74, 0x79, 0x70, 0x65, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x74, 0x79, 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, + 0x70, 0x65, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x12, 0x0a, 0x10, 0x4f, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xca, 0x04, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x12, 0x4f, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x20, 0x2e, 0x73, 0x74, 0x6f, 0x72, From 20c0480c734b708a1b652c4f53b3f475d1dec390 Mon Sep 17 00:00:00 2001 From: Pawel Kosiec Date: Mon, 28 Feb 2022 09:29:42 +0100 Subject: [PATCH 10/10] Prevent caching test result for gRPC client --- pkg/hub/api/grpc/storage_backend/client_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/hub/api/grpc/storage_backend/client_test.go b/pkg/hub/api/grpc/storage_backend/client_test.go index 6e093230d..3aa134e64 100644 --- a/pkg/hub/api/grpc/storage_backend/client_test.go +++ b/pkg/hub/api/grpc/storage_backend/client_test.go @@ -21,7 +21,7 @@ const secretStorageBackendAddr = "GRPC_SECRET_STORAGE_BACKEND_ADDR" // and the `provider` is enabled on this server. // // To run this test, execute: -// GRPC_SECRET_STORAGE_BACKEND_ADDR=":50051" go test ./pkg/hub/api/grpc/storage_backend -v +// GRPC_SECRET_STORAGE_BACKEND_ADDR=":50051" go test ./pkg/hub/api/grpc/storage_backend -v -count 1 func TestNewStorageBackendClient(t *testing.T) { srvAddr := os.Getenv(secretStorageBackendAddr) if srvAddr == "" {