From 7927da4bdc5e74a322ac9794364c8630da255be5 Mon Sep 17 00:00:00 2001 From: Gyanendra Mishra Date: Tue, 7 May 2024 11:00:18 +0100 Subject: [PATCH] feat: allow disabling tini (#2425) Closes #2405 --------- Co-authored-by: leoporoli --- .../start_user_services.go | 7 +- .../objects/service/service_config.go | 31 ++---- .../objects/service/service_config_test.go | 30 +----- .../service_registration/repository_test.go | 34 ++---- .../default_service_network_test.go | 24 +---- .../interpretation_time_value_store_test.go | 23 +--- .../add_service/add_service_shared.go | 24 +---- .../add_service/add_service_shared_test.go | 100 ++---------------- .../kurtosis_instruction/tasks/run_sh.go | 24 +---- .../tasks/tasks_shared.go | 32 +----- .../test_engine/add_service_framework_test.go | 24 +---- .../add_services_framework_test.go | 48 +-------- .../service_config_image_build_spec_test.go | 24 +---- .../service_config_image_spec_minimal_test.go | 24 +---- .../service_config_image_spec_test.go | 24 +---- .../service_config_minimal_framework_test.go | 24 +---- .../service_config_toleration_test.go | 24 +---- .../test_engine/set_service_framework_test.go | 23 +--- .../service_config/service_config.go | 24 ++++- .../starlark-reference/service-config.md | 7 +- .../startosis_add_services_tini_test.go | 37 +++++++ 21 files changed, 109 insertions(+), 503 deletions(-) create mode 100644 internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_services_tini_test.go diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/user_services_functions/start_user_services.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/user_services_functions/start_user_services.go index 23c3f86a8f..371937bbf6 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/user_services_functions/start_user_services.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/user_services_functions/start_user_services.go @@ -542,6 +542,7 @@ func createStartServiceOperation( privateIPAddrPlaceholder := serviceConfig.GetPrivateIPAddrPlaceholder() user := serviceConfig.GetUser() filesToBeMoved := serviceConfig.GetFilesToBeMoved() + tiniEnabled := serviceConfig.GetTiniEnabled() // We replace the placeholder value with the actual private IP address privateIPAddrStr := privateIpAddr.String() @@ -699,14 +700,16 @@ func createStartServiceOperation( ).WithSkipAddingToBridgeNetworkIfStaticIpIsSet( skipAddingUserServiceToBridgeNetwork, ).WithContainerInitEnabled( - true, + tiniEnabled, ).WithVolumeMounts( volumeMounts, ).WithLoggingDriver( fluentdLoggingDriverCnfg, ).WithRestartPolicy( restartPolicy, - ).WithUser(user) + ).WithUser( + user, + ) if entrypointArgs != nil { createAndStartArgsBuilder.WithEntrypointArgs(entrypointArgs) diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index 94560c1f22..f336c6345c 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -74,31 +74,11 @@ type privateServiceConfig struct { ImageDownloadMode image_download_mode.ImageDownloadMode FilesToBeMoved map[string]string + + TiniEnabled bool } -func CreateServiceConfig( - containerImageName string, - imageBuildSpec *image_build_spec.ImageBuildSpec, - imageRegistrySpec *image_registry_spec.ImageRegistrySpec, - nixBuildSpec *nix_build_spec.NixBuildSpec, - privatePorts map[string]*port_spec.PortSpec, - publicPorts map[string]*port_spec.PortSpec, - entrypointArgs []string, - cmdArgs []string, - envVars map[string]string, - filesArtifactExpansion *service_directory.FilesArtifactsExpansion, - persistentDirectories *service_directory.PersistentDirectories, - cpuAllocationMillicpus uint64, - memoryAllocationMegabytes uint64, - privateIPAddrPlaceholder string, - minCpuMilliCpus uint64, - minMemoryMegaBytes uint64, - labels map[string]string, - user *service_user.ServiceUser, - tolerations []v1.Toleration, - nodeSelectors map[string]string, - imageDownloadMode image_download_mode.ImageDownloadMode, -) (*ServiceConfig, error) { +func CreateServiceConfig(containerImageName string, imageBuildSpec *image_build_spec.ImageBuildSpec, imageRegistrySpec *image_registry_spec.ImageRegistrySpec, nixBuildSpec *nix_build_spec.NixBuildSpec, privatePorts map[string]*port_spec.PortSpec, publicPorts map[string]*port_spec.PortSpec, entrypointArgs []string, cmdArgs []string, envVars map[string]string, filesArtifactExpansion *service_directory.FilesArtifactsExpansion, persistentDirectories *service_directory.PersistentDirectories, cpuAllocationMillicpus uint64, memoryAllocationMegabytes uint64, privateIPAddrPlaceholder string, minCpuMilliCpus uint64, minMemoryMegaBytes uint64, labels map[string]string, user *service_user.ServiceUser, tolerations []v1.Toleration, nodeSelectors map[string]string, imageDownloadMode image_download_mode.ImageDownloadMode, tiniEnabled bool) (*ServiceConfig, error) { if err := ValidateServiceConfigLabels(labels); err != nil { return nil, stacktrace.Propagate(err, "Invalid service config labels '%+v'", labels) @@ -128,6 +108,7 @@ func CreateServiceConfig( NodeSelectors: nodeSelectors, ImageDownloadMode: imageDownloadMode, FilesToBeMoved: map[string]string{}, + TiniEnabled: tiniEnabled, } return &ServiceConfig{internalServiceConfig}, nil } @@ -278,6 +259,10 @@ func (serviceConfig *ServiceConfig) GetFilesToBeMoved() map[string]string { return serviceConfig.privateServiceConfig.FilesToBeMoved } +func (serviceConfig *ServiceConfig) GetTiniEnabled() bool { + return serviceConfig.privateServiceConfig.TiniEnabled +} + func (serviceConfig *ServiceConfig) UnmarshalJSON(data []byte) error { // Suppressing exhaustruct requirement because we want an object with zero values diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config_test.go b/container-engine-lib/lib/backend_interface/objects/service/service_config_test.go index ebf5350849..d88285aaa8 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config_test.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config_test.go @@ -65,32 +65,10 @@ func TestServiceConfigMarshallers(t *testing.T) { } func getServiceConfigForTest(t *testing.T, imageName string) *ServiceConfig { - serviceConfig, err := CreateServiceConfig( - imageName, - testImageBuildSpec(), - testImageRegistrySpec(), - testNixBuildSpec(), - testPrivatePorts(t), - testPublicPorts(t), - []string{"bin", "bash", "ls"}, - []string{"-l", "-a"}, - testEnvVars(), - testFilesArtifactExpansion(), - testPersistentDirectory(), - 500, - 1024, - "IP-ADDRESS", - 100, - 512, - map[string]string{ - "test-label-key": "test-label-value", - "test-second-label-key": "test-second-label-value", - }, - testServiceUser(), - testToleration(), - testNodeSelectors(), - testImageDownloadMode(), - ) + serviceConfig, err := CreateServiceConfig(imageName, testImageBuildSpec(), testImageRegistrySpec(), testNixBuildSpec(), testPrivatePorts(t), testPublicPorts(t), []string{"bin", "bash", "ls"}, []string{"-l", "-a"}, testEnvVars(), testFilesArtifactExpansion(), testPersistentDirectory(), 500, 1024, "IP-ADDRESS", 100, 512, map[string]string{ + "test-label-key": "test-label-value", + "test-second-label-key": "test-second-label-value", + }, testServiceUser(), testToleration(), testNodeSelectors(), testImageDownloadMode(), true) require.NoError(t, err) return serviceConfig } diff --git a/container-engine-lib/lib/database_accessors/enclave_db/service_registration/repository_test.go b/container-engine-lib/lib/database_accessors/enclave_db/service_registration/repository_test.go index bd3e445137..ee228be331 100644 --- a/container-engine-lib/lib/database_accessors/enclave_db/service_registration/repository_test.go +++ b/container-engine-lib/lib/database_accessors/enclave_db/service_registration/repository_test.go @@ -304,34 +304,12 @@ func getServiceRegistrationWithDataForTest( } func getServiceConfigForTest(t *testing.T, imageName string) *service.ServiceConfig { - serviceConfig, err := service.CreateServiceConfig( - imageName, - nil, - nil, - nil, - testPrivatePorts(t), - testPublicPorts(t), - []string{"bin", "bash", "ls"}, - []string{"-l", "-a"}, - testEnvVars(), - testFilesArtifactExpansion(), - testPersistentDirectory(), - 500, - 1024, - "IP-ADDRESS", - 100, - 512, - map[string]string{ - "test-label-key": "test-label-value", - "test-second-label-key": "test-second-label-value", - }, - nil, - nil, - map[string]string{ - "disktype": "ssd", - }, - image_download_mode.ImageDownloadMode_Missing, - ) + serviceConfig, err := service.CreateServiceConfig(imageName, nil, nil, nil, testPrivatePorts(t), testPublicPorts(t), []string{"bin", "bash", "ls"}, []string{"-l", "-a"}, testEnvVars(), testFilesArtifactExpansion(), testPersistentDirectory(), 500, 1024, "IP-ADDRESS", 100, 512, map[string]string{ + "test-label-key": "test-label-value", + "test-second-label-key": "test-second-label-value", + }, nil, nil, map[string]string{ + "disktype": "ssd", + }, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) return serviceConfig } diff --git a/core/server/api_container/server/service_network/default_service_network_test.go b/core/server/api_container/server/service_network/default_service_network_test.go index c3be34646a..dc6bd30101 100644 --- a/core/server/api_container/server/service_network/default_service_network_test.go +++ b/core/server/api_container/server/service_network/default_service_network_test.go @@ -1205,29 +1205,7 @@ func openFreeTCPAndUDPLocalHostPortAddressesForTesting() (*netip.AddrPort, *neti } func testServiceConfig(t *testing.T, imageName string) *service.ServiceConfig { - serviceConfig, err := service.CreateServiceConfig( - imageName, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - 0, - 0, - "", - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + serviceConfig, err := service.CreateServiceConfig(imageName, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, 0, "", 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) return serviceConfig } diff --git a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store_test.go b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store_test.go index 49ef32590d..d5016c06fd 100644 --- a/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store_test.go +++ b/core/server/api_container/server/startosis_engine/interpretation_time_value_store/interpretation_time_value_store_test.go @@ -65,28 +65,7 @@ func TestPutNewServiceConfig(t *testing.T) { } func getTestServiceConfigForService(name service.ServiceName, imageTag string) (*service.ServiceConfig, error) { - return service.CreateServiceConfig( - fmt.Sprintf("%v-%v:%v", name, testContainerImageName, imageTag), - nil, - nil, - nil, - nil, - nil, - []string{}, - []string{}, - map[string]string{}, - nil, - nil, - 0, - 0, - "IP-ADDRESS", - 0, - 0, - map[string]string{}, - nil, - nil, - nil, - image_download_mode.ImageDownloadMode_Always) + return service.CreateServiceConfig(fmt.Sprintf("%v-%v:%v", name, testContainerImageName, imageTag), nil, nil, nil, nil, nil, []string{}, []string{}, map[string]string{}, nil, nil, 0, 0, "IP-ADDRESS", 0, 0, map[string]string{}, nil, nil, nil, image_download_mode.ImageDownloadMode_Always, true) } func getEnclaveDBForTest(t *testing.T) *enclave_db.EnclaveDB { diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared.go index 957d1b0fc0..69ba481a3c 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared.go @@ -196,29 +196,7 @@ func replaceMagicStrings( } } - renderedServiceConfig, err := service.CreateServiceConfig( - serviceConfig.GetContainerImageName(), - serviceConfig.GetImageBuildSpec(), - serviceConfig.GetImageRegistrySpec(), - serviceConfig.GetNixBuildSpec(), - serviceConfig.GetPrivatePorts(), - serviceConfig.GetPublicPorts(), - entrypoints, - cmdArgs, - envVars, - serviceConfig.GetFilesArtifactsExpansion(), - serviceConfig.GetPersistentDirectories(), - serviceConfig.GetCPUAllocationMillicpus(), - serviceConfig.GetMemoryAllocationMegabytes(), - serviceConfig.GetPrivateIPAddrPlaceholder(), - serviceConfig.GetMinCPUAllocationMillicpus(), - serviceConfig.GetMinMemoryAllocationMegabytes(), - serviceConfig.GetLabels(), - serviceConfig.GetUser(), - serviceConfig.GetTolerations(), - serviceConfig.GetNodeSelectors(), - serviceConfig.GetImageDownloadMode(), - ) + renderedServiceConfig, err := service.CreateServiceConfig(serviceConfig.GetContainerImageName(), serviceConfig.GetImageBuildSpec(), serviceConfig.GetImageRegistrySpec(), serviceConfig.GetNixBuildSpec(), serviceConfig.GetPrivatePorts(), serviceConfig.GetPublicPorts(), entrypoints, cmdArgs, envVars, serviceConfig.GetFilesArtifactsExpansion(), serviceConfig.GetPersistentDirectories(), serviceConfig.GetCPUAllocationMillicpus(), serviceConfig.GetMemoryAllocationMegabytes(), serviceConfig.GetPrivateIPAddrPlaceholder(), serviceConfig.GetMinCPUAllocationMillicpus(), serviceConfig.GetMinMemoryAllocationMegabytes(), serviceConfig.GetLabels(), serviceConfig.GetUser(), serviceConfig.GetTolerations(), serviceConfig.GetNodeSelectors(), serviceConfig.GetImageDownloadMode(), serviceConfig.GetTiniEnabled()) if err != nil { return "", nil, stacktrace.Propagate(err, "An error occurred creating a service config") diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared_test.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared_test.go index da5e93e38c..974e76ca23 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/add_service/add_service_shared_test.go @@ -38,29 +38,7 @@ func TestAddServiceShared_EntryPointArgsRuntimeValueAreReplaced(t *testing.T) { runtimeValue := fmt.Sprintf(magic_string_helper.RuntimeValueReplacementPlaceholderFormat, stringValueUuid, runtimeValueName) serviceName := service.ServiceName("example-datastore-server-2") - serviceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - nil, - nil, - []string{"-- " + runtimeValue}, - nil, - nil, - nil, - nil, - 0, - 0, - "", - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + serviceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, nil, nil, []string{"-- " + runtimeValue}, nil, nil, nil, nil, 0, 0, "", 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) replacedServiceName, replacedServiceConfig, err := replaceMagicStrings(runtimeValueStore, serviceName, serviceConfig) @@ -86,29 +64,7 @@ func TestAddServiceShared_CmdArgsRuntimeValueAreReplaced(t *testing.T) { runtimeValue := fmt.Sprintf(magic_string_helper.RuntimeValueReplacementPlaceholderFormat, stringValueUuid, runtimeValueName) serviceName := service.ServiceName("example-datastore-server-2") - serviceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - nil, - nil, - nil, - []string{"bash", "-c", "sleep " + runtimeValue}, - nil, - nil, - nil, - 0, - 0, - "", - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + serviceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, nil, nil, nil, []string{"bash", "-c", "sleep " + runtimeValue}, nil, nil, nil, 0, 0, "", 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) replacedServiceName, replacedServiceConfig, err := replaceMagicStrings(runtimeValueStore, serviceName, serviceConfig) @@ -134,31 +90,9 @@ func TestAddServiceShared_EnvVarsWithRuntimeValueAreReplaced(t *testing.T) { runtimeValue := fmt.Sprintf(magic_string_helper.RuntimeValueReplacementPlaceholderFormat, stringValueUuid, runtimeValueName) serviceName := service.ServiceName("example-datastore-server-2") - serviceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - map[string]string{ - "PORT": runtimeValue, - }, - nil, - nil, - 0, - 0, - "", - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + serviceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, nil, nil, nil, nil, map[string]string{ + "PORT": runtimeValue, + }, nil, nil, 0, 0, "", 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) replacedServiceName, replacedServiceConfig, err := replaceMagicStrings(runtimeValueStore, serviceName, serviceConfig) @@ -187,29 +121,7 @@ func TestAddServiceShared_ServiceNameWithRuntimeValuesAreReplaced(t *testing.T) stringRuntimeValue := fmt.Sprintf(magic_string_helper.RuntimeValueReplacementPlaceholderFormat, stringValueUuid, valueName) serviceName := service.ServiceName(stringRuntimeValue) - serviceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - nil, - 0, - 0, - "", - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + serviceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 0, 0, "", 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) replacedServiceName, _, err := replaceMagicStrings(runtimeValueStore, serviceName, serviceConfig) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/run_sh.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/run_sh.go index fdb7bf47b9..aa77080905 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/run_sh.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/run_sh.go @@ -358,29 +358,7 @@ func repacaeMagicStringsInEnvVars(runtimeValueStore *runtime_value_store.Runtime } } - renderedServiceConfig, err := service.CreateServiceConfig( - serviceConfig.GetContainerImageName(), - serviceConfig.GetImageBuildSpec(), - serviceConfig.GetImageRegistrySpec(), - serviceConfig.GetNixBuildSpec(), - serviceConfig.GetPrivatePorts(), - serviceConfig.GetPublicPorts(), - serviceConfig.GetEntrypointArgs(), - serviceConfig.GetCmdArgs(), - envVars, - serviceConfig.GetFilesArtifactsExpansion(), - serviceConfig.GetPersistentDirectories(), - serviceConfig.GetCPUAllocationMillicpus(), - serviceConfig.GetMemoryAllocationMegabytes(), - serviceConfig.GetPrivateIPAddrPlaceholder(), - serviceConfig.GetMinCPUAllocationMillicpus(), - serviceConfig.GetMinMemoryAllocationMegabytes(), - serviceConfig.GetLabels(), - serviceConfig.GetUser(), - serviceConfig.GetTolerations(), - serviceConfig.GetNodeSelectors(), - serviceConfig.GetImageDownloadMode(), - ) + renderedServiceConfig, err := service.CreateServiceConfig(serviceConfig.GetContainerImageName(), serviceConfig.GetImageBuildSpec(), serviceConfig.GetImageRegistrySpec(), serviceConfig.GetNixBuildSpec(), serviceConfig.GetPrivatePorts(), serviceConfig.GetPublicPorts(), serviceConfig.GetEntrypointArgs(), serviceConfig.GetCmdArgs(), envVars, serviceConfig.GetFilesArtifactsExpansion(), serviceConfig.GetPersistentDirectories(), serviceConfig.GetCPUAllocationMillicpus(), serviceConfig.GetMemoryAllocationMegabytes(), serviceConfig.GetPrivateIPAddrPlaceholder(), serviceConfig.GetMinCPUAllocationMillicpus(), serviceConfig.GetMinMemoryAllocationMegabytes(), serviceConfig.GetLabels(), serviceConfig.GetUser(), serviceConfig.GetTolerations(), serviceConfig.GetNodeSelectors(), serviceConfig.GetImageDownloadMode(), tiniEnabled) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating a service config with env var magric strings replaced.") } diff --git a/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/tasks_shared.go b/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/tasks_shared.go index 7dc3822716..9debcbaa29 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/tasks_shared.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_instruction/tasks/tasks_shared.go @@ -50,6 +50,9 @@ const ( shellWrapperCommand = "/bin/sh" noNameSet = "" uniqueNameGenErrStr = "error occurred while generating unique name for the file artifact" + + // enables init mode on containers; cleaning up any zombie processes + tiniEnabled = true ) var runTailCommandToPreventContainerToStopOnCreating = []string{"tail", "-f", "/dev/null"} @@ -271,34 +274,7 @@ func getServiceConfig( filesArtifactExpansion *service_directory.FilesArtifactsExpansion, envVars *map[string]string, ) (*service.ServiceConfig, error) { - serviceConfig, err := service.CreateServiceConfig( - maybeImageName, - maybeImageBuildSpec, - maybeImageRegistrySpec, - maybeNixBuildSpec, - nil, - nil, - // This make sure that the container does not stop as soon as it starts - // This only is needed for kubernetes at the moment - // TODO: Instead of creating a service and running exec commands - // we could probably run the command as an entrypoint and retrieve the results as soon as the - // command is completed - runTailCommandToPreventContainerToStopOnCreating, - nil, - *envVars, - filesArtifactExpansion, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + serviceConfig, err := service.CreateServiceConfig(maybeImageName, maybeImageBuildSpec, maybeImageRegistrySpec, maybeNixBuildSpec, nil, nil, runTailCommandToPreventContainerToStopOnCreating, nil, *envVars, filesArtifactExpansion, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, tiniEnabled) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating service config") } 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 f2acd9ebde..0db407158f 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 @@ -36,29 +36,7 @@ func (suite *KurtosisPlanInstructionTestSuite) TestAddService() { mock.Anything, testServiceName, mock.MatchedBy(func(serviceConfig *service.ServiceConfig) bool { - expectedServiceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(suite.T(), err) actualServiceConfig := serviceConfig 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 37d0838306..aba658cdf6 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 @@ -52,57 +52,13 @@ func (suite *KurtosisPlanInstructionTestSuite) TestAddServices() { suite.Require().Contains(configs, testServiceName) suite.Require().Contains(configs, testServiceName2) - expectedServiceConfig1, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig1, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(suite.T(), err) actualServiceConfig1 := configs[testServiceName] suite.Assert().Equal(expectedServiceConfig1, actualServiceConfig1) - expectedServiceConfig2, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - testCpuAllocation, - testMemoryAllocation, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig2, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, testCpuAllocation, testMemoryAllocation, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(suite.T(), err) actualServiceConfig2 := configs[testServiceName2] diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_build_spec_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_build_spec_test.go index 41f388d4a4..995bd55235 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_build_spec_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_build_spec_test.go @@ -81,29 +81,7 @@ func (t *serviceConfigImageBuildSpecTestCase) Assert(typeValue builtin_argument. testTargetStage, defaultBuildFile, expectedBuildArgs) - expectedServiceConfig, err := service.CreateServiceConfig( - testContainerImageName, - expectedImageBuildSpec, - nil, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig, err := service.CreateServiceConfig(testContainerImageName, expectedImageBuildSpec, nil, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) require.Equal(t, expectedServiceConfig, serviceConfig) require.Equal(t, expectedImageBuildSpec, serviceConfig.GetImageBuildSpec()) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_minimal_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_minimal_test.go index 27dd267f7b..759b63f45b 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_minimal_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_minimal_test.go @@ -54,29 +54,7 @@ func (t *serviceConfigImageSpecMinimalTest) Assert(typeValue builtin_argument.Ku require.Nil(t, interpretationErr) expectedImageRegistrySpec := image_registry_spec.NewImageRegistrySpec(testContainerImageName, "", "", "") - expectedServiceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - expectedImageRegistrySpec, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, expectedImageRegistrySpec, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) require.Equal(t, expectedServiceConfig, serviceConfig) require.Equal(t, expectedImageRegistrySpec, serviceConfig.GetImageRegistrySpec()) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_test.go index 206ca1b935..36bd4435ec 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_image_spec_test.go @@ -60,29 +60,7 @@ func (t *serviceConfigImageSpecTest) Assert(typeValue builtin_argument.KurtosisV require.Nil(t, interpretationErr) expectedImageRegistrySpec := image_registry_spec.NewImageRegistrySpec(testContainerImageName, testRegistryUsername, testRegistryPassword, testRegistryAddr) - expectedServiceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - expectedImageRegistrySpec, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, expectedImageRegistrySpec, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) require.Equal(t, expectedServiceConfig, serviceConfig) require.Equal(t, expectedImageRegistrySpec, serviceConfig.GetImageRegistrySpec()) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_minimal_framework_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_minimal_framework_test.go index a91a9c6fbd..8350576947 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_minimal_framework_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_minimal_framework_test.go @@ -47,29 +47,7 @@ func (t *serviceConfigMinimalTestCase) Assert(typeValue builtin_argument.Kurtosi image_download_mode.ImageDownloadMode_Missing) require.Nil(t, interpretationErr) - expectedServiceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - nil, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, nil, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) require.Equal(t, expectedServiceConfig, serviceConfig) require.Nil(t, serviceConfig.GetImageBuildSpec()) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_toleration_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_toleration_test.go index 6eb6fb421f..250fe7e3e9 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_toleration_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/service_config_toleration_test.go @@ -61,29 +61,7 @@ func (t *serviceConfigTolerationTest) Assert(typeValue builtin_argument.Kurtosis testNoPackageReplaceOptions, image_download_mode.ImageDownloadMode_Missing) require.Nil(t, interpretationErr) expectedTolerations := []v1.Toleration{{Key: testTolerationKey, Operator: v1.TolerationOpEqual, Value: testTolerationValue, Effect: v1.TaintEffectNoSchedule, TolerationSeconds: &testTolerationSeconds}} - expectedServiceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - map[string]*port_spec.PortSpec{}, - map[string]*port_spec.PortSpec{}, - nil, - nil, - map[string]string{}, - nil, - nil, - 0, - 0, - service_config.DefaultPrivateIPAddrPlaceholder, - 0, - 0, - map[string]string{}, - nil, - expectedTolerations, - map[string]string{}, - image_download_mode.ImageDownloadMode_Missing, - ) + expectedServiceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, map[string]*port_spec.PortSpec{}, map[string]*port_spec.PortSpec{}, nil, nil, map[string]string{}, nil, nil, 0, 0, service_config.DefaultPrivateIPAddrPlaceholder, 0, 0, map[string]string{}, nil, expectedTolerations, map[string]string{}, image_download_mode.ImageDownloadMode_Missing, true) require.NoError(t, err) require.Equal(t, expectedServiceConfig, serviceConfig) require.Equal(t, expectedTolerations, serviceConfig.GetTolerations()) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/set_service_framework_test.go b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/set_service_framework_test.go index d820918520..ba790af978 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/set_service_framework_test.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_starlark_framework/test_engine/set_service_framework_test.go @@ -29,28 +29,7 @@ func (suite *KurtosisPlanInstructionTestSuite) TestSetService() { require.NoError(suite.T(), err) suite.interpretationTimeValueStore = interpretationTimeValueStore - testServiceConfig, err := service.CreateServiceConfig( - testContainerImageName, - nil, - nil, - nil, - nil, - nil, - []string{}, - []string{}, - map[string]string{}, - nil, - nil, - 0, - 0, - "IP-ADDRESS", - 0, - 0, - map[string]string{}, - nil, - nil, - nil, - image_download_mode.ImageDownloadMode_Always) + testServiceConfig, err := service.CreateServiceConfig(testContainerImageName, nil, nil, nil, nil, nil, []string{}, []string{}, map[string]string{}, nil, nil, 0, 0, "IP-ADDRESS", 0, 0, map[string]string{}, nil, nil, nil, image_download_mode.ImageDownloadMode_Always, true) require.NoError(suite.T(), err) suite.interpretationTimeValueStore.PutServiceConfig(testServiceName, testServiceConfig) diff --git a/core/server/api_container/server/startosis_engine/kurtosis_types/service_config/service_config.go b/core/server/api_container/server/startosis_engine/kurtosis_types/service_config/service_config.go index 492bf248f7..a083d80d4c 100644 --- a/core/server/api_container/server/startosis_engine/kurtosis_types/service_config/service_config.go +++ b/core/server/api_container/server/startosis_engine/kurtosis_types/service_config/service_config.go @@ -2,12 +2,9 @@ package service_config import ( "fmt" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/image_build_spec" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/image_download_mode" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/image_registry_spec" - "math" - "path" - - "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/image_build_spec" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/nix_build_spec" "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" @@ -27,6 +24,8 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_packages" "go.starlark.net/starlark" v1 "k8s.io/api/core/v1" + "math" + "path" ) const ( @@ -52,6 +51,7 @@ const ( TolerationsAttr = "tolerations" NodeSelectorsAttr = "node_selectors" FilesToBeMovedAttr = "files_to_be_moved" + TiniEnabledAttr = "tini_enabled" DefaultPrivateIPAddrPlaceholder = "KURTOSIS_IP_ADDR_PLACEHOLDER" @@ -221,6 +221,12 @@ func NewServiceConfigType() *kurtosis_type_constructor.KurtosisTypeConstructor { return builtin_argument.StringMappingToString(value, FilesToBeMovedAttr) }, }, + { + Name: TiniEnabledAttr, + IsOptional: true, + ZeroValueProvider: builtin_argument.ZeroValueProvider[starlark.Bool], + Validator: nil, + }, }, }, @@ -525,6 +531,15 @@ func (config *ServiceConfig) ToKurtosisType( } } + tiniEnabled := true + tiniEnabledStarlark, found, interpretationErr := kurtosis_type_constructor.ExtractAttrValue[starlark.Bool](config.KurtosisValueTypeDefault, TiniEnabledAttr) + if interpretationErr != nil { + return nil, interpretationErr + } + if found { + tiniEnabled = bool(tiniEnabledStarlark) + } + serviceConfig, err := service.CreateServiceConfig( imageName, maybeImageBuildSpec, @@ -547,6 +562,7 @@ func (config *ServiceConfig) ToKurtosisType( tolerations, nodeSelectors, imageDownloadMode, + tiniEnabled, ) if err != nil { return nil, startosis_errors.WrapWithInterpretationError(err, "An error occurred creating a service config") diff --git a/docs/docs/api-reference/starlark-reference/service-config.md b/docs/docs/api-reference/starlark-reference/service-config.md index 40b84e695e..b8210b65c1 100644 --- a/docs/docs/api-reference/starlark-reference/service-config.md +++ b/docs/docs/api-reference/starlark-reference/service-config.md @@ -229,7 +229,12 @@ config = ServiceConfig( # OPTIONAL node_selectors = { "disktype": "ssd", - } + }, + + # The tini_enabled field allows you to set the `--init` options when a container is started in Docker. + # OPTIONAL + # Default (true) + tini_enabled = True ) ``` Note that `ImageBuildSpec` can only be used in packages and not standalone scripts as it relies on build context in package. More info on [`ImageBuildSpec`](./image-build-spec.md) here. diff --git a/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_services_tini_test.go b/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_services_tini_test.go new file mode 100644 index 0000000000..c1f23d6d69 --- /dev/null +++ b/internal_testsuites/golang/testsuite/startosis_add_service_test/startosis_add_services_tini_test.go @@ -0,0 +1,37 @@ +package startosis_add_service_test + +import ( + "context" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/require" +) + +const ( + addServicesWithTiniDisabled = ` +def run(plan): + plan.add_service(name = 'wireguard', config = ServiceConfig(image="linuxserver/wireguard",ports={"docker-51820": PortSpec(number=51820,transport_protocol="UDP",wait="30s")},env_vars={"PUID": "1000","PGID": "1000","TZ": "Etc/UTC"}, tini_enabled=False)) +` +) + +func (suite *StartosisAddServiceTestSuite) TestAddServicesTiniDisabled() { + ctx := context.Background() + runResult, err := suite.RunScript(ctx, addServicesWithTiniDisabled) + + t := suite.T() + + require.NoError(t, err, "Unexpected error executing Starlark script") + + expectedScriptOutput := `Service 'wireguard' added with service UUID '[a-f0-9]{32}'` + require.Nil(t, runResult.InterpretationError, "Unexpected interpretation error.") + require.Empty(t, runResult.ValidationErrors, "Unexpected validation error") + require.Nil(t, runResult.ExecutionError, "Unexpected execution error") + require.Regexp(t, expectedScriptOutput, string(runResult.RunOutput)) + logrus.Infof("Successfully ran Starlark script") + + // Ensure that the service is listed + expectedNumberOfServices := 1 + serviceInfos, err := suite.enclaveCtx.GetServices() + require.Nil(t, err) + actualNumberOfServices := len(serviceInfos) + require.Equal(t, expectedNumberOfServices, actualNumberOfServices) +}