diff --git a/cmd/clean.go b/cmd/clean.go index 49a918fd..0783c7b5 100644 --- a/cmd/clean.go +++ b/cmd/clean.go @@ -2,7 +2,7 @@ package cmd import ( "fmt" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/utils" "github.com/spf13/cobra" diff --git a/cmd/describe.go b/cmd/describe.go index df5dfe81..9820bba3 100644 --- a/cmd/describe.go +++ b/cmd/describe.go @@ -3,7 +3,7 @@ package cmd import ( "fmt" "github.com/fatih/color" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/provider/factory" "github.com/krkn-chaos/krknctl/pkg/provider/models" "github.com/krkn-chaos/krknctl/pkg/text" @@ -18,13 +18,9 @@ func NewDescribeCommand(factory *factory.ProviderFactory, config config.Config) Long: `describes a scenario`, Args: cobra.ExactArgs(1), ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - dataSource, err := BuildDataSource(config, false, nil) - if err != nil { - return nil, cobra.ShellCompDirectiveError - } provider := GetProvider(false, factory) - scenarios, err := FetchScenarios(provider, dataSource) + scenarios, err := FetchScenarios(provider) if err != nil { log.Fatalf("Error fetching scenarios: %v", err) return []string{}, cobra.ShellCompDirectiveError @@ -34,14 +30,10 @@ func NewDescribeCommand(factory *factory.ProviderFactory, config config.Config) }, RunE: func(cmd *cobra.Command, args []string) error { - dataSource, err := BuildDataSource(config, false, nil) - if err != nil { - return err - } spinner := NewSpinnerWithSuffix("fetching scenario details...") spinner.Start() provider := GetProvider(false, factory) - scenarioDetail, err := provider.GetScenarioDetail(args[0], dataSource) + scenarioDetail, err := provider.GetScenarioDetail(args[0]) if err != nil { return err } diff --git a/cmd/graph.go b/cmd/graph.go index 53984cd8..b0240dd7 100644 --- a/cmd/graph.go +++ b/cmd/graph.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" "github.com/fatih/color" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/dependencygraph" "github.com/krkn-chaos/krknctl/pkg/provider" providerfactory "github.com/krkn-chaos/krknctl/pkg/provider/factory" @@ -41,7 +41,6 @@ func NewGraphRunCommand(factory *providerfactory.ProviderFactory, scenarioOrches spinner := NewSpinnerWithSuffix("running graph based chaos plan...") volumes := make(map[string]string) environment := make(map[string]string) - debug := false kubeconfig, err := cmd.Flags().GetString("kubeconfig") if err != nil { return err @@ -64,7 +63,6 @@ func NewGraphRunCommand(factory *providerfactory.ProviderFactory, scenarioOrches return fmt.Errorf("file %s does not exist", metricsProfile) } - debug, err = cmd.Flags().GetBool("debug") if err != nil { return err } @@ -94,10 +92,6 @@ func NewGraphRunCommand(factory *providerfactory.ProviderFactory, scenarioOrches nodes := make(map[string]models.ScenarioNode) err = json.Unmarshal(file, &nodes) - dataSource, err := BuildDataSource(config, false, nil) - if err != nil { - return err - } dataProvider := GetProvider(false, factory) nameChannel := make(chan *struct { name *string @@ -105,7 +99,7 @@ func NewGraphRunCommand(factory *providerfactory.ProviderFactory, scenarioOrches }) spinner.Start() go func() { - validateScenariosInput(dataProvider, dataSource, nodes, nameChannel) + validateScenariosInput(dataProvider, nodes, nameChannel) }() for { @@ -162,7 +156,7 @@ func NewGraphRunCommand(factory *providerfactory.ProviderFactory, scenarioOrches } go func() { - (*scenarioOrchestrator).RunGraph(nodes, executionPlan, environment, volumes, false, commChannel, ctx, debug) + (*scenarioOrchestrator).RunGraph(nodes, executionPlan, environment, volumes, false, commChannel, ctx) }() for { @@ -187,7 +181,7 @@ func NewGraphRunCommand(factory *providerfactory.ProviderFactory, scenarioOrches return command } -func validateScenariosInput(provider provider.ScenarioDataProvider, dataSource string, nodes map[string]models.ScenarioNode, scenarioNameChannel chan *struct { +func validateScenariosInput(provider provider.ScenarioDataProvider, nodes map[string]models.ScenarioNode, scenarioNameChannel chan *struct { name *string err error }) { @@ -200,7 +194,8 @@ func validateScenariosInput(provider provider.ScenarioDataProvider, dataSource s name *string err error }{name: &n.Name, err: nil} - scenarioDetail, err := provider.GetScenarioDetail(n.Name, dataSource) + scenarioDetail, err := provider.GetScenarioDetail(n.Name) + if err != nil { scenarioNameChannel <- &struct { name *string @@ -208,13 +203,29 @@ func validateScenariosInput(provider provider.ScenarioDataProvider, dataSource s }{name: &n.Name, err: err} return } + if scenarioDetail == nil { scenarioNameChannel <- &struct { name *string err error - }{name: &n.Name, err: fmt.Errorf("scenario %s not found in %s", n.Name, dataSource)} + }{name: &n.Name, err: fmt.Errorf("scenario %s not found", n.Name)} return } + + globalDetail, err := provider.GetGlobalEnvironment() + if err != nil { + scenarioNameChannel <- &struct { + name *string + err error + }{name: &n.Name, err: err} + return + } + + // adding the global env fields to the scenario fields so, if global env is + // added to the scenario the validation is available + + scenarioDetail.Fields = append(scenarioDetail.Fields, globalDetail.Fields...) + for k, v := range n.Env { field := scenarioDetail.GetFieldByEnvVar(k) if field == nil { @@ -264,13 +275,9 @@ func NewGraphScaffoldCommand(factory *providerfactory.ProviderFactory, config co Long: `Scaffolds a dependency graph based run`, Args: cobra.MinimumNArgs(1), ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - dataSource, err := BuildDataSource(config, false, nil) - if err != nil { - return nil, cobra.ShellCompDirectiveError - } dataProvider := GetProvider(false, factory) - scenarios, err := FetchScenarios(dataProvider, dataSource) + scenarios, err := FetchScenarios(dataProvider) if err != nil { log.Fatalf("Error fetching scenarios: %v", err) return []string{}, cobra.ShellCompDirectiveError @@ -279,12 +286,13 @@ func NewGraphScaffoldCommand(factory *providerfactory.ProviderFactory, config co return *scenarios, cobra.ShellCompDirectiveNoFileComp }, RunE: func(cmd *cobra.Command, args []string) error { - dataSource, err := BuildDataSource(config, false, nil) + dataProvider := GetProvider(false, factory) + includeGlobalEnv, err := cmd.Flags().GetBool("global-env") if err != nil { return err } - dataProvider := GetProvider(false, factory) - output, err := dataProvider.ScaffoldScenarios(args, dataSource) + + output, err := dataProvider.ScaffoldScenarios(args, includeGlobalEnv) if err != nil { return err } diff --git a/cmd/list.go b/cmd/list.go index 7f9bd25b..023a9d51 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -3,7 +3,7 @@ package cmd import ( "fmt" "github.com/fatih/color" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" providerfactory "github.com/krkn-chaos/krknctl/pkg/provider/factory" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" "github.com/spf13/cobra" @@ -30,14 +30,10 @@ func NewListScenariosCommand(factory *providerfactory.ProviderFactory, config co Long: `list available krkn-hub scenarios`, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - dataSource, err := BuildDataSource(config, false, nil) - if err != nil { - return err - } provider := GetProvider(false, factory) s := NewSpinnerWithSuffix("fetching scenarios...") s.Start() - scenarios, err := provider.GetRegistryImages(dataSource) + scenarios, err := provider.GetRegistryImages() if err != nil { s.Stop() log.Fatalf("failed to fetch scenarios: %v", err) diff --git a/cmd/query_status.go b/cmd/query_status.go index 2a6580ae..a880359c 100644 --- a/cmd/query_status.go +++ b/cmd/query_status.go @@ -6,7 +6,7 @@ import ( "encoding/json" "errors" "fmt" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" provider_models "github.com/krkn-chaos/krknctl/pkg/provider/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" diff --git a/cmd/root.go b/cmd/root.go index e96c2d3e..96320f04 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -2,7 +2,7 @@ package cmd import ( "fmt" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/provider/factory" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" "github.com/spf13/cobra" @@ -53,7 +53,7 @@ func Execute(providerFactory *factory.ProviderFactory, scenarioOrchestrator *sce runCmd.LocalFlags().String("alerts-profile", "", "custom alerts profile file path") runCmd.LocalFlags().String("metrics-profile", "", "custom metrics profile file path") runCmd.LocalFlags().Bool("detached", false, "if set this flag will run in detached mode") - runCmd.LocalFlags().Bool("debug", false, "if set this flag will enable debug output in krkn") + runCmd.DisableFlagParsing = true rootCmd.AddCommand(runCmd) @@ -66,9 +66,9 @@ func Execute(providerFactory *factory.ProviderFactory, scenarioOrchestrator *sce graphRunCmd.Flags().String("kubeconfig", "", "kubeconfig path (if not set will default to ~/.kube/config)") graphRunCmd.Flags().String("alerts-profile", "", "custom alerts profile file path") graphRunCmd.Flags().String("metrics-profile", "", "custom metrics profile file path") - graphRunCmd.Flags().Bool("debug", false, "if set this flag will enable debug output in krkn") graphScaffoldCmd := NewGraphScaffoldCommand(providerFactory, config) + graphScaffoldCmd.Flags().Bool("global-env", false, "if set this flag will add global environment variables to each scenario in the graph") graphCmd.AddCommand(graphRunCmd) graphCmd.AddCommand(graphScaffoldCmd) rootCmd.AddCommand(graphCmd) diff --git a/cmd/run.go b/cmd/run.go index 839894cd..cb286645 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -4,12 +4,14 @@ import ( "errors" "fmt" "github.com/fatih/color" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/provider/factory" + "github.com/krkn-chaos/krknctl/pkg/provider/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/utils" "github.com/krkn-chaos/krknctl/pkg/typing" "github.com/spf13/cobra" + "github.com/spf13/pflag" "log" "os" "strings" @@ -17,7 +19,8 @@ import ( ) func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scenario_orchestrator.ScenarioOrchestrator, config config.Config) *cobra.Command { - collectedFlags := make(map[string]*string) + scenarioCollectedFlags := make(map[string]*string) + globalCollectedFlags := make(map[string]*string) var command = &cobra.Command{ Use: "run", Short: "runs a scenario", @@ -25,13 +28,8 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena DisableFlagParsing: false, Args: cobra.MinimumNArgs(1), ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - dataSource, err := BuildDataSource(config, false, nil) - if err != nil { - return nil, cobra.ShellCompDirectiveError - } provider := GetProvider(false, factory) - - scenarios, err := FetchScenarios(provider, dataSource) + scenarios, err := FetchScenarios(provider) if err != nil { log.Fatalf("Error fetching scenarios: %v", err) return []string{}, cobra.ShellCompDirectiveError @@ -41,15 +39,19 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena }, PreRunE: func(cmd *cobra.Command, args []string) error { - dataSource, err := BuildDataSource(config, false, nil) + provider := GetProvider(false, factory) + scenarioDetail, err := provider.GetScenarioDetail(args[0]) if err != nil { return err } - provider := GetProvider(false, factory) - scenarioDetail, err := provider.GetScenarioDetail(args[0], dataSource) + globalEnvDetail, err := provider.GetGlobalEnvironment() if err != nil { return err } + + globalFlags := pflag.NewFlagSet("global", pflag.ExitOnError) + scenarioFlags := pflag.NewFlagSet("scenario", pflag.ExitOnError) + if scenarioDetail == nil { return fmt.Errorf("%s scenario not found", args[0]) } @@ -59,35 +61,55 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena if field.Default != nil { defaultValue = *field.Default } - collectedFlags[*field.Name] = cmd.LocalFlags().String(*field.Name, defaultValue, *field.Description) + scenarioCollectedFlags[*field.Name] = scenarioFlags.String(*field.Name, defaultValue, *field.Description) if err != nil { return err } } + for _, field := range globalEnvDetail.Fields { + var defaultValue = "" + if field.Default != nil { + defaultValue = *field.Default + } + globalCollectedFlags[*field.Name] = globalFlags.String(*field.Name, defaultValue, *field.Description) + if err != nil { + return err + } + } + + cmd.LocalFlags().AddFlagSet(globalFlags) + cmd.LocalFlags().AddFlagSet(scenarioFlags) + + cmd.SetHelpFunc(func(command *cobra.Command, args []string) { + yellow := color.New(color.FgYellow).SprintFunc() + green := color.New(color.FgGreen).SprintFunc() + boldGreen := color.New(color.FgHiGreen, color.Bold).SprintFunc() + fmt.Println(fmt.Sprintf("%s", yellow("Krkn Global flags"))) + printHelp(*globalEnvDetail) + fmt.Println(fmt.Sprintf("\n%s %s", boldGreen(scenarioDetail.Name), green("Flags"))) + printHelp(*scenarioDetail) + fmt.Print("\n\n") + }) + return nil }, RunE: func(cmd *cobra.Command, args []string) error { (*scenarioOrchestrator).PrintContainerRuntime() - spinner := NewSpinnerWithSuffix("validating input...") - dataSource, err := BuildDataSource(config, false, nil) - if err != nil { - return err - } + spinner := NewSpinnerWithSuffix("fetching scenario metadata...") // Starts validating input message spinner.Start() runDetached := false - debug := false provider := GetProvider(false, factory) - scenarioDetail, err := provider.GetScenarioDetail(args[0], dataSource) + scenarioDetail, err := provider.GetScenarioDetail(args[0]) if err != nil { return err } - + globalDetail, err := provider.GetGlobalEnvironment() if err != nil { return err } @@ -134,8 +156,10 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena runDetached = true } - if a == "--debug" { - debug = true + if a == "--help" { + spinner.Stop() + cmd.Help() + return nil } } } @@ -155,38 +179,32 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena if alertsProfile != nil { volumes[*alertsProfile] = config.AlertsProfilePath } + spinner.Suffix = "validating input ..." //dynamic flags parsing - for k := range collectedFlags { - field := scenarioDetail.GetFieldByName(k) - if field == nil { - return fmt.Errorf("field %s not found", k) - } - var foundArg *string = nil - for i, a := range args { - if a == fmt.Sprintf("--%s", k) { - if len(args) < i+2 || strings.HasPrefix(args[i+1], "--") { - return fmt.Errorf("%s has no value", args[i]) - } - foundArg = &args[i+1] - } - } - if field != nil { + scenarioEnv, scenarioVol, err := ParseFlags(scenarioDetail, args, scenarioCollectedFlags, false) + if err != nil { + return err + } + globalEnv, globalVol, err := ParseFlags(globalDetail, args, globalCollectedFlags, true) + if err != nil { + return err + } - value, err := field.Validate(foundArg) - if err != nil { - return err - } - if value != nil && field.Type != typing.File { - environment[*field.Variable] = *value - } else if value != nil && field.Type == typing.File { - fileSrcDst := strings.Split(*value, ":") - volumes[fileSrcDst[0]] = fileSrcDst[1] - } + for k, v := range *scenarioVol { + volumes[k] = v + } - } + for k, v := range *globalVol { + volumes[k] = v + } + for k, v := range *scenarioEnv { + environment[k] = v } - // stops the spinner before printing the input table to not disrupt it + for k, v := range *globalEnv { + environment[k] = v + } + spinner.Stop() tbl := NewEnvironmentTable(environment) @@ -220,7 +238,7 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena spinner.Stop() }() - _, err = (*scenarioOrchestrator).RunAttached(quayImageUri+":"+scenarioDetail.Name, containerName, environment, false, volumes, os.Stdout, os.Stderr, &commChan, conn, debug) + _, err = (*scenarioOrchestrator).RunAttached(quayImageUri+":"+scenarioDetail.Name, containerName, environment, false, volumes, os.Stdout, os.Stderr, &commChan, conn) if err != nil { var staterr *utils.ExitError if errors.As(err, &staterr) { @@ -231,7 +249,7 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena scenarioDuration := time.Since(startTime) fmt.Println(fmt.Sprintf("%s ran for %s", scenarioDetail.Name, scenarioDuration.String())) } else { - containerId, err := (*scenarioOrchestrator).Run(quayImageUri+":"+scenarioDetail.Name, containerName, environment, false, volumes, nil, conn, debug) + containerId, err := (*scenarioOrchestrator).Run(quayImageUri+":"+scenarioDetail.Name, containerName, environment, false, volumes, nil, conn) if err != nil { return err } @@ -245,6 +263,7 @@ func NewRunCommand(factory *factory.ProviderFactory, scenarioOrchestrator *scena return nil }, } + return command } @@ -254,3 +273,20 @@ func checkStringArgValue(args []string, index int) error { } return nil } + +func printHelp(scenario models.ScenarioDetail) { + boldWhite := color.New(color.FgHiWhite, color.Bold).SprintFunc() + for _, f := range scenario.Fields { + + enum := "" + if f.Type == typing.Enum { + enum = strings.Replace(*f.AllowedValues, *f.Separator, "|", -1) + } + def := "" + if f.Default != nil && *f.Default != "" { + def = fmt.Sprintf("(Default: %s)", *f.Default) + } + + fmt.Printf("\t--%s %s: %s [%s]%s\n", *f.Name, boldWhite(enum), *f.Description, boldWhite(f.Type.String()), def) + } +} diff --git a/cmd/utils.go b/cmd/utils.go index 5e7828af..0f2c6be9 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -1,12 +1,16 @@ package cmd import ( + "fmt" "github.com/briandowns/spinner" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/provider" "github.com/krkn-chaos/krknctl/pkg/provider/factory" + "github.com/krkn-chaos/krknctl/pkg/provider/models" + "github.com/krkn-chaos/krknctl/pkg/typing" "github.com/spf13/cobra" "os" + "strings" "time" ) @@ -39,8 +43,8 @@ func GetProvider(offline bool, providerFactory *factory.ProviderFactory) provide return dataProvider } -func FetchScenarios(provider provider.ScenarioDataProvider, dataSource string) (*[]string, error) { - scenarios, err := provider.GetRegistryImages(dataSource) +func FetchScenarios(provider provider.ScenarioDataProvider) (*[]string, error) { + scenarios, err := provider.GetRegistryImages() if err != nil { return nil, err } @@ -51,27 +55,46 @@ func FetchScenarios(provider provider.ScenarioDataProvider, dataSource string) ( return &foundScenarios, nil } -func BuildDataSource(config config.Config, offline bool, offlineSource *string) (string, error) { - var dataSource = "" - if offline == true { - if offlineSource != nil { - dataSource = *offlineSource - } else { - dataSource = "" - } - } else { - var err error - dataSource, err = config.GetQuayRepositoryApiUri() - if err != nil { - return "", err - } - } - return dataSource, nil -} - func CheckFileExists(filePath string) bool { if _, err := os.Stat(filePath); os.IsNotExist(err) { return false } return true } + +func ParseFlags(scenarioDetail *models.ScenarioDetail, args []string, scenarioCollectedFlags map[string]*string, skipDefault bool) (vol *map[string]string, env *map[string]string, err error) { + environment := make(map[string]string) + volumes := make(map[string]string) + for k := range scenarioCollectedFlags { + field := scenarioDetail.GetFieldByName(k) + if field == nil { + return nil, nil, fmt.Errorf("field %s not found", k) + } + var foundArg *string = nil + for i, a := range args { + if a == fmt.Sprintf("--%s", k) { + if len(args) < i+2 || strings.HasPrefix(args[i+1], "--") { + return nil, nil, fmt.Errorf("%s has no value", args[i]) + } + foundArg = &args[i+1] + } + } + var value *string = nil + if foundArg != nil || skipDefault == false { + value, err = field.Validate(foundArg) + if err != nil { + return nil, nil, err + } + } + + if value != nil && field.Type != typing.File { + environment[*field.Variable] = *value + } else if value != nil && field.Type == typing.File { + fileSrcDst := strings.Split(*value, ":") + volumes[fileSrcDst[0]] = fileSrcDst[1] + } + + } + + return &environment, &volumes, nil +} diff --git a/main.go b/main.go index fdaad08f..442c6a30 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/fatih/color" "github.com/krkn-chaos/krknctl/cmd" - krknctlconfig "github.com/krkn-chaos/krknctl/internal/config" + krknctlconfig "github.com/krkn-chaos/krknctl/pkg/config" providerfactory "github.com/krkn-chaos/krknctl/pkg/provider/factory" scenarioorchestratorfactory "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/factory" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/utils" diff --git a/internal/config/config.go b/pkg/config/config.go similarity index 72% rename from internal/config/config.go rename to pkg/config/config.go index 9c4e5f37..b0dc0376 100644 --- a/internal/config/config.go +++ b/pkg/config/config.go @@ -10,8 +10,10 @@ type Config struct { Version string `json:"version"` QuayHost string `json:"quay_host"` QuayOrg string `json:"quay_org"` - QuayRegistry string `json:"quay_registry"` - QuayRepositoryApi string `json:"quay_repositoryApi"` + QuayScenarioRegistry string `json:"quay_scenario_registry"` + QuayBaseImageRegistry string `json:"quay_base_image_registry"` + QuayBaseImageTag string `json:"quay_base_image_tag"` + QuayRepositoryApi string `json:"quay_repository_api"` ContainerPrefix string `json:"container_prefix"` KubeconfigPrefix string `json:"kubeconfig_prefix"` PodmanDarwinSocketTemplate string `json:"podman_darwin_socket_template"` @@ -30,7 +32,6 @@ type Config struct { LabelTitleRegex string `json:"label_title_regex"` LabelDescriptionRegex string `json:"label_description_regex"` LabelInputFieldsRegex string `json:"label_input_fields_regex"` - DebugEnvironmentVariable string `json:"debug_environment_variable"` } //go:embed config.json @@ -46,16 +47,25 @@ func LoadConfig() (Config, error) { } func (c *Config) GetQuayImageUri() (string, error) { - imageUri, err := url.JoinPath(c.QuayHost, c.QuayOrg, c.QuayRegistry) + imageUri, err := url.JoinPath(c.QuayHost, c.QuayOrg, c.QuayScenarioRegistry) if err != nil { return "", err } return imageUri, nil } -func (c *Config) GetQuayRepositoryApiUri() (string, error) { +func (c *Config) GetQuayScenarioRepositoryApiUri() (string, error) { baseHost := "https://" + c.QuayHost - repositoryUri, err := url.JoinPath(baseHost, c.QuayRepositoryApi, c.QuayOrg, c.QuayRegistry) + repositoryUri, err := url.JoinPath(baseHost, c.QuayRepositoryApi, c.QuayOrg, c.QuayScenarioRegistry) + if err != nil { + return "", err + } + return repositoryUri, nil +} + +func (c *Config) GetQuayEnvironmentApiUri() (string, error) { + baseHost := "https://" + c.QuayHost + repositoryUri, err := url.JoinPath(baseHost, c.QuayRepositoryApi, c.QuayOrg, c.QuayBaseImageRegistry) if err != nil { return "", err } diff --git a/internal/config/config.json b/pkg/config/config.json similarity index 86% rename from internal/config/config.json rename to pkg/config/config.json index 25fefa96..e47e5408 100644 --- a/internal/config/config.json +++ b/pkg/config/config.json @@ -2,8 +2,10 @@ "version": "0.0.1", "quay_host": "quay.io", "quay_org": "krkn-chaos", - "quay_registry": "krkn-hub", - "quay_repositoryApi": "api/v1/repository", + "quay_scenario_registry": "krkn-hub", + "quay_base_image_registry" : "krkn", + "quay_base_image_tag" : "latest", + "quay_repository_api": "api/v1/repository", "container_prefix": "krknctl", "kubeconfig_prefix": "krknctl-kubeconfig", "krknctl_logs": "krknct-log", @@ -22,6 +24,5 @@ "label_input_fields": "krknctl.input_fields", "label_title_regex": "LABEL krknctl\\.title=\\\"?(.*)\\\"?", "label_description_regex": "LABEL krknctl\\.description=\\\"?(.*)\\\"?", - "label_input_fields_regex": "LABEL krknctl\\.input_fields=\\'?(\\[.*\\])\\'?", - "debug_environment_variable": "KRKN_DEBUG" + "label_input_fields_regex": "LABEL krknctl\\.input_fields=\\'?(\\[.*\\])\\'?" } diff --git a/pkg/provider/factory/provider_factory.go b/pkg/provider/factory/provider_factory.go index a749be95..590efabf 100644 --- a/pkg/provider/factory/provider_factory.go +++ b/pkg/provider/factory/provider_factory.go @@ -1,7 +1,7 @@ package factory import ( - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/provider" "github.com/krkn-chaos/krknctl/pkg/provider/offline" "github.com/krkn-chaos/krknctl/pkg/provider/quay" diff --git a/pkg/provider/factory/provider_factory_test.go b/pkg/provider/factory/provider_factory_test.go index 469b083c..b3855193 100644 --- a/pkg/provider/factory/provider_factory_test.go +++ b/pkg/provider/factory/provider_factory_test.go @@ -1,7 +1,7 @@ package factory import ( - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/provider" "github.com/krkn-chaos/krknctl/pkg/provider/offline" "github.com/krkn-chaos/krknctl/pkg/provider/quay" diff --git a/pkg/provider/offline/scenario_provider.go b/pkg/provider/offline/scenario_provider.go index 746af2e8..2183b9df 100644 --- a/pkg/provider/offline/scenario_provider.go +++ b/pkg/provider/offline/scenario_provider.go @@ -8,15 +8,20 @@ import ( type ScenarioProvider struct { } -func (p *ScenarioProvider) GetRegistryImages(dataSource string) (*[]models.ScenarioTag, error) { +func (p *ScenarioProvider) GetRegistryImages() (*[]models.ScenarioTag, error) { return nil, errors.New("not yet implemented") } -func (p *ScenarioProvider) GetScenarioDetail(scenario string, dataSource string) (*models.ScenarioDetail, error) { +func (p *ScenarioProvider) GetScenarioDetail(scenario string) (*models.ScenarioDetail, error) { return nil, errors.New("not yet implemented") } -func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, dataSource string) (*string, error) { +func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, includeGlobalEnv bool) (*string, error) { + //TODO implement me + panic("implement me") +} + +func (p *ScenarioProvider) GetGlobalEnvironment() (*models.ScenarioDetail, error) { //TODO implement me panic("implement me") } diff --git a/pkg/provider/provider.go b/pkg/provider/provider.go index e5bf2554..284093c0 100644 --- a/pkg/provider/provider.go +++ b/pkg/provider/provider.go @@ -10,7 +10,8 @@ const ( ) type ScenarioDataProvider interface { - GetRegistryImages(dataSource string) (*[]models.ScenarioTag, error) - GetScenarioDetail(scenario string, dataSource string) (*models.ScenarioDetail, error) - ScaffoldScenarios(scenarios []string, dataSource string) (*string, error) + GetRegistryImages() (*[]models.ScenarioTag, error) + GetGlobalEnvironment() (*models.ScenarioDetail, error) + GetScenarioDetail(scenario string) (*models.ScenarioDetail, error) + ScaffoldScenarios(scenarios []string, includeGlobalEnv bool) (*string, error) } diff --git a/pkg/provider/quay/scenario_provider.go b/pkg/provider/quay/scenario_provider.go index 15932875..1690ba6f 100644 --- a/pkg/provider/quay/scenario_provider.go +++ b/pkg/provider/quay/scenario_provider.go @@ -6,7 +6,7 @@ import ( "errors" "fmt" "github.com/fatih/color" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/provider/models" models2 "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "github.com/krkn-chaos/krknctl/pkg/typing" @@ -23,7 +23,7 @@ type ScenarioProvider struct { Config *config.Config } -func (p *ScenarioProvider) GetRegistryImages(dataSource string) (*[]models.ScenarioTag, error) { +func (p *ScenarioProvider) getRegistryImages(dataSource string) (*[]models.ScenarioTag, error) { tagBaseUrl, err := url.Parse(dataSource + "/tag") if err != nil { return nil, err @@ -65,6 +65,19 @@ func (p *ScenarioProvider) GetRegistryImages(dataSource string) (*[]models.Scena return &scenarioTags, deferErr } +func (p *ScenarioProvider) GetRegistryImages() (*[]models.ScenarioTag, error) { + dataSource, err := p.Config.GetQuayScenarioRepositoryApiUri() + if err != nil { + return nil, err + } + + scenarioTags, err := p.getRegistryImages(dataSource) + if err != nil { + return nil, err + } + return scenarioTags, nil +} + func (p *ScenarioProvider) getInstructionScenario(rootNodeName string) models2.ScenarioNode { node := models2.ScenarioNode{} node.Comment = fmt.Sprintf("**READ CAREFULLY** To create your scenario run plan, assign an ID to each scenario definition (or keep the existing randomly assigned ones if preferred). "+ @@ -74,7 +87,7 @@ func (p *ScenarioProvider) getInstructionScenario(rootNodeName string) models2.S return node } -func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, dataSource string) (*string, error) { +func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, includeGlobalEnv bool) (*string, error) { var scenarioDetails []models.ScenarioDetail // handles babble panic when american word dictionary is not installed @@ -87,7 +100,7 @@ func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, dataSource stri babbler := babble.NewBabbler() babbler.Count = 1 for _, scenarioName := range scenarios { - scenarioDetail, err := p.GetScenarioDetail(scenarioName, dataSource) + scenarioDetail, err := p.GetScenarioDetail(scenarioName) if err != nil { return nil, err @@ -99,7 +112,7 @@ func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, dataSource stri scenarioDetails = append(scenarioDetails, *scenarioDetail) } - // builds all the indexes for the json upfront so I can suggest the root node in the _comment + // builds all the indexes for the json upfront, so I can suggest the root node in the _comment var indexes []string for _, scenario := range scenarios { indexes = append(indexes, fmt.Sprintf("%s-%s", scenario, strings.ToLower(babbler.Babble()))) @@ -144,6 +157,18 @@ func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, dataSource stri } } + + if includeGlobalEnv == true { + globalDetail, err := p.GetGlobalEnvironment() + if err != nil { + return nil, err + } + + for _, field := range globalDetail.Fields { + scenarioNode.Env[*field.Variable] = *field.Default + + } + } scenarioNodes[indexes[i]] = scenarioNode } @@ -159,22 +184,8 @@ func (p *ScenarioProvider) ScaffoldScenarios(scenarios []string, dataSource stri return &jsonBuf, nil } -func (p *ScenarioProvider) GetScenarioDetail(scenario string, dataSource string) (*models.ScenarioDetail, error) { - scenarios, err := p.GetRegistryImages(dataSource) - if err != nil { - return nil, err - } - var foundScenario *models.ScenarioTag = nil - for _, scenarioTag := range *scenarios { - if scenarioTag.Name == scenario { - foundScenario = &scenarioTag - } - } - if foundScenario == nil { - return nil, nil - } - - baseURL, err := url.Parse(dataSource + "/manifest/" + foundScenario.Digest) +func (p *ScenarioProvider) getScenarioDetail(dataSource string, foundScenario *models.ScenarioTag) (*models.ScenarioDetail, error) { + baseURL, err := url.Parse(dataSource + "/manifest/" + (*foundScenario).Digest) if err != nil { return nil, err } @@ -239,6 +250,62 @@ func (p *ScenarioProvider) GetScenarioDetail(scenario string, dataSource string) return &scenarioDetail, deferErr } +func (p *ScenarioProvider) GetScenarioDetail(scenario string) (*models.ScenarioDetail, error) { + dataSource, err := p.Config.GetQuayScenarioRepositoryApiUri() + if err != nil { + return nil, err + } + scenarios, err := p.GetRegistryImages() + if err != nil { + return nil, err + } + var foundScenario *models.ScenarioTag = nil + for _, scenarioTag := range *scenarios { + if scenarioTag.Name == scenario { + foundScenario = &scenarioTag + } + } + if foundScenario == nil { + return nil, nil + } + + scenarioDetail, err := p.getScenarioDetail(dataSource, foundScenario) + if err != nil { + return nil, err + } + return scenarioDetail, nil +} + +func (p *ScenarioProvider) GetGlobalEnvironment() (*models.ScenarioDetail, error) { + dataSource, err := p.Config.GetQuayEnvironmentApiUri() + if err != nil { + return nil, err + } + var foundScenario *models.ScenarioTag = nil + scenarios, err := p.getRegistryImages(dataSource) + if err != nil { + return nil, err + } + if scenarios == nil { + return nil, fmt.Errorf("no tags found in registry %s", dataSource) + } + for _, scenarioTag := range *scenarios { + if scenarioTag.Name == p.Config.QuayBaseImageTag { + foundScenario = &scenarioTag + } + } + if foundScenario == nil { + return nil, nil + } + + globalEnvDetail, err := p.getScenarioDetail(dataSource, foundScenario) + if err != nil { + return nil, err + } + return globalEnvDetail, nil + +} + func (p *ScenarioProvider) parseTitle(s string) (*string, error) { reDoubleQuotes, err := regexp.Compile(p.Config.LabelTitleRegex) if err != nil { diff --git a/pkg/provider/quay/scenario_provider_test.go b/pkg/provider/quay/scenario_provider_test.go index a7b0769a..806ee5d0 100644 --- a/pkg/provider/quay/scenario_provider_test.go +++ b/pkg/provider/quay/scenario_provider_test.go @@ -1,7 +1,7 @@ package quay import ( - krknctlconfig "github.com/krkn-chaos/krknctl/internal/config" + krknctlconfig "github.com/krkn-chaos/krknctl/pkg/config" "github.com/stretchr/testify/assert" "strings" "testing" @@ -16,23 +16,20 @@ func getConfig(t *testing.T) krknctlconfig.Config { func getTestConfig(t *testing.T) krknctlconfig.Config { conf := getConfig(t) - conf.QuayRegistry = "krknctl-test" + conf.QuayScenarioRegistry = "krknctl-test" return conf } func getWrongConfig(t *testing.T) krknctlconfig.Config { conf := getConfig(t) - conf.QuayRegistry = "do_not_exist" + conf.QuayScenarioRegistry = "do_not_exist" return conf } func TestScenarioProvider_GetRegistryImages(t *testing.T) { config := getTestConfig(t) provider := ScenarioProvider{Config: &config} - - uri, err := config.GetQuayRepositoryApiUri() - assert.NoError(t, err) - scenarios, err := provider.GetRegistryImages(uri) + scenarios, err := provider.GetRegistryImages() assert.Nil(t, err) assert.NotNil(t, scenarios) assert.Greater(t, len(*scenarios), 0) @@ -45,9 +42,7 @@ func TestScenarioProvider_GetRegistryImages(t *testing.T) { wrongConfig := getWrongConfig(t) wrongProvider := ScenarioProvider{Config: &wrongConfig} - uri, err = wrongConfig.GetQuayRepositoryApiUri() - assert.NoError(t, err) - _, err = wrongProvider.GetRegistryImages(uri) + _, err = wrongProvider.GetRegistryImages() assert.Error(t, err) } @@ -55,30 +50,28 @@ func TestScenarioProvider_GetRegistryImages(t *testing.T) { func TestQuayScenarioProvider_GetScenarioDetail(t *testing.T) { config := getTestConfig(t) provider := ScenarioProvider{Config: &config} - uri, err := config.GetQuayRepositoryApiUri() - assert.NoError(t, err) - scenario, err := provider.GetScenarioDetail("cpu-hog", uri) + scenario, err := provider.GetScenarioDetail("cpu-hog") assert.Nil(t, err) assert.NotNil(t, scenario) assert.Equal(t, len(scenario.Fields), 5) - scenario, err = provider.GetScenarioDetail("cpu-memory-notitle", uri) + scenario, err = provider.GetScenarioDetail("cpu-memory-notitle") assert.NotNil(t, err) assert.True(t, strings.Contains(err.Error(), "krknctl.title LABEL not found in tag: cpu-memory-notitle")) assert.Nil(t, scenario) - scenario, err = provider.GetScenarioDetail("cpu-memory-nodescription", uri) + scenario, err = provider.GetScenarioDetail("cpu-memory-nodescription") assert.NotNil(t, err) assert.True(t, strings.Contains(err.Error(), "krknctl.description LABEL not found in tag: cpu-memory-nodescription")) assert.Nil(t, scenario) - scenario, err = provider.GetScenarioDetail("cpu-memory-noinput", uri) + scenario, err = provider.GetScenarioDetail("cpu-memory-noinput") assert.NotNil(t, err) assert.True(t, strings.Contains(err.Error(), "krknctl.input_fields LABEL not found in tag: cpu-memory-noinput")) assert.Nil(t, scenario) - scenario, err = provider.GetScenarioDetail("not-found", uri) + scenario, err = provider.GetScenarioDetail("not-found") assert.Nil(t, err) assert.Nil(t, scenario) @@ -86,21 +79,33 @@ func TestQuayScenarioProvider_GetScenarioDetail(t *testing.T) { func TestQuayScenarioProvider_ScaffoldScenarios(t *testing.T) { config := getConfig(t) - uri, err := config.GetQuayRepositoryApiUri() - assert.NoError(t, err) provider := ScenarioProvider{Config: &config} - scenarios, err := provider.GetRegistryImages(uri) + scenarios, err := provider.GetRegistryImages() assert.Nil(t, err) assert.NotNil(t, scenarios) scenarioNames := []string{"node-cpu-hog", "node-memory-hog", "dummy-scenario"} - json, err := provider.ScaffoldScenarios(scenarioNames, uri) + json, err := provider.ScaffoldScenarios(scenarioNames, false) assert.Nil(t, err) assert.NotNil(t, json) - json, err = provider.ScaffoldScenarios([]string{"node-cpu-hog", "does-not-exist"}, uri) + json, err = provider.ScaffoldScenarios(scenarioNames, true) + assert.Nil(t, err) + assert.NotNil(t, json) + + json, err = provider.ScaffoldScenarios([]string{"node-cpu-hog", "does-not-exist"}, false) assert.Nil(t, json) assert.NotNil(t, err) } + +func TestQuayScenarioProvider_GetGlobalEnvironment(t *testing.T) { + config := getConfig(t) + provider := ScenarioProvider{Config: &config} + + baseImageScenario, err := provider.GetGlobalEnvironment() + assert.Nil(t, err) + assert.NotNil(t, baseImageScenario) + assert.Greater(t, len(baseImageScenario.Fields), 0) +} diff --git a/pkg/scenario_orchestrator/common_functions.go b/pkg/scenario_orchestrator/common_functions.go index 921da60a..6b54a62e 100644 --- a/pkg/scenario_orchestrator/common_functions.go +++ b/pkg/scenario_orchestrator/common_functions.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "github.com/fatih/color" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/utils" "io" @@ -15,7 +15,7 @@ import ( "syscall" ) -func CommonRunGraph(scenarios models.ScenarioSet, resolvedGraph models.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *models.GraphCommChannel, orchestrator ScenarioOrchestrator, config config.Config, ctx context.Context, debug bool) { +func CommonRunGraph(scenarios models.ScenarioSet, resolvedGraph models.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *models.GraphCommChannel, orchestrator ScenarioOrchestrator, config config.Config, ctx context.Context) { env := make(map[string]string) volumes := make(map[string]string) @@ -51,7 +51,7 @@ func CommonRunGraph(scenarios models.ScenarioSet, resolvedGraph models.ResolvedG go func() { defer wg.Done() - _, _ = orchestrator.RunAttached(scenario.Image, containerName, env, cache, volumes, file, file, nil, ctx, debug) + _, _ = orchestrator.RunAttached(scenario.Image, containerName, env, cache, volumes, file, file, nil, ctx) }() } @@ -60,9 +60,9 @@ func CommonRunGraph(scenarios models.ScenarioSet, resolvedGraph models.ResolvedG commChannel <- nil } -func CommonRunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, c ScenarioOrchestrator, commChan *chan *string, ctx context.Context, debug bool) (*string, error) { +func CommonRunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, c ScenarioOrchestrator, commChan *chan *string, ctx context.Context) (*string, error) { - containerId, err := c.Run(image, containerName, env, cache, volumeMounts, commChan, ctx, debug) + containerId, err := c.Run(image, containerName, env, cache, volumeMounts, commChan, ctx) if err != nil { return nil, err } diff --git a/pkg/scenario_orchestrator/docker/scenario_orchestrator.go b/pkg/scenario_orchestrator/docker/scenario_orchestrator.go index 541e9f58..9afdb98a 100644 --- a/pkg/scenario_orchestrator/docker/scenario_orchestrator.go +++ b/pkg/scenario_orchestrator/docker/scenario_orchestrator.go @@ -12,7 +12,7 @@ import ( "github.com/docker/docker/client" "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/stdcopy" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" providermodels "github.com/krkn-chaos/krknctl/pkg/provider/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" orchestratormodels "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" @@ -30,7 +30,7 @@ type ScenarioOrchestrator struct { ContainerRuntime orchestratormodels.ContainerRuntime } -func (c *ScenarioOrchestrator) Run(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, commChan *chan *string, ctx context.Context, debug bool) (*string, error) { +func (c *ScenarioOrchestrator) Run(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, commChan *chan *string, ctx context.Context) (*string, error) { cli, err := dockerClientFromContext(ctx) if err != nil { @@ -49,12 +49,6 @@ func (c *ScenarioOrchestrator) Run(image string, containerName string, env map[s } var envVars []string - if debug == true { - envVars = append(envVars, fmt.Sprintf("%s='True'", c.GetConfig().DebugEnvironmentVariable)) - } - - // THIS WILL BE REMOVED WHEN GLOBAL ENV WILL BE INTRODUCED - envVars = append(envVars, "WAIT_DURATION=1") for k, v := range env { envVars = append(envVars, fmt.Sprintf("%s=%s", k, v)) @@ -437,13 +431,13 @@ func (c *ScenarioOrchestrator) AttachWait(containerId *string, stdout io.Writer, return &interrupted, nil } -func (c *ScenarioOrchestrator) RunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, commChan *chan *string, ctx context.Context, debug bool) (*string, error) { - containerId, err := scenario_orchestrator.CommonRunAttached(image, containerName, env, cache, volumeMounts, stdout, stderr, c, commChan, ctx, debug) +func (c *ScenarioOrchestrator) RunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, commChan *chan *string, ctx context.Context) (*string, error) { + containerId, err := scenario_orchestrator.CommonRunAttached(image, containerName, env, cache, volumeMounts, stdout, stderr, c, commChan, ctx) return containerId, err } -func (c *ScenarioOrchestrator) RunGraph(scenarios orchestratormodels.ScenarioSet, resolvedGraph orchestratormodels.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *orchestratormodels.GraphCommChannel, ctx context.Context, debug bool) { - scenario_orchestrator.CommonRunGraph(scenarios, resolvedGraph, extraEnv, extraVolumeMounts, cache, commChannel, c, c.Config, ctx, false) +func (c *ScenarioOrchestrator) RunGraph(scenarios orchestratormodels.ScenarioSet, resolvedGraph orchestratormodels.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *orchestratormodels.GraphCommChannel, ctx context.Context) { + scenario_orchestrator.CommonRunGraph(scenarios, resolvedGraph, extraEnv, extraVolumeMounts, cache, commChannel, c, c.Config, ctx) } func (c *ScenarioOrchestrator) PrintContainerRuntime() { diff --git a/pkg/scenario_orchestrator/docker/scenario_orchestrator_test.go b/pkg/scenario_orchestrator/docker/scenario_orchestrator_test.go index a7bb76ce..46e630da 100644 --- a/pkg/scenario_orchestrator/docker/scenario_orchestrator_test.go +++ b/pkg/scenario_orchestrator/docker/scenario_orchestrator_test.go @@ -4,7 +4,7 @@ import ( "context" "fmt" dockercontainer "github.com/docker/docker/api/types/container" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/test" "github.com/stretchr/testify/assert" diff --git a/pkg/scenario_orchestrator/factory/factory.go b/pkg/scenario_orchestrator/factory/factory.go index 81754132..b9a12465 100644 --- a/pkg/scenario_orchestrator/factory/factory.go +++ b/pkg/scenario_orchestrator/factory/factory.go @@ -1,7 +1,7 @@ package factory import ( - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/docker" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" diff --git a/pkg/scenario_orchestrator/factory/factory_test.go b/pkg/scenario_orchestrator/factory/factory_test.go index 07b89f0d..51e48213 100644 --- a/pkg/scenario_orchestrator/factory/factory_test.go +++ b/pkg/scenario_orchestrator/factory/factory_test.go @@ -1,7 +1,7 @@ package factory import ( - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/docker" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/podman" diff --git a/pkg/scenario_orchestrator/podman/scenario_orchestrator.go b/pkg/scenario_orchestrator/podman/scenario_orchestrator.go index da1165c2..17956a57 100644 --- a/pkg/scenario_orchestrator/podman/scenario_orchestrator.go +++ b/pkg/scenario_orchestrator/podman/scenario_orchestrator.go @@ -11,7 +11,7 @@ import ( "github.com/containers/podman/v5/pkg/errorhandling" "github.com/containers/podman/v5/pkg/specgen" "github.com/docker/docker/api/types/mount" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" providermodels "github.com/krkn-chaos/krknctl/pkg/provider/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" orchestratormodels "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" @@ -51,7 +51,7 @@ func (w *progressWriter) Write(p []byte) (n int, err error) { return len(p), nil } -func (c *ScenarioOrchestrator) Run(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, commChan *chan *string, ctx context.Context, debug bool) (*string, error) { +func (c *ScenarioOrchestrator) Run(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, commChan *chan *string, ctx context.Context) (*string, error) { imageExists, err := images.Exists(ctx, image, nil) if cache == false || imageExists == false { @@ -95,12 +95,6 @@ func (c *ScenarioOrchestrator) Run(image string, containerName string, env map[s s.Name = containerName s.Env = env - if debug == true { - s.Env[c.GetConfig().DebugEnvironmentVariable] = "True" - } - - // THIS WILL BE REMOVED WHEN GLOBAL ENV WILL BE INTRODUCED - s.Env["WAIT_DURATION"] = "1" for k, v := range volumeMounts { containerMount := specs.Mount{ @@ -321,9 +315,9 @@ func (c *ScenarioOrchestrator) ResolveContainerName(containerName string, ctx co // common functions -func (c *ScenarioOrchestrator) RunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, commChan *chan *string, ctx context.Context, debug bool) (*string, error) { +func (c *ScenarioOrchestrator) RunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, commChan *chan *string, ctx context.Context) (*string, error) { time.Sleep(2) - return scenario_orchestrator.CommonRunAttached(image, containerName, env, cache, volumeMounts, stdout, stderr, c, commChan, ctx, debug) + return scenario_orchestrator.CommonRunAttached(image, containerName, env, cache, volumeMounts, stdout, stderr, c, commChan, ctx) } func (c *ScenarioOrchestrator) AttachWait(containerId *string, stdout io.Writer, stderr io.Writer, ctx context.Context) (*bool, error) { @@ -335,9 +329,9 @@ func (c *ScenarioOrchestrator) AttachWait(containerId *string, stdout io.Writer, return &interrupted, nil } -func (c *ScenarioOrchestrator) RunGraph(scenarios orchestratormodels.ScenarioSet, resolvedGraph orchestratormodels.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *orchestratormodels.GraphCommChannel, ctx context.Context, debug bool) { +func (c *ScenarioOrchestrator) RunGraph(scenarios orchestratormodels.ScenarioSet, resolvedGraph orchestratormodels.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *orchestratormodels.GraphCommChannel, ctx context.Context) { //TODO: add a getconfig method in scenarioOrchestrator - scenario_orchestrator.CommonRunGraph(scenarios, resolvedGraph, extraEnv, extraVolumeMounts, cache, commChannel, c, c.Config, ctx, debug) + scenario_orchestrator.CommonRunGraph(scenarios, resolvedGraph, extraEnv, extraVolumeMounts, cache, commChannel, c, c.Config, ctx) } func (c *ScenarioOrchestrator) PrintContainerRuntime() { diff --git a/pkg/scenario_orchestrator/podman/scenario_orchestrator_test.go b/pkg/scenario_orchestrator/podman/scenario_orchestrator_test.go index efb26611..a9cd7b54 100644 --- a/pkg/scenario_orchestrator/podman/scenario_orchestrator_test.go +++ b/pkg/scenario_orchestrator/podman/scenario_orchestrator_test.go @@ -4,7 +4,7 @@ import ( "context" "fmt" "github.com/containers/podman/v5/pkg/bindings/containers" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/test" "github.com/stretchr/testify/assert" diff --git a/pkg/scenario_orchestrator/scenario_orchestrator.go b/pkg/scenario_orchestrator/scenario_orchestrator.go index d5670040..11695ef0 100644 --- a/pkg/scenario_orchestrator/scenario_orchestrator.go +++ b/pkg/scenario_orchestrator/scenario_orchestrator.go @@ -2,7 +2,7 @@ package scenario_orchestrator import ( "context" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" orchestrator_models "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "io" "os" @@ -11,11 +11,11 @@ import ( type ScenarioOrchestrator interface { Connect(containerRuntimeUri string) (context.Context, error) - Run(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, commChan *chan *string, ctx context.Context, debug bool) (*string, error) + Run(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, commChan *chan *string, ctx context.Context) (*string, error) - RunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, commChan *chan *string, ctx context.Context, debug bool) (*string, error) + RunAttached(image string, containerName string, env map[string]string, cache bool, volumeMounts map[string]string, stdout io.Writer, stderr io.Writer, commChan *chan *string, ctx context.Context) (*string, error) - RunGraph(scenarios orchestrator_models.ScenarioSet, resolvedGraph orchestrator_models.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *orchestrator_models.GraphCommChannel, ctx context.Context, debug bool) + RunGraph(scenarios orchestrator_models.ScenarioSet, resolvedGraph orchestrator_models.ResolvedGraph, extraEnv map[string]string, extraVolumeMounts map[string]string, cache bool, commChannel chan *orchestrator_models.GraphCommChannel, ctx context.Context) CleanContainers(ctx context.Context) (*int, error) diff --git a/pkg/scenario_orchestrator/test/common_test_functions.go b/pkg/scenario_orchestrator/test/common_test_functions.go index f2eafa5e..f6cf405c 100644 --- a/pkg/scenario_orchestrator/test/common_test_functions.go +++ b/pkg/scenario_orchestrator/test/common_test_functions.go @@ -4,7 +4,7 @@ import ( "encoding/json" "errors" "fmt" - krknctlconfig "github.com/krkn-chaos/krknctl/internal/config" + krknctlconfig "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/dependencygraph" "github.com/krkn-chaos/krknctl/pkg/provider/quay" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator" @@ -28,7 +28,7 @@ func CommonGetConfig(t *testing.T) krknctlconfig.Config { func CommonGetTestConfig(t *testing.T) krknctlconfig.Config { conf := CommonGetConfig(t) - conf.QuayRegistry = "krknctl-test" + conf.QuayScenarioRegistry = "krknctl-test" return conf } @@ -44,10 +44,7 @@ func CommonTestScenarioOrchestratorRun(t *testing.T, so scenario_orchestrator.Sc registryUri, err := conf.GetQuayImageUri() assert.Nil(t, err) - apiUri, err := conf.GetQuayRepositoryApiUri() - assert.Nil(t, err) - - scenario, err := quayProvider.GetScenarioDetail("dummy-scenario", apiUri) + scenario, err := quayProvider.GetScenarioDetail("dummy-scenario") assert.Nil(t, err) assert.NotNil(t, scenario) kubeconfig, err := utils.PrepareKubeconfig(nil, conf) @@ -73,7 +70,7 @@ func CommonTestScenarioOrchestratorRun(t *testing.T, so scenario_orchestrator.Sc fmt.Println("CONTAINER SOCKET -> " + *socket) timestamp := time.Now().Unix() containerName := fmt.Sprintf("%s-%s-%d", conf.ContainerPrefix, scenario.Name, timestamp) - containerId, err := so.Run(registryUri+":"+scenario.Name, containerName, env, false, map[string]string{}, nil, ctx, false) + containerId, err := so.Run(registryUri+":"+scenario.Name, containerName, env, false, map[string]string{}, nil, ctx) assert.Nil(t, err) assert.NotNil(t, containerId) return *containerId @@ -91,9 +88,7 @@ func CommonTestScenarioOrchestratorRunAttached(t *testing.T, so scenario_orchest quayProvider := quay.ScenarioProvider{Config: &conf} registryUri, err := conf.GetQuayImageUri() assert.Nil(t, err) - apiUri, err := conf.GetQuayRepositoryApiUri() - assert.Nil(t, err) - scenario, err := quayProvider.GetScenarioDetail("failing-scenario", apiUri) + scenario, err := quayProvider.GetScenarioDetail("failing-scenario") assert.Nil(t, err) assert.NotNil(t, scenario) kubeconfig, err := utils.PrepareKubeconfig(nil, conf) @@ -118,7 +113,7 @@ func CommonTestScenarioOrchestratorRunAttached(t *testing.T, so scenario_orchest fmt.Println("CONTAINER SOCKET -> " + *socket) containerName1 := utils.GenerateContainerName(conf, scenario.Name, nil) - containerId, err := so.RunAttached(registryUri+":"+scenario.Name, containerName1, env, false, map[string]string{}, os.Stdout, os.Stderr, nil, ctx, false) + containerId, err := so.RunAttached(registryUri+":"+scenario.Name, containerName1, env, false, map[string]string{}, os.Stdout, os.Stderr, nil, ctx) if err != nil { fmt.Println("ERROR -> " + err.Error()) } @@ -130,7 +125,7 @@ func CommonTestScenarioOrchestratorRunAttached(t *testing.T, so scenario_orchest env["END"] = fmt.Sprintf("%d", duration) env["EXIT_STATUS"] = fmt.Sprintf("%d", exitStatus) containerName2 := utils.GenerateContainerName(conf, scenario.Name, nil) - containerId, err = so.RunAttached(registryUri+":"+scenario.Name, containerName2, env, false, map[string]string{}, os.Stdout, os.Stderr, nil, ctx, false) + containerId, err = so.RunAttached(registryUri+":"+scenario.Name, containerName2, env, false, map[string]string{}, os.Stdout, os.Stderr, nil, ctx) if err != nil { fmt.Println("ERROR -> " + err.Error()) } @@ -230,9 +225,7 @@ func CommonTestScenarioOrchestratorRunGraph(t *testing.T, so scenario_orchestrat fmt.Println("Current user: " + (*currentUser).Name) fmt.Println("current user id" + (*currentUser).Uid) quayProvider := quay.ScenarioProvider{Config: &config} - repositoryApi, err := config.GetQuayRepositoryApiUri() - assert.Nil(t, err) - scenario, err := quayProvider.GetScenarioDetail("dummy-scenario", repositoryApi) + scenario, err := quayProvider.GetScenarioDetail("dummy-scenario") assert.Nil(t, err) assert.NotNil(t, scenario) kubeconfig, err := utils.PrepareKubeconfig(nil, config) @@ -278,7 +271,7 @@ func CommonTestScenarioOrchestratorRunGraph(t *testing.T, so scenario_orchestrat commChannel := make(chan *models.GraphCommChannel) go func() { - so.RunGraph(nodes, executionPlan, map[string]string{}, map[string]string{}, false, commChannel, ctx, false) + so.RunGraph(nodes, executionPlan, map[string]string{}, map[string]string{}, false, commChannel, ctx) }() for { @@ -386,9 +379,7 @@ func CommonTestScenarioOrchestratorResolveContainerName(t *testing.T, so scenari quayProvider := quay.ScenarioProvider{Config: &conf} registryUri, err := conf.GetQuayImageUri() assert.Nil(t, err) - apiUri, err := conf.GetQuayRepositoryApiUri() - assert.Nil(t, err) - scenario, err := quayProvider.GetScenarioDetail("failing-scenario", apiUri) + scenario, err := quayProvider.GetScenarioDetail("failing-scenario") assert.Nil(t, err) assert.NotNil(t, scenario) kubeconfig, err := utils.PrepareKubeconfig(nil, conf) @@ -413,7 +404,7 @@ func CommonTestScenarioOrchestratorResolveContainerName(t *testing.T, so scenari fmt.Println("CONTAINER SOCKET -> " + *socket) containerName := utils.GenerateContainerName(conf, scenario.Name, nil) - containerId, err := so.RunAttached(registryUri+":"+scenario.Name, containerName, env, false, map[string]string{}, os.Stdout, os.Stderr, nil, ctx, false) + containerId, err := so.RunAttached(registryUri+":"+scenario.Name, containerName, env, false, map[string]string{}, os.Stdout, os.Stderr, nil, ctx) assert.Nil(t, err) assert.NotNil(t, containerId) @@ -439,10 +430,7 @@ func CommonTestScenarioOrchestratorKillContainers(t *testing.T, so scenario_orch registryUri, err := conf.GetQuayImageUri() assert.Nil(t, err) - apiUri, err := conf.GetQuayRepositoryApiUri() - assert.Nil(t, err) - - scenario, err := quayProvider.GetScenarioDetail("dummy-scenario", apiUri) + scenario, err := quayProvider.GetScenarioDetail("dummy-scenario") assert.Nil(t, err) assert.NotNil(t, scenario) kubeconfig, err := utils.PrepareKubeconfig(nil, conf) @@ -468,7 +456,7 @@ func CommonTestScenarioOrchestratorKillContainers(t *testing.T, so scenario_orch fmt.Println("CONTAINER SOCKET -> " + *socket) timestamp := time.Now().Unix() containerName := fmt.Sprintf("%s-%s-kill-%d", conf.ContainerPrefix, scenario.Name, timestamp) - containerId, err := so.Run(registryUri+":"+scenario.Name, containerName, env, false, map[string]string{}, nil, ctx, false) + containerId, err := so.Run(registryUri+":"+scenario.Name, containerName, env, false, map[string]string{}, nil, ctx) time.Sleep(2 * time.Second) containers, err := so.ListRunningContainers(ctx) assert.Nil(t, err) @@ -508,10 +496,7 @@ func CommonTestScenarioOrchestratorListRunningScenarios(t *testing.T, so scenari registryUri, err := conf.GetQuayImageUri() assert.Nil(t, err) - apiUri, err := conf.GetQuayRepositoryApiUri() - assert.Nil(t, err) - - scenario, err := quayProvider.GetScenarioDetail("dummy-scenario", apiUri) + scenario, err := quayProvider.GetScenarioDetail("dummy-scenario") assert.Nil(t, err) assert.NotNil(t, scenario) kubeconfig, err := utils.PrepareKubeconfig(nil, conf) @@ -541,8 +526,8 @@ func CommonTestScenarioOrchestratorListRunningScenarios(t *testing.T, so scenari //starting containers in inverted order to check if lisRunningScenarios returns them sorted sortedContainers := make(map[int]string) - _, err = so.Run(registryUri+":"+scenario.Name, containerName2, env, false, map[string]string{}, nil, ctx, false) - _, err = so.Run(registryUri+":"+scenario.Name, containerName1, env, false, map[string]string{}, nil, ctx, false) + _, err = so.Run(registryUri+":"+scenario.Name, containerName2, env, false, map[string]string{}, nil, ctx) + _, err = so.Run(registryUri+":"+scenario.Name, containerName1, env, false, map[string]string{}, nil, ctx) time.Sleep(1 * time.Second) assert.Nil(t, err) @@ -575,10 +560,7 @@ func CommonTestScenarioOrchestratorInspectRunningScenario(t *testing.T, so scena registryUri, err := conf.GetQuayImageUri() assert.Nil(t, err) - apiUri, err := conf.GetQuayRepositoryApiUri() - assert.Nil(t, err) - - scenario, err := quayProvider.GetScenarioDetail("dummy-scenario", apiUri) + scenario, err := quayProvider.GetScenarioDetail("dummy-scenario") assert.Nil(t, err) assert.NotNil(t, scenario) kubeconfig, err := utils.PrepareKubeconfig(nil, conf) @@ -604,7 +586,7 @@ func CommonTestScenarioOrchestratorInspectRunningScenario(t *testing.T, so scena fmt.Println("CONTAINER SOCKET -> " + *socket) containerName1 := utils.GenerateContainerName(conf, scenario.Name, nil) - containerId1, err := so.Run(registryUri+":"+scenario.Name, containerName1, env, false, map[string]string{}, nil, ctx, false) + containerId1, err := so.Run(registryUri+":"+scenario.Name, containerName1, env, false, map[string]string{}, nil, ctx) assert.Nil(t, err) time.Sleep(1 * time.Second) diff --git a/pkg/scenario_orchestrator/utils/utils.go b/pkg/scenario_orchestrator/utils/utils.go index 2637b544..3455a431 100644 --- a/pkg/scenario_orchestrator/utils/utils.go +++ b/pkg/scenario_orchestrator/utils/utils.go @@ -7,7 +7,7 @@ import ( "github.com/containers/podman/v5/pkg/bindings" images "github.com/docker/docker/api/types/image" "github.com/docker/docker/client" - "github.com/krkn-chaos/krknctl/internal/config" + "github.com/krkn-chaos/krknctl/pkg/config" orchestatormodels "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "github.com/krkn-chaos/krknctl/pkg/text" "io/fs" diff --git a/pkg/scenario_orchestrator/utils/utils_test.go b/pkg/scenario_orchestrator/utils/utils_test.go index 6d1ffe57..1fd5c274 100644 --- a/pkg/scenario_orchestrator/utils/utils_test.go +++ b/pkg/scenario_orchestrator/utils/utils_test.go @@ -2,7 +2,7 @@ package utils import ( "fmt" - krknctlconfig "github.com/krkn-chaos/krknctl/internal/config" + krknctlconfig "github.com/krkn-chaos/krknctl/pkg/config" "github.com/krkn-chaos/krknctl/pkg/scenario_orchestrator/models" "github.com/stretchr/testify/assert" "io/fs" diff --git a/pkg/typing/field_test.go b/pkg/typing/field_test.go index 92b9b844..c8588456 100644 --- a/pkg/typing/field_test.go +++ b/pkg/typing/field_test.go @@ -187,6 +187,22 @@ func TestStringField(t *testing.T) { _, err = field.Validate(nil) assert.NotNil(t, err) + // tests the correctness of a complex string with lots of escapes as a default value + + stringComplexRegex := ` + { + "name": "telemetry-filter-pattern", + "short_description": "Telemetry filter pattern", + "description": "Filter pattern for telemetry logs", + "variable": "TELEMETRY_FILTER_PATTERN", + "type": "string", + "default": "[\"(\\\\w{3}\\\\s\\\\d{1,2}\\\\s\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d+).+\",\"kinit (\\\\d+/\\\\d+/\\\\d+\\\\s\\\\d{2}:\\\\d{2}:\\\\d{2})\\\\s+\",\"(\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d+Z).+\"]", + "required": "false" + } +` + err = json.Unmarshal([]byte(stringComplexRegex), &field) + assert.Nil(t, err) + } func TestBooleanField(t *testing.T) { diff --git a/plan.json b/plan.json index 85c47455..40d1ea7c 100644 --- a/plan.json +++ b/plan.json @@ -1,38 +1,55 @@ { "_comment": { - "_comment": "****DELETE THIS NODE**** To create your scenario run plan, assign an ID to each scenario definition (or keep the existing randomly assigned ones if preferred). Define dependencies between scenarios using the `depends_on` field, ensuring there are no cycles (including transitive ones) or self-references.Nodes not referenced will not be executed, Nodes without dependencies will run first, while nodes that share the same parent will execute in parallel. [CURRENT ROOT SCENARIO IS `node-cpu-hog-lachrymogenic`]" + "_comment": "**READ CAREFULLY** To create your scenario run plan, assign an ID to each scenario definition (or keep the existing randomly assigned ones if preferred). Define dependencies between scenarios using the `depends_on` field, ensuring there are no cycles (including transitive ones) or self-references.Nodes not referenced will not be executed, Nodes without dependencies will run first, while nodes that share the same parent will execute in parallel. [CURRENT ROOT SCENARIO IS `dummy-scenario-keraterpeton`]" }, - "node-cpu-hog-arctogaeal": { - "image": "quay.io/krkn-chaos/krkn-hub:node-cpu-hog", - "name": "node-cpu-hog", + "dummy-scenario-keraterpeton": { + "_comment": "I'm the root Node!", + "image": "quay.io/krkn-chaos/krkn-hub:dummy-scenario", + "name": "dummy-scenario", "env": { - "NAMESPACE": "default", - "NODE_CPU_CORE": "2", - "NODE_CPU_PERCENTAGE": "50", - "TOTAL_CHAOS_DURATION": "5" - }, - "depends_on": "node-cpu-hog-lachrymogenic" - }, - "node-cpu-hog-lachrymogenic": { - "image": "quay.io/krkn-chaos/krkn-hub:node-cpu-hog", - "name": "node-cpu-hog", - "env": { - "NAMESPACE": "default", - "NODE_CPU_CORE": "2", - "NODE_CPU_PERCENTAGE": "50", - "TOTAL_CHAOS_DURATION": "5" + "ALERTS_PATH": "config/alerts.yaml", + "CAPTURE_METRICS": "False", + "CERBERUS_ENABLED": "False", + "CERBERUS_URL": "http://0.0.0.0:8080", + "CHECK_CRITICAL_ALERTS": "False", + "DAEMON_MODE": "False", + "DISTRIBUTION": "openshift", + "ENABLE_ALERTS": "False", + "ENABLE_ES": "False", + "END": "10", + "ES_ALERTS_INDEX": "krkn-alerts", + "ES_COLLECT_ALERTS": "False", + "ES_COLLECT_METRICS": "False", + "ES_METRICS_INDEX": "krkn-metrics", + "ES_PASSWORD": "", + "ES_PORT": "443", + "ES_SERVER": "http://0.0.0.0", + "ES_TELEMETRY_INDEX": "krkn-telemetry", + "ES_USERNAME": "elastic", + "ES_VERIFY_CERTS": "False", + "EXIT_STATUS": "0", + "ITERATIONS": "1", + "KRKN_DEBUG": "False", + "KRKN_KUBE_CONFIG": "/home/krkn/.kube/config", + "TELEMETRY_API_URL": "https://ulnmf9xv7j.execute-api.us-west-2.amazonaws.com/production", + "TELEMETRY_ARCHIVE_PATH": "/tmp", + "TELEMETRY_ARCHIVE_SIZE": "1000", + "TELEMETRY_BACKUP_THREADS": "5", + "TELEMETRY_CLI_PATH": "", + "TELEMETRY_ENABLED": "False", + "TELEMETRY_EVENTS_BACKUP": "True", + "TELEMETRY_FILTER_PATTERN": "[\"(\\\\w{3}\\\\s\\\\d{1,2}\\\\s\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d+).+\",\"kinit (\\\\d+/\\\\d+/\\\\d+\\\\s\\\\d{2}:\\\\d{2}:\\\\d{2})\\\\s+\",\"(\\\\d{4}-\\\\d{2}-\\\\d{2}T\\\\d{2}:\\\\d{2}:\\\\d{2}\\\\.\\\\d+Z).+\"]", + "TELEMETRY_FULL_PROMETHEUS_BACKUP": "False", + "TELEMETRY_GROUP": "default", + "TELEMETRY_LOGS_BACKUP": "False", + "TELEMETRY_MAX_RETRIES": "0", + "TELEMETRY_PASSWORD": "", + "TELEMETRY_PROMETHEUS_BACKUP": "True", + "TELEMETRY_RUN_TAG": "chaos", + "TELEMETRY_USERNAME": "redhat-chaos", + "UUID": "", + "WAIT_DURATION": "1" } - }, - "node-cpu-hog-tutelo": { - "image": "quay.io/krkn-chaos/krkn-hub:node-cpu-hog", - "name": "node-cpu-hog", - "env": { - "NAMESPACE": "default", - "NODE_CPU_CORE": "2", - "NODE_CPU_PERCENTAGE": "50", - "TOTAL_CHAOS_DURATION": "5" - }, - "depends_on": "node-cpu-hog-lachrymogenic" } }