diff --git a/pkg/module_manager/go_hook/go_hook.go b/pkg/module_manager/go_hook/go_hook.go index 74a2c9b9..1e5e649d 100644 --- a/pkg/module_manager/go_hook/go_hook.go +++ b/pkg/module_manager/go_hook/go_hook.go @@ -7,13 +7,13 @@ import ( "time" "github.com/deckhouse/deckhouse/pkg/log" - "github.com/flant/shell-operator/pkg/hook/config" "github.com/tidwall/gjson" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "github.com/flant/addon-operator/pkg/module_manager/go_hook/metrics" "github.com/flant/addon-operator/pkg/utils" + "github.com/flant/shell-operator/pkg/hook/config" objectpatch "github.com/flant/shell-operator/pkg/kube/object_patch" "github.com/flant/shell-operator/pkg/kube_events_manager/types" ) diff --git a/pkg/module_manager/models/hooks/global_hook_config.go b/pkg/module_manager/models/hooks/global_hook_config.go index df3d50c8..f69bc155 100644 --- a/pkg/module_manager/models/hooks/global_hook_config.go +++ b/pkg/module_manager/models/hooks/global_hook_config.go @@ -1,27 +1,12 @@ package hooks import ( - "errors" "fmt" - "github.com/davecgh/go-spew/spew" - sdkhook "github.com/deckhouse/module-sdk/pkg/hook" - "github.com/go-openapi/spec" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "sigs.k8s.io/yaml" - . "github.com/flant/addon-operator/pkg/hook/types" gohook "github.com/flant/addon-operator/pkg/module_manager/go_hook" "github.com/flant/shell-operator/pkg/hook/config" . "github.com/flant/shell-operator/pkg/hook/types" - kubeeventsmanager "github.com/flant/shell-operator/pkg/kube_events_manager" - eventtypes "github.com/flant/shell-operator/pkg/kube_events_manager/types" - schdulertypes "github.com/flant/shell-operator/pkg/schedule_manager/types" -) - -const ( - defaultHookGroupName = "main" - defaultHookQueueName = "main" ) // GlobalHookConfig is a structure with versioned hook configuration @@ -52,205 +37,6 @@ type GlobalHookConfigV0 struct { AfterAll interface{} `json:"afterAll"` } -func getGlobalHookConfigSchema(version string) *spec.Schema { - globalHookVersion := "global-hook-" + version - if _, ok := config.Schemas[globalHookVersion]; !ok { - schema := config.Schemas[version] - switch version { - case "v1": - // add beforeAll and afterAll properties - schema += ` - beforeAll: - type: integer - example: 10 - afterAll: - type: integer - example: 10 -` - case "v0": - // add beforeAll and afterAll properties - schema += ` - beforeAll: - type: integer - example: 10 - afterAll: - type: integer - example: 10 -` - } - config.Schemas[globalHookVersion] = schema - } - - return config.GetSchema(globalHookVersion) -} - -// LoadAndValidateShellConfig loads shell hook config from bytes and validate it. Returns multierror. -func (c *GlobalHookConfig) LoadAndValidateShellConfig(data []byte) error { - vu := config.NewDefaultVersionedUntyped() - err := vu.Load(data) - if err != nil { - return err - } - - err = config.ValidateConfig(vu.Obj, getGlobalHookConfigSchema(vu.Version), "") - if err != nil { - return err - } - - c.Version = vu.Version - - err = c.HookConfig.ConvertAndCheck(data) - if err != nil { - return err - } - - err = c.ConvertAndCheck(data) - if err != nil { - return err - } - - return nil -} - -func (c *GlobalHookConfig) LoadAndValidateBatchConfig(hcfg *sdkhook.HookConfig) error { - c.Version = hcfg.ConfigVersion - - hcv1 := remapHookConfigV1FromHookConfig(hcfg) - - err := hcv1.ConvertAndCheck(&c.HookConfig) - if err != nil { - return fmt.Errorf("convert and check from hook config v1: %w", err) - } - - if hcfg.OnStartup != nil { - c.OnStartup = &OnStartupConfig{} - c.OnStartup.AllowFailure = false - c.OnStartup.BindingName = string(OnStartup) - c.OnStartup.Order = float64(*hcfg.OnStartup) - } - - if hcfg.OnBeforeHelm != nil { - c.BeforeAll = &BeforeAllConfig{} - c.BeforeAll.BindingName = string(BeforeAll) - c.BeforeAll.Order = float64(*hcfg.OnBeforeHelm) - } - - if hcfg.OnAfterHelm != nil { - c.AfterAll = &AfterAllConfig{} - c.AfterAll.BindingName = string(AfterAll) - c.AfterAll.Order = float64(*hcfg.OnAfterHelm) - } - - return nil -} - -func (c *GlobalHookConfig) LoadAndValidateGoConfig(input *gohook.HookConfig) error { - hookConfig, err := newHookConfigFromGoConfig(input) - if err != nil { - return err - } - - c.HookConfig = hookConfig - - if input.OnBeforeAll != nil { - c.BeforeAll = &BeforeAllConfig{} - c.BeforeAll.BindingName = string(BeforeAll) - c.BeforeAll.Order = input.OnBeforeAll.Order - } - - if input.OnAfterAll != nil { - c.AfterAll = &AfterAllConfig{} - c.AfterAll.BindingName = string(AfterAll) - c.AfterAll.Order = input.OnAfterAll.Order - } - - return nil -} - -func (c *GlobalHookConfig) ConvertAndCheck(data []byte) error { - switch c.Version { - case "v0": - configV0 := &GlobalHookConfigV0{} - err := yaml.Unmarshal(data, configV0) - if err != nil { - return fmt.Errorf("unmarshal GlobalHookConfig version 0: %s", err) - } - c.GlobalV0 = configV0 - err = c.ConvertAndCheckV0() - if err != nil { - return err - } - case "v1": - configV1 := &GlobalHookConfigV0{} - err := yaml.Unmarshal(data, configV1) - if err != nil { - return fmt.Errorf("unmarshal GlobalHookConfig v1: %s", err) - } - c.GlobalV1 = configV1 - err = c.ConvertAndCheckV1() - if err != nil { - return err - } - default: - // NOTE: this should not happen - return fmt.Errorf("version '%s' is unsupported", c.Version) - } - - return nil -} - -func (c *GlobalHookConfig) ConvertAndCheckV0() (err error) { - c.BeforeAll, err = c.ConvertBeforeAll(c.GlobalV0.BeforeAll) - if err != nil { - return err - } - - c.AfterAll, err = c.ConvertAfterAll(c.GlobalV0.AfterAll) - if err != nil { - return err - } - - return nil -} - -func (c *GlobalHookConfig) ConvertAndCheckV1() (err error) { - c.BeforeAll, err = c.ConvertBeforeAll(c.GlobalV1.BeforeAll) - if err != nil { - return err - } - - c.AfterAll, err = c.ConvertAfterAll(c.GlobalV1.AfterAll) - if err != nil { - return err - } - - return nil -} - -func (c *GlobalHookConfig) ConvertBeforeAll(value interface{}) (*BeforeAllConfig, error) { - floatValue, err := config.ConvertFloatForBinding(value, "beforeAll") - if err != nil || floatValue == nil { - return nil, err - } - - res := &BeforeAllConfig{} - res.BindingName = string(BeforeAll) - res.Order = *floatValue - return res, nil -} - -func (c *GlobalHookConfig) ConvertAfterAll(value interface{}) (*AfterAllConfig, error) { - floatValue, err := config.ConvertFloatForBinding(value, "afterAll") - if err != nil || floatValue == nil { - return nil, err - } - - res := &AfterAllConfig{} - res.BindingName = string(AfterAll) - res.Order = *floatValue - return res, nil -} - func (c *GlobalHookConfig) Bindings() []BindingType { res := make([]BindingType, 0) @@ -294,161 +80,6 @@ func (c *GlobalHookConfig) BindingsCount() int { return res } -func newHookConfigFromGoConfig(input *gohook.HookConfig) (config.HookConfig, error) { - c := config.HookConfig{ - Version: "v1", - Schedules: []ScheduleConfig{}, - OnKubernetesEvents: []OnKubernetesEventConfig{}, - } - - if input.Settings != nil { - c.Settings = &Settings{ - ExecutionMinInterval: input.Settings.ExecutionMinInterval, - ExecutionBurst: input.Settings.ExecutionBurst, - } - } - - if input.OnStartup != nil { - c.OnStartup = &OnStartupConfig{} - c.OnStartup.BindingName = string(OnStartup) - c.OnStartup.Order = input.OnStartup.Order - } - - /*** A HUGE copy paste from shell-operator’s hook_config.ConvertAndCheckV1 ***/ - // WARNING no checks and defaults! - for i, kubeCfg := range input.Kubernetes { - // err := c.CheckOnKubernetesEventV1(kubeCfg, fmt.Sprintf("kubernetes[%d]", i)) - // if err != nil { - // return fmt.Errorf("invalid kubernetes config [%d]: %v", i, err) - //} - - monitor := &kubeeventsmanager.MonitorConfig{} - monitor.Metadata.DebugName = config.MonitorDebugName(kubeCfg.Name, i) - monitor.Metadata.MonitorId = config.MonitorConfigID() - monitor.Metadata.LogLabels = map[string]string{} - monitor.Metadata.MetricLabels = map[string]string{} - // monitor.WithMode(kubeCfg.Mode) - monitor.ApiVersion = kubeCfg.ApiVersion - monitor.Kind = kubeCfg.Kind - monitor.WithNameSelector(kubeCfg.NameSelector) - monitor.WithFieldSelector(kubeCfg.FieldSelector) - monitor.WithNamespaceSelector(kubeCfg.NamespaceSelector) - monitor.WithLabelSelector(kubeCfg.LabelSelector) - if kubeCfg.FilterFunc == nil { - return config.HookConfig{}, errors.New(`"FilterFunc" in KubernetesConfig cannot be nil`) - } - filterFunc := kubeCfg.FilterFunc - monitor.FilterFunc = func(obj *unstructured.Unstructured) (interface{}, error) { - return filterFunc(obj) - } - if gohook.BoolDeref(kubeCfg.ExecuteHookOnEvents, true) { - monitor.WithEventTypes(nil) - } else { - monitor.WithEventTypes([]eventtypes.WatchEventType{}) - } - - kubeConfig := OnKubernetesEventConfig{} - kubeConfig.Monitor = monitor - kubeConfig.AllowFailure = input.AllowFailure - if kubeCfg.Name == "" { - return c, spew.Errorf(`"name" is a required field in binding: %v`, kubeCfg) - } - kubeConfig.BindingName = kubeCfg.Name - if input.Queue == "" { - kubeConfig.Queue = defaultHookQueueName - } else { - kubeConfig.Queue = input.Queue - } - kubeConfig.Group = defaultHookGroupName - - kubeConfig.ExecuteHookOnSynchronization = gohook.BoolDeref(kubeCfg.ExecuteHookOnSynchronization, true) - kubeConfig.WaitForSynchronization = gohook.BoolDeref(kubeCfg.WaitForSynchronization, true) - - kubeConfig.KeepFullObjectsInMemory = false - kubeConfig.Monitor.KeepFullObjectsInMemory = false - - c.OnKubernetesEvents = append(c.OnKubernetesEvents, kubeConfig) - } - - // for i, kubeCfg := range c.V1.OnKubernetesEvent { - // if len(kubeCfg.IncludeSnapshotsFrom) > 0 { - // err := c.CheckIncludeSnapshots(kubeCfg.IncludeSnapshotsFrom...) - // if err != nil { - // return fmt.Errorf("invalid kubernetes config [%d]: includeSnapshots %v", i, err) - // } - // } - //} - - // schedule bindings with includeSnapshotsFrom - // are depend on kubernetes bindings. - c.Schedules = []ScheduleConfig{} - for _, inSch := range input.Schedule { - // err := c.CheckScheduleV1(rawSchedule) - // if err != nil { - // return fmt.Errorf("invalid schedule config [%d]: %v", i, err) - //} - - res := ScheduleConfig{} - - if inSch.Name == "" { - return c, spew.Errorf(`"name" is a required field in binding: %v`, inSch) - } - res.BindingName = inSch.Name - - res.AllowFailure = input.AllowFailure - res.ScheduleEntry = schdulertypes.ScheduleEntry{ - Crontab: inSch.Crontab, - Id: config.ScheduleID(), - } - - if input.Queue == "" { - res.Queue = "main" - } else { - res.Queue = input.Queue - } - res.Group = "main" - - // schedule, err := c.ConvertScheduleV1(rawSchedule) - // if err != nil { - // return err - //} - c.Schedules = append(c.Schedules, res) - } - - // Update IncludeSnapshotsFrom for every binding with a group. - // Merge binding's IncludeSnapshotsFrom with snapshots list calculated for group. - groupSnapshots := make(map[string][]string) - for _, kubeCfg := range c.OnKubernetesEvents { - if kubeCfg.Group == "" { - continue - } - if _, ok := groupSnapshots[kubeCfg.Group]; !ok { - groupSnapshots[kubeCfg.Group] = make([]string, 0) - } - groupSnapshots[kubeCfg.Group] = append(groupSnapshots[kubeCfg.Group], kubeCfg.BindingName) - } - newKubeEvents := make([]OnKubernetesEventConfig, 0) - for _, cfg := range c.OnKubernetesEvents { - if snapshots, ok := groupSnapshots[cfg.Group]; ok { - cfg.IncludeSnapshotsFrom = config.MergeArrays(cfg.IncludeSnapshotsFrom, snapshots) - } - newKubeEvents = append(newKubeEvents, cfg) - } - c.OnKubernetesEvents = newKubeEvents - newSchedules := make([]ScheduleConfig, 0) - for _, cfg := range c.Schedules { - if snapshots, ok := groupSnapshots[cfg.Group]; ok { - cfg.IncludeSnapshotsFrom = config.MergeArrays(cfg.IncludeSnapshotsFrom, snapshots) - } - newSchedules = append(newSchedules, cfg) - } - c.Schedules = newSchedules - - /*** END Copy Paste ***/ - - return c, nil -} - func (c *GlobalHookConfig) LoadAndValidateConfig(configLoader gohook.HookConfigLoader) error { err := configLoader.LoadAndValidate(&c.HookConfig, "global") if err != nil { diff --git a/pkg/module_manager/models/hooks/kind/batch_hook.go b/pkg/module_manager/models/hooks/kind/batch_hook.go index d9491bfb..4a97f989 100644 --- a/pkg/module_manager/models/hooks/kind/batch_hook.go +++ b/pkg/module_manager/models/hooks/kind/batch_hook.go @@ -11,8 +11,6 @@ import ( "github.com/deckhouse/deckhouse/pkg/log" sdkhook "github.com/deckhouse/module-sdk/pkg/hook" - kemtypes "github.com/flant/shell-operator/pkg/kube_events_manager/types" - "github.com/gofrs/uuid/v5" gohook "github.com/flant/addon-operator/pkg/module_manager/go_hook" @@ -24,6 +22,7 @@ import ( "github.com/flant/shell-operator/pkg/hook/config" "github.com/flant/shell-operator/pkg/hook/controller" objectpatch "github.com/flant/shell-operator/pkg/kube/object_patch" + kemtypes "github.com/flant/shell-operator/pkg/kube_events_manager/types" metricoperation "github.com/flant/shell-operator/pkg/metric_storage/operation" ) diff --git a/pkg/module_manager/models/hooks/kind/gohook.go b/pkg/module_manager/models/hooks/kind/gohook.go index 7169a739..dc5e3645 100644 --- a/pkg/module_manager/models/hooks/kind/gohook.go +++ b/pkg/module_manager/models/hooks/kind/gohook.go @@ -6,7 +6,6 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/deckhouse/deckhouse/pkg/log" - kubeeventsmanager "github.com/flant/shell-operator/pkg/kube_events_manager" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" gohook "github.com/flant/addon-operator/pkg/module_manager/go_hook" @@ -18,6 +17,7 @@ import ( "github.com/flant/shell-operator/pkg/hook/controller" htypes "github.com/flant/shell-operator/pkg/hook/types" objectpatch "github.com/flant/shell-operator/pkg/kube/object_patch" + kubeeventsmanager "github.com/flant/shell-operator/pkg/kube_events_manager" eventtypes "github.com/flant/shell-operator/pkg/kube_events_manager/types" schdulertypes "github.com/flant/shell-operator/pkg/schedule_manager/types" ) diff --git a/pkg/module_manager/models/hooks/kind/shellhook.go b/pkg/module_manager/models/hooks/kind/shellhook.go index 43737823..0b3edf1d 100644 --- a/pkg/module_manager/models/hooks/kind/shellhook.go +++ b/pkg/module_manager/models/hooks/kind/shellhook.go @@ -258,12 +258,12 @@ func (sh *ShellHook) LoadOnStartup() *float64 { } func (sh *ShellHook) LoadBeforeAll() *float64 { - res := ConvertFloatForBinding(sh.ScheduleConfig.BeforeAll, "before all") + res := ConvertFloatForBinding(sh.ScheduleConfig.BeforeAll) if res != nil { return res } - res = ConvertFloatForBinding(sh.ScheduleConfig.BeforeHelm, "before helm") + res = ConvertFloatForBinding(sh.ScheduleConfig.BeforeHelm) if res != nil { return res } @@ -272,12 +272,12 @@ func (sh *ShellHook) LoadBeforeAll() *float64 { } func (sh *ShellHook) LoadAfterAll() *float64 { - res := ConvertFloatForBinding(sh.ScheduleConfig.AfterAll, "after all") + res := ConvertFloatForBinding(sh.ScheduleConfig.AfterAll) if res != nil { return res } - res = ConvertFloatForBinding(sh.ScheduleConfig.AfterHelm, "after helm") + res = ConvertFloatForBinding(sh.ScheduleConfig.AfterHelm) if res != nil { return res } @@ -286,7 +286,7 @@ func (sh *ShellHook) LoadAfterAll() *float64 { } func (sh *ShellHook) LoadAfterDeleteHelm() *float64 { - res := ConvertFloatForBinding(sh.ScheduleConfig.AfterDeleteHelm, "after delete helm") + res := ConvertFloatForBinding(sh.ScheduleConfig.AfterDeleteHelm) if res != nil { return res } @@ -304,7 +304,7 @@ type HookScheduleConfig struct { AfterDeleteHelm *uint `json:"afterDeleteHelm" yaml:"afterDeleteHelm"` } -func ConvertFloatForBinding(value *uint, bindingName string) *float64 { +func ConvertFloatForBinding(value *uint) *float64 { if value == nil { return nil } diff --git a/pkg/module_manager/models/hooks/module_hook_config.go b/pkg/module_manager/models/hooks/module_hook_config.go index ec2d9aa5..854dd346 100644 --- a/pkg/module_manager/models/hooks/module_hook_config.go +++ b/pkg/module_manager/models/hooks/module_hook_config.go @@ -2,17 +2,11 @@ package hooks import ( "fmt" - "strconv" - - sdkhook "github.com/deckhouse/module-sdk/pkg/hook" - "github.com/go-openapi/spec" - "sigs.k8s.io/yaml" . "github.com/flant/addon-operator/pkg/hook/types" gohook "github.com/flant/addon-operator/pkg/module_manager/go_hook" "github.com/flant/shell-operator/pkg/hook/config" . "github.com/flant/shell-operator/pkg/hook/types" - "github.com/flant/shell-operator/pkg/kube_events_manager/types" ) // ModuleHookConfig is a structure with versioned hook configuration @@ -50,352 +44,6 @@ type ModuleHookConfigV0 struct { AfterDeleteHelm interface{} `json:"afterDeleteHelm"` } -func getModuleHookConfigSchema(version string) *spec.Schema { - globalHookVersion := "module-hook-" + version - if _, ok := config.Schemas[globalHookVersion]; !ok { - schema := config.Schemas[version] - switch version { - case "v1": - // add beforeHelm, afterHelm and afterDeleteHelm properties - schema += ` - beforeHelm: - type: integer - example: 10 - afterHelm: - type: integer - example: 10 - afterDeleteHelm: - type: integer - example: 10 -` - case "v0": - // add beforeHelm, afterHelm and afterDeleteHelm properties - schema += ` - beforeHelm: - type: integer - example: 10 - afterHelm: - type: integer - example: 10 - afterDeleteHelm: - type: integer - example: 10 -` - } - config.Schemas[globalHookVersion] = schema - } - - return config.GetSchema(globalHookVersion) -} - -// LoadAndValidateShellConfig loads shell hook config from bytes and validate it. Returns multierror. -func (c *ModuleHookConfig) LoadAndValidateShellConfig(data []byte) error { - // find config version - vu := config.NewDefaultVersionedUntyped() - err := vu.Load(data) - if err != nil { - return fmt.Errorf("load data: %w", err) - } - - // validate config scheme - err = config.ValidateConfig(vu.Obj, getModuleHookConfigSchema(vu.Version), "") - if err != nil { - return fmt.Errorf("validate config: %w", err) - } - - c.Version = vu.Version - - // unmarshal data and enrich hook config - err = c.HookConfig.ConvertAndCheck(data) - if err != nil { - return fmt.Errorf("convert and check hook config: %w", err) - } - - // unmarshal data and enrich module hook config - err = c.ConvertAndCheck(data) - if err != nil { - return fmt.Errorf("convert and check: %w", err) - } - - return nil -} - -func remapHookConfigV1FromHookConfig(hcfg *sdkhook.HookConfig) *config.HookConfigV1 { - hcv1 := &config.HookConfigV1{ - ConfigVersion: hcfg.ConfigVersion, - } - - if len(hcfg.Schedule) > 0 { - hcv1.Schedule = make([]config.ScheduleConfigV1, 0, len(hcfg.Schedule)) - } - - if len(hcfg.Kubernetes) > 0 { - hcv1.OnKubernetesEvent = make([]config.OnKubernetesEventConfigV1, 0, len(hcfg.Kubernetes)) - } - - if hcfg.OnStartup != nil { - hcv1.OnStartup = float64(*hcfg.OnStartup) - } - - if hcfg.Settings != nil { - hcv1.Settings = &config.SettingsV1{ - ExecutionMinInterval: hcfg.Settings.ExecutionMinInterval.String(), - ExecutionBurst: strconv.Itoa(hcfg.Settings.ExecutionBurst), - } - } - - for _, sch := range hcfg.Schedule { - hcv1.Schedule = append(hcv1.Schedule, config.ScheduleConfigV1{ - Name: sch.Name, - Crontab: sch.Crontab, - }) - } - - for _, kube := range hcfg.Kubernetes { - newShCfg := config.OnKubernetesEventConfigV1{ - ApiVersion: kube.APIVersion, - Kind: kube.Kind, - Name: kube.Name, - LabelSelector: kube.LabelSelector, - JqFilter: kube.JqFilter, - ExecuteHookOnSynchronization: "true", - WaitForSynchronization: "true", - // permanently false - KeepFullObjectsInMemory: "false", - ResynchronizationPeriod: kube.ResynchronizationPeriod, - IncludeSnapshotsFrom: kube.IncludeSnapshotsFrom, - Queue: kube.Queue, - // TODO: make default constants public to use here - // like go hooks apply default - Group: "main", - } - - if kube.NameSelector != nil { - newShCfg.NameSelector = &config.KubeNameSelectorV1{ - MatchNames: kube.NameSelector.MatchNames, - } - } - - if kube.NamespaceSelector != nil { - newShCfg.Namespace = &config.KubeNamespaceSelectorV1{ - NameSelector: (*types.NameSelector)(kube.NamespaceSelector.NameSelector), - LabelSelector: kube.NamespaceSelector.LabelSelector, - } - } - - if kube.FieldSelector != nil { - fs := &config.KubeFieldSelectorV1{ - MatchExpressions: make([]types.FieldSelectorRequirement, 0, len(kube.FieldSelector.MatchExpressions)), - } - - for _, expr := range kube.FieldSelector.MatchExpressions { - fs.MatchExpressions = append(fs.MatchExpressions, types.FieldSelectorRequirement(expr)) - } - - newShCfg.FieldSelector = fs - } - - if kube.KeepFullObjectsInMemory != nil { - newShCfg.KeepFullObjectsInMemory = strconv.FormatBool(*kube.KeepFullObjectsInMemory) - } - - // *bool --> ExecuteHookOnEvents: [All events] || empty array or nothing - if kube.ExecuteHookOnEvents != nil && !*kube.ExecuteHookOnEvents { - newShCfg.ExecuteHookOnEvents = make([]types.WatchEventType, 0, 1) - } - - if kube.ExecuteHookOnSynchronization != nil { - newShCfg.ExecuteHookOnSynchronization = strconv.FormatBool(*kube.ExecuteHookOnSynchronization) - } - - if kube.WaitForSynchronization != nil { - newShCfg.WaitForSynchronization = strconv.FormatBool(*kube.WaitForSynchronization) - } - - if kube.KeepFullObjectsInMemory != nil { - newShCfg.KeepFullObjectsInMemory = strconv.FormatBool(*kube.KeepFullObjectsInMemory) - } - - if kube.AllowFailure != nil { - newShCfg.AllowFailure = *kube.AllowFailure - } - - hcv1.OnKubernetesEvent = append(hcv1.OnKubernetesEvent, newShCfg) - } - - return hcv1 -} - -func (c *ModuleHookConfig) LoadAndValidateBatchConfig(hcfg *sdkhook.HookConfig) error { - c.Version = hcfg.ConfigVersion - - hcv1 := remapHookConfigV1FromHookConfig(hcfg) - - c.HookConfig.V1 = hcv1 - err := hcv1.ConvertAndCheck(&c.HookConfig) - if err != nil { - return fmt.Errorf("convert and check from hook config v1: %w", err) - } - - if hcfg.OnStartup != nil { - c.OnStartup = &OnStartupConfig{} - c.OnStartup.AllowFailure = false - c.OnStartup.BindingName = string(OnStartup) - c.OnStartup.Order = float64(*hcfg.OnStartup) - } - - if hcfg.OnBeforeHelm != nil { - c.BeforeHelm = &BeforeHelmConfig{} - c.BeforeHelm.BindingName = string(BeforeHelm) - c.BeforeHelm.Order = float64(*hcfg.OnBeforeHelm) - } - - if hcfg.OnAfterHelm != nil { - c.AfterHelm = &AfterHelmConfig{} - c.AfterHelm.BindingName = string(AfterHelm) - c.AfterHelm.Order = float64(*hcfg.OnAfterHelm) - } - - if hcfg.OnAfterDeleteHelm != nil { - c.AfterDeleteHelm = &AfterDeleteHelmConfig{} - c.AfterDeleteHelm.BindingName = string(AfterDeleteHelm) - c.AfterDeleteHelm.Order = float64(*hcfg.OnAfterDeleteHelm) - } - - return nil -} - -func (c *ModuleHookConfig) LoadAndValidateGoConfig(input *gohook.HookConfig) error { - hookConfig, err := newHookConfigFromGoConfig(input) - if err != nil { - return err - } - - c.HookConfig = hookConfig - - if input.OnBeforeHelm != nil { - c.BeforeHelm = &BeforeHelmConfig{} - c.BeforeHelm.BindingName = string(BeforeHelm) - c.BeforeHelm.Order = input.OnBeforeHelm.Order - } - - if input.OnAfterHelm != nil { - c.AfterHelm = &AfterHelmConfig{} - c.AfterHelm.BindingName = string(AfterHelm) - c.AfterHelm.Order = input.OnAfterHelm.Order - } - - if input.OnAfterDeleteHelm != nil { - c.AfterDeleteHelm = &AfterDeleteHelmConfig{} - c.AfterDeleteHelm.BindingName = string(AfterDeleteHelm) - c.AfterDeleteHelm.Order = input.OnAfterDeleteHelm.Order - } - - return nil -} - -func (c *ModuleHookConfig) ConvertAndCheck(data []byte) error { - switch c.Version { - case "v0": - configV0 := &ModuleHookConfigV0{} - err := yaml.Unmarshal(data, configV0) - if err != nil { - return fmt.Errorf("unmarshal ModuleHookConfig version 0: %s", err) - } - c.ModuleV0 = configV0 - err = c.ConvertAndCheckV0() - if err != nil { - return err - } - case "v1": - configV1 := &ModuleHookConfigV0{} - err := yaml.Unmarshal(data, configV1) - if err != nil { - return fmt.Errorf("unmarshal ModuleHookConfig v1: %s", err) - } - c.ModuleV1 = configV1 - err = c.ConvertAndCheckV1() - if err != nil { - return err - } - default: - // NOTE: this should not happen - return fmt.Errorf("version '%s' is unsupported", c.Version) - } - - return nil -} - -func (c *ModuleHookConfig) ConvertAndCheckV0() (err error) { - c.BeforeHelm, err = c.ConvertBeforeHelm(c.ModuleV0.BeforeHelm) - if err != nil { - return err - } - c.AfterHelm, err = c.ConvertAfterHelm(c.ModuleV0.AfterHelm) - if err != nil { - return err - } - c.AfterDeleteHelm, err = c.ConvertAfterDeleteHelm(c.ModuleV0.AfterDeleteHelm) - if err != nil { - return err - } - - return nil -} - -func (c *ModuleHookConfig) ConvertAndCheckV1() (err error) { - c.BeforeHelm, err = c.ConvertBeforeHelm(c.ModuleV1.BeforeHelm) - if err != nil { - return err - } - c.AfterHelm, err = c.ConvertAfterHelm(c.ModuleV1.AfterHelm) - if err != nil { - return err - } - c.AfterDeleteHelm, err = c.ConvertAfterDeleteHelm(c.ModuleV1.AfterDeleteHelm) - if err != nil { - return err - } - - return nil -} - -func (c *ModuleHookConfig) ConvertBeforeHelm(value interface{}) (*BeforeHelmConfig, error) { - floatValue, err := config.ConvertFloatForBinding(value, "beforeHelm") - if err != nil || floatValue == nil { - return nil, err - } - - res := &BeforeHelmConfig{} - res.BindingName = string(BeforeHelm) - res.Order = *floatValue - return res, nil -} - -func (c *ModuleHookConfig) ConvertAfterHelm(value interface{}) (*AfterHelmConfig, error) { - floatValue, err := config.ConvertFloatForBinding(value, "afterHelm") - if err != nil || floatValue == nil { - return nil, err - } - - res := &AfterHelmConfig{} - res.BindingName = string(AfterHelm) - res.Order = *floatValue - return res, nil -} - -func (c *ModuleHookConfig) ConvertAfterDeleteHelm(value interface{}) (*AfterDeleteHelmConfig, error) { - floatValue, err := config.ConvertFloatForBinding(value, "afterDeleteHelm") - if err != nil || floatValue == nil { - return nil, err - } - - res := &AfterDeleteHelmConfig{} - res.BindingName = string(AfterDeleteHelm) - res.Order = *floatValue - return res, nil -} - func (c *ModuleHookConfig) Bindings() []BindingType { res := make([]BindingType, 0)