diff --git a/cli/cli/commands/grafloki/start/start.go b/cli/cli/commands/grafloki/start/start.go index 82d1e4643c..9760814bd9 100644 --- a/cli/cli/commands/grafloki/start/start.go +++ b/cli/cli/commands/grafloki/start/start.go @@ -2,7 +2,6 @@ package start import ( "context" - "fmt" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" @@ -11,8 +10,6 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/engine_manager" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/grafloki" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/kurtosis_config_getter" - "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/resolved_config" - "github.com/kurtosis-tech/kurtosis/cli/cli/out" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/logs_aggregator" "github.com/kurtosis-tech/stacktrace" "github.com/sirupsen/logrus" @@ -44,6 +41,7 @@ func run( if err != nil { return stacktrace.Propagate(err, "An error occurred getting Kurtosis cluster config.") } + clusterConfig.GetClusterType() // NOTE(tedi 04/03/25): If you're wondering why the grafana / loki instance is being started by the CLI (and not in container-engine-lib via KurtosisBackend as with LogsCollector and LogsAggregator), here's why: // 1. now that Kurtosis is purely OSS, it's important to reduce maintenance surface / complexity inside Kurtosis core (Engine, APIContainer, KurtosisBackend, Starlark Engine) @@ -54,36 +52,11 @@ func run( // putting it in the CLI is saying - “You could set up Grafana and Loki yourself, and then restart the engine to point to it, Kurtosis CLI will do that for you to save you a step” // putting it in Kurtosis core is saying - “Grafana and Loki are core a necessary part of the Kurtosis platform and supports the Kurtosis abstraction/value prop" - which is not the case // https://drawpaintacademy.com/the-bull/ - var lokiHost string - var grafanaUrl string - switch clusterConfig.GetClusterType() { - case resolved_config.KurtosisClusterType_Docker: - lokiHost, grafanaUrl, err = grafloki.StartGrafLokiInDocker(ctx) - if err != nil { - return stacktrace.Propagate(err, "An error occurred starting Grafana and Loki in Docker.") - } - case resolved_config.KurtosisClusterType_Kubernetes: - lokiHost, grafanaUrl, err = grafloki.StartGrafLokiInKubernetes(ctx) - if err != nil { - return stacktrace.Propagate(err, "An error occurred starting Grafana and Loki in Kubernetes.") - } - default: - return stacktrace.NewError("Unsupported cluster type: %v", clusterConfig.GetClusterType().String()) - } - - // This matches the exact configurations here: https://vector.dev/docs/reference/configuration/sinks/loki/ - lokiSink := map[string]map[string]interface{}{ - "loki": { - "type": "loki", - "endpoint": lokiHost, - "encoding": map[string]string{ - "codec": "json", - }, - "labels": map[string]string{ - "job": "kurtosis", - }, - }, + lokiSink, _, err := grafloki.StartGrafloki(ctx, clusterConfig.GetClusterType(), clusterConfig.GetGraflokiConfig()) + if err != nil { + return err // already wrapped } + //logrus.Infof("Grafana running at %v", grafanaUrl) logrus.Infof("Configuring engine to send logs to Loki...") err = restartEngineWithLogsSink(ctx, lokiSink) @@ -91,7 +64,6 @@ func run( return stacktrace.Propagate(err, "An error occurred restarting engine to be configured to send logs to Loki.") } - out.PrintOutLn(fmt.Sprintf("Grafana running at %v", grafanaUrl)) return nil } diff --git a/cli/cli/commands/grafloki/stop/stop.go b/cli/cli/commands/grafloki/stop/stop.go index ca21c1d3da..47a70b823a 100644 --- a/cli/cli/commands/grafloki/stop/stop.go +++ b/cli/cli/commands/grafloki/stop/stop.go @@ -8,8 +8,6 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/grafloki" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/kurtosis_config_getter" - "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/resolved_config" - "github.com/kurtosis-tech/kurtosis/cli/cli/out" "github.com/kurtosis-tech/stacktrace" ) @@ -34,21 +32,9 @@ func run( return stacktrace.Propagate(err, "An error occurred getting Kurtosis cluster config.") } - switch clusterConfig.GetClusterType() { - case resolved_config.KurtosisClusterType_Docker: - err := grafloki.StopGrafLokiInDocker(ctx) - if err != nil { - return stacktrace.Propagate(err, "An error occurred stopping Grafana and Loki containers in Docker.") - } - case resolved_config.KurtosisClusterType_Kubernetes: - err := grafloki.StopGrafLokiInKubernetes(ctx) - if err != nil { - return stacktrace.Propagate(err, "An error occurred stopping Grafana and Loki containers in Kubernetes.") - } - default: - return stacktrace.NewError("Unsupported cluster type: %v", clusterConfig.GetClusterType().String()) + if err = grafloki.StopGrafloki(ctx, clusterConfig.GetClusterType()); err != nil { + return err // already wrapped } - out.PrintOutLn("Successfully stopped Grafana and Loki containers.") return nil } diff --git a/cli/cli/helpers/engine_manager/engine_existence_guarantor.go b/cli/cli/helpers/engine_manager/engine_existence_guarantor.go index 721d51611b..2c9d6a94a5 100644 --- a/cli/cli/helpers/engine_manager/engine_existence_guarantor.go +++ b/cli/cli/helpers/engine_manager/engine_existence_guarantor.go @@ -95,6 +95,9 @@ type engineExistenceGuarantor struct { // Destinations the logs aggregator will deliver to sinks logs_aggregator.Sinks + + // If set to true, engine will not store logs in a persistent volume + shouldEnablePersistentVolumeLogsCollection bool } func newEngineExistenceGuarantorWithDefaultVersion( @@ -116,6 +119,7 @@ func newEngineExistenceGuarantorWithDefaultVersion( domain string, logRetentionPeriod string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) *engineExistenceGuarantor { return newEngineExistenceGuarantorWithCustomVersion( ctx, @@ -137,6 +141,7 @@ func newEngineExistenceGuarantorWithDefaultVersion( domain, logRetentionPeriod, sinks, + shouldEnablePersistentVolumeLogsCollection, ) } @@ -160,6 +165,7 @@ func newEngineExistenceGuarantorWithCustomVersion( domain string, logRetentionPeriod string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) *engineExistenceGuarantor { return &engineExistenceGuarantor{ ctx: ctx, @@ -183,6 +189,7 @@ func newEngineExistenceGuarantorWithCustomVersion( domain: domain, logRetentionPeriod: logRetentionPeriod, sinks: sinks, + shouldEnablePersistentVolumeLogsCollection: shouldEnablePersistentVolumeLogsCollection, } } @@ -245,6 +252,7 @@ func (guarantor *engineExistenceGuarantor) VisitStopped() error { guarantor.domain, guarantor.logRetentionPeriod, guarantor.sinks, + guarantor.shouldEnablePersistentVolumeLogsCollection, ) } else { _, _, engineLaunchErr = guarantor.engineServerLauncher.LaunchWithCustomVersion( @@ -268,6 +276,7 @@ func (guarantor *engineExistenceGuarantor) VisitStopped() error { guarantor.domain, guarantor.logRetentionPeriod, guarantor.sinks, + guarantor.shouldEnablePersistentVolumeLogsCollection, ) } if engineLaunchErr != nil { diff --git a/cli/cli/helpers/engine_manager/engine_manager.go b/cli/cli/helpers/engine_manager/engine_manager.go index a46bfb3bdf..1b779d05b8 100644 --- a/cli/cli/helpers/engine_manager/engine_manager.go +++ b/cli/cli/helpers/engine_manager/engine_manager.go @@ -2,6 +2,7 @@ package engine_manager import ( "context" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/grafloki" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/logs_aggregator" "strings" "time" @@ -197,6 +198,19 @@ func (manager *EngineManager) StartEngineIdempotentlyWithDefaultVersion( logrus.Debugf("Engine status: '%v'", status) clusterType := manager.clusterConfig.GetClusterType() + var lokiSink logs_aggregator.Sinks + var grafanaUrl string + if manager.clusterConfig.GetGraflokiConfig().ShouldStartBeforeEngine { + lokiSink, grafanaUrl, err = grafloki.StartGrafloki(ctx, clusterType, manager.clusterConfig.GetGraflokiConfig()) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "An error occurred starting Grafana and Loki before engine.") + } + } + if grafanaUrl != "" { + logrus.Infof("Grafana running at %v", grafanaUrl) + } + additionalSinks = combineSinks(additionalSinks, lokiSink) + engineGuarantor := newEngineExistenceGuarantorWithDefaultVersion( ctx, maybeHostMachinePortBinding, @@ -215,7 +229,8 @@ func (manager *EngineManager) StartEngineIdempotentlyWithDefaultVersion( restartAPIContainers, domain, logRetentionPeriodStr, - combineAdditionalSinksAndConfigSinks(additionalSinks, manager.clusterConfig.GetLogsAggregatorConfig().Sinks), + combineSinks(additionalSinks, manager.clusterConfig.GetLogsAggregatorConfig().Sinks), + manager.clusterConfig.ShouldEnableDefaultLogsSink(), ) // TODO Need to handle the Kubernetes case, where a gateway needs to be started after the engine is started but // before we can return an EngineClient @@ -247,6 +262,20 @@ func (manager *EngineManager) StartEngineIdempotentlyWithCustomVersion(ctx conte } clusterType := manager.clusterConfig.GetClusterType() + + var lokiSink logs_aggregator.Sinks + var grafanaUrl string + if manager.clusterConfig.GetGraflokiConfig().ShouldStartBeforeEngine { + lokiSink, grafanaUrl, err = grafloki.StartGrafloki(ctx, clusterType, manager.clusterConfig.GetGraflokiConfig()) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "An error occurred starting Grafana and Loki before engine.") + } + } + if grafanaUrl != "" { + logrus.Infof("Grafana running at %v", grafanaUrl) + } + additionalSinks = combineSinks(additionalSinks, lokiSink) + engineGuarantor := newEngineExistenceGuarantorWithCustomVersion( ctx, maybeHostMachinePortBinding, @@ -266,7 +295,8 @@ func (manager *EngineManager) StartEngineIdempotentlyWithCustomVersion(ctx conte restartAPIContainers, domain, logRetentionPeriodStr, - combineAdditionalSinksAndConfigSinks(additionalSinks, manager.clusterConfig.GetLogsAggregatorConfig().Sinks), + combineSinks(manager.clusterConfig.GetLogsAggregatorConfig().Sinks, additionalSinks), + manager.clusterConfig.ShouldEnableDefaultLogsSink(), ) engineClient, engineClientCloseFunc, err := manager.startEngineWithGuarantor(ctx, status, engineGuarantor) if err != nil { @@ -528,14 +558,14 @@ func (manager *EngineManager) waitUntilEngineStoppedOrError(ctx context.Context) return stacktrace.NewError("Engine did not report stopped status, last status reported was '%v'", status) } -// combineAdditionalSinksAndConfigSinks will combine additionalSinks and configSinks -// note: additionalSinks will override configSinks in case of an id clash -func combineAdditionalSinksAndConfigSinks(additionalSinks logs_aggregator.Sinks, configSinks logs_aggregator.Sinks) logs_aggregator.Sinks { +// combineSinks aggregates sinks and sinksToAdd +// note: sinksToAdd will override sinks in case of an id clash +func combineSinks(sinks logs_aggregator.Sinks, sinksToAdd logs_aggregator.Sinks) logs_aggregator.Sinks { combinedSinks := logs_aggregator.Sinks{} - for sinkId, sink := range configSinks { + for sinkId, sink := range sinks { combinedSinks[sinkId] = sink } - for sinkId, sink := range additionalSinks { + for sinkId, sink := range sinksToAdd { combinedSinks[sinkId] = sink } return combinedSinks diff --git a/cli/cli/helpers/grafloki/docker_grafloki.go b/cli/cli/helpers/grafloki/docker_grafloki.go index 42303ec1ae..beda6aa8a8 100644 --- a/cli/cli/helpers/grafloki/docker_grafloki.go +++ b/cli/cli/helpers/grafloki/docker_grafloki.go @@ -6,9 +6,12 @@ import ( "github.com/docker/docker/client" "github.com/docker/go-connections/nat" "github.com/go-yaml/yaml" + "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/resolved_config" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_manager" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_manager/types" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_label_key" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service_user" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/uuid_generator" "github.com/kurtosis-tech/stacktrace" "github.com/sirupsen/logrus" "net/http" @@ -18,23 +21,29 @@ import ( ) const ( - LokiContainerName = "kurtosis-loki" - GrafanaContainerName = "kurtosis-grafana" - lokiReadinessPath = "/ready" + LokiContainerLabel = "kurtosis-loki" + GrafanaContainerLabel = "kurtosis-grafana" + + lokiReadinessPath = "/ready" bridgeNetworkName = "bridge" localhostAddr = "127.0.0.1" + rootUserUid = 0 ) var EmptyDockerClientOpts = []client.Opt{} + +var LokiContainerNamePrefix = fmt.Sprintf("%v-", LokiContainerLabel) +var GrafanaContainerNamePrefix = fmt.Sprintf("%v-", GrafanaContainerLabel) + var lokiContainerLabels = map[string]string{ - docker_label_key.ContainerTypeDockerLabelKey.GetString(): LokiContainerName, + docker_label_key.ContainerTypeDockerLabelKey.GetString(): LokiContainerLabel, } var grafanaContainerLabels = map[string]string{ - docker_label_key.ContainerTypeDockerLabelKey.GetString(): GrafanaContainerName, + docker_label_key.ContainerTypeDockerLabelKey.GetString(): GrafanaContainerLabel, } -func StartGrafLokiInDocker(ctx context.Context) (string, string, error) { +func StartGrafLokiInDocker(ctx context.Context, graflokiConfig resolved_config.GrafanaLokiConfig) (string, string, error) { dockerManager, err := docker_manager.CreateDockerManager(EmptyDockerClientOpts) if err != nil { return "", "", stacktrace.Propagate(err, "An error occurred creating the docker manager to start grafana and loki.") @@ -45,10 +54,9 @@ func StartGrafLokiInDocker(ctx context.Context) (string, string, error) { if err != nil { return "", "", stacktrace.Propagate(err, "An error occurred checking if Grafana and Loki exist.") } - if !doesGrafanaAndLokiExist { logrus.Infof("No running Grafana and Loki containers found. Creating them...") - lokiHost, err = createGrafanaAndLokiContainers(ctx, dockerManager) + lokiHost, err = createGrafanaAndLokiContainers(ctx, dockerManager, graflokiConfig) if err != nil { return "", "", stacktrace.Propagate(err, "An error occurred creating Grafana and Loki containers.") } @@ -58,7 +66,7 @@ func StartGrafLokiInDocker(ctx context.Context) (string, string, error) { return lokiHost, grafanaUrl, nil } -func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_manager.DockerManager) (string, error) { +func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_manager.DockerManager, graflokConfig resolved_config.GrafanaLokiConfig) (string, error) { lokiNatPort := nat.Port(strconv.Itoa(lokiPort) + "/tcp") grafanaNatPort := nat.Port(strconv.Itoa(grafanaPort) + "/tcp") @@ -67,7 +75,16 @@ func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_m return "", stacktrace.Propagate(err, "An error occurred getting Docker network id by Name: %v", bridgeNetworkName) } - lokiArgs := docker_manager.NewCreateAndStartContainerArgsBuilder(lokiImage, LokiContainerName, bridgeNetworkId). + lokiImage := defaultLokiImage + if graflokConfig.LokiImage != "" { + lokiImage = graflokConfig.LokiImage + } + lokiUuid, err := uuid_generator.GenerateUUIDString() + if err != nil { + return "", stacktrace.Propagate(err, "An error occurred generating a uuid for Loki.") + } + lokiContainerName := fmt.Sprintf("%v%v", LokiContainerNamePrefix, lokiUuid) + lokiArgs := docker_manager.NewCreateAndStartContainerArgsBuilder(lokiImage, lokiContainerName, bridgeNetworkId). WithUsedPorts(map[nat.Port]docker_manager.PortPublishSpec{ lokiNatPort: docker_manager.NewManualPublishingSpec(lokiPort), }). @@ -78,7 +95,7 @@ func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_m Build() lokiContainerId, _, err := dockerManager.CreateAndStartContainer(ctx, lokiArgs) if err != nil { - return "", stacktrace.Propagate(err, "An error occurred creating '%v' container.", LokiContainerName) + return "", stacktrace.Propagate(err, "An error occurred creating '%v' container.", lokiContainerName) } shouldDestroyLokiContainer := true defer func() { @@ -107,7 +124,7 @@ func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_m ApiVersion: int64(1), Datasources: []GrafanaDatasource{ { - Name: LokiContainerName, + Name: lokiContainerName, Type_: "loki", Access: "proxy", Url: lokiBridgeNetworkIpAddress, @@ -119,7 +136,7 @@ func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_m if err != nil { return "", stacktrace.Propagate(err, "An error occurred serializing Grafana datasource to yaml: %v", grafanaDatasourceYaml) } - logrus.Infof("Grafana data source yaml %v", string(grafanaDatasourceYaml)) + logrus.Debugf("Grafana data source yaml %v", string(grafanaDatasourceYaml)) tmpFile, err := os.CreateTemp("", "grafana-datasource-*.yaml") if err != nil { @@ -130,7 +147,17 @@ func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_m return "", stacktrace.Propagate(err, "An error occurred writing config.") } - grafanaArgs := docker_manager.NewCreateAndStartContainerArgsBuilder(grafanaImage, GrafanaContainerName, bridgeNetworkId). + grafanaImage := defaultGrafanaImage + if graflokConfig.GrafanaImage != "" { + grafanaImage = graflokConfig.GrafanaImage + } + root := service_user.NewServiceUser(rootUserUid) + grafanaUuid, err := uuid_generator.GenerateUUIDString() + if err != nil { + return "", stacktrace.Propagate(err, "An error occurred generating a uuid for Grafana.") + } + grafanaContainerName := fmt.Sprintf("%v%v", GrafanaContainerNamePrefix, grafanaUuid) + grafanaArgs := docker_manager.NewCreateAndStartContainerArgsBuilder(grafanaImage, grafanaContainerName, bridgeNetworkId). WithUsedPorts(map[nat.Port]docker_manager.PortPublishSpec{ grafanaNatPort: docker_manager.NewManualPublishingSpec(grafanaPort), }). @@ -146,10 +173,11 @@ func createGrafanaAndLokiContainers(ctx context.Context, dockerManager *docker_m WithRestartPolicy(docker_manager.RestartOnFailure). WithNetworkMode(bridgeNetworkName). WithLabels(grafanaContainerLabels). + WithUser(root). Build() grafanaContainerId, _, err := dockerManager.CreateAndStartContainer(ctx, grafanaArgs) if err != nil { - return "", stacktrace.Propagate(err, "An error creating creating '%v' container.", GrafanaContainerName) + return "", stacktrace.Propagate(err, "An error creating creating '%v' container.", grafanaContainerName) } shouldDestroyGrafanaContainer := true defer func() { @@ -215,6 +243,35 @@ func checkGrafanaAndLokiContainerExistence(ctx context.Context, dockerManager *d return existsLoki && existsGrafana, fmt.Sprintf("http://%v:%v", lokiBridgeNetworkIpAddress, lokiPort), nil } +func StopGrafLokiInDocker(ctx context.Context) error { + dockerManager, err := docker_manager.CreateDockerManager(EmptyDockerClientOpts) + if err != nil { + return stacktrace.Propagate(err, "An error occurred creating Docker manager.") + } + + grafanaContainer, err := getContainerByLabel(ctx, dockerManager, grafanaContainerLabels) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting Grafana container by labels: +%v", grafanaContainerLabels) + } + if grafanaContainer != nil { + if err := dockerManager.RemoveContainer(ctx, grafanaContainer.GetName()); err != nil { + return stacktrace.Propagate(err, "An error occurred removing Grafana container '%v'", GrafanaContainerNamePrefix) + } + } + + lokiContainer, err := getContainerByLabel(ctx, dockerManager, lokiContainerLabels) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting Loki container by labels: +%v", lokiContainerLabels) + } + if lokiContainer != nil { + if err := dockerManager.RemoveContainer(ctx, lokiContainer.GetName()); err != nil { + return stacktrace.Propagate(err, "An error occurred removing Loki container '%v'", GrafanaContainerNamePrefix) + } + } + + return nil +} + func getContainerByLabel(ctx context.Context, dockerManager *docker_manager.DockerManager, containerLabels map[string]string) (*types.Container, error) { containers, err := dockerManager.GetContainersByLabels(ctx, containerLabels, false) if err != nil { @@ -228,17 +285,3 @@ func getContainerByLabel(ctx context.Context, dockerManager *docker_manager.Dock } return containers[0], nil } - -func StopGrafLokiInDocker(ctx context.Context) error { - dockerManager, err := docker_manager.CreateDockerManager(EmptyDockerClientOpts) - if err != nil { - return stacktrace.Propagate(err, "An error occurred creating Docker manager.") - } - if err := dockerManager.RemoveContainer(ctx, GrafanaContainerName); err != nil { - return stacktrace.Propagate(err, "An error occurred removing Grafana container '%v'", GrafanaContainerName) - } - if err := dockerManager.RemoveContainer(ctx, LokiContainerName); err != nil { - return stacktrace.Propagate(err, "An error occurred removing Loki container '%v'", GrafanaContainerName) - } - return nil -} diff --git a/cli/cli/helpers/grafloki/kubernetes_grafloki.go b/cli/cli/helpers/grafloki/kubernetes_grafloki.go index 1472cfe617..6a71e764fa 100644 --- a/cli/cli/helpers/grafloki/kubernetes_grafloki.go +++ b/cli/cli/helpers/grafloki/kubernetes_grafloki.go @@ -3,6 +3,7 @@ package grafloki import ( "context" "fmt" + "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/resolved_config" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_manager" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/kubernetes_label_key" "github.com/kurtosis-tech/stacktrace" @@ -43,7 +44,7 @@ var grafanaLabels = map[string]string{ var httpApplicationProtocol = "http" -func StartGrafLokiInKubernetes(ctx context.Context) (string, string, error) { +func StartGrafLokiInKubernetes(ctx context.Context, graflokiConfig resolved_config.GrafanaLokiConfig) (string, string, error) { k8sManager, err := getKubernetesManager() if err != nil { return "", "", stacktrace.Propagate(err, "An error occurred getting Kubernetes Manager.") @@ -54,7 +55,7 @@ func StartGrafLokiInKubernetes(ctx context.Context) (string, string, error) { shouldRemoveGrafanaAndLoki := false doesGrafanaAndLokiExist, lokiHost := checkGrafanaAndLokiDeploymentExistence(ctx, k8sManager) if !doesGrafanaAndLokiExist { - lokiHost, removeGrafanaAndLokiFunc, err = createGrafanaAndLokiDeployments(ctx, k8sManager) + lokiHost, removeGrafanaAndLokiFunc, err = createGrafanaAndLokiDeployments(ctx, k8sManager, graflokiConfig) if err != nil { return "", "", stacktrace.Propagate(err, "An error occurred creating Grafana and Loki deployments.") } @@ -71,7 +72,7 @@ func StartGrafLokiInKubernetes(ctx context.Context) (string, string, error) { return lokiHost, getGrafanaUrlOnHostMachine(grafanaPort), nil } -func createGrafanaAndLokiDeployments(ctx context.Context, k8sManager *kubernetes_manager.KubernetesManager) (string, func(), error) { +func createGrafanaAndLokiDeployments(ctx context.Context, k8sManager *kubernetes_manager.KubernetesManager, graflokiConfig resolved_config.GrafanaLokiConfig) (string, func(), error) { graflokilNamespaceObj, err := k8sManager.CreateNamespace(ctx, graflokiNamespace, map[string]string{}, map[string]string{}) if err != nil { return "", nil, stacktrace.Propagate(err, "An error occurred creating namespace '%v'", graflokiNamespace) @@ -89,6 +90,10 @@ func createGrafanaAndLokiDeployments(ctx context.Context, k8sManager *kubernetes } }() + lokiImage := defaultLokiImage + if graflokiConfig.LokiImage != "" { + lokiImage = graflokiConfig.LokiImage + } lokiDeployment, err := k8sManager.CreateDeployment( ctx, graflokiNamespace, @@ -254,6 +259,10 @@ func createGrafanaAndLokiDeployments(ctx context.Context, k8sManager *kubernetes } }() + grafanaImage := defaultGrafanaImage + if graflokiConfig.GrafanaImage != "" { + grafanaImage = graflokiConfig.GrafanaImage + } grafanaDeployment, err := k8sManager.CreateDeployment( ctx, graflokiNamespace, diff --git a/cli/cli/helpers/grafloki/shared.go b/cli/cli/helpers/grafloki/shared.go index 0e58f3e150..3bbb10d0f9 100644 --- a/cli/cli/helpers/grafloki/shared.go +++ b/cli/cli/helpers/grafloki/shared.go @@ -1,11 +1,19 @@ package grafloki +import ( + "context" + "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/resolved_config" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/logs_aggregator" + "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" +) + const ( - lokiImage = "grafana/loki:3.4.2" - lokiPort = 3100 + defaultLokiImage = "grafana/loki:3.4.2" + lokiPort = 3100 - grafanaImage = "grafana/grafana:11.6.0" - grafanaPort = 3000 + defaultGrafanaImage = "grafana/grafana:11.6.0" + grafanaPort = 3000 grafanaAuthAnonymousEnabledEnvVarKey = "GF_AUTH_ANONYMOUS_ENABLED" grafanaAuthAnonymousEnabledEnvVarVal = "true" @@ -31,3 +39,59 @@ type GrafanaDatasources struct { ApiVersion int64 `yaml:"apiVersion"` Datasources []GrafanaDatasource `yaml:"datasources"` } + +func StartGrafloki(ctx context.Context, clusterType resolved_config.KurtosisClusterType, graflokiConfig resolved_config.GrafanaLokiConfig) (logs_aggregator.Sinks, string, error) { + var lokiHost string + var grafanaUrl string + var err error + switch clusterType { + case resolved_config.KurtosisClusterType_Docker: + lokiHost, grafanaUrl, err = StartGrafLokiInDocker(ctx, graflokiConfig) + if err != nil { + return nil, "", stacktrace.Propagate(err, "An error occurred starting Grafana and Loki in Docker.") + } + case resolved_config.KurtosisClusterType_Kubernetes: + lokiHost, grafanaUrl, err = StartGrafLokiInKubernetes(ctx, graflokiConfig) + if err != nil { + return nil, "", stacktrace.Propagate(err, "An error occurred starting Grafana and Loki in Kubernetes.") + } + default: + return nil, "", stacktrace.NewError("Unsupported cluster type: %v", clusterType.String()) + } + + // This matches the exact configurations here: https://vector.dev/docs/reference/configuration/sinks/loki/ + lokiSink := map[string]map[string]interface{}{ + "loki": { + "type": "loki", + "endpoint": lokiHost, + "encoding": map[string]string{ + "codec": "json", + }, + "labels": map[string]string{ + "job": "kurtosis", + }, + }, + } + + return lokiSink, grafanaUrl, nil +} + +func StopGrafloki(ctx context.Context, clusterType resolved_config.KurtosisClusterType) error { + switch clusterType { + case resolved_config.KurtosisClusterType_Docker: + err := StopGrafLokiInDocker(ctx) + if err != nil { + return stacktrace.Propagate(err, "An error occurred stopping Grafana and Loki containers in Docker.") + } + case resolved_config.KurtosisClusterType_Kubernetes: + err := StopGrafLokiInKubernetes(ctx) + if err != nil { + return stacktrace.Propagate(err, "An error occurred stopping Grafana and Loki containers in Kubernetes.") + } + default: + return stacktrace.NewError("Unsupported cluster type: %v", clusterType.String()) + } + + logrus.Info("Successfully stopped Grafana and Loki.") + return nil +} diff --git a/cli/cli/kurtosis_config/config_version/config_version.go b/cli/cli/kurtosis_config/config_version/config_version.go index b754bc7db3..d0c496ab68 100644 --- a/cli/cli/kurtosis_config/config_version/config_version.go +++ b/cli/cli/kurtosis_config/config_version/config_version.go @@ -8,6 +8,7 @@ const ( ConfigVersion_v0 ConfigVersion = iota ConfigVersion_v1 ConfigVersion_v2 // Fixed a typo in Kubernetes config, `enclave-size-in-Megabytes` -> `enclave-size-in-megabytes` - ConfigVersion_v3 - ConfigVersion_v4 + ConfigVersion_v3 // adds logs aggregator config + ConfigVersion_v4 // adds engine-node-name to KubernetesClusterConfig + ConfigVersion_v5 // adds GrafanaLokiConfig to KurtosisClusterConfig ) diff --git a/cli/cli/kurtosis_config/config_version/configversion_enumer.go b/cli/cli/kurtosis_config/config_version/configversion_enumer.go index 990c68ddbe..d74324e897 100644 --- a/cli/cli/kurtosis_config/config_version/configversion_enumer.go +++ b/cli/cli/kurtosis_config/config_version/configversion_enumer.go @@ -7,11 +7,11 @@ import ( "strings" ) -const _ConfigVersionName = "ConfigVersion_v0ConfigVersion_v1ConfigVersion_v2ConfigVersion_v3ConfigVersion_v4" +const _ConfigVersionName = "ConfigVersion_v0ConfigVersion_v1ConfigVersion_v2ConfigVersion_v3ConfigVersion_v4ConfigVersion_v5" -var _ConfigVersionIndex = [...]uint8{0, 16, 32, 48, 64, 80} +var _ConfigVersionIndex = [...]uint8{0, 16, 32, 48, 64, 80, 96} -const _ConfigVersionLowerName = "configversion_v0configversion_v1configversion_v2configversion_v3configversion_v4" +const _ConfigVersionLowerName = "configversion_v0configversion_v1configversion_v2configversion_v3configversion_v4configversion_v5" func (i ConfigVersion) String() string { if i >= ConfigVersion(len(_ConfigVersionIndex)-1) { @@ -29,9 +29,10 @@ func _ConfigVersionNoOp() { _ = x[ConfigVersion_v2-(2)] _ = x[ConfigVersion_v3-(3)] _ = x[ConfigVersion_v4-(4)] + _ = x[ConfigVersion_v5-(5)] } -var _ConfigVersionValues = []ConfigVersion{ConfigVersion_v0, ConfigVersion_v1, ConfigVersion_v2, ConfigVersion_v3, ConfigVersion_v4} +var _ConfigVersionValues = []ConfigVersion{ConfigVersion_v0, ConfigVersion_v1, ConfigVersion_v2, ConfigVersion_v3, ConfigVersion_v4, ConfigVersion_v5} var _ConfigVersionNameToValueMap = map[string]ConfigVersion{ _ConfigVersionName[0:16]: ConfigVersion_v0, @@ -44,6 +45,8 @@ var _ConfigVersionNameToValueMap = map[string]ConfigVersion{ _ConfigVersionLowerName[48:64]: ConfigVersion_v3, _ConfigVersionName[64:80]: ConfigVersion_v4, _ConfigVersionLowerName[64:80]: ConfigVersion_v4, + _ConfigVersionName[80:96]: ConfigVersion_v5, + _ConfigVersionLowerName[80:96]: ConfigVersion_v5, } var _ConfigVersionNames = []string{ @@ -52,6 +55,7 @@ var _ConfigVersionNames = []string{ _ConfigVersionName[32:48], _ConfigVersionName[48:64], _ConfigVersionName[64:80], + _ConfigVersionName[80:96], } // ConfigVersionString retrieves an enum value from the enum constants string name. diff --git a/cli/cli/kurtosis_config/overrides_deserializers/config_overrides_deserializers.go b/cli/cli/kurtosis_config/overrides_deserializers/config_overrides_deserializers.go index f0491e8cb8..e1e69bb16d 100644 --- a/cli/cli/kurtosis_config/overrides_deserializers/config_overrides_deserializers.go +++ b/cli/cli/kurtosis_config/overrides_deserializers/config_overrides_deserializers.go @@ -8,6 +8,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v2" "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v3" v4 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + v5 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v5" "github.com/kurtosis-tech/stacktrace" ) @@ -22,6 +23,18 @@ type configOverridesDeserializer func(configFileBytes []byte) (interface{}, erro // We keep these sorted in REVERSE chronological order so you don't need to scroll to the bottom each time // >>>>>>>>>>>>>>>>>>>>>>>>>>>>> INSTRUCTIONS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< var AllConfigOverridesDeserializers = map[config_version.ConfigVersion]configOverridesDeserializer{ + config_version.ConfigVersion_v5: func(configFileBytes []byte) (interface{}, error) { + overrides := &v5.KurtosisConfigV5{ + ConfigVersion: 0, + ShouldSendMetrics: nil, + KurtosisClusters: nil, + CloudConfig: nil, + } + if err := yaml.Unmarshal(configFileBytes, overrides); err != nil { + return nil, stacktrace.Propagate(err, "An error occurred unmarshalling Kurtosis config YAML file content '%v'", string(configFileBytes)) + } + return overrides, nil + }, config_version.ConfigVersion_v4: func(configFileBytes []byte) (interface{}, error) { overrides := &v4.KurtosisConfigV4{ ConfigVersion: 0, diff --git a/cli/cli/kurtosis_config/overrides_migrators/config_overrides_migrators.go b/cli/cli/kurtosis_config/overrides_migrators/config_overrides_migrators.go index b2772571f6..198fd7d349 100644 --- a/cli/cli/kurtosis_config/overrides_migrators/config_overrides_migrators.go +++ b/cli/cli/kurtosis_config/overrides_migrators/config_overrides_migrators.go @@ -7,6 +7,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v2" "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v3" "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + v5 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v5" "github.com/kurtosis-tech/stacktrace" ) @@ -26,6 +27,7 @@ type configOverridesMigrator = func(uncastedOldConfig interface{}) (interface{}, // to the bottom each time // >>>>>>>>>>>>>>>>>>>>>>>>>>>>> INSTRUCTIONS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< var AllConfigOverridesMigrators = map[config_version.ConfigVersion]configOverridesMigrator{ + config_version.ConfigVersion_v4: migrateFromV4, config_version.ConfigVersion_v3: migrateFromV3, config_version.ConfigVersion_v2: migrateFromV2, config_version.ConfigVersion_v1: migrateFromV1, @@ -33,6 +35,77 @@ var AllConfigOverridesMigrators = map[config_version.ConfigVersion]configOverrid } // vvvvvvvvvvvvvvvvvvvvvvv REVERSE chronological order so you don't have to scroll forever vvvvvvvvvvvvvvvvvvvv +func migrateFromV4(uncastedConfig interface{}) (interface{}, error) { + // cast "uncastedConfig" to current version we're upgrading from + castedOldConfig, ok := uncastedConfig.(*v4.KurtosisConfigV4) + if !ok { + return nil, stacktrace.NewError( + "Failed to cast old configuration '%+v' to expected configuration struct", + uncastedConfig, + ) + } + + var newClusters map[string]*v5.KurtosisClusterConfigV5 + if castedOldConfig.KurtosisClusters != nil { + newClusters = map[string]*v5.KurtosisClusterConfigV5{} + for oldClusterName, oldClusterConfig := range castedOldConfig.KurtosisClusters { + oldKubernetesConfig := oldClusterConfig.Config + oldLogsAggregatorConfig := oldClusterConfig.LogsAggregator + + var newKubernetesConfig *v5.KubernetesClusterConfigV5 + if oldKubernetesConfig != nil { + newKubernetesConfig = &v5.KubernetesClusterConfigV5{ + KubernetesClusterName: oldKubernetesConfig.KubernetesClusterName, + StorageClass: oldKubernetesConfig.StorageClass, + EnclaveSizeInMegabytes: oldKubernetesConfig.EnclaveSizeInMegabytes, + EngineNodeName: oldKubernetesConfig.EngineNodeName, + } + } + + var newLogsAggregatorConfig *v5.LogsAggregatorConfigV5 + if oldLogsAggregatorConfig != nil { + newLogsAggregatorConfig = &v5.LogsAggregatorConfigV5{ + Sinks: oldLogsAggregatorConfig.Sinks, + } + } + + newGraflokiConfig := &v5.GrafanaLokiConfig{ + ShouldStartBeforeEngine: false, + GrafanaImage: "", + LokiImage: "", + } + + newClusterConfig := &v5.KurtosisClusterConfigV5{ + Type: oldClusterConfig.Type, + Config: newKubernetesConfig, + LogsAggregator: newLogsAggregatorConfig, + GrafanaLokiConfig: newGraflokiConfig, + ShouldEnableDefaultLogsSink: nil, + } + + newClusters[oldClusterName] = newClusterConfig + } + } + + var newCloudConfig *v5.KurtosisCloudConfigV5 + if castedOldConfig.CloudConfig != nil { + newCloudConfig = &v5.KurtosisCloudConfigV5{ + ApiUrl: castedOldConfig.CloudConfig.ApiUrl, + Port: castedOldConfig.CloudConfig.Port, + CertificateChain: castedOldConfig.CloudConfig.CertificateChain, + } + } + + newConfig := &v5.KurtosisConfigV5{ + ConfigVersion: config_version.ConfigVersion_v4, + ShouldSendMetrics: castedOldConfig.ShouldSendMetrics, + KurtosisClusters: newClusters, + CloudConfig: newCloudConfig, + } + + return newConfig, nil +} + func migrateFromV3(uncastedConfig interface{}) (interface{}, error) { // cast "uncastedConfig" to current version we're upgrading from castedOldConfig, ok := uncastedConfig.(*v3.KurtosisConfigV3) diff --git a/cli/cli/kurtosis_config/overrides_objects/config_version_emptystructs.go b/cli/cli/kurtosis_config/overrides_objects/config_version_emptystructs.go index 04403c549d..2018b31dce 100644 --- a/cli/cli/kurtosis_config/overrides_objects/config_version_emptystructs.go +++ b/cli/cli/kurtosis_config/overrides_objects/config_version_emptystructs.go @@ -6,7 +6,8 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v1" "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v2" "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v3" - v4 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v5" ) /* @@ -19,6 +20,12 @@ For an explanation, see the docs on TestKurtosisConfigIsUsingLatestConfigStruct. */ var AllConfigVersionEmptyStructs = map[config_version.ConfigVersion]interface{}{ + config_version.ConfigVersion_v5: &v5.KurtosisConfigV5{ + ConfigVersion: 0, + ShouldSendMetrics: nil, + KurtosisClusters: nil, + CloudConfig: nil, + }, config_version.ConfigVersion_v4: &v4.KurtosisConfigV4{ ConfigVersion: 0, ShouldSendMetrics: nil, diff --git a/cli/cli/kurtosis_config/overrides_objects/v5/grafana_loki_config_v5.go b/cli/cli/kurtosis_config/overrides_objects/v5/grafana_loki_config_v5.go new file mode 100644 index 0000000000..ca3b7d7c34 --- /dev/null +++ b/cli/cli/kurtosis_config/overrides_objects/v5/grafana_loki_config_v5.go @@ -0,0 +1,10 @@ +package v5 + +type GrafanaLokiConfig struct { + // ShouldStartBeforeEngine starts Grafana and Loki before the engine, if true. + // Equivalent to running `grafloki start` before `engine start`. + // Useful for treating Grafana and Loki as default logging setup in Kurtosis. + ShouldStartBeforeEngine bool `yaml:"should-start-before-engine,omitempty"` + GrafanaImage string `yaml:"grafana-image,omitempty"` + LokiImage string `yaml:"loki-image,omitempty"` +} diff --git a/cli/cli/kurtosis_config/overrides_objects/v5/kubernetes_cluster_config_v5.go b/cli/cli/kurtosis_config/overrides_objects/v5/kubernetes_cluster_config_v5.go new file mode 100644 index 0000000000..4a4a616a36 --- /dev/null +++ b/cli/cli/kurtosis_config/overrides_objects/v5/kubernetes_cluster_config_v5.go @@ -0,0 +1,17 @@ +package v5 + +/* +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + DO NOT CHANGE THIS FILE! + If you change this file, it will break config for users who have instantiated an + overrides file with this version of config overrides! + Instead, to make changes, you will need to add a new version of the config +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +*/ + +type KubernetesClusterConfigV5 struct { + KubernetesClusterName *string `yaml:"kubernetes-cluster-name,omitempty"` + StorageClass *string `yaml:"storage-class,omitempty"` + EnclaveSizeInMegabytes *uint `yaml:"enclave-size-in-megabytes,omitempty"` + EngineNodeName *string `yaml:"engine-node-name,omitempty"` +} diff --git a/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_cloud_config_v5.go b/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_cloud_config_v5.go new file mode 100644 index 0000000000..ba8d293584 --- /dev/null +++ b/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_cloud_config_v5.go @@ -0,0 +1,16 @@ +package v5 + +/* +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + DO NOT CHANGE THIS FILE! + If you change this file, it will break config for users who have instantiated an + overrides file with this version of config overrides! + Instead, to make changes, you will need to add a new version of the config +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +*/ + +type KurtosisCloudConfigV5 struct { + ApiUrl *string `yaml:"api-url,omitempty"` + Port *uint `yaml:"port,omitempty"` + CertificateChain *string `yaml:"certificate-chain,omitempty"` +} diff --git a/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_cluster_config_v5.go b/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_cluster_config_v5.go new file mode 100644 index 0000000000..ee78c82b77 --- /dev/null +++ b/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_cluster_config_v5.go @@ -0,0 +1,22 @@ +package v5 + +/* +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + DO NOT CHANGE THIS FILE! + If you change this file, it will break config for users who have instantiated an + overrides file with this version of config overrides! + Instead, to make changes, you will need to add a new version of the config +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +*/ + +type KurtosisClusterConfigV5 struct { + Type *string `yaml:"type,omitempty"` + // If we ever get another type of cluster that has configuration, this will need to be polymorphically deserialized + Config *KubernetesClusterConfigV5 `yaml:"config,omitempty"` + LogsAggregator *LogsAggregatorConfigV5 `yaml:"logs-aggregator,omitempty"` + GrafanaLokiConfig *GrafanaLokiConfig `yaml:"grafana-loki,omitempty"` + + // ShouldEnableDefaultLogsSink controls use of PersistentVolumeLogsDB (default: true) as the storage location for logs. + // Useful for saving storage when using custom or Grafana Loki-based logging. + ShouldEnableDefaultLogsSink *bool `yaml:"should-enable-default-logs-sink,omitempty"` +} diff --git a/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_config_v5.go b/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_config_v5.go new file mode 100644 index 0000000000..39ecd8960e --- /dev/null +++ b/cli/cli/kurtosis_config/overrides_objects/v5/kurtosis_config_v5.go @@ -0,0 +1,26 @@ +package v5 + +import "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/config_version" + +/* +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + DO NOT CHANGE THIS FILE! + If you change this file, it will break config for users who have instantiated an + overrides file with this version of config overrides! + Instead, to make changes, you will need to add a new version of the config +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +*/ + +// NOTE: All new YAML property names here should be kebab-case because +// 1. it's easier to read +// 2. it's easier to write +// 3. it's consistent with previous properties and changing the format of an already-written config file is very difficult +type KurtosisConfigV5 struct { + // vvvvvvvvv Every new Kurtosis config version must have this key vvvvvvvv + ConfigVersion config_version.ConfigVersion `yaml:"config-version"` + // ^^^^^^^^^ Every new Kurtosis config version must have this key ^^^^^^^^ + + ShouldSendMetrics *bool `yaml:"should-send-metrics,omitempty"` + KurtosisClusters map[string]*KurtosisClusterConfigV5 `yaml:"kurtosis-clusters,omitempty"` + CloudConfig *KurtosisCloudConfigV5 `yaml:"cloud-config,omitempty"` +} diff --git a/cli/cli/kurtosis_config/overrides_objects/v5/logs_aggregator_config_v5.go b/cli/cli/kurtosis_config/overrides_objects/v5/logs_aggregator_config_v5.go new file mode 100644 index 0000000000..e3f9406862 --- /dev/null +++ b/cli/cli/kurtosis_config/overrides_objects/v5/logs_aggregator_config_v5.go @@ -0,0 +1,5 @@ +package v5 + +type LogsAggregatorConfigV5 struct { + Sinks map[string]map[string]interface{} `yaml:"sinks,omitempty"` +} diff --git a/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go b/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go index 8b0821193c..c9f399422f 100644 --- a/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go +++ b/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config.go @@ -2,7 +2,7 @@ package resolved_config import ( "context" - v4 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + v5 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v5" "strings" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/backend_creator" @@ -28,13 +28,21 @@ type KurtosisClusterConfig struct { engineBackendConfigSupplier engine_server_launcher.KurtosisBackendConfigSupplier clusterType KurtosisClusterType logsAggregator LogsAggregatorConfig + graflokiConfig GrafanaLokiConfig + shouldEnableDefaultLogsSink bool } type LogsAggregatorConfig struct { Sinks logs_aggregator.Sinks } -func NewKurtosisClusterConfigFromOverrides(clusterId string, overrides *v4.KurtosisClusterConfigV4) (*KurtosisClusterConfig, error) { +type GrafanaLokiConfig struct { + ShouldStartBeforeEngine bool + GrafanaImage string + LokiImage string +} + +func NewKurtosisClusterConfigFromOverrides(clusterId string, overrides *v5.KurtosisClusterConfigV5) (*KurtosisClusterConfig, error) { if overrides.Type == nil { return nil, stacktrace.NewError("Kurtosis cluster must have a defined type") } @@ -73,11 +81,27 @@ func NewKurtosisClusterConfigFromOverrides(clusterId string, overrides *v4.Kurto } } + var grafloki GrafanaLokiConfig + if overrides.GrafanaLokiConfig != nil { + grafloki = GrafanaLokiConfig{ + ShouldStartBeforeEngine: overrides.GrafanaLokiConfig.ShouldStartBeforeEngine, + GrafanaImage: overrides.GrafanaLokiConfig.GrafanaImage, + LokiImage: overrides.GrafanaLokiConfig.LokiImage, + } + } + + shouldEnableDefaultLogsSink := DefaultShouldEnableDefaultLogsSink + if overrides.ShouldEnableDefaultLogsSink != nil { + shouldEnableDefaultLogsSink = *overrides.ShouldEnableDefaultLogsSink + } + return &KurtosisClusterConfig{ kurtosisBackendSupplier: backendSupplier, engineBackendConfigSupplier: engineBackendConfigSupplier, clusterType: clusterType, logsAggregator: logsAggregator, + graflokiConfig: grafloki, + shouldEnableDefaultLogsSink: shouldEnableDefaultLogsSink, }, nil } @@ -101,12 +125,20 @@ func (clusterConfig *KurtosisClusterConfig) GetLogsAggregatorConfig() LogsAggreg return clusterConfig.logsAggregator } +func (clusterConfig *KurtosisClusterConfig) GetGraflokiConfig() GrafanaLokiConfig { + return clusterConfig.graflokiConfig +} + +func (clusterConfig *KurtosisClusterConfig) ShouldEnableDefaultLogsSink() bool { + return clusterConfig.shouldEnableDefaultLogsSink +} + // ==================================================================================================== // // Private Helpers // // ==================================================================================================== -func getSuppliers(clusterId string, clusterType KurtosisClusterType, kubernetesConfig *v4.KubernetesClusterConfigV4) ( +func getSuppliers(clusterId string, clusterType KurtosisClusterType, kubernetesConfig *v5.KubernetesClusterConfigV5) ( kurtosisBackendSupplier, engine_server_launcher.KurtosisBackendConfigSupplier, error, diff --git a/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config_test.go b/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config_test.go index 7fa7dca015..381bc14132 100644 --- a/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config_test.go +++ b/cli/cli/kurtosis_config/resolved_config/kurtosis_cluster_config_test.go @@ -1,7 +1,7 @@ package resolved_config import ( - v4 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v5" "testing" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/logs_aggregator" @@ -9,10 +9,12 @@ import ( ) func TestNewKurtosisClusterConfigEmptyOverrides(t *testing.T) { - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ - Type: nil, - Config: nil, - LogsAggregator: nil, + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: nil, + Config: nil, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.Error(t, err) @@ -20,10 +22,12 @@ func TestNewKurtosisClusterConfigEmptyOverrides(t *testing.T) { func TestNewKurtosisClusterConfigDockerType(t *testing.T) { dockerType := KurtosisClusterType_Docker.String() - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ - Type: &dockerType, - Config: nil, - LogsAggregator: nil, + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &dockerType, + Config: nil, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.NoError(t, err) @@ -31,10 +35,12 @@ func TestNewKurtosisClusterConfigDockerType(t *testing.T) { func TestNewKurtosisClusterConfigKubernetesNoConfig(t *testing.T) { kubernetesType := KurtosisClusterType_Kubernetes.String() - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ - Type: &kubernetesType, - Config: nil, - LogsAggregator: nil, + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &kubernetesType, + Config: nil, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.Error(t, err) @@ -42,10 +48,12 @@ func TestNewKurtosisClusterConfigKubernetesNoConfig(t *testing.T) { func TestNewKurtosisClusterConfigNonsenseType(t *testing.T) { clusterType := "gdsfgsdfvsf" - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ - Type: &clusterType, - Config: nil, - LogsAggregator: nil, + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &clusterType, + Config: nil, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.Error(t, err) @@ -54,16 +62,18 @@ func TestNewKurtosisClusterConfigNonsenseType(t *testing.T) { func TestNewKurtosisClusterConfigKubernetesPartialConfig(t *testing.T) { kubernetesType := KurtosisClusterType_Kubernetes.String() kubernetesClusterName := "some-name" - kubernetesPartialConfig := v4.KubernetesClusterConfigV4{ + kubernetesPartialConfig := v5.KubernetesClusterConfigV5{ KubernetesClusterName: &kubernetesClusterName, StorageClass: nil, EnclaveSizeInMegabytes: nil, EngineNodeName: nil, } - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ - Type: &kubernetesType, - Config: &kubernetesPartialConfig, - LogsAggregator: nil, + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &kubernetesType, + Config: &kubernetesPartialConfig, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.Error(t, err) @@ -75,16 +85,18 @@ func TestNewKurtosisClusterConfigKubernetesFullConfig(t *testing.T) { kubernetesStorageClass := "some-storage-class" kubernetesEnclaveSizeInMB := uint(5) kubernetesEngineNodeName := "some-node-name" - kubernetesFullConfig := v4.KubernetesClusterConfigV4{ + kubernetesFullConfig := v5.KubernetesClusterConfigV5{ KubernetesClusterName: &kubernetesClusterName, StorageClass: &kubernetesStorageClass, EnclaveSizeInMegabytes: &kubernetesEnclaveSizeInMB, EngineNodeName: &kubernetesEngineNodeName, } - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ - Type: &kubernetesType, - Config: &kubernetesFullConfig, - LogsAggregator: nil, + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &kubernetesType, + Config: &kubernetesFullConfig, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.NoError(t, err) @@ -96,16 +108,18 @@ func TestNewKurtosisClusterConfigLogsAggregatorNoConfig(t *testing.T) { kubernetesStorageClass := "some-storage-class" kubernetesEnclaveSizeInMB := uint(5) kubernetesEngineNodeName := "some-node-name" - kubernetesFullConfig := v4.KubernetesClusterConfigV4{ + kubernetesFullConfig := v5.KubernetesClusterConfigV5{ KubernetesClusterName: &kubernetesClusterName, StorageClass: &kubernetesStorageClass, EnclaveSizeInMegabytes: &kubernetesEnclaveSizeInMB, EngineNodeName: &kubernetesEngineNodeName, } - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ - Type: &kubernetesType, - Config: &kubernetesFullConfig, - LogsAggregator: nil, + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &kubernetesType, + Config: &kubernetesFullConfig, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.NoError(t, err) @@ -117,22 +131,24 @@ func TestNewKurtosisClusterConfigLogsAggregatorReservedSinkId(t *testing.T) { kubernetesStorageClass := "some-storage-class" kubernetesEnclaveSizeInMB := uint(5) kubernetesEngineNodeName := "some-node-name" - kubernetesFullConfig := v4.KubernetesClusterConfigV4{ + kubernetesFullConfig := v5.KubernetesClusterConfigV5{ KubernetesClusterName: &kubernetesClusterName, StorageClass: &kubernetesStorageClass, EnclaveSizeInMegabytes: &kubernetesEnclaveSizeInMB, EngineNodeName: &kubernetesEngineNodeName, } - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ Type: &kubernetesType, Config: &kubernetesFullConfig, - LogsAggregator: &v4.LogsAggregatorConfigV4{ + LogsAggregator: &v5.LogsAggregatorConfigV5{ Sinks: map[string]map[string]interface{}{ logs_aggregator.DefaultSinkId: { "type": "elasticsearch", }, }, }, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.Error(t, err) @@ -144,22 +160,110 @@ func TestNewKurtosisClusterConfigLogsAggregatorFullConfig(t *testing.T) { kubernetesStorageClass := "some-storage-class" kubernetesEnclaveSizeInMB := uint(5) kubernetesEngineNodeName := "some-node-name" - kubernetesFullConfig := v4.KubernetesClusterConfigV4{ + kubernetesFullConfig := v5.KubernetesClusterConfigV5{ KubernetesClusterName: &kubernetesClusterName, StorageClass: &kubernetesStorageClass, EnclaveSizeInMegabytes: &kubernetesEnclaveSizeInMB, EngineNodeName: &kubernetesEngineNodeName, } - kurtosisClusterConfigOverrides := v4.KurtosisClusterConfigV4{ + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ Type: &kubernetesType, Config: &kubernetesFullConfig, - LogsAggregator: &v4.LogsAggregatorConfigV4{ + LogsAggregator: &v5.LogsAggregatorConfigV5{ Sinks: map[string]map[string]interface{}{ "elasticsearch": { "type": "elasticsearch", }, }, }, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, + } + _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) + require.NoError(t, err) +} + +func TestNewKurtosisClusterConfigGraflokiNoConfig(t *testing.T) { + kubernetesType := KurtosisClusterType_Kubernetes.String() + kubernetesClusterName := "some-name" + kubernetesStorageClass := "some-storage-class" + kubernetesEnclaveSizeInMB := uint(5) + kubernetesEngineNodeName := "some-node-name" + kubernetesFullConfig := v5.KubernetesClusterConfigV5{ + KubernetesClusterName: &kubernetesClusterName, + StorageClass: &kubernetesStorageClass, + EnclaveSizeInMegabytes: &kubernetesEnclaveSizeInMB, + EngineNodeName: &kubernetesEngineNodeName, + } + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &kubernetesType, + Config: &kubernetesFullConfig, + LogsAggregator: &v5.LogsAggregatorConfigV5{ + Sinks: map[string]map[string]interface{}{ + "elasticsearch": { + "type": "elasticsearch", + }, + }, + }, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: nil, + } + _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) + require.NoError(t, err) +} + +func TestNewKurtosisClusterConfigGraflokiFullConfig(t *testing.T) { + kubernetesType := KurtosisClusterType_Kubernetes.String() + kubernetesClusterName := "some-name" + kubernetesStorageClass := "some-storage-class" + kubernetesEnclaveSizeInMB := uint(5) + kubernetesEngineNodeName := "some-node-name" + grafanaImage := "grafana:1.32" + lokiImage := "loki:1.32" + kubernetesFullConfig := v5.KubernetesClusterConfigV5{ + KubernetesClusterName: &kubernetesClusterName, + StorageClass: &kubernetesStorageClass, + EnclaveSizeInMegabytes: &kubernetesEnclaveSizeInMB, + EngineNodeName: &kubernetesEngineNodeName, + } + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &kubernetesType, + Config: &kubernetesFullConfig, + LogsAggregator: nil, + GrafanaLokiConfig: &v5.GrafanaLokiConfig{ + ShouldStartBeforeEngine: false, + GrafanaImage: grafanaImage, + LokiImage: lokiImage, + }, + ShouldEnableDefaultLogsSink: nil, + } + actualKurtosisClusterConfig, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) + require.NotNil(t, actualKurtosisClusterConfig.graflokiConfig) + require.Equal(t, actualKurtosisClusterConfig.graflokiConfig.GrafanaImage, grafanaImage) + require.Equal(t, actualKurtosisClusterConfig.graflokiConfig.LokiImage, lokiImage) + require.False(t, actualKurtosisClusterConfig.graflokiConfig.ShouldStartBeforeEngine) + require.NoError(t, err) +} + +func TestNewKurtosisClusterConfigShouldEnableDefaultLogsSink(t *testing.T) { + kubernetesType := KurtosisClusterType_Kubernetes.String() + kubernetesClusterName := "some-name" + kubernetesStorageClass := "some-storage-class" + kubernetesEnclaveSizeInMB := uint(5) + kubernetesEngineNodeName := "some-node-name" + ShouldEnableDefaultLogsSink := true + kubernetesFullConfig := v5.KubernetesClusterConfigV5{ + KubernetesClusterName: &kubernetesClusterName, + StorageClass: &kubernetesStorageClass, + EnclaveSizeInMegabytes: &kubernetesEnclaveSizeInMB, + EngineNodeName: &kubernetesEngineNodeName, + } + kurtosisClusterConfigOverrides := v5.KurtosisClusterConfigV5{ + Type: &kubernetesType, + Config: &kubernetesFullConfig, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: &ShouldEnableDefaultLogsSink, } _, err := NewKurtosisClusterConfigFromOverrides("test", &kurtosisClusterConfigOverrides) require.NoError(t, err) diff --git a/cli/cli/kurtosis_config/resolved_config/kurtosis_config.go b/cli/cli/kurtosis_config/resolved_config/kurtosis_config.go index 2b95a712a9..ed01ca69ad 100644 --- a/cli/cli/kurtosis_config/resolved_config/kurtosis_config.go +++ b/cli/cli/kurtosis_config/resolved_config/kurtosis_config.go @@ -2,7 +2,7 @@ package resolved_config import ( "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/config_version" - "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + v5 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v5" "github.com/kurtosis-tech/stacktrace" ) @@ -22,6 +22,10 @@ const ( // Certificate chain obtained by running: openssl s_client -connect cloud.kurtosis.com:8080 -showcerts DefaultCertificateChain = "-----BEGIN CERTIFICATE-----\nMIIF0TCCBLmgAwIBAgIQDyigPWbHPvH8PY0tWs+GfzANBgkqhkiG9w0BAQsFADA8\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g\nUlNBIDIwNDggTTAxMB4XDTIzMDcyMTAwMDAwMFoXDTI0MDgxODIzNTk1OVowHTEb\nMBkGA1UEAxMSY2xvdWQua3VydG9zaXMuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAm5pEA+3RLt32aCSorHdiLUVRGJ5lAWBVUmS/5QBDNs6oYPYe\nV2oaHwgb0CxVcjhe+OzYeukJOY9g7uKsLAbTMtoKrrqqm8FuOnr1FKWV3/aopGCA\nKkUwQFf24oSeEDoA9SzLlJolVHWxOMiwPgq0LMg7vmIGmGCeXW6IOWQ6t5DLz9Mg\naUIunrRt9CsiMp9fEJzip4RkGfQL9t/B3Y5dtctNW/NHhmn0hFwdKM6NFetzR8JU\nmywfDTBlhkVy6PcGklIJCtbB02VifcnwYLkmlG4dddCzR6whn06h4KYcbIRtAAhs\nCUnVbi+8jn2OqvKSWJ0RTnNQ45wIVu2GBnbgoQIDAQABo4IC7DCCAugwHwYDVR0j\nBBgwFoAUgbgOY4qJEhjl+js7UJWf5uWQE4UwHQYDVR0OBBYEFOrSXY4CXs9tNuMg\nksZe0C3z83OtMB0GA1UdEQQWMBSCEmNsb3VkLmt1cnRvc2lzLmNvbTAOBgNVHQ8B\nAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMDsGA1UdHwQ0\nMDIwMKAuoCyGKmh0dHA6Ly9jcmwucjJtMDEuYW1hem9udHJ1c3QuY29tL3IybTAx\nLmNybDATBgNVHSAEDDAKMAgGBmeBDAECATB1BggrBgEFBQcBAQRpMGcwLQYIKwYB\nBQUHMAGGIWh0dHA6Ly9vY3NwLnIybTAxLmFtYXpvbnRydXN0LmNvbTA2BggrBgEF\nBQcwAoYqaHR0cDovL2NydC5yMm0wMS5hbWF6b250cnVzdC5jb20vcjJtMDEuY2Vy\nMAwGA1UdEwEB/wQCMAAwggF/BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB3AO7N0GTV\n2xrOxVy3nbTNE6Iyh0Z8vOzew1FIWUZxH7WbAAABiXj17bMAAAQDAEgwRgIhAMRo\nVj0REFx0sDfWWgLLGr74Vb3ZFIG4UP2e3RnFJvzYAiEAmiI6Yn8IUBFDK0XVzSXu\nEOOk1lG1P6Joa1to8z9u7t4AdwBIsONr2qZHNA/lagL6nTDrHFIBy1bdLIHZu7+r\nOdiEcwAAAYl49e2uAAAEAwBIMEYCIQC+A2CnA4MPZJkoQev4Sh97dmozlPGNZIOD\nSvCANNx+/wIhAOk5geC6d42rDwE8hclRiGwIlXYacLGHqPKPEWgvQHLKAHUA2ra/\naz+1tiKfm8K7XGvocJFxbLtRhIU0vaQ9MEjX+6sAAAGJePXthQAABAMARjBEAiBD\ngHWN1z3GQBEZb7UAccg1tLEHGHwZTeMvAC+JJZHzigIgZOIagJoMAWCD+n7IfHWR\nCAdI6Z5FF7GFsIJwd0/ytgMwDQYJKoZIhvcNAQELBQADggEBACjM3hpxhf10xU6q\nDFJ6r8ayq/C02fRss+gF1hFTl3aJOngIQenHocb0xqTqaOKsm68MpxVI0fIXTWGe\nwYTpOIYXekHcftCJrgE8b3+kTtRp9cihnalq1MrkchWuN8eGZ4kgjCl9MYKV+7/u\nYG8Kzg4OxPwhEcYUgmPavhG2+K6RjyB1rR2KtEp7kI8Nn5UmI86Sty0PWY9+xaVw\nmvs1l/K58Y+kW/hJXnY93UWckQn3qV5nU/dA0zJkj63+JaZ2+MVeo1VHonjufLvX\nBT1NfrF+vGDF7ULMkPbSrLzMlbl6ULYqIEARJQHr2BouJuNScp9z3vZXHCiqkjaY\nGiZS750=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEXjCCA0agAwIBAgITB3MSOAudZoijOx7Zv5zNpo4ODzANBgkqhkiG9w0BAQsF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAxMB4XDTIyMDgyMzIyMjEyOFoXDTMwMDgyMzIyMjEyOFowPDEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEcMBoGA1UEAxMTQW1hem9uIFJT\nQSAyMDQ4IE0wMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOtxLKnL\nH4gokjIwr4pXD3i3NyWVVYesZ1yX0yLI2qIUZ2t88Gfa4gMqs1YSXca1R/lnCKeT\nepWSGA+0+fkQNpp/L4C2T7oTTsddUx7g3ZYzByDTlrwS5HRQQqEFE3O1T5tEJP4t\nf+28IoXsNiEzl3UGzicYgtzj2cWCB41eJgEmJmcf2T8TzzK6a614ZPyq/w4CPAff\nnAV4coz96nW3AyiE2uhuB4zQUIXvgVSycW7sbWLvj5TDXunEpNCRwC4kkZjK7rol\njtT2cbb7W2s4Bkg3R42G3PLqBvt2N32e/0JOTViCk8/iccJ4sXqrS1uUN4iB5Nmv\nJK74csVl+0u0UecCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD\nVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNV\nHQ4EFgQUgbgOY4qJEhjl+js7UJWf5uWQE4UwHwYDVR0jBBgwFoAUhBjMhTTsvAyU\nlC4IWZzHshBOCggwewYIKwYBBQUHAQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8v\nb2NzcC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDov\nL2NydC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8E\nODA2MDSgMqAwhi5odHRwOi8vY3JsLnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jv\nb3RjYTEuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IB\nAQCtAN4CBSMuBjJitGuxlBbkEUDeK/pZwTXv4KqPK0G50fOHOQAd8j21p0cMBgbG\nkfMHVwLU7b0XwZCav0h1ogdPMN1KakK1DT0VwA/+hFvGPJnMV1Kx2G4S1ZaSk0uU\n5QfoiYIIano01J5k4T2HapKQmmOhS/iPtuo00wW+IMLeBuKMn3OLn005hcrOGTad\nhcmeyfhQP7Z+iKHvyoQGi1C0ClymHETx/chhQGDyYSWqB/THwnN15AwLQo0E5V9E\nSJlbe4mBlqeInUsNYugExNf+tOiybcrswBy8OFsd34XOW3rjSUtsuafd9AWySa3h\nxRRrwszrzX/WWGm6wyB+f7C4\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEkjCCA3qgAwIBAgITBn+USionzfP6wq4rAfkI7rnExjANBgkqhkiG9w0BAQsF\nADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNj\nb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4x\nOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1\ndGhvcml0eSAtIEcyMB4XDTE1MDUyNTEyMDAwMFoXDTM3MTIzMTAxMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\nca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\nIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\nVOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\njgSubJrIqg0CAwEAAaOCATEwggEtMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/\nBAQDAgGGMB0GA1UdDgQWBBSEGMyFNOy8DJSULghZnMeyEE4KCDAfBgNVHSMEGDAW\ngBScXwDfqgHXMCs4iKK4bUqc8hGRgzB4BggrBgEFBQcBAQRsMGowLgYIKwYBBQUH\nMAGGImh0dHA6Ly9vY3NwLnJvb3RnMi5hbWF6b250cnVzdC5jb20wOAYIKwYBBQUH\nMAKGLGh0dHA6Ly9jcnQucm9vdGcyLmFtYXpvbnRydXN0LmNvbS9yb290ZzIuY2Vy\nMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwucm9vdGcyLmFtYXpvbnRydXN0\nLmNvbS9yb290ZzIuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQsF\nAAOCAQEAYjdCXLwQtT6LLOkMm2xF4gcAevnFWAu5CIw+7bMlPLVvUOTNNWqnkzSW\nMiGpSESrnO09tKpzbeR/FoCJbM8oAxiDR3mjEH4wW6w7sGDgd9QIpuEdfF7Au/ma\neyKdpwAJfqxGF4PcnCZXmTA5YpaP7dreqsXMGz7KQ2hsVxa81Q4gLv7/wmpdLqBK\nbRRYh5TmOTFffHPLkIhqhBGWJ6bt2YFGpn6jcgAKUj6DiAdjd4lpFw85hdKrCEVN\n0FE6/V1dN2RMfjCyVSRCnTawXZwXgWHxyvkQAiSr6w10kY17RSlQOYiypok1JR4U\nakcjMS9cmvqtmg5iUaQqqcT5NJ0hGA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV\nBAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw\nMAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\neTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV\nUzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp\nZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\nMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/\ny8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N\nTm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo\nOt+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C\nzyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J\nQ4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB\nAAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O\nBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV\nrNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u\nc3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud\nHwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG\nBFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G\nVfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1\nl08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt\n8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ\n59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu\nVsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w=\n-----END CERTIFICATE-----" portNumberUpperBound = uint(65535) + + // Default log sink is PersistentVolumeLogsDatabase, used by service logs. + // Enabled by default for log access, but can be disabled if using a custom or Grafana Loki setup that leverages export logs feature + DefaultShouldEnableDefaultLogsSink = true ) /* @@ -38,7 +42,7 @@ the overrides on top of the default config. */ type KurtosisConfig struct { // Only necessary to store for when we serialize overrides - overrides *v4.KurtosisConfigV4 + overrides *v5.KurtosisConfigV5 shouldSendMetrics bool clusters map[string]*KurtosisClusterConfig @@ -136,7 +140,7 @@ func NewKurtosisConfigFromOverrides(uncastedOverrides interface{}) (*KurtosisCon // NOTE: We probably want to remove this function entirely func NewKurtosisConfigFromRequiredFields(shouldSendMetrics bool) (*KurtosisConfig, error) { - overrides := &v4.KurtosisConfigV4{ + overrides := &v5.KurtosisConfigV5{ ConfigVersion: 0, ShouldSendMetrics: &shouldSendMetrics, KurtosisClusters: nil, @@ -168,7 +172,7 @@ func (kurtosisConfig *KurtosisConfig) GetKurtosisClusters() map[string]*Kurtosis return kurtosisConfig.clusters } -func (kurtosisConfig *KurtosisConfig) GetOverrides() *v4.KurtosisConfigV4 { +func (kurtosisConfig *KurtosisConfig) GetOverrides() *v5.KurtosisConfigV5 { return kurtosisConfig.overrides } @@ -182,37 +186,41 @@ func (kurtosisConfig *KurtosisConfig) GetCloudConfig() *KurtosisCloudConfig { // // ==================================================================================================== // This is a separate helper function so that we can use it to ensure that the -func castUncastedOverrides(uncastedOverrides interface{}) (*v4.KurtosisConfigV4, error) { - castedOverrides, ok := uncastedOverrides.(*v4.KurtosisConfigV4) +func castUncastedOverrides(uncastedOverrides interface{}) (*v5.KurtosisConfigV5, error) { + castedOverrides, ok := uncastedOverrides.(*v5.KurtosisConfigV5) if !ok { return nil, stacktrace.NewError("An error occurred casting the uncasted config overrides to the right version") } return castedOverrides, nil } -func getDefaultKurtosisClusterConfigOverrides() map[string]*v4.KurtosisClusterConfigV4 { +func getDefaultKurtosisClusterConfigOverrides() map[string]*v5.KurtosisClusterConfigV5 { dockerClusterType := KurtosisClusterType_Docker.String() minikubeClusterType := KurtosisClusterType_Kubernetes.String() minikubeKubernetesClusterName := defaultMinikubeClusterKubernetesClusterNameStr minikubeStorageClass := defaultMinikubeStorageClass minikubeEnclaveDataVolSizeMB := defaultMinikubeEnclaveDataVolumeMB minikubeEngineNodeName := defaultMinikubeEngineNodeName + shouldEnableDefaultLogsSink := DefaultShouldEnableDefaultLogsSink - result := map[string]*v4.KurtosisClusterConfigV4{ + result := map[string]*v5.KurtosisClusterConfigV5{ DefaultDockerClusterName: { - Type: &dockerClusterType, - Config: nil, // Must be nil for Docker - LogsAggregator: nil, + Type: &dockerClusterType, + Config: nil, // Must be nil for Docker + LogsAggregator: nil, + GrafanaLokiConfig: nil, }, defaultMinikubeClusterName: { Type: &minikubeClusterType, - Config: &v4.KubernetesClusterConfigV4{ + Config: &v5.KubernetesClusterConfigV5{ KubernetesClusterName: &minikubeKubernetesClusterName, StorageClass: &minikubeStorageClass, EnclaveSizeInMegabytes: &minikubeEnclaveDataVolSizeMB, EngineNodeName: &minikubeEngineNodeName, }, - LogsAggregator: nil, + LogsAggregator: nil, + GrafanaLokiConfig: nil, + ShouldEnableDefaultLogsSink: &shouldEnableDefaultLogsSink, }, } diff --git a/cli/cli/kurtosis_config/resolved_config/kurtosis_config_test.go b/cli/cli/kurtosis_config/resolved_config/kurtosis_config_test.go index d59a89f61d..f72f825cb0 100644 --- a/cli/cli/kurtosis_config/resolved_config/kurtosis_config_test.go +++ b/cli/cli/kurtosis_config/resolved_config/kurtosis_config_test.go @@ -1,7 +1,7 @@ package resolved_config import ( - v4 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v4" + v5 "github.com/kurtosis-tech/kurtosis/cli/cli/kurtosis_config/overrides_objects/v5" "sort" "testing" @@ -51,7 +51,7 @@ func TestNewKurtosisConfigFromRequiredFields_MetricsElectionIsSent(t *testing.T) } func TestNewKurtosisConfigEmptyOverrides(t *testing.T) { - _, err := NewKurtosisConfigFromOverrides(&v4.KurtosisConfigV4{ + _, err := NewKurtosisConfigFromOverrides(&v5.KurtosisConfigV5{ ConfigVersion: 0, ShouldSendMetrics: nil, KurtosisClusters: nil, @@ -62,9 +62,9 @@ func TestNewKurtosisConfigEmptyOverrides(t *testing.T) { } func TestNewKurtosisConfigJustMetrics(t *testing.T) { - version := config_version.ConfigVersion_v4 + version := config_version.ConfigVersion_v5 shouldSendMetrics := true - originalOverrides := v4.KurtosisConfigV4{ + originalOverrides := v5.KurtosisConfigV5{ ConfigVersion: version, ShouldSendMetrics: &shouldSendMetrics, KurtosisClusters: nil, @@ -92,14 +92,14 @@ func TestNewKurtosisConfigOverridesAreLatestVersion(t *testing.T) { } func TestCloudConfigOverridesApiUrl(t *testing.T) { - version := config_version.ConfigVersion_v4 + version := config_version.ConfigVersion_v5 shouldSendMetrics := true apiUrl := "test.com" - originalOverrides := v4.KurtosisConfigV4{ + originalOverrides := v5.KurtosisConfigV5{ ConfigVersion: version, ShouldSendMetrics: &shouldSendMetrics, KurtosisClusters: nil, - CloudConfig: &v4.KurtosisCloudConfigV4{ + CloudConfig: &v5.KurtosisCloudConfigV5{ ApiUrl: &apiUrl, Port: nil, CertificateChain: nil, diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/docker_kurtosis_backend.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/docker_kurtosis_backend.go index 6172814154..d525e7f2e0 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/docker_kurtosis_backend.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/docker_kurtosis_backend.go @@ -41,7 +41,8 @@ import ( ) const ( - isResourceInformationComplete = true + isResourceInformationComplete = true + defaultShouldEnablePersistentVolumeLogsCollection = true ) type DockerKurtosisBackend struct { @@ -115,6 +116,7 @@ func (backend *DockerKurtosisBackend) CreateEngine( shouldStartInDebugMode bool, gitAuthToken string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) ( *engine.Engine, error, @@ -128,6 +130,7 @@ func (backend *DockerKurtosisBackend) CreateEngine( shouldStartInDebugMode, gitAuthToken, sinks, + shouldEnablePersistentVolumeLogsCollection, backend.dockerManager, backend.objAttrsProvider, ) @@ -389,6 +392,7 @@ func (backend *DockerKurtosisBackend) CreateLogsAggregator( logsAggregatorContainer, httpPortNum, sinks, + defaultShouldEnablePersistentVolumeLogsCollection, backend.dockerManager, backend.objAttrsProvider, ) diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go index 600f9a2332..042fb5b668 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go @@ -46,6 +46,7 @@ func CreateEngine( shouldStartInDebugMode bool, gitAuthToken string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, dockerManager *docker_manager.DockerManager, objAttrsProvider object_attributes_provider.DockerObjectAttributesProvider, ) ( @@ -107,6 +108,7 @@ func CreateEngine( logsAggregatorContainer, defaultHttpLogsAggregatorPortNum, sinks, + shouldEnablePersistentVolumeLogsCollection, dockerManager, objAttrsProvider) if err != nil { diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go index 249e8e55a3..c4e79cdc5e 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go @@ -22,6 +22,7 @@ func CreateLogsAggregator( logsAggregatorContainer LogsAggregatorContainer, logsAggregatorHttpPortNumber uint16, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, dockerManager *docker_manager.DockerManager, objAttrsProvider object_attributes_provider.DockerObjectAttributesProvider, ) ( @@ -65,6 +66,7 @@ func CreateLogsAggregator( logsAggregatorHttpPortNumber, logsAggregatorHttpPortId, targetNetworkId, + shouldEnablePersistentVolumeLogsCollection, objAttrsProvider, dockerManager) if err != nil { diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go index f39339a62c..2f910334e9 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go @@ -23,9 +23,12 @@ func newVectorConfig( listeningPortNumber uint16, httpPortNumber uint16, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) *VectorConfig { - reconciledSinks := map[string]map[string]interface{}{ - logs_aggregator.DefaultSinkId: { + reconciledSinks := map[string]map[string]interface{}{} + + if shouldEnablePersistentVolumeLogsCollection { + reconciledSinks[logs_aggregator.DefaultSinkId] = map[string]interface{}{ "type": fileSinkType, "inputs": []string{defaultSourceId}, "path": uuidLogsFilepath, @@ -39,7 +42,7 @@ func newVectorConfig( "max_size": bufferSize, "when_full": "block", }, - }, + } } for sinkId, sinkConfig := range sinks { diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go index 6ee3a91b2b..2061f6bbd2 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go @@ -8,7 +8,8 @@ func createVectorConfigurationCreatorForKurtosis( listeningPortNumber uint16, httpPortNumber uint16, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) *vectorConfigurationCreator { - config := newVectorConfig(listeningPortNumber, httpPortNumber, sinks) + config := newVectorConfig(listeningPortNumber, httpPortNumber, sinks, shouldEnablePersistentVolumeLogsCollection) return newVectorConfigurationCreator(config) } diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_container.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_container.go index 080b3c08bd..0a00cdf64d 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_container.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_container.go @@ -35,10 +35,11 @@ func (vector *vectorLogsAggregatorContainer) CreateAndStart( httpPortNumber uint16, logsAggregatorHttpPortId string, targetNetworkId string, + shouldEnablePersistentVolumeLogsCollection bool, objAttrsProvider object_attributes_provider.DockerObjectAttributesProvider, dockerManager *docker_manager.DockerManager, ) (string, map[string]string, func(), error) { - vectorConfigurationCreatorObj := createVectorConfigurationCreatorForKurtosis(logsListeningPortNumber, httpPortNumber, sinks) + vectorConfigurationCreatorObj := createVectorConfigurationCreatorForKurtosis(logsListeningPortNumber, httpPortNumber, sinks, shouldEnablePersistentVolumeLogsCollection) vectorContainerConfigProviderObj := createVectorContainerConfigProvider(httpPortNumber) // Start vector diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/logs_aggregator_container.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/logs_aggregator_container.go index 9b46088b4d..a26f9851d9 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/logs_aggregator_container.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/logs_aggregator_functions/logs_aggregator_container.go @@ -19,6 +19,7 @@ type LogsAggregatorContainer interface { httpPortNumber uint16, logsAggregatorHttpPortId string, targetNetworkId string, + shouldEnablePersistentVolumeLogsCollection bool, objAttrsProvider object_attributes_provider.DockerObjectAttributesProvider, dockerManager *docker_manager.DockerManager, ) (string, map[string]string, func(), error) diff --git a/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_label_key/label_key_consts.go b/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_label_key/label_key_consts.go index 1946f9052c..bb497777b4 100644 --- a/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_label_key/label_key_consts.go +++ b/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_label_key/label_key_consts.go @@ -40,6 +40,7 @@ const ( logsLabelPrefixStr = "kurtosis_" logsOnlyEnclaveUuidLabelKeyStr = logsLabelPrefixStr + "enclave_uuid" logsOnlyServiceUuidDockerLabelKey = logsLabelPrefixStr + "service_uuid" + logsOnlyServiceNameDockerLabelKey = logsLabelPrefixStr + "service_name" // Traefik label keys traefikLabelKeyPrefixStr = "traefik." @@ -67,3 +68,4 @@ var PrivateIPDockerLabelKey = MustCreateNewDockerLabelKey(privateIpAddrLabelKeyS var UserServiceGUIDDockerLabelKey = MustCreateNewDockerLabelKey(userServiceGuidDockerLabelKeyStr) var LogsEnclaveUUIDDockerLabelKey = MustCreateNewDockerLabelKey(logsOnlyEnclaveUuidLabelKeyStr) var LogsServiceUUIDDockerLabelKey = MustCreateNewDockerLabelKey(logsOnlyServiceUuidDockerLabelKey) +var LogsServiceNameDockerLabelKey = MustCreateNewDockerLabelKey(logsOnlyServiceNameDockerLabelKey) diff --git a/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_labels_for_logs/docker_labels_for_logs.go b/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_labels_for_logs/docker_labels_for_logs.go index 0263cd9cab..1fe075f933 100644 --- a/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_labels_for_logs/docker_labels_for_logs.go +++ b/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/docker_labels_for_logs/docker_labels_for_logs.go @@ -10,6 +10,7 @@ var DockerLabelsForLogsStream = []*docker_label_key.DockerLabelKey{ docker_label_key.ContainerTypeDockerLabelKey, docker_label_key.LogsEnclaveUUIDDockerLabelKey, docker_label_key.LogsServiceUUIDDockerLabelKey, + docker_label_key.LogsServiceNameDockerLabelKey, } func GetDockerLabelsForLogStream() []*docker_label_key.DockerLabelKey { diff --git a/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/enclave_object_attributes_provider.go b/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/enclave_object_attributes_provider.go index 193b0a25bd..76b387a502 100644 --- a/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/enclave_object_attributes_provider.go +++ b/container-engine-lib/lib/backend_impls/docker/object_attributes_provider/enclave_object_attributes_provider.go @@ -245,6 +245,12 @@ func (provider *dockerEnclaveObjectAttributesProviderImpl) ForUserServiceContain } labels[docker_label_key.LogsServiceUUIDDockerLabelKey] = serviceUuidLabel + serviceNameLabel, err := docker_label_value.CreateNewDockerLabelValue(serviceNameStr) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred creating a Docker label value from service name string '%v'", serviceNameStr) + } + labels[docker_label_key.LogsServiceNameDockerLabelKey] = serviceNameLabel + // add user custom label for userLabelKey, userLabelValue := range userLabels { dockerLabelKey, err := docker_label_key.CreateNewDockerUserCustomLabelKey(userLabelKey) diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/engine_functions/create_engine.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/engine_functions/create_engine.go index 83fdbd22c4..8221e1a73d 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/engine_functions/create_engine.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/engine_functions/create_engine.go @@ -56,6 +56,7 @@ func CreateEngine( _ bool, //It's not required to add extra configuration in K8S for enabling the debug server githubAuthToken string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, engineNodeName string, kubernetesManager *kubernetes_manager.KubernetesManager, objAttrsProvider object_attributes_provider.KubernetesObjectAttributesProvider, @@ -294,6 +295,7 @@ func CreateEngine( logsAggregatorDeployment, defaultHttpLogsAggregatorPortNum, sinks, + shouldEnablePersistentVolumeLogsCollection, objAttrsProvider, kubernetesManager, ) diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/kubernetes_kurtosis_backend.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/kubernetes_kurtosis_backend.go index 3de2b449c8..cc54a24035 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/kubernetes_kurtosis_backend.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/kubernetes_kurtosis_backend.go @@ -36,9 +36,10 @@ import ( ) const ( - isResourceInformationComplete = false - noProductionMode = false - anyNodeEngineNodeName = "" // engine can be scheduled by k8s on any node + isResourceInformationComplete = false + noProductionMode = false + anyNodeEngineNodeName = "" // engine can be scheduled by k8s on any node + defaultShouldTurnOffPersistentVolumeLogsCollection = false ) type KubernetesKurtosisBackend struct { @@ -152,6 +153,7 @@ func (backend *KubernetesKurtosisBackend) CreateEngine( shouldStartInDebugMode bool, githubAuthToken string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) ( *engine.Engine, error, @@ -165,6 +167,7 @@ func (backend *KubernetesKurtosisBackend) CreateEngine( shouldStartInDebugMode, githubAuthToken, sinks, + shouldEnablePersistentVolumeLogsCollection, backend.engineNodeName, backend.kubernetesManager, backend.objAttrsProvider, @@ -481,6 +484,7 @@ func (backend *KubernetesKurtosisBackend) CreateLogsAggregator(ctx context.Conte logsAggregatorDeployment, httpPortNum, sinks, + defaultShouldTurnOffPersistentVolumeLogsCollection, backend.objAttrsProvider, backend.kubernetesManager) if err != nil { diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go index d68def136e..65a935e15e 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/create_logs_aggregator.go @@ -16,6 +16,7 @@ func CreateLogsAggregator( logsAggregatorResourcesManager LogsAggregatorResourcesManager, logsAggregatorHttpPortNumber uint16, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, objAttrProvider object_attributes_provider.KubernetesObjectAttributesProvider, kubernetesManager *kubernetes_manager.KubernetesManager, ) (*logs_aggregator.LogsAggregator, func(), error) { @@ -40,6 +41,7 @@ func CreateLogsAggregator( defaultLogsListeningPortNum, sinks, logsAggregatorHttpPortNumber, + shouldEnablePersistentVolumeLogsCollection, engineNamespace, objAttrProvider, kubernetesManager) diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go index 86be459cb6..45dc1949f5 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_config.go @@ -23,9 +23,12 @@ func newVectorConfig( listeningPortNumber uint16, httpPortNumber uint16, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) *VectorConfig { - reconciledSinks := map[string]map[string]interface{}{ - logs_aggregator.DefaultSinkId: { + reconciledSinks := map[string]map[string]interface{}{} + + if shouldEnablePersistentVolumeLogsCollection { + reconciledSinks[logs_aggregator.DefaultSinkId] = map[string]interface{}{ "type": fileSinkType, "inputs": []string{defaultSourceId}, "path": uuidLogsFilepath, @@ -39,7 +42,7 @@ func newVectorConfig( "max_size": bufferSize, "when_full": "block", }, - }, + } } for sinkId, sinkConfig := range sinks { diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go index 6ee3a91b2b..2061f6bbd2 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_configuration_creator_factory.go @@ -8,7 +8,8 @@ func createVectorConfigurationCreatorForKurtosis( listeningPortNumber uint16, httpPortNumber uint16, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) *vectorConfigurationCreator { - config := newVectorConfig(listeningPortNumber, httpPortNumber, sinks) + config := newVectorConfig(listeningPortNumber, httpPortNumber, sinks, shouldEnablePersistentVolumeLogsCollection) return newVectorConfigurationCreator(config) } diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_deployment.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_deployment.go index dbe1aac7cd..bb4e6589de 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_deployment.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/implementations/vector/vector_logs_aggregator_deployment.go @@ -38,6 +38,7 @@ func (logsAggregator *vectorLogsAggregatorResourcesManager) CreateAndStart( logsListeningPortNum uint16, sinks logs_aggregator.Sinks, httpPortNumber uint16, + shouldEnablePersistentVolumeLogsCollection bool, engineNamespace string, objAttrsProvider object_attributes_provider.KubernetesObjectAttributesProvider, kubernetesManager *kubernetes_manager.KubernetesManager, @@ -78,7 +79,7 @@ func (logsAggregator *vectorLogsAggregatorResourcesManager) CreateAndStart( } }() - vectorConfigurationCreatorObj := createVectorConfigurationCreatorForKurtosis(logsListeningPortNum, httpPortNumber, sinks) + vectorConfigurationCreatorObj := createVectorConfigurationCreatorForKurtosis(logsListeningPortNum, httpPortNumber, sinks, shouldEnablePersistentVolumeLogsCollection) configMap, removeConfigMapFunc, err := vectorConfigurationCreatorObj.CreateConfiguration(ctx, namespace.Name, logsAggregatorAttrProvider, kubernetesManager) if err != nil { diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/logs_aggregator_deployment.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/logs_aggregator_deployment.go index 15aff66daf..308b57570c 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/logs_aggregator_deployment.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_aggregator_functions/logs_aggregator_deployment.go @@ -18,6 +18,7 @@ type LogsAggregatorResourcesManager interface { logsListeningPort uint16, sinks logs_aggregator.Sinks, httpPortNumber uint16, + shouldEnablePersistentVolumeLogsCollection bool, // Provided so deployment can be scheduled on same node as engine engineNamespace string, objAttrsProvider object_attributes_provider.KubernetesObjectAttributesProvider, diff --git a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_collector_functions/implementations/fluentbit/fluentbit_logs_collector_daemonset.go b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_collector_functions/implementations/fluentbit/fluentbit_logs_collector_daemonset.go index 878b409584..82c2e80e06 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_collector_functions/implementations/fluentbit/fluentbit_logs_collector_daemonset.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/kubernetes_kurtosis_backend/logs_collector_functions/implementations/fluentbit/fluentbit_logs_collector_daemonset.go @@ -472,6 +472,7 @@ func generateFluentBitConfigStr( CheckpointDbMountPath string LogsEnclaveUUIDLabel string LogsServiceUUIDLabel string + LogsServiceNameLabel string K8sApiServerURL string LogsAggregatorHost string LogsAggregatorPortNum uint16 @@ -488,6 +489,7 @@ func generateFluentBitConfigStr( CheckpointDbMountPath: fluentBitCheckpointDbMountPath, LogsEnclaveUUIDLabel: kubernetes_label_key.LogsEnclaveUUIDKubernetesLabelKey.GetString(), LogsServiceUUIDLabel: kubernetes_label_key.LogsServiceUUIDKubernetesLabelKey.GetString(), + LogsServiceNameLabel: kubernetes_label_key.LogsServiceNameKubernetesLabelKey.GetString(), K8sApiServerURL: k8sApiServerUrl, LogsAggregatorPortNum: logsAggregatorPortNun, LogsAggregatorHost: logsAggregatorHost, diff --git a/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/enclave_object_attributes_provider.go b/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/enclave_object_attributes_provider.go index 97f2999964..fa19e6b807 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/enclave_object_attributes_provider.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/enclave_object_attributes_provider.go @@ -188,6 +188,12 @@ func (provider *kubernetesEnclaveObjectAttributesProviderImpl) ForUserServicePod } labels[kubernetes_label_key.LogsServiceUUIDKubernetesLabelKey] = uuidLabelValue + nameLabelValue, err := kubernetes_label_value.CreateNewKubernetesLabelValue(string(serviceName)) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred creating a service name Kubernetes label value from string '%v'", string(serviceName)) + } + labels[kubernetes_label_key.LogsServiceNameKubernetesLabelKey] = nameLabelValue + // add user custom label for userLabelKey, userLabelValue := range userLabels { kubernetesLabelKey, err := kubernetes_label_key.CreateNewKubernetesUserCustomLabelKey(userLabelKey) diff --git a/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/kubernetes_label_key/label_key_consts.go b/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/kubernetes_label_key/label_key_consts.go index a127497f59..82928f637d 100644 --- a/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/kubernetes_label_key/label_key_consts.go +++ b/container-engine-lib/lib/backend_impls/kubernetes/object_attributes_provider/kubernetes_label_key/label_key_consts.go @@ -36,6 +36,7 @@ const ( logsOnlyKurtosisPrefix = "kurtosis_" logsOnlyEnclaveUuidLabelKeyStr = logsOnlyKurtosisPrefix + "enclave_uuid" logsOnlyServiceUuidKubernetesLabelKey = logsOnlyKurtosisPrefix + "service_uuid" + logsOnlyServiceNameKubernetesLabelKey = logsOnlyKurtosisPrefix + "service_logs" engineNodeLabelKeyStr = labelKeyPrefixStr + "engine-node" ) @@ -62,3 +63,4 @@ var EngineNodeLabelKey = MustCreateNewKubernetesLabelKey(engineNodeLabelKeyStr) var LogsEnclaveUUIDKubernetesLabelKey = MustCreateNewKubernetesLabelKey(logsOnlyEnclaveUuidLabelKeyStr) var LogsServiceUUIDKubernetesLabelKey = MustCreateNewKubernetesLabelKey(logsOnlyServiceUuidKubernetesLabelKey) +var LogsServiceNameKubernetesLabelKey = MustCreateNewKubernetesLabelKey(logsOnlyServiceNameKubernetesLabelKey) diff --git a/container-engine-lib/lib/backend_impls/metrics_reporting/metrics_reporting_kurtosis_backend.go b/container-engine-lib/lib/backend_impls/metrics_reporting/metrics_reporting_kurtosis_backend.go index feb72edbbe..74c595276e 100644 --- a/container-engine-lib/lib/backend_impls/metrics_reporting/metrics_reporting_kurtosis_backend.go +++ b/container-engine-lib/lib/backend_impls/metrics_reporting/metrics_reporting_kurtosis_backend.go @@ -57,6 +57,7 @@ func (backend *MetricsReportingKurtosisBackend) CreateEngine( shouldStartInDebugMode bool, githubAuthToken string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) (*engine.Engine, error) { result, err := backend.underlying.CreateEngine( ctx, @@ -67,6 +68,7 @@ func (backend *MetricsReportingKurtosisBackend) CreateEngine( shouldStartInDebugMode, githubAuthToken, sinks, + shouldEnablePersistentVolumeLogsCollection, ) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating the engine using image '%v' with tag '%v' and debug mode '%v'", imageOrgAndRepo, imageVersionTag, shouldStartInDebugMode) diff --git a/container-engine-lib/lib/backend_interface/kurtosis_backend.go b/container-engine-lib/lib/backend_interface/kurtosis_backend.go index c6babc46ae..34aef47abc 100644 --- a/container-engine-lib/lib/backend_interface/kurtosis_backend.go +++ b/container-engine-lib/lib/backend_interface/kurtosis_backend.go @@ -51,6 +51,7 @@ type KurtosisBackend interface { shouldStartInDebugMode bool, githubAuthToken string, sinks logs_aggregator.Sinks, + shouldTurnOffPersistentVolumeLogsCollection bool, ) ( *engine.Engine, error, @@ -331,6 +332,7 @@ type KurtosisBackend interface { resultErr error, // Represents an error with the function itself, rather than the user services ) + // TODO: this should be removed from KurtosisBackend interface, as nobody consumes it - all CRUD for LogsAggregator is used/managed by engine CreateLogsAggregator( ctx context.Context, httpPortNum uint16, diff --git a/container-engine-lib/lib/backend_interface/mock_kurtosis_backend.go b/container-engine-lib/lib/backend_interface/mock_kurtosis_backend.go index 6e9fa4070a..6584c6be33 100644 --- a/container-engine-lib/lib/backend_interface/mock_kurtosis_backend.go +++ b/container-engine-lib/lib/backend_interface/mock_kurtosis_backend.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.52.4. DO NOT EDIT. +// Code generated by mockery v2.23.1. DO NOT EDIT. package backend_interface @@ -54,10 +54,6 @@ func (_m *MockKurtosisBackend) EXPECT() *MockKurtosisBackend_Expecter { func (_m *MockKurtosisBackend) BuildImage(ctx context.Context, imageName string, imageBuildSpec *image_build_spec.ImageBuildSpec) (string, error) { ret := _m.Called(ctx, imageName, imageBuildSpec) - if len(ret) == 0 { - panic("no return value specified for BuildImage") - } - var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, *image_build_spec.ImageBuildSpec) (string, error)); ok { @@ -112,10 +108,6 @@ func (_c *MockKurtosisBackend_BuildImage_Call) RunAndReturn(run func(context.Con func (_m *MockKurtosisBackend) CopyFilesFromUserService(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID, srcPathOnService string, output io.Writer) error { ret := _m.Called(ctx, enclaveUuid, serviceUuid, srcPathOnService, output) - if len(ret) == 0 { - panic("no return value specified for CopyFilesFromUserService") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID, service.ServiceUUID, string, io.Writer) error); ok { r0 = rf(ctx, enclaveUuid, serviceUuid, srcPathOnService, output) @@ -162,10 +154,6 @@ func (_c *MockKurtosisBackend_CopyFilesFromUserService_Call) RunAndReturn(run fu func (_m *MockKurtosisBackend) CreateAPIContainer(ctx context.Context, image string, enclaveUuid enclave.EnclaveUUID, grpcPortNum uint16, enclaveDataVolumeDirpath string, ownIpAddressEnvVar string, customEnvVars map[string]string, shouldStartInDebugMode bool) (*api_container.APIContainer, error) { ret := _m.Called(ctx, image, enclaveUuid, grpcPortNum, enclaveDataVolumeDirpath, ownIpAddressEnvVar, customEnvVars, shouldStartInDebugMode) - if len(ret) == 0 { - panic("no return value specified for CreateAPIContainer") - } - var r0 *api_container.APIContainer var r1 error if rf, ok := ret.Get(0).(func(context.Context, string, enclave.EnclaveUUID, uint16, string, string, map[string]string, bool) (*api_container.APIContainer, error)); ok { @@ -227,10 +215,6 @@ func (_c *MockKurtosisBackend_CreateAPIContainer_Call) RunAndReturn(run func(con func (_m *MockKurtosisBackend) CreateEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID, enclaveName string) (*enclave.Enclave, error) { ret := _m.Called(ctx, enclaveUuid, enclaveName) - if len(ret) == 0 { - panic("no return value specified for CreateEnclave") - } - var r0 *enclave.Enclave var r1 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID, string) (*enclave.Enclave, error)); ok { @@ -283,29 +267,25 @@ func (_c *MockKurtosisBackend_CreateEnclave_Call) RunAndReturn(run func(context. return _c } -// CreateEngine provides a mock function with given fields: ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks -func (_m *MockKurtosisBackend) CreateEngine(ctx context.Context, imageOrgAndRepo string, imageVersionTag string, grpcPortNum uint16, envVars map[string]string, shouldStartInDebugMode bool, githubAuthToken string, sinks logs_aggregator.Sinks) (*engine.Engine, error) { - ret := _m.Called(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks) - - if len(ret) == 0 { - panic("no return value specified for CreateEngine") - } +// CreateEngine provides a mock function with given fields: ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks, shouldTurnOffPersistentVolumeLogsCollection +func (_m *MockKurtosisBackend) CreateEngine(ctx context.Context, imageOrgAndRepo string, imageVersionTag string, grpcPortNum uint16, envVars map[string]string, shouldStartInDebugMode bool, githubAuthToken string, sinks logs_aggregator.Sinks, shouldTurnOffPersistentVolumeLogsCollection bool) (*engine.Engine, error) { + ret := _m.Called(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks, shouldTurnOffPersistentVolumeLogsCollection) var r0 *engine.Engine var r1 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks) (*engine.Engine, error)); ok { - return rf(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks) + if rf, ok := ret.Get(0).(func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks, bool) (*engine.Engine, error)); ok { + return rf(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks, shouldTurnOffPersistentVolumeLogsCollection) } - if rf, ok := ret.Get(0).(func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks) *engine.Engine); ok { - r0 = rf(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks) + if rf, ok := ret.Get(0).(func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks, bool) *engine.Engine); ok { + r0 = rf(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks, shouldTurnOffPersistentVolumeLogsCollection) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*engine.Engine) } } - if rf, ok := ret.Get(1).(func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks) error); ok { - r1 = rf(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks) + if rf, ok := ret.Get(1).(func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks, bool) error); ok { + r1 = rf(ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks, shouldTurnOffPersistentVolumeLogsCollection) } else { r1 = ret.Error(1) } @@ -327,13 +307,14 @@ type MockKurtosisBackend_CreateEngine_Call struct { // - shouldStartInDebugMode bool // - githubAuthToken string // - sinks logs_aggregator.Sinks -func (_e *MockKurtosisBackend_Expecter) CreateEngine(ctx interface{}, imageOrgAndRepo interface{}, imageVersionTag interface{}, grpcPortNum interface{}, envVars interface{}, shouldStartInDebugMode interface{}, githubAuthToken interface{}, sinks interface{}) *MockKurtosisBackend_CreateEngine_Call { - return &MockKurtosisBackend_CreateEngine_Call{Call: _e.mock.On("CreateEngine", ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks)} +// - shouldTurnOffPersistentVolumeLogsCollection bool +func (_e *MockKurtosisBackend_Expecter) CreateEngine(ctx interface{}, imageOrgAndRepo interface{}, imageVersionTag interface{}, grpcPortNum interface{}, envVars interface{}, shouldStartInDebugMode interface{}, githubAuthToken interface{}, sinks interface{}, shouldTurnOffPersistentVolumeLogsCollection interface{}) *MockKurtosisBackend_CreateEngine_Call { + return &MockKurtosisBackend_CreateEngine_Call{Call: _e.mock.On("CreateEngine", ctx, imageOrgAndRepo, imageVersionTag, grpcPortNum, envVars, shouldStartInDebugMode, githubAuthToken, sinks, shouldTurnOffPersistentVolumeLogsCollection)} } -func (_c *MockKurtosisBackend_CreateEngine_Call) Run(run func(ctx context.Context, imageOrgAndRepo string, imageVersionTag string, grpcPortNum uint16, envVars map[string]string, shouldStartInDebugMode bool, githubAuthToken string, sinks logs_aggregator.Sinks)) *MockKurtosisBackend_CreateEngine_Call { +func (_c *MockKurtosisBackend_CreateEngine_Call) Run(run func(ctx context.Context, imageOrgAndRepo string, imageVersionTag string, grpcPortNum uint16, envVars map[string]string, shouldStartInDebugMode bool, githubAuthToken string, sinks logs_aggregator.Sinks, shouldTurnOffPersistentVolumeLogsCollection bool)) *MockKurtosisBackend_CreateEngine_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(string), args[2].(string), args[3].(uint16), args[4].(map[string]string), args[5].(bool), args[6].(string), args[7].(logs_aggregator.Sinks)) + run(args[0].(context.Context), args[1].(string), args[2].(string), args[3].(uint16), args[4].(map[string]string), args[5].(bool), args[6].(string), args[7].(logs_aggregator.Sinks), args[8].(bool)) }) return _c } @@ -343,7 +324,7 @@ func (_c *MockKurtosisBackend_CreateEngine_Call) Return(_a0 *engine.Engine, _a1 return _c } -func (_c *MockKurtosisBackend_CreateEngine_Call) RunAndReturn(run func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks) (*engine.Engine, error)) *MockKurtosisBackend_CreateEngine_Call { +func (_c *MockKurtosisBackend_CreateEngine_Call) RunAndReturn(run func(context.Context, string, string, uint16, map[string]string, bool, string, logs_aggregator.Sinks, bool) (*engine.Engine, error)) *MockKurtosisBackend_CreateEngine_Call { _c.Call.Return(run) return _c } @@ -352,10 +333,6 @@ func (_c *MockKurtosisBackend_CreateEngine_Call) RunAndReturn(run func(context.C func (_m *MockKurtosisBackend) CreateLogsAggregator(ctx context.Context, httpPortNum uint16, sinks logs_aggregator.Sinks) (*logs_aggregator.LogsAggregator, error) { ret := _m.Called(ctx, httpPortNum, sinks) - if len(ret) == 0 { - panic("no return value specified for CreateLogsAggregator") - } - var r0 *logs_aggregator.LogsAggregator var r1 error if rf, ok := ret.Get(0).(func(context.Context, uint16, logs_aggregator.Sinks) (*logs_aggregator.LogsAggregator, error)); ok { @@ -412,10 +389,6 @@ func (_c *MockKurtosisBackend_CreateLogsAggregator_Call) RunAndReturn(run func(c func (_m *MockKurtosisBackend) CreateLogsCollectorForEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID, logsCollectorHttpPortNumber uint16, logsCollectorTcpPortNumber uint16) (*logs_collector.LogsCollector, error) { ret := _m.Called(ctx, enclaveUuid, logsCollectorHttpPortNumber, logsCollectorTcpPortNumber) - if len(ret) == 0 { - panic("no return value specified for CreateLogsCollectorForEnclave") - } - var r0 *logs_collector.LogsCollector var r1 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID, uint16, uint16) (*logs_collector.LogsCollector, error)); ok { @@ -473,10 +446,6 @@ func (_c *MockKurtosisBackend_CreateLogsCollectorForEnclave_Call) RunAndReturn(r func (_m *MockKurtosisBackend) CreateReverseProxy(ctx context.Context, engineGuid engine.EngineGUID) (*reverse_proxy.ReverseProxy, error) { ret := _m.Called(ctx, engineGuid) - if len(ret) == 0 { - panic("no return value specified for CreateReverseProxy") - } - var r0 *reverse_proxy.ReverseProxy var r1 error if rf, ok := ret.Get(0).(func(context.Context, engine.EngineGUID) (*reverse_proxy.ReverseProxy, error)); ok { @@ -532,10 +501,6 @@ func (_c *MockKurtosisBackend_CreateReverseProxy_Call) RunAndReturn(run func(con func (_m *MockKurtosisBackend) DestroyAPIContainers(ctx context.Context, filters *api_container.APIContainerFilters) (map[enclave.EnclaveUUID]bool, map[enclave.EnclaveUUID]error, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for DestroyAPIContainers") - } - var r0 map[enclave.EnclaveUUID]bool var r1 map[enclave.EnclaveUUID]error var r2 error @@ -600,10 +565,6 @@ func (_c *MockKurtosisBackend_DestroyAPIContainers_Call) RunAndReturn(run func(c func (_m *MockKurtosisBackend) DestroyEnclaves(ctx context.Context, filters *enclave.EnclaveFilters) (map[enclave.EnclaveUUID]bool, map[enclave.EnclaveUUID]error, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for DestroyEnclaves") - } - var r0 map[enclave.EnclaveUUID]bool var r1 map[enclave.EnclaveUUID]error var r2 error @@ -668,10 +629,6 @@ func (_c *MockKurtosisBackend_DestroyEnclaves_Call) RunAndReturn(run func(contex func (_m *MockKurtosisBackend) DestroyEngines(ctx context.Context, filters *engine.EngineFilters) (map[engine.EngineGUID]bool, map[engine.EngineGUID]error, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for DestroyEngines") - } - var r0 map[engine.EngineGUID]bool var r1 map[engine.EngineGUID]error var r2 error @@ -736,10 +693,6 @@ func (_c *MockKurtosisBackend_DestroyEngines_Call) RunAndReturn(run func(context func (_m *MockKurtosisBackend) DestroyLogsAggregator(ctx context.Context) error { ret := _m.Called(ctx) - if len(ret) == 0 { - panic("no return value specified for DestroyLogsAggregator") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context) error); ok { r0 = rf(ctx) @@ -782,10 +735,6 @@ func (_c *MockKurtosisBackend_DestroyLogsAggregator_Call) RunAndReturn(run func( func (_m *MockKurtosisBackend) DestroyLogsCollectorForEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID) error { ret := _m.Called(ctx, enclaveUuid) - if len(ret) == 0 { - panic("no return value specified for DestroyLogsCollectorForEnclave") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID) error); ok { r0 = rf(ctx, enclaveUuid) @@ -829,10 +778,6 @@ func (_c *MockKurtosisBackend_DestroyLogsCollectorForEnclave_Call) RunAndReturn( func (_m *MockKurtosisBackend) DestroyReverseProxy(ctx context.Context) error { ret := _m.Called(ctx) - if len(ret) == 0 { - panic("no return value specified for DestroyReverseProxy") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context) error); ok { r0 = rf(ctx) @@ -875,10 +820,6 @@ func (_c *MockKurtosisBackend_DestroyReverseProxy_Call) RunAndReturn(run func(co func (_m *MockKurtosisBackend) DestroyUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters) (map[service.ServiceUUID]bool, map[service.ServiceUUID]error, error) { ret := _m.Called(ctx, enclaveUuid, filters) - if len(ret) == 0 { - panic("no return value specified for DestroyUserServices") - } - var r0 map[service.ServiceUUID]bool var r1 map[service.ServiceUUID]error var r2 error @@ -944,10 +885,6 @@ func (_c *MockKurtosisBackend_DestroyUserServices_Call) RunAndReturn(run func(co func (_m *MockKurtosisBackend) DumpEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID, outputDirpath string) error { ret := _m.Called(ctx, enclaveUuid, outputDirpath) - if len(ret) == 0 { - panic("no return value specified for DumpEnclave") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID, string) error); ok { r0 = rf(ctx, enclaveUuid, outputDirpath) @@ -992,10 +929,6 @@ func (_c *MockKurtosisBackend_DumpEnclave_Call) RunAndReturn(run func(context.Co func (_m *MockKurtosisBackend) DumpKurtosis(ctx context.Context, outputDirpath string) error { ret := _m.Called(ctx, outputDirpath) - if len(ret) == 0 { - panic("no return value specified for DumpKurtosis") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, outputDirpath) @@ -1039,10 +972,6 @@ func (_c *MockKurtosisBackend_DumpKurtosis_Call) RunAndReturn(run func(context.C func (_m *MockKurtosisBackend) FetchImage(ctx context.Context, image string, registrySpec *image_registry_spec.ImageRegistrySpec, downloadMode image_download_mode.ImageDownloadMode) (bool, string, error) { ret := _m.Called(ctx, image, registrySpec, downloadMode) - if len(ret) == 0 { - panic("no return value specified for FetchImage") - } - var r0 bool var r1 string var r2 error @@ -1105,10 +1034,6 @@ func (_c *MockKurtosisBackend_FetchImage_Call) RunAndReturn(run func(context.Con func (_m *MockKurtosisBackend) GetAPIContainers(ctx context.Context, filters *api_container.APIContainerFilters) (map[enclave.EnclaveUUID]*api_container.APIContainer, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for GetAPIContainers") - } - var r0 map[enclave.EnclaveUUID]*api_container.APIContainer var r1 error if rf, ok := ret.Get(0).(func(context.Context, *api_container.APIContainerFilters) (map[enclave.EnclaveUUID]*api_container.APIContainer, error)); ok { @@ -1164,10 +1089,6 @@ func (_c *MockKurtosisBackend_GetAPIContainers_Call) RunAndReturn(run func(conte func (_m *MockKurtosisBackend) GetAvailableCPUAndMemory(ctx context.Context) (compute_resources.MemoryInMegaBytes, compute_resources.CpuMilliCores, bool, error) { ret := _m.Called(ctx) - if len(ret) == 0 { - panic("no return value specified for GetAvailableCPUAndMemory") - } - var r0 compute_resources.MemoryInMegaBytes var r1 compute_resources.CpuMilliCores var r2 bool @@ -1234,10 +1155,6 @@ func (_c *MockKurtosisBackend_GetAvailableCPUAndMemory_Call) RunAndReturn(run fu func (_m *MockKurtosisBackend) GetEnclaves(ctx context.Context, filters *enclave.EnclaveFilters) (map[enclave.EnclaveUUID]*enclave.Enclave, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for GetEnclaves") - } - var r0 map[enclave.EnclaveUUID]*enclave.Enclave var r1 error if rf, ok := ret.Get(0).(func(context.Context, *enclave.EnclaveFilters) (map[enclave.EnclaveUUID]*enclave.Enclave, error)); ok { @@ -1293,10 +1210,6 @@ func (_c *MockKurtosisBackend_GetEnclaves_Call) RunAndReturn(run func(context.Co func (_m *MockKurtosisBackend) GetEngineLogs(ctx context.Context, outputDirpath string) error { ret := _m.Called(ctx, outputDirpath) - if len(ret) == 0 { - panic("no return value specified for GetEngineLogs") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context, string) error); ok { r0 = rf(ctx, outputDirpath) @@ -1340,10 +1253,6 @@ func (_c *MockKurtosisBackend_GetEngineLogs_Call) RunAndReturn(run func(context. func (_m *MockKurtosisBackend) GetEngines(ctx context.Context, filters *engine.EngineFilters) (map[engine.EngineGUID]*engine.Engine, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for GetEngines") - } - var r0 map[engine.EngineGUID]*engine.Engine var r1 error if rf, ok := ret.Get(0).(func(context.Context, *engine.EngineFilters) (map[engine.EngineGUID]*engine.Engine, error)); ok { @@ -1399,10 +1308,6 @@ func (_c *MockKurtosisBackend_GetEngines_Call) RunAndReturn(run func(context.Con func (_m *MockKurtosisBackend) GetLogsAggregator(ctx context.Context) (*logs_aggregator.LogsAggregator, error) { ret := _m.Called(ctx) - if len(ret) == 0 { - panic("no return value specified for GetLogsAggregator") - } - var r0 *logs_aggregator.LogsAggregator var r1 error if rf, ok := ret.Get(0).(func(context.Context) (*logs_aggregator.LogsAggregator, error)); ok { @@ -1457,10 +1362,6 @@ func (_c *MockKurtosisBackend_GetLogsAggregator_Call) RunAndReturn(run func(cont func (_m *MockKurtosisBackend) GetLogsCollectorForEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID) (*logs_collector.LogsCollector, error) { ret := _m.Called(ctx, enclaveUuid) - if len(ret) == 0 { - panic("no return value specified for GetLogsCollectorForEnclave") - } - var r0 *logs_collector.LogsCollector var r1 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID) (*logs_collector.LogsCollector, error)); ok { @@ -1516,10 +1417,6 @@ func (_c *MockKurtosisBackend_GetLogsCollectorForEnclave_Call) RunAndReturn(run func (_m *MockKurtosisBackend) GetReverseProxy(ctx context.Context) (*reverse_proxy.ReverseProxy, error) { ret := _m.Called(ctx) - if len(ret) == 0 { - panic("no return value specified for GetReverseProxy") - } - var r0 *reverse_proxy.ReverseProxy var r1 error if rf, ok := ret.Get(0).(func(context.Context) (*reverse_proxy.ReverseProxy, error)); ok { @@ -1574,10 +1471,6 @@ func (_c *MockKurtosisBackend_GetReverseProxy_Call) RunAndReturn(run func(contex func (_m *MockKurtosisBackend) GetShellOnUserService(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID) error { ret := _m.Called(ctx, enclaveUuid, serviceUuid) - if len(ret) == 0 { - panic("no return value specified for GetShellOnUserService") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID, service.ServiceUUID) error); ok { r0 = rf(ctx, enclaveUuid, serviceUuid) @@ -1622,10 +1515,6 @@ func (_c *MockKurtosisBackend_GetShellOnUserService_Call) RunAndReturn(run func( func (_m *MockKurtosisBackend) GetUserServiceLogs(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters, shouldFollowLogs bool) (map[service.ServiceUUID]io.ReadCloser, map[service.ServiceUUID]error, error) { ret := _m.Called(ctx, enclaveUuid, filters, shouldFollowLogs) - if len(ret) == 0 { - panic("no return value specified for GetUserServiceLogs") - } - var r0 map[service.ServiceUUID]io.ReadCloser var r1 map[service.ServiceUUID]error var r2 error @@ -1692,10 +1581,6 @@ func (_c *MockKurtosisBackend_GetUserServiceLogs_Call) RunAndReturn(run func(con func (_m *MockKurtosisBackend) GetUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters) (map[service.ServiceUUID]*service.Service, error) { ret := _m.Called(ctx, enclaveUuid, filters) - if len(ret) == 0 { - panic("no return value specified for GetUserServices") - } - var r0 map[service.ServiceUUID]*service.Service var r1 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID, *service.ServiceFilters) (map[service.ServiceUUID]*service.Service, error)); ok { @@ -1752,10 +1637,6 @@ func (_c *MockKurtosisBackend_GetUserServices_Call) RunAndReturn(run func(contex func (_m *MockKurtosisBackend) NixBuild(ctx context.Context, nixBuildSpec *nix_build_spec.NixBuildSpec) (string, error) { ret := _m.Called(ctx, nixBuildSpec) - if len(ret) == 0 { - panic("no return value specified for NixBuild") - } - var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, *nix_build_spec.NixBuildSpec) (string, error)); ok { @@ -1809,10 +1690,6 @@ func (_c *MockKurtosisBackend_NixBuild_Call) RunAndReturn(run func(context.Conte func (_m *MockKurtosisBackend) PruneUnusedImages(ctx context.Context) ([]string, error) { ret := _m.Called(ctx) - if len(ret) == 0 { - panic("no return value specified for PruneUnusedImages") - } - var r0 []string var r1 error if rf, ok := ret.Get(0).(func(context.Context) ([]string, error)); ok { @@ -1867,10 +1744,6 @@ func (_c *MockKurtosisBackend_PruneUnusedImages_Call) RunAndReturn(run func(cont func (_m *MockKurtosisBackend) RegisterUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, services map[service.ServiceName]bool) (map[service.ServiceName]*service.ServiceRegistration, map[service.ServiceName]error, error) { ret := _m.Called(ctx, enclaveUuid, services) - if len(ret) == 0 { - panic("no return value specified for RegisterUserServices") - } - var r0 map[service.ServiceName]*service.ServiceRegistration var r1 map[service.ServiceName]error var r2 error @@ -1936,10 +1809,6 @@ func (_c *MockKurtosisBackend_RegisterUserServices_Call) RunAndReturn(run func(c func (_m *MockKurtosisBackend) RemoveRegisteredUserServiceProcesses(ctx context.Context, enclaveUuid enclave.EnclaveUUID, services map[service.ServiceUUID]bool) (map[service.ServiceUUID]bool, map[service.ServiceUUID]error, error) { ret := _m.Called(ctx, enclaveUuid, services) - if len(ret) == 0 { - panic("no return value specified for RemoveRegisteredUserServiceProcesses") - } - var r0 map[service.ServiceUUID]bool var r1 map[service.ServiceUUID]error var r2 error @@ -2005,10 +1874,6 @@ func (_c *MockKurtosisBackend_RemoveRegisteredUserServiceProcesses_Call) RunAndR func (_m *MockKurtosisBackend) RunUserServiceExecCommandWithStreamedOutput(ctx context.Context, enclaveUuid enclave.EnclaveUUID, serviceUuid service.ServiceUUID, cmd []string) (chan string, chan *exec_result.ExecResult, error) { ret := _m.Called(ctx, enclaveUuid, serviceUuid, cmd) - if len(ret) == 0 { - panic("no return value specified for RunUserServiceExecCommandWithStreamedOutput") - } - var r0 chan string var r1 chan *exec_result.ExecResult var r2 error @@ -2075,10 +1940,6 @@ func (_c *MockKurtosisBackend_RunUserServiceExecCommandWithStreamedOutput_Call) func (_m *MockKurtosisBackend) RunUserServiceExecCommands(ctx context.Context, enclaveUuid enclave.EnclaveUUID, containerUser string, userServiceCommands map[service.ServiceUUID][]string) (map[service.ServiceUUID]*exec_result.ExecResult, map[service.ServiceUUID]error, error) { ret := _m.Called(ctx, enclaveUuid, containerUser, userServiceCommands) - if len(ret) == 0 { - panic("no return value specified for RunUserServiceExecCommands") - } - var r0 map[service.ServiceUUID]*exec_result.ExecResult var r1 map[service.ServiceUUID]error var r2 error @@ -2145,10 +2006,6 @@ func (_c *MockKurtosisBackend_RunUserServiceExecCommands_Call) RunAndReturn(run func (_m *MockKurtosisBackend) StartRegisteredUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, services map[service.ServiceUUID]*service.ServiceConfig) (map[service.ServiceUUID]*service.Service, map[service.ServiceUUID]error, error) { ret := _m.Called(ctx, enclaveUuid, services) - if len(ret) == 0 { - panic("no return value specified for StartRegisteredUserServices") - } - var r0 map[service.ServiceUUID]*service.Service var r1 map[service.ServiceUUID]error var r2 error @@ -2214,10 +2071,6 @@ func (_c *MockKurtosisBackend_StartRegisteredUserServices_Call) RunAndReturn(run func (_m *MockKurtosisBackend) StopAPIContainers(ctx context.Context, filters *api_container.APIContainerFilters) (map[enclave.EnclaveUUID]bool, map[enclave.EnclaveUUID]error, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for StopAPIContainers") - } - var r0 map[enclave.EnclaveUUID]bool var r1 map[enclave.EnclaveUUID]error var r2 error @@ -2282,10 +2135,6 @@ func (_c *MockKurtosisBackend_StopAPIContainers_Call) RunAndReturn(run func(cont func (_m *MockKurtosisBackend) StopEnclaves(ctx context.Context, filters *enclave.EnclaveFilters) (map[enclave.EnclaveUUID]bool, map[enclave.EnclaveUUID]error, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for StopEnclaves") - } - var r0 map[enclave.EnclaveUUID]bool var r1 map[enclave.EnclaveUUID]error var r2 error @@ -2350,10 +2199,6 @@ func (_c *MockKurtosisBackend_StopEnclaves_Call) RunAndReturn(run func(context.C func (_m *MockKurtosisBackend) StopEngines(ctx context.Context, filters *engine.EngineFilters) (map[engine.EngineGUID]bool, map[engine.EngineGUID]error, error) { ret := _m.Called(ctx, filters) - if len(ret) == 0 { - panic("no return value specified for StopEngines") - } - var r0 map[engine.EngineGUID]bool var r1 map[engine.EngineGUID]error var r2 error @@ -2418,10 +2263,6 @@ func (_c *MockKurtosisBackend_StopEngines_Call) RunAndReturn(run func(context.Co func (_m *MockKurtosisBackend) StopUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, filters *service.ServiceFilters) (map[service.ServiceUUID]bool, map[service.ServiceUUID]error, error) { ret := _m.Called(ctx, enclaveUuid, filters) - if len(ret) == 0 { - panic("no return value specified for StopUserServices") - } - var r0 map[service.ServiceUUID]bool var r1 map[service.ServiceUUID]error var r2 error @@ -2487,10 +2328,6 @@ func (_c *MockKurtosisBackend_StopUserServices_Call) RunAndReturn(run func(conte func (_m *MockKurtosisBackend) UnregisterUserServices(ctx context.Context, enclaveUuid enclave.EnclaveUUID, services map[service.ServiceUUID]bool) (map[service.ServiceUUID]bool, map[service.ServiceUUID]error, error) { ret := _m.Called(ctx, enclaveUuid, services) - if len(ret) == 0 { - panic("no return value specified for UnregisterUserServices") - } - var r0 map[service.ServiceUUID]bool var r1 map[service.ServiceUUID]error var r2 error @@ -2556,10 +2393,6 @@ func (_c *MockKurtosisBackend_UnregisterUserServices_Call) RunAndReturn(run func func (_m *MockKurtosisBackend) UpdateEnclave(ctx context.Context, enclaveUuid enclave.EnclaveUUID, newName string, creationTime *time.Time) error { ret := _m.Called(ctx, enclaveUuid, newName, creationTime) - if len(ret) == 0 { - panic("no return value specified for UpdateEnclave") - } - var r0 error if rf, ok := ret.Get(0).(func(context.Context, enclave.EnclaveUUID, string, *time.Time) error); ok { r0 = rf(ctx, enclaveUuid, newName, creationTime) @@ -2601,12 +2434,13 @@ func (_c *MockKurtosisBackend_UpdateEnclave_Call) RunAndReturn(run func(context. return _c } -// NewMockKurtosisBackend creates a new instance of MockKurtosisBackend. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewMockKurtosisBackend(t interface { +type mockConstructorTestingTNewMockKurtosisBackend interface { mock.TestingT Cleanup(func()) -}) *MockKurtosisBackend { +} + +// NewMockKurtosisBackend creates a new instance of MockKurtosisBackend. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +func NewMockKurtosisBackend(t mockConstructorTestingTNewMockKurtosisBackend) *MockKurtosisBackend { mock := &MockKurtosisBackend{} mock.Mock.Test(t) diff --git a/docs/docs/cli-reference/grafloki-start.md b/docs/docs/cli-reference/grafloki-start.md index bc1eefd357..7fbb98919a 100644 --- a/docs/docs/cli-reference/grafloki-start.md +++ b/docs/docs/cli-reference/grafloki-start.md @@ -14,5 +14,23 @@ This command starts a local Grafana/Loki instance and restarts the Kurtosis engi Read more about sinks and how to [export logs][export-logs] from Kurtosis. +Kurtosis Config allows configuring `grafana-loki` and `should-enable-default-logs-sink` configurations. + +```yaml +config-version: 5 +should-send-metrics: true +kurtosis-clusters: + docker: + type: "docker" + grafana-loki: + grafana-image: "grafana/grafana:11.6.0" + loki-image: "grafana/loki:2.9.4" + # Starts Grafana and Loki before engine - useful if Grafana Loki is default logging setup + should-start-before-engine: true + # If set to false, Kurtosis will not collect logs in the default PersistentVolumeLogsDB + # Useful to save storage if leveraging external logging setups + should-enable-default-logs-sink: false +``` + [export-logs]: ../guides/exporting-logs.md \ No newline at end of file diff --git a/engine/launcher/engine_server_launcher/engine_server_launcher.go b/engine/launcher/engine_server_launcher/engine_server_launcher.go index 93c1d274fc..27345514b2 100644 --- a/engine/launcher/engine_server_launcher/engine_server_launcher.go +++ b/engine/launcher/engine_server_launcher/engine_server_launcher.go @@ -52,6 +52,7 @@ func (launcher *EngineServerLauncher) LaunchWithDefaultVersion( domain string, logRetentionPeriod string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) ( resultPublicIpAddr net.IP, resultPublicGrpcPortSpec *port_spec.PortSpec, @@ -78,6 +79,7 @@ func (launcher *EngineServerLauncher) LaunchWithDefaultVersion( domain, logRetentionPeriod, sinks, + shouldEnablePersistentVolumeLogsCollection, ) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred launching the engine server container with default version tag '%v'", kurtosis_version.KurtosisVersion) @@ -106,6 +108,7 @@ func (launcher *EngineServerLauncher) LaunchWithCustomVersion( domain string, logRetentionPeriod string, sinks logs_aggregator.Sinks, + shouldEnablePersistentVolumeLogsCollection bool, ) ( resultPublicIpAddr net.IP, resultPublicGrpcPortSpec *port_spec.PortSpec, @@ -150,6 +153,7 @@ func (launcher *EngineServerLauncher) LaunchWithCustomVersion( shouldStartInDebugMode, githubAuthToken, sinks, + shouldEnablePersistentVolumeLogsCollection, ) if err != nil { return nil, nil, stacktrace.Propagate(err, "An error occurred launching the engine server container")