From 595d0bc4292b673b45d9478822f442a6c7d56491 Mon Sep 17 00:00:00 2001 From: "guillaume.bouvignies" Date: Tue, 21 Mar 2023 16:26:39 +0100 Subject: [PATCH] Add logic to connect to a remote context --- cli/cli/go.mod | 6 +- cli/cli/go.sum | 9 +- .../engine_existence_guarantor.go | 8 + .../helpers/engine_manager/engine_manager.go | 7 +- .../kurtosis_cluster_config.go | 62 ++++-- container-engine-lib/go.mod | 1 + container-engine-lib/go.sum | 2 + .../backend_creator/backend_creator.go | 13 +- .../remote_context_backend/backend_creator.go | 95 ++++++++ .../kurtosis_remote_backend_config.go | 14 ++ .../remote_context_kurtosis_backend.go | 208 ++++++++++++++++++ .../file_backed_config_persistence.go | 10 +- .../store/serialization/contexts_config.go | 23 ++ .../store/serialization/kurtosis_context.go | 23 ++ engine/launcher/args/args.go | 8 +- .../engine_server_launcher.go | 8 + .../kurtosis_context_supplier.go | 57 +++++ engine/launcher/go.mod | 21 +- engine/launcher/go.sum | 79 +++---- engine/server/engine/main.go | 14 +- engine/server/go.mod | 5 +- engine/server/go.sum | 44 +--- 22 files changed, 593 insertions(+), 124 deletions(-) create mode 100644 container-engine-lib/lib/backend_impls/remote_context_backend/backend_creator.go create mode 100644 container-engine-lib/lib/backend_impls/remote_context_backend/kurtosis_remote_backend_config.go create mode 100644 container-engine-lib/lib/backend_impls/remote_context_backend/remote_context_kurtosis_backend.go create mode 100644 contexts-config-store/store/serialization/contexts_config.go create mode 100644 contexts-config-store/store/serialization/kurtosis_context.go create mode 100644 engine/launcher/engine_server_launcher/kurtosis_context_supplier.go diff --git a/cli/cli/go.mod b/cli/cli/go.mod index 69a7f9d949..df7b39f4a6 100644 --- a/cli/cli/go.mod +++ b/cli/cli/go.mod @@ -5,6 +5,7 @@ go 1.18 replace ( github.com/kurtosis-tech/kurtosis/api/golang => ../../api/golang github.com/kurtosis-tech/kurtosis/container-engine-lib => ../../container-engine-lib + github.com/kurtosis-tech/kurtosis/contexts-config-store => ../../contexts-config-store github.com/kurtosis-tech/kurtosis/engine/launcher => ../../engine/launcher github.com/kurtosis-tech/kurtosis/kurtosis_version => ../../kurtosis_version ) @@ -18,6 +19,7 @@ require ( github.com/go-yaml/yaml v2.1.0+incompatible github.com/kurtosis-tech/kurtosis/api/golang v0.0.0 // local dependency github.com/kurtosis-tech/kurtosis/container-engine-lib v0.0.0 // local dependency + github.com/kurtosis-tech/kurtosis/contexts-config-store v0.0.0 // local dependency github.com/kurtosis-tech/kurtosis/engine/launcher v0.0.0 // local dependency github.com/kurtosis-tech/kurtosis/kurtosis_version v0.0.0 // Local dependency generated during build github.com/kurtosis-tech/metrics-library/golang v0.0.0-20230221115618-70c305416224 @@ -30,7 +32,7 @@ require ( github.com/stretchr/testify v1.7.4 golang.org/x/crypto v0.0.0-20220214200702-86341886e292 google.golang.org/grpc v1.41.0 - google.golang.org/protobuf v1.27.1 + google.golang.org/protobuf v1.29.1 k8s.io/apimachinery v0.24.0 // indirect k8s.io/client-go v0.24.0 ) @@ -45,7 +47,6 @@ require ( ) require ( - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Microsoft/go-winio v0.4.17 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -84,6 +85,7 @@ require ( golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/net v0.7.0 // indirect golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect golang.org/x/sys v0.5.0 // indirect golang.org/x/term v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect diff --git a/cli/cli/go.sum b/cli/cli/go.sum index b097bc6832..2a6e331d96 100644 --- a/cli/cli/go.sum +++ b/cli/cli/go.sum @@ -36,8 +36,7 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= 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= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= @@ -486,6 +485,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -536,7 +537,6 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -730,8 +730,9 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj 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/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= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/cli/cli/helpers/engine_manager/engine_existence_guarantor.go b/cli/cli/helpers/engine_manager/engine_existence_guarantor.go index e73f4c3cb6..9e3f85808d 100644 --- a/cli/cli/helpers/engine_manager/engine_existence_guarantor.go +++ b/cli/cli/helpers/engine_manager/engine_existence_guarantor.go @@ -46,6 +46,8 @@ type engineExistenceGuarantor struct { engineServerKurtosisBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier + kurtosisRemoteBackendConfigSupplier *engine_server_launcher.KurtosisRemoteBackendConfigSupplier + engineServerLauncher *engine_server_launcher.EngineServerLauncher imageVersionTag string @@ -70,6 +72,7 @@ func newEngineExistenceGuarantorWithDefaultVersion( kurtosisBackend backend_interface.KurtosisBackend, shouldSendMetrics bool, engineServerKurtosisBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier, + kurtosisRemoteBackendConfigSupplier *engine_server_launcher.KurtosisRemoteBackendConfigSupplier, logLevel logrus.Level, maybeCurrentlyRunningEngineVersionTag string, kurtosisClusterType resolved_config.KurtosisClusterType, @@ -80,6 +83,7 @@ func newEngineExistenceGuarantorWithDefaultVersion( kurtosisBackend, shouldSendMetrics, engineServerKurtosisBackendConfigSupplier, + kurtosisRemoteBackendConfigSupplier, defaultEngineImageVersionTag, logLevel, maybeCurrentlyRunningEngineVersionTag, @@ -93,6 +97,7 @@ func newEngineExistenceGuarantorWithCustomVersion( kurtosisBackend backend_interface.KurtosisBackend, shouldSendMetrics bool, engineServerKurtosisBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier, + kurtosisRemoteBackendConfigSupplier *engine_server_launcher.KurtosisRemoteBackendConfigSupplier, imageVersionTag string, logLevel logrus.Level, maybeCurrentlyRunningEngineVersionTag string, @@ -103,6 +108,7 @@ func newEngineExistenceGuarantorWithCustomVersion( preVisitingMaybeHostMachineIpAndPort: preVisitingMaybeHostMachineIpAndPort, kurtosisBackend: kurtosisBackend, engineServerKurtosisBackendConfigSupplier: engineServerKurtosisBackendConfigSupplier, + kurtosisRemoteBackendConfigSupplier: kurtosisRemoteBackendConfigSupplier, engineServerLauncher: engine_server_launcher.NewEngineServerLauncher(kurtosisBackend), imageVersionTag: imageVersionTag, logLevel: logLevel, @@ -137,6 +143,7 @@ func (guarantor *engineExistenceGuarantor) VisitStopped() error { metricsUserId, guarantor.shouldSendMetrics, guarantor.engineServerKurtosisBackendConfigSupplier, + guarantor.kurtosisRemoteBackendConfigSupplier, ) } else { _, _, engineLaunchErr = guarantor.engineServerLauncher.LaunchWithCustomVersion( @@ -148,6 +155,7 @@ func (guarantor *engineExistenceGuarantor) VisitStopped() error { metricsUserId, guarantor.shouldSendMetrics, guarantor.engineServerKurtosisBackendConfigSupplier, + guarantor.kurtosisRemoteBackendConfigSupplier, ) } if engineLaunchErr != nil { diff --git a/cli/cli/helpers/engine_manager/engine_manager.go b/cli/cli/helpers/engine_manager/engine_manager.go index cd3b5ee0b4..579818f945 100644 --- a/cli/cli/helpers/engine_manager/engine_manager.go +++ b/cli/cli/helpers/engine_manager/engine_manager.go @@ -29,6 +29,7 @@ type EngineManager struct { kurtosisBackend backend_interface.KurtosisBackend shouldSendMetrics bool engineServerKurtosisBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier + remoteBackendConfigSupplier *engine_server_launcher.KurtosisRemoteBackendConfigSupplier clusterConfig *resolved_config.KurtosisClusterConfig // Make engine IP, port, and protocol configurable in the future } @@ -71,12 +72,14 @@ func NewEngineManager(ctx context.Context) (*EngineManager, error) { return nil, stacktrace.Propagate(err, "An error occurred getting the Kurtosis backend for cluster '%v'", clusterName) } engineBackendConfigSupplier := clusterConfig.GetEngineBackendConfigSupplier() + remoteBackendConfigSupplier := clusterConfig.GetKurtosisRemoteBackendConfigSupplier() return &EngineManager{ kurtosisBackend: kurtosisBackend, shouldSendMetrics: kurtosisConfig.GetShouldSendMetrics(), engineServerKurtosisBackendConfigSupplier: engineBackendConfigSupplier, - clusterConfig: clusterConfig, + remoteBackendConfigSupplier: remoteBackendConfigSupplier, + clusterConfig: clusterConfig, }, nil } @@ -143,6 +146,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithDefaultVersion(ctx cont manager.kurtosisBackend, manager.shouldSendMetrics, manager.engineServerKurtosisBackendConfigSupplier, + manager.remoteBackendConfigSupplier, logLevel, engineVersion, clusterType, @@ -170,6 +174,7 @@ func (manager *EngineManager) StartEngineIdempotentlyWithCustomVersion(ctx conte manager.kurtosisBackend, manager.shouldSendMetrics, manager.engineServerKurtosisBackendConfigSupplier, + manager.remoteBackendConfigSupplier, engineImageVersionTag, logLevel, engineVersion, diff --git a/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go b/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go index c7c2a52519..a58d403e71 100644 --- a/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go +++ b/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go @@ -4,7 +4,10 @@ import ( "context" v2 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v2" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/remote_context_backend" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" + "github.com/kurtosis-tech/kurtosis/contexts-config-store/api/golang/generated" + "github.com/kurtosis-tech/kurtosis/contexts-config-store/store" "github.com/kurtosis-tech/kurtosis/engine/launcher/engine_server_launcher" "github.com/kurtosis-tech/stacktrace" "strings" @@ -20,9 +23,10 @@ var dockerBackendApiContainerModeArgs *backend_creator.APIContainerModeArgs = ni type kurtosisBackendSupplier func(ctx context.Context) (backend_interface.KurtosisBackend, error) type KurtosisClusterConfig struct { - kurtosisBackendSupplier kurtosisBackendSupplier - engineBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier - clusterType KurtosisClusterType + kurtosisBackendSupplier kurtosisBackendSupplier + engineBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier + kurtosisRemoteBackendConfigSupplier *engine_server_launcher.KurtosisRemoteBackendConfigSupplier + clusterType KurtosisClusterType } func NewKurtosisClusterConfigFromOverrides(clusterId string, overrides *v2.KurtosisClusterConfigV2) (*KurtosisClusterConfig, error) { @@ -41,15 +45,16 @@ func NewKurtosisClusterConfigFromOverrides(clusterId string, overrides *v2.Kurto ) } - backendSupplier, engineBackendConfigSupplier, err := getSuppliers(clusterId, clusterType, overrides.Config) + backendSupplier, engineBackendConfigSupplier, kurtosisRemoteBackendConfigSupplier, err := getSuppliers(clusterId, clusterType, overrides.Config) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred getting the suppliers that cluster '%v' will use", clusterId) } return &KurtosisClusterConfig{ - kurtosisBackendSupplier: backendSupplier, - engineBackendConfigSupplier: engineBackendConfigSupplier, - clusterType: clusterType, + kurtosisBackendSupplier: backendSupplier, + engineBackendConfigSupplier: engineBackendConfigSupplier, + kurtosisRemoteBackendConfigSupplier: kurtosisRemoteBackendConfigSupplier, + clusterType: clusterType, }, nil } @@ -65,6 +70,10 @@ func (clusterConfig *KurtosisClusterConfig) GetEngineBackendConfigSupplier() eng return clusterConfig.engineBackendConfigSupplier } +func (clusterConfig *KurtosisClusterConfig) GetKurtosisRemoteBackendConfigSupplier() *engine_server_launcher.KurtosisRemoteBackendConfigSupplier { + return clusterConfig.kurtosisRemoteBackendConfigSupplier +} + func (clusterConfig *KurtosisClusterConfig) GetClusterType() KurtosisClusterType { return clusterConfig.clusterType } @@ -77,21 +86,36 @@ func (clusterConfig *KurtosisClusterConfig) GetClusterType() KurtosisClusterType func getSuppliers(clusterId string, clusterType KurtosisClusterType, kubernetesConfig *v2.KubernetesClusterConfigV2) ( kurtosisBackendSupplier, engine_server_launcher.KurtosisBackendConfigSupplier, + *engine_server_launcher.KurtosisRemoteBackendConfigSupplier, error, ) { + kurtosisRemoteBackendConfigSupplier := engine_server_launcher.NewKurtosisRemoteBackendConfigSupplier(func() (*generated.KurtosisContext, error) { + contextsConfigStore := store.GetContextConfigStore() + currentContext, err := contextsConfigStore.GetCurrentContext() + if err != nil { + return nil, stacktrace.Propagate(err, "Error loading current context info") + } + return currentContext, nil + }) + var backendSupplier kurtosisBackendSupplier var engineConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier switch clusterType { case KurtosisClusterType_Docker: if kubernetesConfig != nil { - return nil, nil, stacktrace.NewError( + return nil, nil, nil, stacktrace.NewError( "Cluster '%v' defines cluster config, but config must not be provided when cluster type is '%v'", clusterId, clusterType.String(), ) } + backendSupplier = func(_ context.Context) (backend_interface.KurtosisBackend, error) { - backend, err := backend_creator.GetLocalDockerKurtosisBackend(dockerBackendApiContainerModeArgs) + kurtosisRemoteBackendConfigMaybe, err := kurtosisRemoteBackendConfigSupplier.GetOptionalRemoteConfig() + if err != nil { + return nil, stacktrace.Propagate(err, "Error building optional remote Kurtosis backend config") + } + backend, err := remote_context_backend.GetContextAwareKurtosisBackend(kurtosisRemoteBackendConfigMaybe, dockerBackendApiContainerModeArgs) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating the Docker Kurtosis backend") } @@ -101,14 +125,14 @@ func getSuppliers(clusterId string, clusterType KurtosisClusterType, kubernetesC engineConfigSupplier = engine_server_launcher.NewDockerKurtosisBackendConfigSupplier() case KurtosisClusterType_Kubernetes: if kubernetesConfig == nil { - return nil, nil, stacktrace.NewError( + return nil, nil, nil, stacktrace.NewError( "Cluster '%v' doesn't define cluster config, but config must be provided when cluster type is '%v'", clusterId, clusterType.String(), ) } if kubernetesConfig.KubernetesClusterName == nil { - return nil, nil, stacktrace.NewError( + return nil, nil, nil, stacktrace.NewError( "Type of cluster '%v' is '%v' but has no Kubernetes cluster name in its config map", clusterId, clusterType, @@ -119,7 +143,7 @@ func getSuppliers(clusterId string, clusterType KurtosisClusterType, kubernetesC _ = *kubernetesConfig.KubernetesClusterName if kubernetesConfig.StorageClass == nil { - return nil, nil, stacktrace.NewError( + return nil, nil, nil, stacktrace.NewError( "Type of cluster '%v' is '%v' but no storage class was defined in the config", clusterId, clusterType, @@ -133,6 +157,16 @@ func getSuppliers(clusterId string, clusterType KurtosisClusterType, kubernetesC } backendSupplier = func(ctx context.Context) (backend_interface.KurtosisBackend, error) { + kurtosisRemoteBackendConfigMaybe, err := kurtosisRemoteBackendConfigSupplier.GetOptionalRemoteConfig() + if err != nil { + return nil, stacktrace.Propagate(err, "Error building optional remote Kurtosis backend config") + } + if kurtosisRemoteBackendConfigMaybe != nil { + return nil, stacktrace.NewError("Using Kubernetes as a local cluster connected to a remote" + + "Kurtosis backend is currently not supported. Either switch to a local-only context to use " + + "Kubernetes locally, or switch the cluster to Docker to connect to a remote Kurtosis backend") + } + pluginPath := backend_interface.GetPluginPathForCLI(backend_interface.KubernetesPluginName) plugin, err := backend_interface.OpenBackendPlugin(pluginPath) if err != nil { @@ -158,11 +192,11 @@ func getSuppliers(clusterId string, clusterType KurtosisClusterType, kubernetesC engineConfigSupplier = engine_server_launcher.NewKubernetesKurtosisBackendConfigSupplier(storageClass, enclaveDataVolumeSizeInMb) default: // This should never happen because we enforce this via unit tests - return nil, nil, stacktrace.NewError( + return nil, nil, nil, stacktrace.NewError( "Cluster '%v' has unrecognized type '%v'; this is a bug in Kurtosis", clusterId, clusterType.String(), ) } - return backendSupplier, engineConfigSupplier, nil + return backendSupplier, engineConfigSupplier, kurtosisRemoteBackendConfigSupplier, nil } diff --git a/container-engine-lib/go.mod b/container-engine-lib/go.mod index fbff54059a..939f79d71b 100644 --- a/container-engine-lib/go.mod +++ b/container-engine-lib/go.mod @@ -12,6 +12,7 @@ require ( github.com/sirupsen/logrus v1.8.1 github.com/stretchr/testify v1.7.4 go.etcd.io/bbolt v1.3.6 + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c gopkg.in/yaml.v3 v3.0.1 ) diff --git a/container-engine-lib/go.sum b/container-engine-lib/go.sum index ec7d0fbf58..9fbd4c5073 100644 --- a/container-engine-lib/go.sum +++ b/container-engine-lib/go.sum @@ -87,6 +87,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator/backend_creator.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator/backend_creator.go index b550e3870c..62899ca480 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator/backend_creator.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator/backend_creator.go @@ -30,11 +30,22 @@ type APIContainerModeArgs struct { func GetLocalDockerKurtosisBackend( optionalApiContainerModeArgs *APIContainerModeArgs, ) (backend_interface.KurtosisBackend, error) { - dockerClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + localDockerClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating a Docker client connected to the local environment") } + localDockerBackend, err := GetDockerKurtosisBackend(localDockerClient, optionalApiContainerModeArgs) + if err != nil { + return nil, stacktrace.Propagate(err, "Unable to build local Kurtosis Docker backend") + } + return localDockerBackend, nil +} + +func GetDockerKurtosisBackend( + dockerClient *client.Client, + optionalApiContainerModeArgs *APIContainerModeArgs, +) (backend_interface.KurtosisBackend, error) { dockerManager := docker_manager.NewDockerManager(dockerClient) // If running within the API container context, detect the network that the API container is running inside diff --git a/container-engine-lib/lib/backend_impls/remote_context_backend/backend_creator.go b/container-engine-lib/lib/backend_impls/remote_context_backend/backend_creator.go new file mode 100644 index 0000000000..a479bbc115 --- /dev/null +++ b/container-engine-lib/lib/backend_impls/remote_context_backend/backend_creator.go @@ -0,0 +1,95 @@ +package remote_context_backend + +import ( + "fmt" + "github.com/docker/docker/client" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" + "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" + "os" + "path" +) + +const ( + urlProtocol = "tcp" + + noTempDirPrefix = "" + tempDirNamePattern = "kurtosis_backend_tls_*" + caFileName = "ca.pem" + certFileName = "cert.pem" + keyFileName = "key.pem" + tlsFilesPerm = 0644 +) + +func GetContextAwareKurtosisBackend( + remoteBackendConfig *KurtosisRemoteBackendConfig, + optionalApiContainerModeArgs *backend_creator.APIContainerModeArgs, +) (backend_interface.KurtosisBackend, error) { + localDockerBackend, err := backend_creator.GetLocalDockerKurtosisBackend(optionalApiContainerModeArgs) + if err != nil { + return nil, stacktrace.Propagate(err, "Unable to build Kurtosis Backend connected to local Docker instance") + } + + if remoteBackendConfig == nil { + logrus.Debugf("Instantiating a context aware backend with no remote backend config ends up returning" + + "a regular local Docker backend.") + return localDockerBackend, nil + } + remoteDockerClient, err := buildRemoteDockerClient(remoteBackendConfig) + if err != nil { + return nil, stacktrace.Propagate(err, "Error building client configuration for Docker remote backend") + } + kurtosisRemoteBackend, err := backend_creator.GetDockerKurtosisBackend(remoteDockerClient, optionalApiContainerModeArgs) + if err != nil { + return nil, stacktrace.Propagate(err, "Error building Kurtosis remote Docker backend") + } + return newRemoteContextKurtosisBackend(localDockerBackend, kurtosisRemoteBackend), nil +} + +func buildRemoteDockerClient(remoteBackendConfig *KurtosisRemoteBackendConfig) (*client.Client, error) { + var clientOptions []client.Opt + + // host and port option + url := fmt.Sprintf("%s://%s:%d", urlProtocol, remoteBackendConfig.Host, remoteBackendConfig.Port) + clientOptions = append(clientOptions, client.WithHost(url)) + + // TLS option if config is present + if tlsConfig := remoteBackendConfig.Tls; tlsConfig != nil { + tlsFilesDir, err := writeTlsConfigToTempDir(tlsConfig.Ca, tlsConfig.ClientCert, tlsConfig.ClientKey) + if err != nil { + return nil, stacktrace.Propagate(err, "Error building TLS configuration to connect to remote Docker backend") + } + tlsOpt := client.WithTLSClientConfig( + path.Join(tlsFilesDir, caFileName), + path.Join(tlsFilesDir, certFileName), + path.Join(tlsFilesDir, keyFileName)) + clientOptions = append(clientOptions, tlsOpt) + } + + // API version negotiation option + clientOptions = append(clientOptions, client.WithAPIVersionNegotiation()) + + remoteDockerClient, err := client.NewClientWithOpts(clientOptions...) + if err != nil { + return nil, stacktrace.Propagate(err, "Error building Docker remote client") + } + return remoteDockerClient, nil +} + +func writeTlsConfigToTempDir(ca []byte, cert []byte, key []byte) (string, error) { + tempDirectory, err := os.MkdirTemp("", tempDirNamePattern) + if err != nil { + return "", stacktrace.Propagate(err, "Cannot create a temporary directory to store Kurtosis backend TLS files") + } + if err = os.WriteFile(path.Join(tempDirectory, caFileName), ca, tlsFilesPerm); err != nil { + return "", stacktrace.Propagate(err, "Error writing content of CA to temporary file") + } + if err = os.WriteFile(path.Join(tempDirectory, certFileName), cert, tlsFilesPerm); err != nil { + return "", stacktrace.Propagate(err, "Error writing content of certificate to temporary file") + } + if err = os.WriteFile(path.Join(tempDirectory, keyFileName), key, tlsFilesPerm); err != nil { + return "", stacktrace.Propagate(err, "Error writing content of key to temporary file") + } + return tempDirectory, nil +} diff --git a/container-engine-lib/lib/backend_impls/remote_context_backend/kurtosis_remote_backend_config.go b/container-engine-lib/lib/backend_impls/remote_context_backend/kurtosis_remote_backend_config.go new file mode 100644 index 0000000000..bf212717ff --- /dev/null +++ b/container-engine-lib/lib/backend_impls/remote_context_backend/kurtosis_remote_backend_config.go @@ -0,0 +1,14 @@ +package remote_context_backend + +type KurtosisRemoteBackendConfig struct { + Host string `json:"host"` + Port uint32 `json:"port"` + + Tls *KurtosisBackendTlsConfig `json:"tls,omitempty"` +} + +type KurtosisBackendTlsConfig struct { + Ca []byte `json:"ca"` + ClientCert []byte `json:"cert"` + ClientKey []byte `json:"key"` +} diff --git a/container-engine-lib/lib/backend_impls/remote_context_backend/remote_context_kurtosis_backend.go b/container-engine-lib/lib/backend_impls/remote_context_backend/remote_context_kurtosis_backend.go new file mode 100644 index 0000000000..e75976e592 --- /dev/null +++ b/container-engine-lib/lib/backend_impls/remote_context_backend/remote_context_kurtosis_backend.go @@ -0,0 +1,208 @@ +package remote_context_backend + +import ( + "context" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/api_container" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/enclave" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/engine" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/exec_result" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/logs_collector" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/logs_database" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/networking_sidecar" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/stacktrace" + "golang.org/x/sync/errgroup" + "io" + "net" +) + +// RemoteContextKurtosisBackend is a dual context holding a reference to a local backend running on Docker (k8s is +// currently not supported to work with a remote Kurtosis backend) and a reference to a remote Kurtosis backend (which +// currently is a Docker backend, we do not support anything else). +// Basically, requests are dispatched among those 2 backends depending on which area of Kurtosis they touch. +// This might change, but right now the engine runs locally, therefore engine interacting endpoint goes to the local +// backend, and all the rest goes to the remote backend, as all other containers (including API container) should be +// running in the remote backend +type RemoteContextKurtosisBackend struct { + localKurtosisBackend backend_interface.KurtosisBackend + remoteKurtosisBackend backend_interface.KurtosisBackend +} + +// newRemoteContextKurtosisBackend instantiate a new RemoteContextKurtosisBackend but is private. Use the corresponding +// backend_creator to build such a backend +func newRemoteContextKurtosisBackend( + localBackend backend_interface.KurtosisBackend, + contextBackend backend_interface.KurtosisBackend, +) *RemoteContextKurtosisBackend { + return &RemoteContextKurtosisBackend{ + localKurtosisBackend: localBackend, + remoteKurtosisBackend: contextBackend, + } +} + +func (backend *RemoteContextKurtosisBackend) FetchImage(ctx context.Context, image string) error { + // without knowing which backend will need the image, it's tricky to filter which one should fetch it. + // For now, fetch it on both in parallel + errorGroup := errgroup.Group{} + errorGroup.Go(func() error { + return backend.localKurtosisBackend.FetchImage(ctx, image) + }) + errorGroup.Go(func() error { + return backend.remoteKurtosisBackend.FetchImage(ctx, image) + }) + if err := errorGroup.Wait(); err != nil { + return stacktrace.Propagate(err, "Error fetching the image in one of the backends") + } + return nil +} + +func (backend *RemoteContextKurtosisBackend) CreateEngine(ctx context.Context, imageOrgAndRepo string, imageVersionTag string, grpcPortNum uint16, grpcProxyPortNum uint16, envVars map[string]string) (*engine.Engine, error) { + return backend.localKurtosisBackend.CreateEngine(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, grpcProxyPortNum, envVars) +} + +func (backend *RemoteContextKurtosisBackend) GetEngines(ctx context.Context, filters *engine.EngineFilters) (map[engine.EngineGUID]*engine.Engine, error) { + return backend.localKurtosisBackend.GetEngines(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) StopEngines(ctx context.Context, filters *engine.EngineFilters) (successfulEngineGuids map[engine.EngineGUID]bool, erroredEngineGuids map[engine.EngineGUID]error, resultErr error) { + return backend.localKurtosisBackend.StopEngines(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) DestroyEngines(ctx context.Context, filters *engine.EngineFilters) (successfulEngineGuids map[engine.EngineGUID]bool, erroredEngineGuids map[engine.EngineGUID]error, resultErr error) { + return backend.localKurtosisBackend.DestroyEngines(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) CreateEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID, enclaveName string, isPartitioningEnabled bool) (*enclave.Enclave, error) { + return backend.remoteKurtosisBackend.CreateEnclave(ctx, enclaveUuid, enclaveName, isPartitioningEnabled) +} + +func (backend *RemoteContextKurtosisBackend) GetEnclaves(ctx context.Context, filters *enclave.EnclaveFilters) (map[enclave.EnclaveUUID]*enclave.Enclave, error) { + return backend.remoteKurtosisBackend.GetEnclaves(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) StopEnclaves(ctx context.Context, filters *enclave.EnclaveFilters) (successfulEnclaveIds map[enclave.EnclaveUUID]bool, erroredEnclaveIds map[enclave.EnclaveUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.StopEnclaves(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) DumpEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID, outputDirpath string) error { + return backend.remoteKurtosisBackend.DumpEnclave(ctx, enclaveUuid, outputDirpath) +} + +func (backend *RemoteContextKurtosisBackend) DestroyEnclaves(ctx context.Context, filters *enclave.EnclaveFilters) (successfulEnclaveIds map[enclave.EnclaveUUID]bool, erroredEnclaveIds map[enclave.EnclaveUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.DestroyEnclaves(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) CreateAPIContainer(ctx context.Context, image string, enclaveUuid enclave.EnclaveUUID, grpcPortNum uint16, grpcProxyPortNum uint16, enclaveDataVolumeDirpath string, ownIpAddressEnvVar string, customEnvVars map[string]string) (*api_container.APIContainer, error) { + return backend.remoteKurtosisBackend.CreateAPIContainer(ctx, image, enclaveUuid, grpcPortNum, grpcProxyPortNum, enclaveDataVolumeDirpath, ownIpAddressEnvVar, customEnvVars) +} + +func (backend *RemoteContextKurtosisBackend) GetAPIContainers(ctx context.Context, filters *api_container.APIContainerFilters) (map[enclave.EnclaveUUID]*api_container.APIContainer, error) { + return backend.remoteKurtosisBackend.GetAPIContainers(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) StopAPIContainers(ctx context.Context, filters *api_container.APIContainerFilters) (successfulApiContainerIds map[enclave.EnclaveUUID]bool, erroredApiContainerIds map[enclave.EnclaveUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.StopAPIContainers(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) DestroyAPIContainers(ctx context.Context, filters *api_container.APIContainerFilters) (successfulApiContainerIds map[enclave.EnclaveUUID]bool, erroredApiContainerIds map[enclave.EnclaveUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.DestroyAPIContainers(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) RegisterUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, services map[service.ServiceName]bool) (map[service.ServiceName]*service.ServiceRegistration, map[service.ServiceName]error, error) { + return backend.remoteKurtosisBackend.RegisterUserServices(ctx, enclaveUuid, services) +} + +func (backend *RemoteContextKurtosisBackend) UnregisterUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, services map[service.ServiceUUID]bool) (map[service.ServiceUUID]bool, map[service.ServiceUUID]error, error) { + return backend.remoteKurtosisBackend.UnregisterUserServices(ctx, enclaveUuid, services) +} + +func (backend *RemoteContextKurtosisBackend) StartRegisteredUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, services map[service.ServiceUUID]*service.ServiceConfig) (map[service.ServiceUUID]*service.Service, map[service.ServiceUUID]error, error) { + return backend.remoteKurtosisBackend.StartRegisteredUserServices(ctx, enclaveUuid, services) +} + +func (backend *RemoteContextKurtosisBackend) GetUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters) (map[service.ServiceUUID]*service.Service, error) { + return backend.remoteKurtosisBackend.GetUserServices(ctx, enclaveUuid, filters) +} + +func (backend *RemoteContextKurtosisBackend) GetUserServiceLogs(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters, shouldFollowLogs bool) (successfulUserServiceLogs map[service.ServiceUUID]io.ReadCloser, erroredUserServiceUuids map[service.ServiceUUID]error, resultError error) { + return backend.remoteKurtosisBackend.GetUserServiceLogs(ctx, enclaveUuid, filters, shouldFollowLogs) +} + +func (backend *RemoteContextKurtosisBackend) PauseService(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUUID service.ServiceUUID) (resultErr error) { + return backend.remoteKurtosisBackend.PauseService(ctx, enclaveUuid, serviceUUID) +} + +func (backend *RemoteContextKurtosisBackend) UnpauseService(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUUID service.ServiceUUID) (resultErr error) { + return backend.remoteKurtosisBackend.UnpauseService(ctx, enclaveUuid, serviceUUID) +} + +func (backend *RemoteContextKurtosisBackend) RunUserServiceExecCommands(ctx context.Context, enclaveUuid enclave.EnclaveUUID, userServiceCommands map[service.ServiceUUID][]string) (succesfulUserServiceExecResults map[service.ServiceUUID]*exec_result.ExecResult, erroredUserServiceUuids map[service.ServiceUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.RunUserServiceExecCommands(ctx, enclaveUuid, userServiceCommands) +} + +func (backend *RemoteContextKurtosisBackend) GetConnectionWithUserService(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID) (resultConn net.Conn, resultErr error) { + return backend.remoteKurtosisBackend.GetConnectionWithUserService(ctx, enclaveUuid, serviceUuid) +} + +func (backend *RemoteContextKurtosisBackend) CopyFilesFromUserService(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID, srcPathOnService string, output io.Writer) error { + return backend.remoteKurtosisBackend.CopyFilesFromUserService(ctx, enclaveUuid, serviceUuid, srcPathOnService, output) +} + +func (backend *RemoteContextKurtosisBackend) StopUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters) (successfulUserServiceUuids map[service.ServiceUUID]bool, erroredUserServiceUuids map[service.ServiceUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.StopUserServices(ctx, enclaveUuid, filters) +} + +func (backend *RemoteContextKurtosisBackend) DestroyUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters) (successfulUserServiceUuids map[service.ServiceUUID]bool, erroredUserServiceUuids map[service.ServiceUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.DestroyUserServices(ctx, enclaveUuid, filters) + +} + +func (backend *RemoteContextKurtosisBackend) CreateNetworkingSidecar(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID) (*networking_sidecar.NetworkingSidecar, error) { + return backend.remoteKurtosisBackend.CreateNetworkingSidecar(ctx, enclaveUuid, serviceUuid) +} + +func (backend *RemoteContextKurtosisBackend) GetNetworkingSidecars(ctx context.Context, filters *networking_sidecar.NetworkingSidecarFilters) (map[service.ServiceUUID]*networking_sidecar.NetworkingSidecar, error) { + return backend.remoteKurtosisBackend.GetNetworkingSidecars(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) RunNetworkingSidecarExecCommands(ctx context.Context, enclaveUuid enclave.EnclaveUUID, networkingSidecarsCommands map[service.ServiceUUID][]string) (successfulNetworkingSidecarExecResults map[service.ServiceUUID]*exec_result.ExecResult, erroredUserServiceUuids map[service.ServiceUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.RunNetworkingSidecarExecCommands(ctx, enclaveUuid, networkingSidecarsCommands) +} + +func (backend *RemoteContextKurtosisBackend) StopNetworkingSidecars(ctx context.Context, filters *networking_sidecar.NetworkingSidecarFilters) (successfulUserServiceUuids map[service.ServiceUUID]bool, erroredUserServiceUuids map[service.ServiceUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.StopNetworkingSidecars(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) DestroyNetworkingSidecars(ctx context.Context, filters *networking_sidecar.NetworkingSidecarFilters) (successfulUserServiceUuids map[service.ServiceUUID]bool, erroredUserServiceUuids map[service.ServiceUUID]error, resultErr error) { + return backend.remoteKurtosisBackend.DestroyNetworkingSidecars(ctx, filters) +} + +func (backend *RemoteContextKurtosisBackend) CreateLogsDatabase(ctx context.Context, logsDatabaseHttpPortNumber uint16) (*logs_database.LogsDatabase, error) { + return backend.remoteKurtosisBackend.CreateLogsDatabase(ctx, logsDatabaseHttpPortNumber) +} + +func (backend *RemoteContextKurtosisBackend) GetLogsDatabase(ctx context.Context) (*logs_database.LogsDatabase, error) { + return backend.remoteKurtosisBackend.GetLogsDatabase(ctx) +} + +func (backend *RemoteContextKurtosisBackend) DestroyLogsDatabase(ctx context.Context) error { + return backend.remoteKurtosisBackend.DestroyLogsDatabase(ctx) +} + +func (backend *RemoteContextKurtosisBackend) CreateLogsCollectorForEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID, logsCollectorHttpPortNumber uint16, logsCollectorTcpPortNumber uint16) (*logs_collector.LogsCollector, error) { + return backend.remoteKurtosisBackend.CreateLogsCollectorForEnclave(ctx, enclaveUuid, logsCollectorHttpPortNumber, logsCollectorHttpPortNumber) + +} + +func (backend *RemoteContextKurtosisBackend) GetLogsCollectorForEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID) (*logs_collector.LogsCollector, error) { + return backend.remoteKurtosisBackend.GetLogsCollectorForEnclave(ctx, enclaveUuid) +} + +func (backend *RemoteContextKurtosisBackend) DestroyLogsCollectorForEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID) error { + return backend.remoteKurtosisBackend.DestroyLogsCollectorForEnclave(ctx, enclaveUuid) +} + +func (backend *RemoteContextKurtosisBackend) DestroyDeprecatedCentralizedLogsResources(ctx context.Context) error { + return backend.remoteKurtosisBackend.DestroyDeprecatedCentralizedLogsResources(ctx) +} diff --git a/contexts-config-store/store/persistence/file_backed_config_persistence.go b/contexts-config-store/store/persistence/file_backed_config_persistence.go index d6cbc36fb5..d1ee995c54 100644 --- a/contexts-config-store/store/persistence/file_backed_config_persistence.go +++ b/contexts-config-store/store/persistence/file_backed_config_persistence.go @@ -3,8 +3,8 @@ package persistence import ( "github.com/adrg/xdg" "github.com/kurtosis-tech/kurtosis/contexts-config-store/api/golang/generated" + "github.com/kurtosis-tech/kurtosis/contexts-config-store/store/serialization" "github.com/kurtosis-tech/stacktrace" - "google.golang.org/protobuf/encoding/protojson" "os" "path" "sync" @@ -57,8 +57,8 @@ func (persistence *FileBackedConfigPersistence) LoadContextsConfig() (*generated return nil, stacktrace.Propagate(err, "Unable to read context config file at '%s'", persistence.backingFilePath) } - contextsConfig := new(generated.KurtosisContextsConfig) - if err = protojson.Unmarshal(contextsConfigFileContent, contextsConfig); err != nil { + contextsConfig, err := serialization.DeserializeKurtosisContextsConfig(contextsConfigFileContent) + if err != nil { return nil, stacktrace.Propagate(err, "Unable to deserialize content of context config file at '%s'", persistence.backingFilePath) } @@ -102,11 +102,11 @@ func (persistence *FileBackedConfigPersistence) persistContextsConfigInternal(ne persistence.Lock() defer persistence.Unlock() - serializedConfig, err := protojson.Marshal(newContextsConfig) + serializedContextsConfig, err := serialization.SerializeKurtosisContextsConfig(newContextsConfig) if err != nil { return stacktrace.Propagate(err, "Unable to serialize content of contexts config object to JSON") } - if err = os.WriteFile(persistence.backingFilePath, serializedConfig, defaultFilePerm); err != nil { + if err = os.WriteFile(persistence.backingFilePath, serializedContextsConfig, defaultFilePerm); err != nil { return stacktrace.Propagate(err, "Unable to write context config file to '%s'", persistence.backingFilePath) } diff --git a/contexts-config-store/store/serialization/contexts_config.go b/contexts-config-store/store/serialization/contexts_config.go new file mode 100644 index 0000000000..cb6c2832b5 --- /dev/null +++ b/contexts-config-store/store/serialization/contexts_config.go @@ -0,0 +1,23 @@ +package serialization + +import ( + "github.com/kurtosis-tech/kurtosis/contexts-config-store/api/golang/generated" + "github.com/kurtosis-tech/stacktrace" + "google.golang.org/protobuf/encoding/protojson" +) + +func SerializeKurtosisContextsConfig(kurtosisContextsConfig *generated.KurtosisContextsConfig) ([]byte, error) { + serializedKurtosisContext, err := protojson.Marshal(kurtosisContextsConfig) + if err != nil { + return nil, stacktrace.Propagate(err, "Unable to serialize Kurtosis contexts config object") + } + return serializedKurtosisContext, nil +} + +func DeserializeKurtosisContextsConfig(serializedKurtosisContextsConfig []byte) (*generated.KurtosisContextsConfig, error) { + kurtosisContextsConfig := new(generated.KurtosisContextsConfig) + if err := protojson.Unmarshal(serializedKurtosisContextsConfig, kurtosisContextsConfig); err != nil { + return nil, stacktrace.Propagate(err, "Unable to deserialize Kurtosis contexts config object") + } + return kurtosisContextsConfig, nil +} diff --git a/contexts-config-store/store/serialization/kurtosis_context.go b/contexts-config-store/store/serialization/kurtosis_context.go new file mode 100644 index 0000000000..0a7faac1d1 --- /dev/null +++ b/contexts-config-store/store/serialization/kurtosis_context.go @@ -0,0 +1,23 @@ +package serialization + +import ( + "github.com/kurtosis-tech/kurtosis/contexts-config-store/api/golang/generated" + "github.com/kurtosis-tech/stacktrace" + "google.golang.org/protobuf/encoding/protojson" +) + +func SerializeKurtosisContext(kurtosisContext *generated.KurtosisContext) ([]byte, error) { + serializedKurtosisContext, err := protojson.Marshal(kurtosisContext) + if err != nil { + return nil, stacktrace.Propagate(err, "Unable to serialize Kurtosis context object") + } + return serializedKurtosisContext, nil +} + +func DeserializeKurtosisContext(serializedKurtosisContext []byte) (*generated.KurtosisContext, error) { + kurtosisContext := new(generated.KurtosisContext) + if err := protojson.Unmarshal(serializedKurtosisContext, kurtosisContext); err != nil { + return nil, stacktrace.Propagate(err, "Unable to deserialize Kurtosis context object") + } + return kurtosisContext, nil +} diff --git a/engine/launcher/args/args.go b/engine/launcher/args/args.go index 272cf421eb..a19a6ef1df 100644 --- a/engine/launcher/args/args.go +++ b/engine/launcher/args/args.go @@ -2,6 +2,7 @@ package args import ( "encoding/json" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/remote_context_backend" "github.com/kurtosis-tech/kurtosis/engine/launcher/args/kurtosis_backend_config" "reflect" "strings" @@ -33,6 +34,9 @@ type EngineServerArgs struct { // Should be deserialized differently depending on value of KurtosisBackendType KurtosisBackendConfig interface{} `json:"kurtosisBackendConfig"` + + // Configuration to connect to a remote Kurtosis backend, if needed + KurtosisRemoteBackendConfig *remote_context_backend.KurtosisRemoteBackendConfig `json:"kurtosisRemoteBackendConfig,omitempty"` } func (args *EngineServerArgs) UnmarshalJSON(data []byte) error { @@ -67,7 +71,7 @@ func (args *EngineServerArgs) UnmarshalJSON(data []byte) error { } // Even though the fields are public due to JSON de/serialization requirements, we still have this constructor so that -// we get compile errors if there are missing fields +// we get compile errors if there are missing fields func NewEngineServerArgs( grpcListenPortNum uint16, grpcProxyListenPortNum uint16, @@ -77,6 +81,7 @@ func NewEngineServerArgs( didUserAcceptSendingMetrics bool, kurtosisBackendType KurtosisBackendType, kurtosisBackendConfig interface{}, + remoteBackendConfig *remote_context_backend.KurtosisRemoteBackendConfig, ) (*EngineServerArgs, error) { result := &EngineServerArgs{ GrpcListenPortNum: grpcListenPortNum, @@ -87,6 +92,7 @@ func NewEngineServerArgs( DidUserAcceptSendingMetrics: didUserAcceptSendingMetrics, KurtosisBackendType: kurtosisBackendType, KurtosisBackendConfig: kurtosisBackendConfig, + KurtosisRemoteBackendConfig: remoteBackendConfig, } if err := result.validate(); err != nil { return nil, stacktrace.Propagate(err, "An error occurred validating engine server args") diff --git a/engine/launcher/engine_server_launcher/engine_server_launcher.go b/engine/launcher/engine_server_launcher/engine_server_launcher.go index 15c614c6a7..7e456498fb 100644 --- a/engine/launcher/engine_server_launcher/engine_server_launcher.go +++ b/engine/launcher/engine_server_launcher/engine_server_launcher.go @@ -37,6 +37,7 @@ func (launcher *EngineServerLauncher) LaunchWithDefaultVersion( metricsUserID string, didUserAcceptSendingMetrics bool, backendConfigSupplier KurtosisBackendConfigSupplier, + kurtosisRemoteBackendConfigSupplier *KurtosisRemoteBackendConfigSupplier, ) ( resultPublicIpAddr net.IP, resultPublicGrpcPortSpec *port_spec.PortSpec, @@ -52,6 +53,7 @@ func (launcher *EngineServerLauncher) LaunchWithDefaultVersion( metricsUserID, didUserAcceptSendingMetrics, backendConfigSupplier, + kurtosisRemoteBackendConfigSupplier, ) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred launching the engine server container with default version tag '%v'", kurtosis_version.KurtosisVersion) @@ -68,12 +70,17 @@ func (launcher *EngineServerLauncher) LaunchWithCustomVersion( metricsUserID string, didUserAcceptSendingMetrics bool, backendConfigSupplier KurtosisBackendConfigSupplier, + kurtosisRemoteBackendConfigSupplier *KurtosisRemoteBackendConfigSupplier, ) ( resultPublicIpAddr net.IP, resultPublicGrpcPortSpec *port_spec.PortSpec, resultErr error, ) { kurtosisBackendType, kurtosisBackendConfig := backendConfigSupplier.getKurtosisBackendConfig() + remoteBackendConfigMaybe, err := kurtosisRemoteBackendConfigSupplier.GetOptionalRemoteConfig() + if err != nil { + return nil, nil, stacktrace.Propagate(err, "Error retrieving current Kurtosis context") + } argsObj, err := args.NewEngineServerArgs( grpcListenPortNum, grpcProxyListenPortNum, @@ -83,6 +90,7 @@ func (launcher *EngineServerLauncher) LaunchWithCustomVersion( didUserAcceptSendingMetrics, kurtosisBackendType, kurtosisBackendConfig, + remoteBackendConfigMaybe, ) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred creating the engine server args") diff --git a/engine/launcher/engine_server_launcher/kurtosis_context_supplier.go b/engine/launcher/engine_server_launcher/kurtosis_context_supplier.go new file mode 100644 index 0000000000..ae0b39ae75 --- /dev/null +++ b/engine/launcher/engine_server_launcher/kurtosis_context_supplier.go @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022 - present Kurtosis Technologies Inc. + * All Rights Reserved. + */ + +package engine_server_launcher + +import ( + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/remote_context_backend" + "github.com/kurtosis-tech/kurtosis/contexts-config-store/api/golang" + "github.com/kurtosis-tech/kurtosis/contexts-config-store/api/golang/generated" + "github.com/kurtosis-tech/stacktrace" +) + +type KurtosisContextSupplier func() (*generated.KurtosisContext, error) + +type KurtosisRemoteBackendConfigSupplier struct { + kurtosisContextSupplier KurtosisContextSupplier +} + +func NewKurtosisRemoteBackendConfigSupplier(kurtosisContextSupplier KurtosisContextSupplier) *KurtosisRemoteBackendConfigSupplier { + return &KurtosisRemoteBackendConfigSupplier{ + kurtosisContextSupplier: kurtosisContextSupplier, + } +} + +func (supplier KurtosisRemoteBackendConfigSupplier) GetOptionalRemoteConfig() (*remote_context_backend.KurtosisRemoteBackendConfig, error) { + kurtosisContext, err := supplier.kurtosisContextSupplier() + if err != nil { + return nil, stacktrace.Propagate(err, "Error retrieving Kurtosis context object") + } + remoteBackendConfigMaybe, err := golang.Visit[remote_context_backend.KurtosisRemoteBackendConfig](kurtosisContext, golang.KurtosisContextVisitor[remote_context_backend.KurtosisRemoteBackendConfig]{ + VisitLocalOnlyContextV0: func(localContext *generated.LocalOnlyContextV0) (*remote_context_backend.KurtosisRemoteBackendConfig, error) { + // context is local, no remote backend config + return nil, nil + }, + VisitRemoteContextV0: func(remoteContext *generated.RemoteContextV0) (*remote_context_backend.KurtosisRemoteBackendConfig, error) { + var tlsConfig *remote_context_backend.KurtosisBackendTlsConfig + if remoteContext.GetTlsConfig() != nil { + tlsConfig = &remote_context_backend.KurtosisBackendTlsConfig{ + Ca: remoteContext.GetTlsConfig().GetCertificateAuthority(), + ClientCert: remoteContext.GetTlsConfig().GetClientCertificate(), + ClientKey: remoteContext.GetTlsConfig().GetClientKey(), + } + } + return &remote_context_backend.KurtosisRemoteBackendConfig{ + Host: remoteContext.GetHost(), + Port: remoteContext.GetKurtosisBackendPort(), + Tls: tlsConfig, + }, nil + }, + }) + if err != nil { + return nil, stacktrace.Propagate(err, "Unable to generate remote backend configuration") + } + return remoteBackendConfigMaybe, nil +} diff --git a/engine/launcher/go.mod b/engine/launcher/go.mod index 67016265f6..4348418dd6 100644 --- a/engine/launcher/go.mod +++ b/engine/launcher/go.mod @@ -1,14 +1,16 @@ module github.com/kurtosis-tech/kurtosis/engine/launcher -go 1.17 +go 1.18 replace ( github.com/kurtosis-tech/kurtosis/container-engine-lib => ../../container-engine-lib + github.com/kurtosis-tech/kurtosis/contexts-config-store => ../../contexts-config-store github.com/kurtosis-tech/kurtosis/kurtosis_version => ../../kurtosis_version ) require ( github.com/kurtosis-tech/kurtosis/container-engine-lib v0.0.0 // local dependency + github.com/kurtosis-tech/kurtosis/contexts-config-store v0.0.0 // local dependency github.com/kurtosis-tech/kurtosis/kurtosis_version v0.0.0 // Local dependency generated during build github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409 github.com/sirupsen/logrus v1.8.1 @@ -16,9 +18,26 @@ require ( ) require ( + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Microsoft/go-winio v0.4.17 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/distribution v2.8.0+incompatible // indirect + github.com/docker/docker v20.10.16+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/gammazero/deque v0.1.0 // indirect + github.com/gammazero/workerpool v1.1.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.4.0 // indirect + go.etcd.io/bbolt v1.3.6 // indirect + golang.org/x/net v0.7.0 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect golang.org/x/sys v0.5.0 // indirect + google.golang.org/protobuf v1.29.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/engine/launcher/go.sum b/engine/launcher/go.sum index 4096ea502c..5b2e650e7b 100644 --- a/engine/launcher/go.sum +++ b/engine/launcher/go.sum @@ -1,46 +1,48 @@ -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w= github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dmarkham/enumer v1.5.5/go.mod h1:qHwULwuCxYFAFM5KCkpF1U/U0BF5sNQKLccvUzKNY2w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= +github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +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-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= github.com/gammazero/deque v0.1.0/go.mod h1:KQw7vFau1hHuM8xmI9RbgKFbAsQFWmBpqQ2KenFLk6M= +github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= github.com/gammazero/workerpool v1.1.2/go.mod h1:UelbXcO0zCIGFcufcirHhq2/xtLXJdQ29qZNlXG9OjQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409 h1:YQTATifMUwZEtZYb0LVA7DK2pj8s71iY8rzweuUQ5+g= github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409/go.mod h1:y5weVs5d9wXXHcDA1awRxkIhhHC1xxYJN8a7aXnE6S8= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +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.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/pascaldekloe/name v1.0.0/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/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/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -51,74 +53,51 @@ github.com/stretchr/testify v1.7.4 h1:wZRexSlwd7ZXfKINDLsO4r7WBt3gTKONc6K/VesHvH github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= +gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= diff --git a/engine/server/engine/main.go b/engine/server/engine/main.go index 9361e72306..1136afeb19 100644 --- a/engine/server/engine/main.go +++ b/engine/server/engine/main.go @@ -10,6 +10,7 @@ import ( "fmt" "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/remote_context_backend" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/core/launcher/api_container_launcher" "github.com/kurtosis-tech/kurtosis/engine/launcher/args" @@ -102,7 +103,9 @@ func runMain() error { return stacktrace.NewError("Backend configuration parameters are null - there must be backend configuration parameters.") } - kurtosisBackend, err := getKurtosisBackend(ctx, serverArgs.KurtosisBackendType, backendConfig) + remoteContextBackendConfig := serverArgs.KurtosisRemoteBackendConfig + + kurtosisBackend, err := getKurtosisBackend(ctx, serverArgs.KurtosisBackendType, backendConfig, remoteContextBackendConfig) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the Kurtosis backend for backend type '%v' and config '%+v'", serverArgs.KurtosisBackendType, backendConfig) } @@ -150,16 +153,21 @@ func getEnclaveManager(kurtosisBackend backend_interface.KurtosisBackend, kurtos return enclaveManager, nil } -func getKurtosisBackend(ctx context.Context, kurtosisBackendType args.KurtosisBackendType, backendConfig interface{}) (backend_interface.KurtosisBackend, error) { +func getKurtosisBackend(ctx context.Context, kurtosisBackendType args.KurtosisBackendType, backendConfig interface{}, remoteBackendConfigMaybe *remote_context_backend.KurtosisRemoteBackendConfig) (backend_interface.KurtosisBackend, error) { var kurtosisBackend backend_interface.KurtosisBackend var err error switch kurtosisBackendType { case args.KurtosisBackendType_Docker: - kurtosisBackend, err = backend_creator.GetLocalDockerKurtosisBackend(apiContainerModeArgsForKurtosisBackend) + kurtosisBackend, err = remote_context_backend.GetContextAwareKurtosisBackend(remoteBackendConfigMaybe, apiContainerModeArgsForKurtosisBackend) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred getting local Docker Kurtosis backend") } case args.KurtosisBackendType_Kubernetes: + if remoteBackendConfigMaybe != nil { + return nil, stacktrace.NewError("Using Kubernetes as a local cluster connected to a remote " + + "Kurtosis backend is currently not supported. Either switch to a local-only context to use " + + "Kubernetes locally, or switch the cluster to Docker to connect to a remote Kurtosis backend") + } // Use this with more properties _, ok := (backendConfig).(kurtosis_backend_config.KubernetesBackendConfig) if !ok { diff --git a/engine/server/go.mod b/engine/server/go.mod index 2c53ef0cc5..c14f561a24 100644 --- a/engine/server/go.mod +++ b/engine/server/go.mod @@ -5,6 +5,7 @@ go 1.18 replace ( github.com/kurtosis-tech/kurtosis/api/golang => ../../api/golang github.com/kurtosis-tech/kurtosis/container-engine-lib => ../../container-engine-lib + github.com/kurtosis-tech/kurtosis/contexts-config-store => ../../contexts-config-store github.com/kurtosis-tech/kurtosis/core/launcher => ../../core/launcher github.com/kurtosis-tech/kurtosis/engine/launcher => ../launcher github.com/kurtosis-tech/kurtosis/kurtosis_version => ../../kurtosis_version @@ -22,11 +23,10 @@ require ( github.com/sirupsen/logrus v1.8.1 github.com/stretchr/testify v1.8.1 google.golang.org/grpc v1.41.0 - google.golang.org/protobuf v1.27.1 + google.golang.org/protobuf v1.29.1 ) require ( - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Microsoft/go-winio v0.4.17 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/docker/distribution v2.8.0+incompatible // indirect @@ -55,4 +55,5 @@ require github.com/gorilla/websocket v1.4.2 require ( github.com/kurtosis-tech/kurtosis/kurtosis_version v0.0.0 // indirect github.com/stretchr/objx v0.5.0 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect ) diff --git a/engine/server/go.sum b/engine/server/go.sum index 1b35533d7a..bde9c5beec 100644 --- a/engine/server/go.sum +++ b/engine/server/go.sum @@ -1,7 +1,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w= @@ -14,11 +13,9 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dmarkham/enumer v1.5.5/go.mod h1:qHwULwuCxYFAFM5KCkpF1U/U0BF5sNQKLccvUzKNY2w= github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ= @@ -94,20 +91,14 @@ github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409 h1:YQTATi github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409/go.mod h1:y5weVs5d9wXXHcDA1awRxkIhhHC1xxYJN8a7aXnE6S8= github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae h1:O4SWKdcHVCvYqyDV+9CJA1fcDN2L11Bule0iFy3YlAI= -github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= 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.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/pascaldekloe/name v1.0.0/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -119,7 +110,6 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB 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/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -129,7 +119,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.4/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -138,15 +127,12 @@ github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0o github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -155,8 +141,6 @@ golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -167,10 +151,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -181,8 +162,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -196,46 +177,31 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220513210249-45d2b4557a2a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= -golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -266,20 +232,18 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD 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/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= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo= -gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=