From 44f4cf70d959eadf0c3cd0d7e8ba216e3c5fde91 Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Tue, 27 Feb 2024 18:02:46 +0000 Subject: [PATCH 01/12] needs a lot of work like tests, docs and some cleanup --- core/server/api_container/main.go | 8 +- .../interpretation_time_value_store.go | 36 ++++++ .../service_value_repository.go | 114 ++++++++++++++++++ .../startosis_engine/kurtosis_builtins.go | 8 +- .../add_service/add_service.go | 13 +- .../add_service/add_services.go | 35 +++--- .../get_service/get_service.go | 95 +++++++++++++++ .../startosis_engine/startosis_interpreter.go | 25 ++-- .../startosis_interpreter_test.go | 2 +- 9 files changed, 306 insertions(+), 30 deletions(-) create mode 100644 core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go create mode 100644 core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go create mode 100644 core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go diff --git a/core/server/api_container/main.go b/core/server/api_container/main.go index 578470031e..268b664184 100644 --- a/core/server/api_container/main.go +++ b/core/server/api_container/main.go @@ -8,6 +8,7 @@ package main import ( "context" "fmt" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "net" "os" "path" @@ -203,6 +204,11 @@ func runMain() error { return stacktrace.Propagate(err, "An error occurred creating the runtime value store") } + interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, starlarkValueSerde) + if err != nil { + return stacktrace.Propagate(err, "an error occurred while creating the interpretation time value store") + } + // Load the current enclave plan, in case the enclave is being restarted enclavePlan, err := enclave_plan_persistence.Load(enclaveDb) if err != nil { @@ -211,7 +217,7 @@ func runMain() error { // TODO: Consolidate Interpreter, Validator and Executor into a single interface startosisRunner := startosis_engine.NewStartosisRunner( - startosis_engine.NewStartosisInterpreter(serviceNetwork, gitPackageContentProvider, runtimeValueStore, starlarkValueSerde, serverArgs.EnclaveEnvVars), + startosis_engine.NewStartosisInterpreter(serviceNetwork, gitPackageContentProvider, runtimeValueStore, starlarkValueSerde, serverArgs.EnclaveEnvVars, interpretationTimeValueStore), startosis_engine.NewStartosisValidator(&kurtosisBackend, serviceNetwork, filesArtifactStore), startosis_engine.NewStartosisExecutor(starlarkValueSerde, runtimeValueStore, enclavePlan, enclaveDb)) diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go new file mode 100644 index 0000000000..087cc344d7 --- /dev/null +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go @@ -0,0 +1,36 @@ +package interpretation_time_value_store + +import ( + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/enclave_db" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" + "github.com/kurtosis-tech/stacktrace" +) + +type InterpretationTimeValueStore struct { + serviceValues *serviceInterpretationValueRepository + serde *kurtosis_types.StarlarkValueSerde +} + +func CreateInterpretationTimeValueStore(enclaveDb *enclave_db.EnclaveDB, serde *kurtosis_types.StarlarkValueSerde) (*InterpretationTimeValueStore, error) { + serviceValuesRepository, err := getOrCreateNewServiceInterpretationTimeValueRepository(enclaveDb, serde) + if err != nil { + return nil, stacktrace.Propagate(err, "an error occurred creating interpretation time service value repository") + } + return &InterpretationTimeValueStore{serviceValues: serviceValuesRepository, serde: serde}, nil +} + +func (itvs *InterpretationTimeValueStore) AddService(name service.ServiceName, service *kurtosis_types.Service) error { + if err := itvs.serviceValues.AddService(name, service); err != nil { + return stacktrace.Propagate(err, "an error occurred while adding '%v' for service '%v' to db", service, name) + } + return nil +} + +func (itvs *InterpretationTimeValueStore) GetService(name service.ServiceName) (*kurtosis_types.Service, error) { + serviceStarlark, err := itvs.serviceValues.GetService(name) + if err != nil { + return nil, stacktrace.Propagate(err, "an error occurred fetching interpretation time value for '%v' from db", name) + } + return serviceStarlark, nil +} diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go new file mode 100644 index 0000000000..3a46a7a5fb --- /dev/null +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go @@ -0,0 +1,114 @@ +package interpretation_time_value_store + +import ( + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/enclave_db" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" + "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" + bolt "go.etcd.io/bbolt" +) + +var ( + serviceInterpretationValueBucketName = []byte("service-interpretation-value") + emptyValue = []byte{} +) + +type serviceInterpretationValueRepository struct { + enclaveDb *enclave_db.EnclaveDB + starlarkValueSerde *kurtosis_types.StarlarkValueSerde +} + +// TODO add tests for this module +func getOrCreateNewServiceInterpretationTimeValueRepository( + enclaveDb *enclave_db.EnclaveDB, + starlarkValueSerde *kurtosis_types.StarlarkValueSerde, +) (*serviceInterpretationValueRepository, error) { + if err := enclaveDb.Update(func(tx *bolt.Tx) error { + bucket, err := tx.CreateBucketIfNotExists(serviceInterpretationValueBucketName) + if err != nil { + return stacktrace.Propagate(err, "An error occurred while creating the recipe result database bucket") + } + logrus.Debugf("Recipe result bucket: '%+v'", bucket) + + return nil + }); err != nil { + return nil, stacktrace.Propagate(err, "An error occurred while building the recipe result repository") + } + + repository := &serviceInterpretationValueRepository{ + enclaveDb: enclaveDb, + starlarkValueSerde: starlarkValueSerde, + } + + return repository, nil +} + +func (repository *serviceInterpretationValueRepository) AddService(name service.ServiceName, service *kurtosis_types.Service) error { + logrus.Debugf("Saving service interpretation value '%v' for service with name '%v' to", service, name) + if err := repository.enclaveDb.Update(func(tx *bolt.Tx) error { + bucket := tx.Bucket(serviceInterpretationValueBucketName) + + serviceNameKey := getKey(name) + serializedValue := repository.starlarkValueSerde.Serialize(service) + + // save it to disk + if err := bucket.Put(serviceNameKey, []byte(serializedValue)); err != nil { + return stacktrace.Propagate(err, "An error occurred while saving service interpretation time value '%v' for service '%v'", serializedValue, serviceNameKey) + } + return nil + }); err != nil { + return stacktrace.Propagate(err, "An error occurred while saving service interpretation time value '%v' for service '%v'", service, name) + } + logrus.Debugf("Succesfully saved service '%v'", name) + return nil +} + +func (repository *serviceInterpretationValueRepository) GetService(name service.ServiceName) (*kurtosis_types.Service, error) { + logrus.Debugf("Getting service interpretation time value for service '%v'", name) + value := &kurtosis_types.Service{} + + if err := repository.enclaveDb.View(func(tx *bolt.Tx) error { + bucket := tx.Bucket(serviceInterpretationValueBucketName) + + serviceNameKey := getKey(name) + + serviceSerializedValue := bucket.Get(serviceNameKey) + + // check for existence + if serviceSerializedValue == nil { + return stacktrace.NewError("Service '%v' doesn't exist in the repository", name) + } + + isEmptyValue := len(serviceSerializedValue) == len(emptyValue) + + serviceSerializedValueStr := string(serviceSerializedValue) + + // this will the case if the key was saved with an empty value + if isEmptyValue { + return nil + } + + deserializedValue, interpretationErr := repository.starlarkValueSerde.Deserialize(serviceSerializedValueStr) + if interpretationErr != nil { + return stacktrace.Propagate(interpretationErr, "an error occurred while deserializing object associated with service '%v' in repository", name) + } + + var ok bool + value, ok = deserializedValue.(*kurtosis_types.Service) + if !ok { + return stacktrace.NewError("An error occurred converting the deserialized value '%v' into required internal type", deserializedValue) + } + + return nil + }); err != nil { + return nil, stacktrace.Propagate(err, "An error occurred while getting service '%v' from db", name) + } + logrus.Debugf("Successfully got value for '%v'", name) + return value, nil + +} + +func getKey(name service.ServiceName) []byte { + return []byte(name) +} diff --git a/core/server/api_container/server/startosis_engine/kurtosis_builtins.go b/core/server/api_container/server/startosis_engine/kurtosis_builtins.go index fc8df636b6..3152a6feb2 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_builtins.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_builtins.go @@ -6,8 +6,10 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/builtins/import_module" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/builtins/print_builtin" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/builtins/read_file" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/exec" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/kurtosis_print" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/remove_service" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/render_templates" @@ -60,10 +62,12 @@ func KurtosisPlanInstructions( packageContentProvider startosis_packages.PackageContentProvider, packageReplaceOptions map[string]string, nonBlockingMode bool, + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore, ) []*kurtosis_plan_instruction.KurtosisPlanInstruction { return []*kurtosis_plan_instruction.KurtosisPlanInstruction{ - add_service.NewAddService(serviceNetwork, runtimeValueStore, packageId, packageContentProvider, packageReplaceOptions), - add_service.NewAddServices(serviceNetwork, runtimeValueStore, packageId, packageContentProvider, packageReplaceOptions), + add_service.NewAddService(serviceNetwork, runtimeValueStore, packageId, packageContentProvider, packageReplaceOptions, interpretationTimeValueStore), + add_service.NewAddServices(serviceNetwork, runtimeValueStore, packageId, packageContentProvider, packageReplaceOptions, interpretationTimeValueStore), + get_service.NewGetService(interpretationTimeValueStore), verify.NewVerify(runtimeValueStore), exec.NewExec(serviceNetwork, runtimeValueStore), kurtosis_print.NewPrint(serviceNetwork, runtimeValueStore), diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go index a3686e9a6d..df99cce293 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go @@ -7,6 +7,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_plan_persistence" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/builtin_argument" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/kurtosis_plan_instruction" @@ -32,7 +33,8 @@ func NewAddService( runtimeValueStore *runtime_value_store.RuntimeValueStore, packageId string, packageContentProvider startosis_packages.PackageContentProvider, - packageReplaceOptions map[string]string) *kurtosis_plan_instruction.KurtosisPlanInstruction { + packageReplaceOptions map[string]string, + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore) *kurtosis_plan_instruction.KurtosisPlanInstruction { return &kurtosis_plan_instruction.KurtosisPlanInstruction{ KurtosisBaseBuiltin: &kurtosis_starlark_framework.KurtosisBaseBuiltin{ Name: AddServiceBuiltinName, @@ -74,6 +76,8 @@ func NewAddService( resultUuid: "", // populated at interpretation time readyCondition: nil, // populated at interpretation time + + interpretationTimeValueStore: interpretationTimeValueStore, } }, @@ -97,6 +101,8 @@ type AddServiceCapabilities struct { packageContentProvider startosis_packages.PackageContentProvider packageReplaceOptions map[string]string + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore + resultUuid string } @@ -134,6 +140,11 @@ func (builtin *AddServiceCapabilities) Interpret(locatorOfModuleInWhichThisBuilt if interpretationErr != nil { return nil, interpretationErr } + + err = builtin.interpretationTimeValueStore.AddService(builtin.serviceName, returnValue) + if err != nil { + return nil, startosis_errors.WrapWithInterpretationError(err, "an error occurred while persisting return value for service '%v'", serviceName) + } return returnValue, nil } diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go index a99eaa6ee2..85a79005a5 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go @@ -7,6 +7,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/service_network" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_plan_persistence" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/builtin_argument" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/kurtosis_plan_instruction" @@ -35,7 +36,8 @@ func NewAddServices( runtimeValueStore *runtime_value_store.RuntimeValueStore, packageId string, packageContentProvider startosis_packages.PackageContentProvider, - packageReplaceOptions map[string]string) *kurtosis_plan_instruction.KurtosisPlanInstruction { + packageReplaceOptions map[string]string, + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore) *kurtosis_plan_instruction.KurtosisPlanInstruction { return &kurtosis_plan_instruction.KurtosisPlanInstruction{ KurtosisBaseBuiltin: &kurtosis_starlark_framework.KurtosisBaseBuiltin{ Name: AddServicesBuiltinName, @@ -59,12 +61,13 @@ func NewAddServices( Capabilities: func() kurtosis_plan_instruction.KurtosisPlanInstructionCapabilities { return &AddServicesCapabilities{ - serviceNetwork: serviceNetwork, - runtimeValueStore: runtimeValueStore, - packageId: packageId, - packageContentProvider: packageContentProvider, - packageReplaceOptions: packageReplaceOptions, - serviceConfigs: nil, // populated at interpretation time + serviceNetwork: serviceNetwork, + runtimeValueStore: runtimeValueStore, + packageId: packageId, + packageContentProvider: packageContentProvider, + packageReplaceOptions: packageReplaceOptions, + serviceConfigs: nil, // populated at interpretation time + interpretationTimeValueStore: interpretationTimeValueStore, resultUuids: map[service.ServiceName]string{}, // populated at interpretation time readyConditions: nil, // populated at interpretation time @@ -80,11 +83,12 @@ func NewAddServices( } type AddServicesCapabilities struct { - serviceNetwork service_network.ServiceNetwork - runtimeValueStore *runtime_value_store.RuntimeValueStore - packageId string - packageContentProvider startosis_packages.PackageContentProvider - packageReplaceOptions map[string]string + serviceNetwork service_network.ServiceNetwork + runtimeValueStore *runtime_value_store.RuntimeValueStore + packageId string + packageContentProvider startosis_packages.PackageContentProvider + packageReplaceOptions map[string]string + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore serviceConfigs map[service.ServiceName]*service.ServiceConfig @@ -112,7 +116,7 @@ func (builtin *AddServicesCapabilities) Interpret(locatorOfModuleInWhichThisBuil builtin.serviceConfigs = serviceConfigs builtin.readyConditions = readyConditions - resultUuids, returnValue, interpretationErr := makeAddServicesInterpretationReturnValue(builtin.serviceConfigs, builtin.runtimeValueStore) + resultUuids, returnValue, interpretationErr := makeAddServicesInterpretationReturnValue(builtin.serviceConfigs, builtin.runtimeValueStore, builtin.interpretationTimeValueStore) if interpretationErr != nil { return nil, interpretationErr } @@ -450,7 +454,7 @@ func validateAndConvertConfigsAndReadyConditions( return convertedServiceConfigs, readyConditionsByServiceName, nil } -func makeAddServicesInterpretationReturnValue(serviceConfigs map[service.ServiceName]*service.ServiceConfig, runtimeValueStore *runtime_value_store.RuntimeValueStore) (map[service.ServiceName]string, *starlark.Dict, *startosis_errors.InterpretationError) { +func makeAddServicesInterpretationReturnValue(serviceConfigs map[service.ServiceName]*service.ServiceConfig, runtimeValueStore *runtime_value_store.RuntimeValueStore, interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore) (map[service.ServiceName]string, *starlark.Dict, *startosis_errors.InterpretationError) { servicesObjectDict := starlark.NewDict(len(serviceConfigs)) resultUuids := map[service.ServiceName]string{} var err error @@ -467,6 +471,9 @@ func makeAddServicesInterpretationReturnValue(serviceConfigs map[service.Service if err := servicesObjectDict.SetKey(serviceNameStr, serviceObject); err != nil { return nil, nil, startosis_errors.WrapWithInterpretationError(err, "Unable to generate the object that should be returned by the '%s' builtin", AddServicesBuiltinName) } + if err = interpretationTimeValueStore.AddService(serviceName, serviceObject); err != nil { + return nil, nil, startosis_errors.WrapWithInterpretationError(err, "an error occurred while persisting the return value for service with name '%v'", serviceName) + } } return resultUuids, servicesObjectDict, nil } diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go new file mode 100644 index 0000000000..0894b91d60 --- /dev/null +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go @@ -0,0 +1,95 @@ +package get_service + +import ( + "context" + "fmt" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_plan_persistence" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/builtin_argument" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/kurtosis_plan_instruction" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_errors" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_validator" + "go.starlark.net/starlark" +) + +const ( + GetServiceBuiltinName = "get_service" + ServiceNameArgName = "name" +) + +func NewGetService(interpretationTimeStore *interpretation_time_value_store.InterpretationTimeValueStore) *kurtosis_plan_instruction.KurtosisPlanInstruction { + return &kurtosis_plan_instruction.KurtosisPlanInstruction{ + KurtosisBaseBuiltin: &kurtosis_starlark_framework.KurtosisBaseBuiltin{ + Name: GetServiceBuiltinName, + Arguments: []*builtin_argument.BuiltinArgument{ + { + Name: ServiceNameArgName, + IsOptional: false, + ZeroValueProvider: builtin_argument.ZeroValueProvider[starlark.String], + Validator: func(value starlark.Value) *startosis_errors.InterpretationError { + return builtin_argument.NonEmptyString(value, ServiceNameArgName) + }, + }, + }, + Deprecation: nil, + }, + Capabilities: func() kurtosis_plan_instruction.KurtosisPlanInstructionCapabilities { + return &GetServiceCapabilities{interpretationTimeStore: interpretationTimeStore, serviceName: ""} + }, + DefaultDisplayArguments: nil, + } +} + +type GetServiceCapabilities struct { + interpretationTimeStore *interpretation_time_value_store.InterpretationTimeValueStore + serviceName service.ServiceName +} + +func (builtin *GetServiceCapabilities) Interpret(_ string, arguments *builtin_argument.ArgumentValuesSet) (starlark.Value, *startosis_errors.InterpretationError) { + serviceNameArgumentValue, err := builtin_argument.ExtractArgumentValue[starlark.String](arguments, ServiceNameArgName) + if err != nil { + return nil, startosis_errors.WrapWithInterpretationError(err, "Unable to extract value for '%s' argument", ServiceNameArgName) + } + serviceName := service.ServiceName(serviceNameArgumentValue.GoString()) + + serviceStarlarkValue, err := builtin.interpretationTimeStore.GetService(serviceName) + if err != nil { + return nil, startosis_errors.WrapWithInterpretationError(err, "an error occurred while fetching service '%v' from the store", serviceName) + } + + return serviceStarlarkValue, nil +} + +func (builtin *GetServiceCapabilities) Validate(_ *builtin_argument.ArgumentValuesSet, validatorEnvironment *startosis_validator.ValidatorEnvironment) *startosis_errors.ValidationError { + if exists := validatorEnvironment.DoesServiceNameExist(builtin.serviceName); exists != startosis_validator.ComponentNotFound { + return startosis_errors.NewValidationError("Service '%v' required by '%v' instruction doesn't exist", builtin.serviceName, GetServiceBuiltinName) + } + return nil +} + +func (builtin *GetServiceCapabilities) Execute(_ context.Context, _ *builtin_argument.ArgumentValuesSet) (string, error) { + // Note this is a no-op. + // Perhaps this instruction should be like `read_file` instead and not a part of any plan + // But that shouldn't be done outside a function; so it's here for now + return fmt.Sprintf("Fetched service '%v'", builtin.serviceName), nil +} + +func (builtin *GetServiceCapabilities) TryResolveWith(instructionsAreEqual bool, _ *enclave_plan_persistence.EnclavePlanInstruction, enclaveComponents *enclave_structure.EnclaveComponents) enclave_structure.InstructionResolutionStatus { + if instructionsAreEqual && enclaveComponents.HasServiceBeenUpdated(builtin.serviceName) { + return enclave_structure.InstructionIsUpdate + } else if instructionsAreEqual { + return enclave_structure.InstructionIsEqual + } + return enclave_structure.InstructionIsUnknown +} + +func (builtin *GetServiceCapabilities) FillPersistableAttributes(builder *enclave_plan_persistence.EnclavePlanInstructionBuilder) { + builder.SetType(GetServiceBuiltinName).AddServiceName(builtin.serviceName) +} + +func (builtin *GetServiceCapabilities) Description() string { + return fmt.Sprintf("Fetched service '%v'", builtin.serviceName) +} diff --git a/core/server/api_container/server/startosis_engine/startosis_interpreter.go b/core/server/api_container/server/startosis_engine/startosis_interpreter.go index ed23c5bd73..91740fe74d 100644 --- a/core/server/api_container/server/startosis_engine/startosis_interpreter.go +++ b/core/server/api_container/server/startosis_engine/startosis_interpreter.go @@ -11,6 +11,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan/resolver" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/plan_module" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/package_io" @@ -56,21 +57,23 @@ type StartosisInterpreter struct { serviceNetwork service_network.ServiceNetwork recipeExecutor *runtime_value_store.RuntimeValueStore // TODO AUTH there will be a leak here in case people with different repo visibility access a module - packageContentProvider startosis_packages.PackageContentProvider - starlarkValueSerde *kurtosis_types.StarlarkValueSerde - enclaveEnvVars string + packageContentProvider startosis_packages.PackageContentProvider + starlarkValueSerde *kurtosis_types.StarlarkValueSerde + enclaveEnvVars string + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore } type SerializedInterpretationOutput string -func NewStartosisInterpreter(serviceNetwork service_network.ServiceNetwork, packageContentProvider startosis_packages.PackageContentProvider, runtimeValueStore *runtime_value_store.RuntimeValueStore, starlarkValueSerde *kurtosis_types.StarlarkValueSerde, enclaveVarEnvs string) *StartosisInterpreter { +func NewStartosisInterpreter(serviceNetwork service_network.ServiceNetwork, packageContentProvider startosis_packages.PackageContentProvider, runtimeValueStore *runtime_value_store.RuntimeValueStore, starlarkValueSerde *kurtosis_types.StarlarkValueSerde, enclaveVarEnvs string, interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore) *StartosisInterpreter { return &StartosisInterpreter{ - mutex: &sync.Mutex{}, - serviceNetwork: serviceNetwork, - recipeExecutor: runtimeValueStore, - packageContentProvider: packageContentProvider, - enclaveEnvVars: enclaveVarEnvs, - starlarkValueSerde: starlarkValueSerde, + mutex: &sync.Mutex{}, + serviceNetwork: serviceNetwork, + recipeExecutor: runtimeValueStore, + packageContentProvider: packageContentProvider, + enclaveEnvVars: enclaveVarEnvs, + starlarkValueSerde: starlarkValueSerde, + interpretationTimeValueStore: interpretationTimeValueStore, } } @@ -270,7 +273,7 @@ func (interpreter *StartosisInterpreter) Interpret( if mainFuncParamsNum >= minimumParamsRequiredForPlan { firstParamName, _ := mainFunction.Param(planParamIndex) if firstParamName == planParamName { - kurtosisPlanInstructions := KurtosisPlanInstructions(packageId, interpreter.serviceNetwork, interpreter.recipeExecutor, interpreter.packageContentProvider, packageReplaceOptions, nonBlockingMode) + kurtosisPlanInstructions := KurtosisPlanInstructions(packageId, interpreter.serviceNetwork, interpreter.recipeExecutor, interpreter.packageContentProvider, packageReplaceOptions, nonBlockingMode, interpreter.interpretationTimeValueStore) planModule := plan_module.PlanModule(newInstructionsPlan, enclaveComponents, interpreter.starlarkValueSerde, instructionsPlanMask, kurtosisPlanInstructions) argsTuple = append(argsTuple, planModule) } diff --git a/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go b/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go index 4f560c25b3..699aaeb297 100644 --- a/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go +++ b/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go @@ -71,7 +71,7 @@ func (suite *StartosisInterpreterTestSuite) SetupTest() { suite.runtimeValueStore = runtimeValueStore suite.serviceNetwork = service_network.NewMockServiceNetwork(suite.T()) - suite.interpreter = NewStartosisInterpreter(suite.serviceNetwork, suite.packageContentProvider, suite.runtimeValueStore, nil, "") + suite.interpreter = NewStartosisInterpreter(suite.serviceNetwork, suite.packageContentProvider, suite.runtimeValueStore, nil, "", nil) service.NewServiceRegistration( testServiceName, From e5ac92a68eed8726a9a18a865e0bae66489b94ed Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Tue, 27 Feb 2024 19:04:29 +0000 Subject: [PATCH 02/12] tests pass --- .../test_engine/add_service_framework_test.go | 20 ++++---- .../add_services_framework_test.go | 20 ++++---- .../suite_kurtosis_plan_instruction_test.go | 12 +++-- .../startosis_interpreter_idempotent_test.go | 6 ++- .../startosis_interpreter_test.go | 15 ++++-- go.work.sum | 46 +++++++++++++++++++ 6 files changed, 95 insertions(+), 24 deletions(-) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_service_framework_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_service_framework_test.go index adb5eb05ac..774ace3ec0 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_service_framework_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_service_framework_test.go @@ -2,6 +2,7 @@ package test_engine import ( "fmt" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "testing" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_packages/mock_package_content_provider" @@ -22,9 +23,10 @@ import ( type addServiceTestCase struct { *testing.T - serviceNetwork *service_network.MockServiceNetwork - runtimeValueStore *runtime_value_store.RuntimeValueStore - packageContentProvider *mock_package_content_provider.MockPackageContentProvider + serviceNetwork *service_network.MockServiceNetwork + runtimeValueStore *runtime_value_store.RuntimeValueStore + packageContentProvider *mock_package_content_provider.MockPackageContentProvider + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore } func (suite *KurtosisPlanInstructionTestSuite) TestAddService() { @@ -67,10 +69,11 @@ func (suite *KurtosisPlanInstructionTestSuite) TestAddService() { ) suite.run(&addServiceTestCase{ - T: suite.T(), - serviceNetwork: suite.serviceNetwork, - runtimeValueStore: suite.runtimeValueStore, - packageContentProvider: suite.packageContentProvider, + T: suite.T(), + serviceNetwork: suite.serviceNetwork, + runtimeValueStore: suite.runtimeValueStore, + packageContentProvider: suite.packageContentProvider, + interpretationTimeValueStore: suite.interpretationTimeValueStore, }) } @@ -80,7 +83,8 @@ func (t *addServiceTestCase) GetInstruction() *kurtosis_plan_instruction.Kurtosi t.runtimeValueStore, testModulePackageId, t.packageContentProvider, - testNoPackageReplaceOptions) + testNoPackageReplaceOptions, + t.interpretationTimeValueStore) } func (t *addServiceTestCase) GetStarlarkCode() string { diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_services_framework_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_services_framework_test.go index 7912c700a0..e70931009e 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_services_framework_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/add_services_framework_test.go @@ -2,6 +2,7 @@ package test_engine import ( "fmt" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "io" "net/http" "net/url" @@ -25,9 +26,10 @@ import ( type addServicesTestCase struct { *testing.T - serviceNetwork *service_network.MockServiceNetwork - runtimeValueStore *runtime_value_store.RuntimeValueStore - packageContentProvider *mock_package_content_provider.MockPackageContentProvider + serviceNetwork *service_network.MockServiceNetwork + runtimeValueStore *runtime_value_store.RuntimeValueStore + packageContentProvider *mock_package_content_provider.MockPackageContentProvider + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore } func (suite *KurtosisPlanInstructionTestSuite) TestAddServices() { @@ -201,10 +203,11 @@ func (suite *KurtosisPlanInstructionTestSuite) TestAddServices() { }, nil) suite.run(&addServicesTestCase{ - T: suite.T(), - serviceNetwork: suite.serviceNetwork, - runtimeValueStore: suite.runtimeValueStore, - packageContentProvider: suite.packageContentProvider, + T: suite.T(), + serviceNetwork: suite.serviceNetwork, + runtimeValueStore: suite.runtimeValueStore, + packageContentProvider: suite.packageContentProvider, + interpretationTimeValueStore: suite.interpretationTimeValueStore, }) } @@ -214,7 +217,8 @@ func (t *addServicesTestCase) GetInstruction() *kurtosis_plan_instruction.Kurtos t.runtimeValueStore, testModulePackageId, t.packageContentProvider, - testNoPackageReplaceOptions) + testNoPackageReplaceOptions, + t.interpretationTimeValueStore) } func (t *addServicesTestCase) GetStarlarkCode() string { diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/suite_kurtosis_plan_instruction_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/suite_kurtosis_plan_instruction_test.go index 31db6acde1..468618d602 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/suite_kurtosis_plan_instruction_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/suite_kurtosis_plan_instruction_test.go @@ -6,6 +6,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan/resolver" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/kurtosis_plan_instruction" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/runtime_value_store" @@ -26,9 +27,10 @@ type KurtosisPlanInstructionTestSuite struct { starlarkThread *starlark.Thread starlarkEnv starlark.StringDict - serviceNetwork *service_network.MockServiceNetwork - runtimeValueStore *runtime_value_store.RuntimeValueStore - packageContentProvider *mock_package_content_provider.MockPackageContentProvider + serviceNetwork *service_network.MockServiceNetwork + runtimeValueStore *runtime_value_store.RuntimeValueStore + packageContentProvider *mock_package_content_provider.MockPackageContentProvider + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore } func TestKurtosisPlanInstructionSuite(t *testing.T) { @@ -47,6 +49,10 @@ func (suite *KurtosisPlanInstructionTestSuite) SetupTest() { suite.Require().NoError(err) suite.runtimeValueStore = runtimeValueStoreForTest + interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, serde) + suite.Require().NoError(err) + suite.interpretationTimeValueStore = interpretationTimeValueStore + suite.packageContentProvider = mock_package_content_provider.NewMockPackageContentProvider() } diff --git a/core/server/api_container/server/startosis_engine/startosis_interpreter_idempotent_test.go b/core/server/api_container/server/startosis_engine/startosis_interpreter_idempotent_test.go index 76407536c5..f60f45a376 100644 --- a/core/server/api_container/server/startosis_engine/startosis_interpreter_idempotent_test.go +++ b/core/server/api_container/server/startosis_engine/startosis_interpreter_idempotent_test.go @@ -9,6 +9,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan/resolver" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types/port_spec" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/runtime_value_store" @@ -62,12 +63,15 @@ func (suite *StartosisInterpreterIdempotentTestSuite) SetupTest() { runtimeValueStore, err := runtime_value_store.CreateRuntimeValueStore(starlarkValueSerde, enclaveDb) require.NoError(suite.T(), err) + interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, starlarkValueSerde) + require.Nil(suite.T(), err) + serviceNetwork := service_network.NewMockServiceNetwork(suite.T()) serviceNetwork.EXPECT().GetApiContainerInfo().Maybe().Return( service_network.NewApiContainerInfo(net.IPv4(0, 0, 0, 0), uint16(1234), "0.0.0"), ) serviceNetwork.EXPECT().GetEnclaveUuid().Maybe().Return(enclaveUuid) - suite.interpreter = NewStartosisInterpreter(serviceNetwork, suite.packageContentProvider, runtimeValueStore, starlarkValueSerde, "") + suite.interpreter = NewStartosisInterpreter(serviceNetwork, suite.packageContentProvider, runtimeValueStore, starlarkValueSerde, "", interpretationTimeValueStore) } func TestRunStartosisInterpreterIdempotentTestSuite(t *testing.T) { diff --git a/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go b/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go index 699aaeb297..c585fc3717 100644 --- a/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go +++ b/core/server/api_container/server/startosis_engine/startosis_interpreter_test.go @@ -13,6 +13,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan/resolver" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/kurtosis_print" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_instruction/remove_service" @@ -53,9 +54,10 @@ const ( type StartosisInterpreterTestSuite struct { suite.Suite - serviceNetwork *service_network.MockServiceNetwork - packageContentProvider *mock_package_content_provider.MockPackageContentProvider - runtimeValueStore *runtime_value_store.RuntimeValueStore + serviceNetwork *service_network.MockServiceNetwork + packageContentProvider *mock_package_content_provider.MockPackageContentProvider + runtimeValueStore *runtime_value_store.RuntimeValueStore + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore interpreter *StartosisInterpreter } @@ -71,7 +73,12 @@ func (suite *StartosisInterpreterTestSuite) SetupTest() { suite.runtimeValueStore = runtimeValueStore suite.serviceNetwork = service_network.NewMockServiceNetwork(suite.T()) - suite.interpreter = NewStartosisInterpreter(suite.serviceNetwork, suite.packageContentProvider, suite.runtimeValueStore, nil, "", nil) + interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, dummySerde) + require.NoError(suite.T(), err) + suite.interpretationTimeValueStore = interpretationTimeValueStore + require.NotNil(suite.T(), interpretationTimeValueStore) + + suite.interpreter = NewStartosisInterpreter(suite.serviceNetwork, suite.packageContentProvider, suite.runtimeValueStore, nil, "", suite.interpretationTimeValueStore) service.NewServiceRegistration( testServiceName, diff --git a/go.work.sum b/go.work.sum index c10ae32ea2..828496b9a5 100644 --- a/go.work.sum +++ b/go.work.sum @@ -30,12 +30,15 @@ cloud.google.com/go/automl v1.13.1 h1:iP9iQurb0qbz+YOOMfKSEjhONA/WcoOIjt6/m+6pIg cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= cloud.google.com/go/baremetalsolution v0.5.0 h1:2AipdYXL0VxMboelTTw8c1UJ7gYu35LZYUbuRv9Q28s= cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1 h1:0Ge9PQAy6cZ1tRrkc44UVgYV15nw2TVnzJzYsMHXF+E= cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= cloud.google.com/go/batch v0.7.0 h1:YbMt0E6BtqeD5FvSv1d56jbVsWEzlGm55lYte+M6Mzs= cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1 h1:uE0Q//W7FOGPjf7nuPiP0zoE8wOT3ngoIO2HIet0ilY= cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= cloud.google.com/go/beyondcorp v0.6.1 h1:doSatyJyIY1ffqsHuv5DiPSYoXZRIUrJYLArWLZqE/E= cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0 h1:VPg+fZXULQjs8LiMeWdLaB5oe8G9sEoZ0I0j6IMiG1Q= cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= cloud.google.com/go/bigquery v1.52.0 h1:JKLNdxI0N+TIUWD6t9KN646X27N5dQWq9dZbbTWZ8hc= cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= @@ -81,6 +84,7 @@ cloud.google.com/go/dataqna v0.8.1 h1:ITpUJep04hC9V7C+gcK390HO++xesQFSUJ7S4nSnF3 cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= cloud.google.com/go/datastore v1.12.0 h1:e713dRZv/yyGRHJ4MQLhAcuxlSzqXlYvEYFMKM7q0u4= cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1 h1:i8HMKsqg/Sl3ZlOTGl471Z8j2uKtbRDT9VXJUIVlMik= cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= cloud.google.com/go/datastream v1.9.1 h1:BxAt9Tvi1hoEqI4fvyXh/Oc8vd7b5aCZb3bzewh8Dvg= cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= @@ -112,6 +116,7 @@ cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= cloud.google.com/go/gkebackup v0.4.0 h1:za3QZvw6ujR0uyqkhomKKKNoXDyqYGPJies3voUK8DA= cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0 h1:lgyrpdhtJKV7l1GM15YFt+OCyHMxsQZuSydyNmS0Pxo= cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= cloud.google.com/go/gkeconnect v0.8.1 h1:a1ckRvVznnuvDWESM2zZDzSVFvggeBaVY5+BVB8tbT0= cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= @@ -126,6 +131,7 @@ cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kO cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iam v1.1.0 h1:67gSqaPukx7O8WLLHMa0PNs3EBGd2eE4d+psbO/CO94= cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/iap v1.8.1 h1:X1tcp+EoJ/LGX6cUPt3W2D4H2Kbqq0pLAsldnsCjLlE= cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= @@ -149,6 +155,7 @@ cloud.google.com/go/managedidentities v1.6.1 h1:2/qZuOeLgUHorSdxSQGtnOu9xQkBn37+ cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= cloud.google.com/go/maps v0.7.0 h1:mv9YaczD4oZBZkM5XJl6fXQ984IkJNHPwkc8MUsdkBo= cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0 h1:m4BlGu0qnPwuq5aToT3atcVckS+hf40jsRXveJhusJI= cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= cloud.google.com/go/mediatranslation v0.8.1 h1:50cF7c1l3BanfKrpnTCaTvhf+Fo6kdF21DG0byG7gYU= cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= @@ -202,6 +209,7 @@ cloud.google.com/go/retail v1.14.1 h1:gYBrb9u/Hc5s5lUTFXX1Vsbc/9BEvgtioY6ZKaK0DK cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= cloud.google.com/go/run v0.9.0 h1:ydJQo+k+MShYnBfhaRHSZYeD/SQKZzZLAROyfpeD9zw= cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0 h1:kHeIG8q+N6Zv0nDkBjSOYfK2eWqa5FnaiDPH/7/HirE= cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= cloud.google.com/go/scheduler v1.10.1 h1:yoZbZR8880KgPGLmACOMCiY2tPk+iX4V/dkxqTirlz8= cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= @@ -357,10 +365,12 @@ github.com/aws/aws-sdk-go-v2 v1.17.6 h1:Y773UK7OBqhzi5VDXMi1zVGsoj+CVHs2eaC2bDsL github.com/aws/aws-sdk-go-v2 v1.17.6/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= github.com/aws/aws-sdk-go-v2/config v1.18.16 h1:4r7gsCu8Ekwl5iJGE/GmspA2UifqySCCkyyyPFeWs3w= github.com/aws/aws-sdk-go-v2/config v1.18.16/go.mod h1:XjM6lVbq7UgELp9NjXBrb1DQY/ownlWsvDhEQksemJc= +github.com/aws/aws-sdk-go-v2/config v1.18.19 h1:AqFK6zFNtq4i1EYu+eC7lcKHYnZagMn6SW171la0bGw= github.com/aws/aws-sdk-go-v2/credentials v1.13.16 h1:GgToSxaENX/1zXIGNFfiVk4hxryYJ5Vt4Mh8XLAL7Lc= github.com/aws/aws-sdk-go-v2/credentials v1.13.16/go.mod h1:KP7aFJhfwPFgx9aoVYL2nYHjya5WBD98CWaadpgmnpY= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.24 h1:5qyqXASrX2zy5cTnoHHa4N2c3Lc94GH7gjnBP3GwKdU= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.24/go.mod h1:neYVaeKr5eT7BzwULuG2YbLhzWZ22lpjKdCybR7AXrQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.1 h1:gt57MN3liKiyGopcqgNzJb2+d9MJaKT/q1OksHNXVE4= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.56 h1:kFDCPqqVvb9vYcW82L7xYfrBGpuxXQ/8A/zYVayRQK4= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.56/go.mod h1:FoSBuessadgy8Cqp9gQF8U5rzi1XVQhiEJ6su2/kBEE= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.30 h1:y+8n9AGDjikyXoMBTRaHHHSaFEB8267ykmvyPodJfys= @@ -369,6 +379,7 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24 h1:r+Kv+SEJquhAZXaJ7G github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24/go.mod h1:gAuCezX/gob6BSMbItsSlMb6WZGV7K2+fWOvk8xBSto= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.31 h1:hf+Vhp5WtTdcSdE+yEcUz8L73sAzN0R+0jQv+Z51/mI= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.31/go.mod h1:5zUjguZfG5qjhG9/wqmuyHRyUftl2B5Cp6NNxNC6kRA= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.32 h1:p5luUImdIqywn6JpQsW3tq5GNOxKmOnEpybzPx+d1lk= github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.22 h1:lTqBRUuy8oLhBsnnVZf14uRbIHPHCrGqg4Plc8gU/1U= github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.22/go.mod h1:YsOa3tFriwWNvBPYHXM5ARiU2yqBNWPWeUiq+4i7Na0= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.25 h1:B/hO3jfWRm7hP00UeieNlI5O2xP5WJ27tyJG5lzc7AM= @@ -381,10 +392,13 @@ github.com/aws/aws-sdk-go-v2/service/s3 v1.30.6 h1:zzTm99krKsFcF4N7pu2z17yCcAZpQ github.com/aws/aws-sdk-go-v2/service/s3 v1.30.6/go.mod h1:PudwVKUTApfm0nYaPutOXaKdPKTlZYClGBQpVIRdcbs= github.com/aws/aws-sdk-go-v2/service/sso v1.12.5 h1:bdKIX6SVF3nc3xJFw6Nf0igzS6Ff/louGq8Z6VP/3Hs= github.com/aws/aws-sdk-go-v2/service/sso v1.12.5/go.mod h1:vuWiaDB30M/QTC+lI3Wj6S/zb7tpUK2MSYgy3Guh2L0= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.6 h1:5V7DWLBd7wTELVz5bPpwzYy/sikk0gsgZfj40X+l5OI= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.5 h1:xLPZMyuZ4GuqRCIec/zWuIhRFPXh2UOJdLXBSi64ZWQ= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.5/go.mod h1:QjxpHmCwAg0ESGtPQnLIVp7SedTOBMYy+Slr3IfMKeI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.6 h1:B8cauxOH1W1v7rd8RdI/MWnoR4Ze0wIHWrb90qczxj4= github.com/aws/aws-sdk-go-v2/service/sts v1.18.6 h1:rIFn5J3yDoeuKCE9sESXqM5POTAhOP1du3bv/qTL+tE= github.com/aws/aws-sdk-go-v2/service/sts v1.18.6/go.mod h1:48WJ9l3dwP0GSHWGc5sFGGlCkuA82Mc2xnw+T6Q8aDw= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.7 h1:bWNgNdRko2x6gqa0blfATqAZKZokPIeM1vfmQt2pnvM= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -497,6 +511,8 @@ github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAAZ8l63Ydzw= github.com/docker/cli v24.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= @@ -510,6 +526,8 @@ github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNE github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780 h1:tFh1tRc4CA31yP6qDcu+Trax5wW5GuMxvkIba07qVLY= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= @@ -574,6 +592,7 @@ github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/lint v0.0.0-20180702182130-06c8688daad7 h1:2hRPrmiwPrp3fQX967rNJIhQPtiGXdlQWAxKbKw3VHA= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E= github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= @@ -665,6 +684,7 @@ github.com/itchyny/timefmt-go v0.1.5 h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm github.com/itchyny/timefmt-go v0.1.5/go.mod h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1 h1:ujPKutqRlJtcfWk6toYVYagwra7HQHbXOaS171b4Tg8= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= @@ -827,6 +847,8 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a h1:9ZKAASQSHhDYGoxY8uLVpewe1GDZ2vu2Tr/vTdVAkFQ= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/tview v0.0.0-20221029100920-c4a7e501810d h1:jKIUJdMcIVGOSHi6LSqJqw9RqblyblE2ZrHvFbWR3S0= github.com/rivo/tview v0.0.0-20221029100920-c4a7e501810d/go.mod h1:YX2wUZOcJGOIycErz2s9KvDaP0jnWwRCirQMPLPpQ+Y= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= @@ -940,6 +962,8 @@ github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMzt github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738 h1:VcrIfasaLFkyjk6KNlXQSzO+B0fZcnECiDrKJsfxka0= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= @@ -1002,6 +1026,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= google.golang.org/api v0.40.0 h1:uWrpz12dpVPn7cojP82mk02XDgTJLDPc2KbVTxrWb4A= google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= @@ -1060,6 +1086,26 @@ kernel.org/pub/linux/libs/security/libcap/cap v1.2.67 h1:sPQ9qlSNR26fToTKbxe/HDW kernel.org/pub/linux/libs/security/libcap/cap v1.2.67/go.mod h1:GkntoBuwffz19qtdFVB+k2NtWNN+yCKnC/Ykv/hMiTU= kernel.org/pub/linux/libs/security/libcap/psx v1.2.67 h1:NxbXJ7pDVq0FKBsqjieT92QDXI2XaqH2HAi4QcCOHt8= kernel.org/pub/linux/libs/security/libcap/psx v1.2.67/go.mod h1:+l6Ee2F59XiJ2I6WR5ObpC1utCQJZ/VLsEbQCD8RG24= +lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.2 h1:S2uFiaNPd/vTAP/4EmyY8Qe2Quzu26A2L1e25xRNTio= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= From 5e73cafa57ea6b5744c51d9eb1675795246a15ce Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 12:49:19 +0000 Subject: [PATCH 03/12] added the get_service instruction --- .../service_value_repository_test.go | 93 +++++++++++++++++++ .../get_service/get_service.go | 2 + .../startosis_add_service_test.go | 5 + 3 files changed, 100 insertions(+) create mode 100644 core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go new file mode 100644 index 0000000000..8b59d4d118 --- /dev/null +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go @@ -0,0 +1,93 @@ +package interpretation_time_value_store + +import ( + port_spec_core "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/port_spec" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/database_accessors/enclave_db" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/kurtosis_types/port_spec" + "github.com/stretchr/testify/require" + bolt "go.etcd.io/bbolt" + "go.starlark.net/starlark" + "go.starlark.net/starlarkstruct" + "os" + "testing" +) + +const ( + starlarkThreadName = "thread-for-db-test" + serviceName = service.ServiceName("datastore-1") + serviceNameStarlarkStr = starlark.String(serviceName) + hostName = serviceNameStarlarkStr + ipAddress = starlark.String("172.23.34.44") +) + +func TestAddAndGetTest(t *testing.T) { + repository := getRecipeResultRepositoryForTest(t) + require.NotNil(t, repository) + + applicationProtocol := "" + maybeUrl := "" + + port, interpretationErr := port_spec.CreatePortSpecUsingGoValues( + "my-test-service", + uint16(443), + port_spec_core.TransportProtocol_TCP, + &applicationProtocol, + "10s", + &maybeUrl, + ) + require.Nil(t, interpretationErr) + ports := starlark.NewDict(1) + require.NoError(t, ports.SetKey(starlark.String("http"), port)) + + expectedService, interpretationErr := kurtosis_types.CreateService(serviceNameStarlarkStr, hostName, ipAddress, ports) + require.Nil(t, interpretationErr) + + err := repository.AddService(serviceName, expectedService) + require.Nil(t, err) + + actualService, err := repository.GetService(serviceName) + require.Nil(t, err) + require.Equal(t, expectedService.AttrNames(), actualService.AttrNames()) + require.Equal(t, expectedService.String(), actualService.String()) +} + +func getRecipeResultRepositoryForTest(t *testing.T) *serviceInterpretationValueRepository { + file, err := os.CreateTemp("/tmp", "*.db") + defer func() { + err = os.Remove(file.Name()) + require.NoError(t, err) + }() + + require.NoError(t, err) + db, err := bolt.Open(file.Name(), 0666, nil) + require.NoError(t, err) + enclaveDb := &enclave_db.EnclaveDB{ + DB: db, + } + + dummySerde := newDummyStarlarkValueSerDeForTest() + + repository, err := getOrCreateNewServiceInterpretationTimeValueRepository(enclaveDb, dummySerde) + require.NoError(t, err) + + return repository +} + +func newDummyStarlarkValueSerDeForTest() *kurtosis_types.StarlarkValueSerde { + thread := &starlark.Thread{ + Name: starlarkThreadName, + Print: nil, + Load: nil, + OnMaxSteps: nil, + Steps: 0, + } + starlarkEnv := starlark.StringDict{ + starlarkstruct.Default.GoString(): starlark.NewBuiltin(starlarkstruct.Default.GoString(), starlarkstruct.Make), + + kurtosis_types.ServiceTypeName: starlark.NewBuiltin(kurtosis_types.ServiceTypeName, kurtosis_types.NewServiceType().CreateBuiltin()), + port_spec.PortSpecTypeName: starlark.NewBuiltin(port_spec.PortSpecTypeName, port_spec.NewPortSpecType().CreateBuiltin()), + } + return kurtosis_types.NewStarlarkValueSerde(thread, starlarkEnv) +} diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go index 0894b91d60..9b3048c0a0 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go @@ -55,6 +55,8 @@ func (builtin *GetServiceCapabilities) Interpret(_ string, arguments *builtin_ar } serviceName := service.ServiceName(serviceNameArgumentValue.GoString()) + builtin.serviceName = serviceName + serviceStarlarkValue, err := builtin.interpretationTimeStore.GetService(serviceName) if err != nil { return nil, startosis_errors.WrapWithInterpretationError(err, "an error occurred while fetching service '%v' from the store", serviceName) diff --git a/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go b/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go index 809a8a6c20..3ea4f6a6e7 100644 --- a/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go +++ b/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go @@ -36,6 +36,9 @@ def run(plan): datastore_1 = plan.add_service(name = SERVICE_NAME, config = config) datastore_2 = plan.add_service(name = SERVICE_NAME_2, config = config) + ds1_through_get = plan.get_service(SERVICE_NAME) + plan.print(ds1_through_get) + test_hostname_cmd = "nc -zv {0} {1}".format(datastore_1.hostname, GRPC_PORT) connection_result = plan.exec( recipe = ExecRecipe( @@ -67,6 +70,8 @@ func (suite *StartosisAddServiceTestSuite) TestAddTwoServicesAndTestConnection() expectedScriptOutput := `Adding services ` + serviceName + ` and ` + serviceName2 + ` Service '` + serviceName + `' added with service UUID '[a-z-0-9]+' Service '` + serviceName2 + `' added with service UUID '[a-z-0-9]+' +Fetched service '` + "" + `' +Service\(name="datastore-1", hostname="datastore-1", ip_address="[0-9\.]+", ports=\{"grpc": PortSpec\(number=1323, transport_protocol="TCP", wait="2m0s"\)\}\) Command returned with exit code '0' and the following output: -------------------- [a-z-0-9]+ \([0-9\.]+:1323\) open From 55f08af795f7cbc44592643fe96a9168b6c89796 Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 12:57:46 +0000 Subject: [PATCH 04/12] fixed test --- .../interpretation_time_value_store.go | 6 +++--- .../service_value_repository.go | 5 ++--- .../service_value_repository_test.go | 2 +- .../kurtosis_instruction/add_service/add_service.go | 2 +- .../kurtosis_instruction/add_service/add_services.go | 8 ++++---- .../kurtosis_instruction/get_service/get_service.go | 2 +- .../startosis_add_service_test.go | 2 +- 7 files changed, 13 insertions(+), 14 deletions(-) diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go index 087cc344d7..6a99504faf 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go @@ -15,14 +15,14 @@ type InterpretationTimeValueStore struct { func CreateInterpretationTimeValueStore(enclaveDb *enclave_db.EnclaveDB, serde *kurtosis_types.StarlarkValueSerde) (*InterpretationTimeValueStore, error) { serviceValuesRepository, err := getOrCreateNewServiceInterpretationTimeValueRepository(enclaveDb, serde) if err != nil { - return nil, stacktrace.Propagate(err, "an error occurred creating interpretation time service value repository") + return nil, stacktrace.Propagate(err, "An error occurred creating interpretation time value store") } return &InterpretationTimeValueStore{serviceValues: serviceValuesRepository, serde: serde}, nil } func (itvs *InterpretationTimeValueStore) AddService(name service.ServiceName, service *kurtosis_types.Service) error { if err := itvs.serviceValues.AddService(name, service); err != nil { - return stacktrace.Propagate(err, "an error occurred while adding '%v' for service '%v' to db", service, name) + return stacktrace.Propagate(err, "An error occurred while adding value '%v' for service '%v' to db", service, name) } return nil } @@ -30,7 +30,7 @@ func (itvs *InterpretationTimeValueStore) AddService(name service.ServiceName, s func (itvs *InterpretationTimeValueStore) GetService(name service.ServiceName) (*kurtosis_types.Service, error) { serviceStarlark, err := itvs.serviceValues.GetService(name) if err != nil { - return nil, stacktrace.Propagate(err, "an error occurred fetching interpretation time value for '%v' from db", name) + return nil, stacktrace.Propagate(err, "An error occurred fetching interpretation time value for '%v' from db", name) } return serviceStarlark, nil } diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go index 3a46a7a5fb..655621898b 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go @@ -19,7 +19,6 @@ type serviceInterpretationValueRepository struct { starlarkValueSerde *kurtosis_types.StarlarkValueSerde } -// TODO add tests for this module func getOrCreateNewServiceInterpretationTimeValueRepository( enclaveDb *enclave_db.EnclaveDB, starlarkValueSerde *kurtosis_types.StarlarkValueSerde, @@ -27,13 +26,13 @@ func getOrCreateNewServiceInterpretationTimeValueRepository( if err := enclaveDb.Update(func(tx *bolt.Tx) error { bucket, err := tx.CreateBucketIfNotExists(serviceInterpretationValueBucketName) if err != nil { - return stacktrace.Propagate(err, "An error occurred while creating the recipe result database bucket") + return stacktrace.Propagate(err, "An error occurred while creating the bucket for the service interpretation time value repository") } logrus.Debugf("Recipe result bucket: '%+v'", bucket) return nil }); err != nil { - return nil, stacktrace.Propagate(err, "An error occurred while building the recipe result repository") + return nil, stacktrace.Propagate(err, "An error occurred while building service interpretation time value repository") } repository := &serviceInterpretationValueRepository{ diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go index 8b59d4d118..a92a97126a 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go @@ -30,7 +30,7 @@ func TestAddAndGetTest(t *testing.T) { maybeUrl := "" port, interpretationErr := port_spec.CreatePortSpecUsingGoValues( - "my-test-service", + string(serviceName), uint16(443), port_spec_core.TransportProtocol_TCP, &applicationProtocol, diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go index df99cce293..8eb3e9a624 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go @@ -143,7 +143,7 @@ func (builtin *AddServiceCapabilities) Interpret(locatorOfModuleInWhichThisBuilt err = builtin.interpretationTimeValueStore.AddService(builtin.serviceName, returnValue) if err != nil { - return nil, startosis_errors.WrapWithInterpretationError(err, "an error occurred while persisting return value for service '%v'", serviceName) + return nil, startosis_errors.WrapWithInterpretationError(err, "An error occurred while persisting return value for service '%v'", serviceName) } return returnValue, nil } diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go index 85a79005a5..ca50444f52 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go @@ -116,7 +116,7 @@ func (builtin *AddServicesCapabilities) Interpret(locatorOfModuleInWhichThisBuil builtin.serviceConfigs = serviceConfigs builtin.readyConditions = readyConditions - resultUuids, returnValue, interpretationErr := makeAddServicesInterpretationReturnValue(builtin.serviceConfigs, builtin.runtimeValueStore, builtin.interpretationTimeValueStore) + resultUuids, returnValue, interpretationErr := makeAndPersistAddServicesInterpretationReturnValue(builtin.serviceConfigs, builtin.runtimeValueStore, builtin.interpretationTimeValueStore) if interpretationErr != nil { return nil, interpretationErr } @@ -206,7 +206,7 @@ func (builtin *AddServicesCapabilities) Execute(ctx context.Context, _ *builtin_ serviceMsg := fmt.Sprintf("Service '%v' error:\n%v\n", serviceName, serviceErr) allServiceChecksErrMsg = allServiceChecksErrMsg + serviceMsg } - return "", stacktrace.NewError("An error occurred while checking al service, these are the errors by service:\n%s", allServiceChecksErrMsg) + return "", stacktrace.NewError("An error occurred while checking all service, these are the errors by service:\n%s", allServiceChecksErrMsg) } defer func() { if shouldDeleteAllStartedServices { @@ -454,7 +454,7 @@ func validateAndConvertConfigsAndReadyConditions( return convertedServiceConfigs, readyConditionsByServiceName, nil } -func makeAddServicesInterpretationReturnValue(serviceConfigs map[service.ServiceName]*service.ServiceConfig, runtimeValueStore *runtime_value_store.RuntimeValueStore, interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore) (map[service.ServiceName]string, *starlark.Dict, *startosis_errors.InterpretationError) { +func makeAndPersistAddServicesInterpretationReturnValue(serviceConfigs map[service.ServiceName]*service.ServiceConfig, runtimeValueStore *runtime_value_store.RuntimeValueStore, interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore) (map[service.ServiceName]string, *starlark.Dict, *startosis_errors.InterpretationError) { servicesObjectDict := starlark.NewDict(len(serviceConfigs)) resultUuids := map[service.ServiceName]string{} var err error @@ -472,7 +472,7 @@ func makeAddServicesInterpretationReturnValue(serviceConfigs map[service.Service return nil, nil, startosis_errors.WrapWithInterpretationError(err, "Unable to generate the object that should be returned by the '%s' builtin", AddServicesBuiltinName) } if err = interpretationTimeValueStore.AddService(serviceName, serviceObject); err != nil { - return nil, nil, startosis_errors.WrapWithInterpretationError(err, "an error occurred while persisting the return value for service with name '%v'", serviceName) + return nil, nil, startosis_errors.WrapWithInterpretationError(err, "An error occurred while persisting the return value for service with name '%v'", serviceName) } } return resultUuids, servicesObjectDict, nil diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go index 9b3048c0a0..e35c097d75 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go @@ -59,7 +59,7 @@ func (builtin *GetServiceCapabilities) Interpret(_ string, arguments *builtin_ar serviceStarlarkValue, err := builtin.interpretationTimeStore.GetService(serviceName) if err != nil { - return nil, startosis_errors.WrapWithInterpretationError(err, "an error occurred while fetching service '%v' from the store", serviceName) + return nil, startosis_errors.WrapWithInterpretationError(err, "An error occurred while fetching service '%v' from the store", serviceName) } return serviceStarlarkValue, nil diff --git a/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go b/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go index 3ea4f6a6e7..cbd8fad27b 100644 --- a/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go +++ b/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_service_test.go @@ -70,7 +70,7 @@ func (suite *StartosisAddServiceTestSuite) TestAddTwoServicesAndTestConnection() expectedScriptOutput := `Adding services ` + serviceName + ` and ` + serviceName2 + ` Service '` + serviceName + `' added with service UUID '[a-z-0-9]+' Service '` + serviceName2 + `' added with service UUID '[a-z-0-9]+' -Fetched service '` + "" + `' +Fetched service '` + serviceName + `' Service\(name="datastore-1", hostname="datastore-1", ip_address="[0-9\.]+", ports=\{"grpc": PortSpec\(number=1323, transport_protocol="TCP", wait="2m0s"\)\}\) Command returned with exit code '0' and the following output: -------------------- From 968c144d8aba3f1b10028ae69a948d1ad5ab5f1f Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 12:59:17 +0000 Subject: [PATCH 05/12] fix linter --- .../interpretation_time_value_store/service_value_repository.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go index 655621898b..e09d35188f 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go @@ -65,7 +65,7 @@ func (repository *serviceInterpretationValueRepository) AddService(name service. func (repository *serviceInterpretationValueRepository) GetService(name service.ServiceName) (*kurtosis_types.Service, error) { logrus.Debugf("Getting service interpretation time value for service '%v'", name) - value := &kurtosis_types.Service{} + var value *kurtosis_types.Service if err := repository.enclaveDb.View(func(tx *bolt.Tx) error { bucket := tx.Bucket(serviceInterpretationValueBucketName) From 141e6bedcaa1be64a3fb6c31924a9d0aeb7053e2 Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 13:39:07 +0000 Subject: [PATCH 06/12] fixed validaiton --- .../kurtosis_instruction/get_service/get_service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go index e35c097d75..d96cac710d 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go @@ -66,7 +66,7 @@ func (builtin *GetServiceCapabilities) Interpret(_ string, arguments *builtin_ar } func (builtin *GetServiceCapabilities) Validate(_ *builtin_argument.ArgumentValuesSet, validatorEnvironment *startosis_validator.ValidatorEnvironment) *startosis_errors.ValidationError { - if exists := validatorEnvironment.DoesServiceNameExist(builtin.serviceName); exists != startosis_validator.ComponentNotFound { + if exists := validatorEnvironment.DoesServiceNameExist(builtin.serviceName); exists == startosis_validator.ComponentNotFound { return startosis_errors.NewValidationError("Service '%v' required by '%v' instruction doesn't exist", builtin.serviceName, GetServiceBuiltinName) } return nil From 6fd17bc8b9c757f72c1e0dc8de1d55ab5ac99622 Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 14:28:10 +0000 Subject: [PATCH 07/12] some renames --- .../server/service_network/mock_service_network.go | 4 ++-- .../interpretation_time_value_store.go | 4 ++-- .../service_value_repository.go | 6 +++--- .../service_value_repository_test.go | 2 +- .../kurtosis_instruction/add_service/add_service.go | 2 +- .../kurtosis_instruction/add_service/add_services.go | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/server/api_container/server/service_network/mock_service_network.go b/core/server/api_container/server/service_network/mock_service_network.go index 72022a913f..837ba4cdac 100644 --- a/core/server/api_container/server/service_network/mock_service_network.go +++ b/core/server/api_container/server/service_network/mock_service_network.go @@ -62,7 +62,7 @@ func (_m *MockServiceNetwork) AddService(ctx context.Context, serviceName servic return r0, r1 } -// MockServiceNetwork_AddService_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddService' +// MockServiceNetwork_AddService_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PutService' type MockServiceNetwork_AddService_Call struct { *mock.Call } @@ -72,7 +72,7 @@ type MockServiceNetwork_AddService_Call struct { // - serviceName service.ServiceName // - serviceConfig *service.ServiceConfig func (_e *MockServiceNetwork_Expecter) AddService(ctx interface{}, serviceName interface{}, serviceConfig interface{}) *MockServiceNetwork_AddService_Call { - return &MockServiceNetwork_AddService_Call{Call: _e.mock.On("AddService", ctx, serviceName, serviceConfig)} + return &MockServiceNetwork_AddService_Call{Call: _e.mock.On("PutService", ctx, serviceName, serviceConfig)} } func (_c *MockServiceNetwork_AddService_Call) Run(run func(ctx context.Context, serviceName service.ServiceName, serviceConfig *service.ServiceConfig)) *MockServiceNetwork_AddService_Call { diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go index 6a99504faf..af89cd79cc 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store.go @@ -20,8 +20,8 @@ func CreateInterpretationTimeValueStore(enclaveDb *enclave_db.EnclaveDB, serde * return &InterpretationTimeValueStore{serviceValues: serviceValuesRepository, serde: serde}, nil } -func (itvs *InterpretationTimeValueStore) AddService(name service.ServiceName, service *kurtosis_types.Service) error { - if err := itvs.serviceValues.AddService(name, service); err != nil { +func (itvs *InterpretationTimeValueStore) PutService(name service.ServiceName, service *kurtosis_types.Service) error { + if err := itvs.serviceValues.PutService(name, service); err != nil { return stacktrace.Propagate(err, "An error occurred while adding value '%v' for service '%v' to db", service, name) } return nil diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go index e09d35188f..7106e086ad 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go @@ -43,7 +43,7 @@ func getOrCreateNewServiceInterpretationTimeValueRepository( return repository, nil } -func (repository *serviceInterpretationValueRepository) AddService(name service.ServiceName, service *kurtosis_types.Service) error { +func (repository *serviceInterpretationValueRepository) PutService(name service.ServiceName, service *kurtosis_types.Service) error { logrus.Debugf("Saving service interpretation value '%v' for service with name '%v' to", service, name) if err := repository.enclaveDb.Update(func(tx *bolt.Tx) error { bucket := tx.Bucket(serviceInterpretationValueBucketName) @@ -83,9 +83,9 @@ func (repository *serviceInterpretationValueRepository) GetService(name service. serviceSerializedValueStr := string(serviceSerializedValue) - // this will the case if the key was saved with an empty value + // if an empty value was found we return an error if isEmptyValue { - return nil + return stacktrace.NewError("An empty value was found for service '%v'; this is unexpected", name) } deserializedValue, interpretationErr := repository.starlarkValueSerde.Deserialize(serviceSerializedValueStr) diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go index a92a97126a..86dfb5f908 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go @@ -44,7 +44,7 @@ func TestAddAndGetTest(t *testing.T) { expectedService, interpretationErr := kurtosis_types.CreateService(serviceNameStarlarkStr, hostName, ipAddress, ports) require.Nil(t, interpretationErr) - err := repository.AddService(serviceName, expectedService) + err := repository.PutService(serviceName, expectedService) require.Nil(t, err) actualService, err := repository.GetService(serviceName) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go index 8eb3e9a624..1fbef6e632 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service.go @@ -141,7 +141,7 @@ func (builtin *AddServiceCapabilities) Interpret(locatorOfModuleInWhichThisBuilt return nil, interpretationErr } - err = builtin.interpretationTimeValueStore.AddService(builtin.serviceName, returnValue) + err = builtin.interpretationTimeValueStore.PutService(builtin.serviceName, returnValue) if err != nil { return nil, startosis_errors.WrapWithInterpretationError(err, "An error occurred while persisting return value for service '%v'", serviceName) } diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go index ca50444f52..035ee5a15d 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_services.go @@ -471,7 +471,7 @@ func makeAndPersistAddServicesInterpretationReturnValue(serviceConfigs map[servi if err := servicesObjectDict.SetKey(serviceNameStr, serviceObject); err != nil { return nil, nil, startosis_errors.WrapWithInterpretationError(err, "Unable to generate the object that should be returned by the '%s' builtin", AddServicesBuiltinName) } - if err = interpretationTimeValueStore.AddService(serviceName, serviceObject); err != nil { + if err = interpretationTimeValueStore.PutService(serviceName, serviceObject); err != nil { return nil, nil, startosis_errors.WrapWithInterpretationError(err, "An error occurred while persisting the return value for service with name '%v'", serviceName) } } From 796e6cc9e3d265f8201af514bf90bd2afbee9f1d Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 14:30:06 +0000 Subject: [PATCH 08/12] revert a change --- .../server/service_network/mock_service_network.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/server/api_container/server/service_network/mock_service_network.go b/core/server/api_container/server/service_network/mock_service_network.go index 837ba4cdac..72022a913f 100644 --- a/core/server/api_container/server/service_network/mock_service_network.go +++ b/core/server/api_container/server/service_network/mock_service_network.go @@ -62,7 +62,7 @@ func (_m *MockServiceNetwork) AddService(ctx context.Context, serviceName servic return r0, r1 } -// MockServiceNetwork_AddService_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PutService' +// MockServiceNetwork_AddService_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AddService' type MockServiceNetwork_AddService_Call struct { *mock.Call } @@ -72,7 +72,7 @@ type MockServiceNetwork_AddService_Call struct { // - serviceName service.ServiceName // - serviceConfig *service.ServiceConfig func (_e *MockServiceNetwork_Expecter) AddService(ctx interface{}, serviceName interface{}, serviceConfig interface{}) *MockServiceNetwork_AddService_Call { - return &MockServiceNetwork_AddService_Call{Call: _e.mock.On("PutService", ctx, serviceName, serviceConfig)} + return &MockServiceNetwork_AddService_Call{Call: _e.mock.On("AddService", ctx, serviceName, serviceConfig)} } func (_c *MockServiceNetwork_AddService_Call) Run(run func(ctx context.Context, serviceName service.ServiceName, serviceConfig *service.ServiceConfig)) *MockServiceNetwork_AddService_Call { From ee486781377a098c597fb59f87aa86568118f89e Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 14:33:51 +0000 Subject: [PATCH 09/12] some corrections --- .../service_value_repository.go | 2 +- .../service_value_repository_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go index 7106e086ad..13ab900907 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go @@ -28,7 +28,7 @@ func getOrCreateNewServiceInterpretationTimeValueRepository( if err != nil { return stacktrace.Propagate(err, "An error occurred while creating the bucket for the service interpretation time value repository") } - logrus.Debugf("Recipe result bucket: '%+v'", bucket) + logrus.Debugf("Service value interpretation time store bucket: '%+v'", bucket) return nil }); err != nil { diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go index 86dfb5f908..eecfb45a61 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go @@ -23,7 +23,7 @@ const ( ) func TestAddAndGetTest(t *testing.T) { - repository := getRecipeResultRepositoryForTest(t) + repository := getServiceInterpretationTimeValueRepository(t) require.NotNil(t, repository) applicationProtocol := "" @@ -53,7 +53,7 @@ func TestAddAndGetTest(t *testing.T) { require.Equal(t, expectedService.String(), actualService.String()) } -func getRecipeResultRepositoryForTest(t *testing.T) *serviceInterpretationValueRepository { +func getServiceInterpretationTimeValueRepository(t *testing.T) *serviceInterpretationValueRepository { file, err := os.CreateTemp("/tmp", "*.db") defer func() { err = os.Remove(file.Name()) From 6ece66899cea74d46c85f898fb39646656b67f3b Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 14:39:18 +0000 Subject: [PATCH 10/12] add a failing test case --- .../service_value_repository.go | 2 +- .../service_value_repository_test.go | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go index 13ab900907..f3c44bbe54 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository.go @@ -85,7 +85,7 @@ func (repository *serviceInterpretationValueRepository) GetService(name service. // if an empty value was found we return an error if isEmptyValue { - return stacktrace.NewError("An empty value was found for service '%v'; this is unexpected", name) + return stacktrace.NewError("An empty value was found for service '%v'; this is a bug in Kurtosis", name) } deserializedValue, interpretationErr := repository.starlarkValueSerde.Deserialize(serviceSerializedValueStr) diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go index eecfb45a61..9b7db03a01 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/service_value_repository_test.go @@ -22,7 +22,7 @@ const ( ipAddress = starlark.String("172.23.34.44") ) -func TestAddAndGetTest(t *testing.T) { +func TestPutGet_Succeed(t *testing.T) { repository := getServiceInterpretationTimeValueRepository(t) require.NotNil(t, repository) @@ -53,6 +53,15 @@ func TestAddAndGetTest(t *testing.T) { require.Equal(t, expectedService.String(), actualService.String()) } +func TestPutGetFail_ForMissingServiceName(t *testing.T) { + repository := getServiceInterpretationTimeValueRepository(t) + require.NotNil(t, repository) + + actualService, err := repository.GetService(serviceName) + require.Error(t, err) + require.Nil(t, actualService) +} + func getServiceInterpretationTimeValueRepository(t *testing.T) *serviceInterpretationValueRepository { file, err := os.CreateTemp("/tmp", "*.db") defer func() { From 684f88e6fbd52046d0bbaf78d1b5daa2cc5bcc6a Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 16:07:02 +0000 Subject: [PATCH 11/12] added docs --- .../api-reference/starlark-reference/plan.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/docs/api-reference/starlark-reference/plan.md b/docs/docs/api-reference/starlark-reference/plan.md index c41ec9e5d9..d9ad45d683 100644 --- a/docs/docs/api-reference/starlark-reference/plan.md +++ b/docs/docs/api-reference/starlark-reference/plan.md @@ -97,6 +97,22 @@ services will be rolled back and the instruction will return an execution error. ::: +get_service +----------- + +The `get_service` instruction allows you to get a [Service][service-starlark-reference] object from a service name. This is +useful in situations if you don't have access to the [Service][service-starlark-reference] returned by the `add_service` or `add_services` +instructions anymore; perhaps you are in a different function or have imported and run another Kurtosis package. + +```python +# Returns a Service object (see the Service page in the sidebar) +service = plan.get_service( + # The name of the service to get + # MANDATORY + name = "my-service" +) +``` + verify ------ From 8b839be326231bad2fb950d3b6af2437d3bb4ef0 Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Wed, 28 Feb 2024 16:19:52 +0000 Subject: [PATCH 12/12] revert excessive reversion --- .../kurtosis_instruction/get_service/get_service.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go index d96cac710d..868034c0bb 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/get_service/get_service.go @@ -39,7 +39,9 @@ func NewGetService(interpretationTimeStore *interpretation_time_value_store.Inte Capabilities: func() kurtosis_plan_instruction.KurtosisPlanInstructionCapabilities { return &GetServiceCapabilities{interpretationTimeStore: interpretationTimeStore, serviceName: ""} }, - DefaultDisplayArguments: nil, + DefaultDisplayArguments: map[string]bool{ + ServiceNameArgName: true, + }, } }