From 0fdd5079018ae1eae14a991fef2475d1ac62a2c8 Mon Sep 17 00:00:00 2001 From: Dmitry Denisenko Date: Fri, 24 Jan 2025 10:39:23 +0300 Subject: [PATCH 01/23] add option module to platform Signed-off-by: Dmitry Denisenko --- .../platform/cmd/module/disable/disable.go | 54 +++++++++ internal/platform/cmd/module/enable/enable.go | 54 +++++++++ internal/platform/cmd/module/flags/flags.go | 29 +++++ internal/platform/cmd/module/list/list.go | 52 ++++++++ internal/platform/cmd/module/module.go | 53 ++++++++ .../cmd/module/operatemodule/optionsmodule.go | 113 ++++++++++++++++++ .../cmd/module/operatemodule/switchmodule.go | 79 ++++++++++++ .../cmd/module/snapshots/snapshots.go | 54 +++++++++ .../platform/cmd/module/v1alpha1/v1alpha1.go | 30 +++++ internal/platform/cmd/module/values/values.go | 53 ++++++++ internal/platform/cmd/platform.go | 10 +- 11 files changed, 576 insertions(+), 5 deletions(-) create mode 100644 internal/platform/cmd/module/disable/disable.go create mode 100644 internal/platform/cmd/module/enable/enable.go create mode 100644 internal/platform/cmd/module/flags/flags.go create mode 100644 internal/platform/cmd/module/list/list.go create mode 100644 internal/platform/cmd/module/module.go create mode 100644 internal/platform/cmd/module/operatemodule/optionsmodule.go create mode 100644 internal/platform/cmd/module/operatemodule/switchmodule.go create mode 100644 internal/platform/cmd/module/snapshots/snapshots.go create mode 100644 internal/platform/cmd/module/v1alpha1/v1alpha1.go create mode 100644 internal/platform/cmd/module/values/values.go diff --git a/internal/platform/cmd/module/disable/disable.go b/internal/platform/cmd/module/disable/disable.go new file mode 100644 index 00000000..9c549395 --- /dev/null +++ b/internal/platform/cmd/module/disable/disable.go @@ -0,0 +1,54 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package disable + +import ( + "fmt" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" + "github.com/spf13/cobra" + "k8s.io/kubectl/pkg/util/templates" +) + +var disableLong = templates.LongDesc(` +Disable module in the ModuleConfig resource. + +© Flant JSC 2025`) + +func NewCommand() *cobra.Command { + disableCmd := &cobra.Command{ + Use: "disable", + Short: "Disable module.", + Long: disableLong, + ValidArgs: []string{"module_name"}, + SilenceErrors: true, + SilenceUsage: true, + RunE: disableModule, + } + flags.AddFlags(disableCmd.Flags()) + return disableCmd +} + +func disableModule(cmd *cobra.Command, moduleName []string) error { + err := operatemodule.OperateModule(cmd, moduleName[0], false) + if err != nil { + return fmt.Errorf("Error disable module: %w", err) + } + fmt.Printf("Module %s disabled\n", moduleName[0]) + return err +} diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go new file mode 100644 index 00000000..3bdf8bda --- /dev/null +++ b/internal/platform/cmd/module/enable/enable.go @@ -0,0 +1,54 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package enable + +import ( + "fmt" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" + "github.com/spf13/cobra" + "k8s.io/kubectl/pkg/util/templates" +) + +var enableLong = templates.LongDesc(` +Enable module in the ModuleConfig resource. + +© Flant JSC 2025`) + +func NewCommand() *cobra.Command { + enableCmd := &cobra.Command{ + Use: "enable", + Short: "Enable module.", + Long: enableLong, + ValidArgs: []string{"module_name"}, + SilenceErrors: true, + SilenceUsage: true, + RunE: enableModule, + } + flags.AddFlags(enableCmd.Flags()) + return enableCmd +} + +func enableModule(cmd *cobra.Command, moduleName []string) error { + err := operatemodule.OperateModule(cmd, moduleName[0], true) + if err != nil { + return fmt.Errorf("Error enable module: %w", err) + } + fmt.Printf("Module %s enabled\n", moduleName[0]) + return err +} diff --git a/internal/platform/cmd/module/flags/flags.go b/internal/platform/cmd/module/flags/flags.go new file mode 100644 index 00000000..95930678 --- /dev/null +++ b/internal/platform/cmd/module/flags/flags.go @@ -0,0 +1,29 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package flags + +import ( + "github.com/spf13/pflag" +) + +func AddFlags(flagSet *pflag.FlagSet) { + flagSet.StringP( + "editor", "e", + "vi", + "Your favourite editor.", + ) +} diff --git a/internal/platform/cmd/module/list/list.go b/internal/platform/cmd/module/list/list.go new file mode 100644 index 00000000..57a48ea8 --- /dev/null +++ b/internal/platform/cmd/module/list/list.go @@ -0,0 +1,52 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package list + +import ( + "fmt" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" + "github.com/spf13/cobra" + "k8s.io/kubectl/pkg/util/templates" +) + +var listLong = templates.LongDesc(` +List enabled modules in DKP. + +© Flant JSC 2025`) + +func NewCommand() *cobra.Command { + listCmd := &cobra.Command{ + Use: "list", + Short: "List enabled modules.", + Long: listLong, + SilenceErrors: true, + SilenceUsage: true, + RunE: listModule, + } + flags.AddFlags(listCmd.Flags()) + return listCmd +} + +func listModule(cmd *cobra.Command, args []string) error { + err := operatemodule.OptionsModule(cmd, "list.yaml") + if err != nil { + return fmt.Errorf("Error list modules: %w", err) + } + return err +} diff --git a/internal/platform/cmd/module/module.go b/internal/platform/cmd/module/module.go new file mode 100644 index 00000000..c024311b --- /dev/null +++ b/internal/platform/cmd/module/module.go @@ -0,0 +1,53 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package module + +import ( + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/enable" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/list" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/snapshots" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/values" + "github.com/spf13/cobra" + "k8s.io/kubectl/pkg/util/templates" + + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/disable" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/flags" +) + +var moduleLong = templates.LongDesc(` +Module options for Deckhouse Kubernetes Platform. + +© Flant JSC 2025`) + +func NewCommand() *cobra.Command { + moduleCmd := &cobra.Command{ + Use: "module", Short: "Module options DKP", + Long: moduleLong, + } + + moduleCmd.AddCommand( + enable.NewCommand(), + disable.NewCommand(), + list.NewCommand(), + values.NewCommand(), + snapshots.NewCommand(), + ) + + flags.AddFlags(moduleCmd.Flags()) + + return moduleCmd +} diff --git a/internal/platform/cmd/module/operatemodule/optionsmodule.go b/internal/platform/cmd/module/operatemodule/optionsmodule.go new file mode 100644 index 00000000..b77cdfa5 --- /dev/null +++ b/internal/platform/cmd/module/operatemodule/optionsmodule.go @@ -0,0 +1,113 @@ +package operatemodule + +import ( + "bytes" + "context" + "fmt" + "github.com/deckhouse/deckhouse-cli/internal/utilk8s" + "github.com/spf13/cobra" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/remotecommand" +) + +func OptionsModule(cmd *cobra.Command, pathFromOption string) error { + + kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + config, kubeCl, err := utilk8s.SetupK8sClientSet(kubeconfigPath) + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + const ( + apiProtocol = "http" + apiEndpoint = "127.0.0.1" + apiPort = "9652" + modulePath = "module" + labelSelector = "leader=true" + namespace = "d8-system" + containerName = "deckhouse" + ) + + fullEndpointUrl := fmt.Sprintf("%s://%s:%s/%s/%s", apiProtocol, apiEndpoint, apiPort, modulePath, pathFromOption) + getApi := []string{"curl", fullEndpointUrl} + podName, err := getDeckhousePod(kubeCl, namespace, labelSelector, containerName) + executor, err := execInPod(config, kubeCl, getApi, podName, namespace, containerName) + + var stdout bytes.Buffer + var stderr bytes.Buffer + if err = executor.StreamWithContext( + context.Background(), + remotecommand.StreamOptions{ + Stdout: &stdout, + Stderr: &stderr, + }); err != nil { + return err + } + + fmt.Printf("%s\n", stdout.String()) + return err +} + +func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelector string, containerName string) (string, error) { + pods, err := kubeCl.CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{ + LabelSelector: labelSelector, + }) + if err != nil { + return "", fmt.Errorf("Error listing pods: %w", err) + } + + if len(pods.Items) == 0 { + return "", fmt.Errorf("No pods found with the label:", labelSelector) + } + + pod := pods.Items[0] + podName := pod.Name + var containerFound bool + for _, c := range pod.Spec.Containers { + if c.Name == containerName { + containerFound = true + break + } + } + if !containerFound { + return "", fmt.Errorf("Container %q not found in pod %q", containerName, podName) + } + return podName, nil +} + +func execInPod(config *rest.Config, kubeCl *kubernetes.Clientset, getApi []string, podName string, namespace string, containerName string) (remotecommand.Executor, error) { + scheme := runtime.NewScheme() + parameterCodec := runtime.NewParameterCodec(scheme) + if err := v1.AddToScheme(scheme); err != nil { + return nil, fmt.Errorf("Failed to create parameter codec: %w", err) + } + + req := kubeCl.CoreV1().RESTClient(). + Post(). + Resource("pods"). + Name(podName). + Namespace(namespace). + SubResource("exec"). + VersionedParams(&v1.PodExecOptions{ + Command: getApi, + Container: containerName, + Stdin: false, + Stdout: true, + Stderr: true, + TTY: false, + }, parameterCodec) + + executor, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL()) + if err != nil { + return nil, fmt.Errorf("Creating SPDY executor for Pod %s: %v", podName, err) + } + return executor, nil +} diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go new file mode 100644 index 00000000..da1dcba1 --- /dev/null +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -0,0 +1,79 @@ +package operatemodule + +import ( + "context" + "fmt" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/v1alpha1" + "github.com/deckhouse/deckhouse-cli/internal/utilk8s" + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/dynamic" + "k8s.io/utils/ptr" +) + +func OperateModule(cmd *cobra.Command, name string, enabled bool) error { + kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + config, _, err := utilk8s.SetupK8sClientSet(kubeconfigPath) + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + return fmt.Errorf("Failed to create dynamic client: %v", err) + } + + resourceClient := dynamicClient.Resource( + schema.GroupVersionResource{ + Group: "deckhouse.io", + Version: "v1alpha1", + Resource: "moduleconfigs", + }, + ) + + customResource, err := resourceClient.Get(context.TODO(), name, metav1.GetOptions{}) + if err != nil { + return fmt.Errorf("Error get options module '%s': %w", name, err) + } + if customResource != nil { + if err = unstructured.SetNestedField(customResource.Object, enabled, "spec", "enabled"); err != nil { + return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", enabled, name, err) + } + if _, err = resourceClient.Update(context.TODO(), customResource, metav1.UpdateOptions{}); err != nil { + return fmt.Errorf("failed to update the '%s' module config: %w", name, err) + } + return nil + } + + obj, err := createModuleConfig(name, enabled) + if err != nil { + return fmt.Errorf("failed to convert the '%s' module config: %w", name, err) + } + if _, err = resourceClient.Create(context.TODO(), obj, metav1.CreateOptions{}); err != nil { + return fmt.Errorf("failed to create the '%s' module config: %w", name, err) + } + return err +} + +func createModuleConfig(name string, enabled bool) (*unstructured.Unstructured, error) { + newCfg := &v1alpha1.ModuleConfigMeta{ + TypeMeta: metav1.TypeMeta{ + Kind: "ModuleConfig", + APIVersion: "deckhouse.io/v1alpha1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1alpha1.ModuleConfigSpec{ + Enabled: ptr.To(enabled), + }, + } + content, err := runtime.DefaultUnstructuredConverter.ToUnstructured(newCfg) + return &unstructured.Unstructured{Object: content}, err +} diff --git a/internal/platform/cmd/module/snapshots/snapshots.go b/internal/platform/cmd/module/snapshots/snapshots.go new file mode 100644 index 00000000..169c81ea --- /dev/null +++ b/internal/platform/cmd/module/snapshots/snapshots.go @@ -0,0 +1,54 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package snapshots + +import ( + "fmt" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" + "github.com/spf13/cobra" + "k8s.io/kubectl/pkg/util/templates" +) + +var snapshotsLong = templates.LongDesc(` +Dump module snapshots by name for hooks in DKP. + +© Flant JSC 2025`) + +func NewCommand() *cobra.Command { + snapshotsCmd := &cobra.Command{ + Use: "snapshots", + Short: "Dump shapshots.", + Long: snapshotsLong, + ValidArgs: []string{"module_name"}, + SilenceErrors: true, + SilenceUsage: true, + RunE: snapshotsModule, + } + flags.AddFlags(snapshotsCmd.Flags()) + return snapshotsCmd +} + +func snapshotsModule(cmd *cobra.Command, moduleName []string) error { + pathFromOption := fmt.Sprintf("%s/snapshots.yaml", moduleName[0]) + err := operatemodule.OptionsModule(cmd, pathFromOption) + if err != nil { + return fmt.Errorf("Error snapshot module: %w", err) + } + return err +} diff --git a/internal/platform/cmd/module/v1alpha1/v1alpha1.go b/internal/platform/cmd/module/v1alpha1/v1alpha1.go new file mode 100644 index 00000000..cc3ecf29 --- /dev/null +++ b/internal/platform/cmd/module/v1alpha1/v1alpha1.go @@ -0,0 +1,30 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +type ModuleConfigMeta struct { + metav1.TypeMeta `json:",inline"` + // Standard object's metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitempty"` + Spec ModuleConfigSpec `json:"spec"` + Status ModuleConfigStatus `json:"status,omitempty"` +} + +type ModuleConfigSpec struct { + Version int `json:"version,omitempty"` + Settings SettingsValues `json:"settings,omitempty"` + Enabled *bool `json:"enabled,omitempty"` + UpdatePolicy string `json:"updatePolicy,omitempty"` + Source string `json:"source,omitempty"` +} + +type ModuleConfigStatus struct { + Version string `json:"version"` + Message string `json:"message"` +} + +type SettingsValues map[string]interface{} diff --git a/internal/platform/cmd/module/values/values.go b/internal/platform/cmd/module/values/values.go new file mode 100644 index 00000000..0759135d --- /dev/null +++ b/internal/platform/cmd/module/values/values.go @@ -0,0 +1,53 @@ +/* +Copyright 2024 Flant JSC + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package values + +import ( + "fmt" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + "github.com/spf13/cobra" + "k8s.io/kubectl/pkg/util/templates" +) + +var valuesLong = templates.LongDesc(` +Dump module values by name in DKP. + +© Flant JSC 2025`) + +func NewCommand() *cobra.Command { + valuesCmd := &cobra.Command{ + Use: "values", + Short: "Dump values", + Long: valuesLong, + ValidArgs: []string{"module_name"}, + SilenceErrors: true, + SilenceUsage: true, + RunE: valuesModule, + } + flags.AddFlags(valuesCmd.Flags()) + return valuesCmd +} + +func valuesModule(cmd *cobra.Command, moduleName []string) error { + pathFromOption := fmt.Sprintf("%s/values.yaml", moduleName[0]) + err := operatemodule.OptionsModule(cmd, pathFromOption) + if err != nil { + return fmt.Errorf("Error print values: %w", err) + } + return err +} diff --git a/internal/platform/cmd/platform.go b/internal/platform/cmd/platform.go index 9706e44e..64caf63c 100644 --- a/internal/platform/cmd/platform.go +++ b/internal/platform/cmd/platform.go @@ -21,25 +21,25 @@ import ( "k8s.io/kubectl/pkg/util/templates" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit" + "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module" "github.com/deckhouse/deckhouse-cli/internal/platform/flags" ) var platformLong = templates.LongDesc(` -Operate the Deckhouse Kubernetes Platform. +Change configuration files in Kubernetes cluster conveniently and safely. -© Flant JSC 2025`) +© Flant JSC 2024`) func NewCommand() *cobra.Command { platformCmd := &cobra.Command{ - Use: "platform ", - Short: "Operate the Deckhouse Kubernetes Platform", - Aliases: []string{"p"}, + Use: "platform", Short: "Edit configuration files", Long: platformLong, PreRunE: flags.ValidateParameters, } platformCmd.AddCommand( edit.NewCommand(), + module.NewCommand(), ) flags.AddPersistentFlags(platformCmd) From eb4823565cc6837e399cb329c157328cd2fb9376 Mon Sep 17 00:00:00 2001 From: Dmitry Denisenko Date: Fri, 24 Jan 2025 10:52:42 +0300 Subject: [PATCH 02/23] adds in go.mod Signed-off-by: Dmitry Denisenko --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index ccb2b0e6..9ee7fea5 100644 --- a/go.mod +++ b/go.mod @@ -36,6 +36,7 @@ require ( k8s.io/component-base v0.29.3 k8s.io/klog/v2 v2.120.1 k8s.io/kubectl v0.29.3 + k8s.io/utils v0.0.0-20240310230437-4693a0247e57 sigs.k8s.io/yaml v1.4.0 ) @@ -562,7 +563,6 @@ require ( k8s.io/klog v1.0.0 // indirect k8s.io/kube-openapi v0.0.0-20240105020646-a37d4de58910 // indirect k8s.io/metrics v0.29.3 // indirect - k8s.io/utils v0.0.0-20240310230437-4693a0247e57 // indirect kubevirt.io/api v1.2.0 // indirect kubevirt.io/containerized-data-importer-api v1.57.0-alpha1 // indirect kubevirt.io/controller-lifecycle-operator-sdk/api v0.0.0-20220329064328-f3cc58c6ed90 // indirect From 8a3988a6700fbd6f6156fb4febb6834f5ff3bbfe Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Fri, 24 Jan 2025 12:06:18 +0400 Subject: [PATCH 03/23] ++ --- internal/platform/cmd/module/operatemodule/optionsmodule.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/operatemodule/optionsmodule.go b/internal/platform/cmd/module/operatemodule/optionsmodule.go index b77cdfa5..62fd6814 100644 --- a/internal/platform/cmd/module/operatemodule/optionsmodule.go +++ b/internal/platform/cmd/module/operatemodule/optionsmodule.go @@ -65,7 +65,7 @@ func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelect } if len(pods.Items) == 0 { - return "", fmt.Errorf("No pods found with the label:", labelSelector) + return "", fmt.Errorf("No pods found with the label: %w", labelSelector) } pod := pods.Items[0] From c2072dce2332517a1980ccfce7c8b6290edcdf83 Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Fri, 24 Jan 2025 12:18:21 +0400 Subject: [PATCH 04/23] ++ --- internal/platform/cmd/module/operatemodule/optionsmodule.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/operatemodule/optionsmodule.go b/internal/platform/cmd/module/operatemodule/optionsmodule.go index 62fd6814..ae56df14 100644 --- a/internal/platform/cmd/module/operatemodule/optionsmodule.go +++ b/internal/platform/cmd/module/operatemodule/optionsmodule.go @@ -65,7 +65,7 @@ func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelect } if len(pods.Items) == 0 { - return "", fmt.Errorf("No pods found with the label: %w", labelSelector) + return "", fmt.Errorf("No pods found with the label: %s", labelSelector) } pod := pods.Items[0] From b26668aa3dbf1b94e9b4064f1219cb0b5884e92f Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Fri, 24 Jan 2025 12:31:15 +0400 Subject: [PATCH 05/23] ++ --- internal/platform/cmd/module/disable/disable.go | 2 +- internal/platform/cmd/module/enable/enable.go | 2 +- internal/platform/cmd/module/flags/flags.go | 2 +- internal/platform/cmd/module/list/list.go | 2 +- internal/platform/cmd/module/module.go | 2 +- internal/platform/cmd/module/snapshots/snapshots.go | 2 +- internal/platform/cmd/module/values/values.go | 2 +- internal/platform/cmd/platform.go | 10 ++++++---- 8 files changed, 13 insertions(+), 11 deletions(-) diff --git a/internal/platform/cmd/module/disable/disable.go b/internal/platform/cmd/module/disable/disable.go index 9c549395..89ae2b89 100644 --- a/internal/platform/cmd/module/disable/disable.go +++ b/internal/platform/cmd/module/disable/disable.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index 3bdf8bda..8389a932 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/platform/cmd/module/flags/flags.go b/internal/platform/cmd/module/flags/flags.go index 95930678..6c65c8f7 100644 --- a/internal/platform/cmd/module/flags/flags.go +++ b/internal/platform/cmd/module/flags/flags.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/platform/cmd/module/list/list.go b/internal/platform/cmd/module/list/list.go index 57a48ea8..d423f8c3 100644 --- a/internal/platform/cmd/module/list/list.go +++ b/internal/platform/cmd/module/list/list.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/platform/cmd/module/module.go b/internal/platform/cmd/module/module.go index c024311b..e36e0490 100644 --- a/internal/platform/cmd/module/module.go +++ b/internal/platform/cmd/module/module.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/platform/cmd/module/snapshots/snapshots.go b/internal/platform/cmd/module/snapshots/snapshots.go index 169c81ea..a190ba71 100644 --- a/internal/platform/cmd/module/snapshots/snapshots.go +++ b/internal/platform/cmd/module/snapshots/snapshots.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/platform/cmd/module/values/values.go b/internal/platform/cmd/module/values/values.go index 0759135d..2d897c62 100644 --- a/internal/platform/cmd/module/values/values.go +++ b/internal/platform/cmd/module/values/values.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/internal/platform/cmd/platform.go b/internal/platform/cmd/platform.go index 64caf63c..57410eb5 100644 --- a/internal/platform/cmd/platform.go +++ b/internal/platform/cmd/platform.go @@ -1,5 +1,5 @@ /* -Copyright 2024 Flant JSC +Copyright 2025 Flant JSC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,13 +26,15 @@ import ( ) var platformLong = templates.LongDesc(` -Change configuration files in Kubernetes cluster conveniently and safely. +Operate platform options in DKP. -© Flant JSC 2024`) +© Flant JSC 2025`) func NewCommand() *cobra.Command { platformCmd := &cobra.Command{ - Use: "platform", Short: "Edit configuration files", + Use: "platform ", + Short: "Operate platform options.", + Aliases: []string{"p"}, Long: platformLong, PreRunE: flags.ValidateParameters, } From 317ca3fa63f01f10fb1b8f542add6a41b7e55410 Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 16:48:42 +0400 Subject: [PATCH 06/23] Update internal/platform/cmd/module/operatemodule/optionsmodule.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/operatemodule/optionsmodule.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/platform/cmd/module/operatemodule/optionsmodule.go b/internal/platform/cmd/module/operatemodule/optionsmodule.go index ae56df14..a0d67d95 100644 --- a/internal/platform/cmd/module/operatemodule/optionsmodule.go +++ b/internal/platform/cmd/module/operatemodule/optionsmodule.go @@ -31,6 +31,7 @@ func OptionsModule(cmd *cobra.Command, pathFromOption string) error { apiEndpoint = "127.0.0.1" apiPort = "9652" modulePath = "module" + labelSelector = "leader=true" namespace = "d8-system" containerName = "deckhouse" From a507be7c24f9af9a1f3e4e151d89feeb68616402 Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:05:59 +0400 Subject: [PATCH 07/23] Update internal/platform/cmd/module/values/values.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/values/values.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/values/values.go b/internal/platform/cmd/module/values/values.go index 2d897c62..7754dc50 100644 --- a/internal/platform/cmd/module/values/values.go +++ b/internal/platform/cmd/module/values/values.go @@ -25,7 +25,7 @@ import ( ) var valuesLong = templates.LongDesc(` -Dump module values by name in DKP. +Dump module hooks values. © Flant JSC 2025`) From 8e192a9a3ac2eb9977cb9f02f7dfb594ea56038b Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:06:09 +0400 Subject: [PATCH 08/23] Update internal/platform/cmd/module/snapshots/snapshots.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/snapshots/snapshots.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/snapshots/snapshots.go b/internal/platform/cmd/module/snapshots/snapshots.go index a190ba71..58648c82 100644 --- a/internal/platform/cmd/module/snapshots/snapshots.go +++ b/internal/platform/cmd/module/snapshots/snapshots.go @@ -26,7 +26,7 @@ import ( ) var snapshotsLong = templates.LongDesc(` -Dump module snapshots by name for hooks in DKP. +Dump module hooks snapshots. © Flant JSC 2025`) From 4edc7ee78918392515a3683a59ffc8ac38f9024e Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:07:36 +0400 Subject: [PATCH 09/23] Update internal/platform/cmd/module/enable/enable.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/enable/enable.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index 8389a932..3348e72d 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -26,7 +26,7 @@ import ( ) var enableLong = templates.LongDesc(` -Enable module in the ModuleConfig resource. +Enable module using the ModuleConfig resource. © Flant JSC 2025`) From 76d0d923d826fb8076b0021eaab096127619f3f7 Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:07:53 +0400 Subject: [PATCH 10/23] Update internal/platform/cmd/module/disable/disable.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/disable/disable.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/disable/disable.go b/internal/platform/cmd/module/disable/disable.go index 89ae2b89..f1296264 100644 --- a/internal/platform/cmd/module/disable/disable.go +++ b/internal/platform/cmd/module/disable/disable.go @@ -26,7 +26,7 @@ import ( ) var disableLong = templates.LongDesc(` -Disable module in the ModuleConfig resource. +Disable module using the ModuleConfig resource. © Flant JSC 2025`) From 51461a09b53a2085ec64e96a69218570a2a4da7f Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:08:00 +0400 Subject: [PATCH 11/23] Update internal/platform/cmd/module/list/list.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/list/list.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/list/list.go b/internal/platform/cmd/module/list/list.go index d423f8c3..ca64d0f6 100644 --- a/internal/platform/cmd/module/list/list.go +++ b/internal/platform/cmd/module/list/list.go @@ -26,7 +26,7 @@ import ( ) var listLong = templates.LongDesc(` -List enabled modules in DKP. +List enabled Deckhouse Kubernetes Platform modules. © Flant JSC 2025`) From f2b82eff41d3fdaf840d9edffa3e8a5bdaaa3ff0 Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:08:14 +0400 Subject: [PATCH 12/23] Update internal/platform/cmd/module/module.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/module.go b/internal/platform/cmd/module/module.go index e36e0490..0b0b4a89 100644 --- a/internal/platform/cmd/module/module.go +++ b/internal/platform/cmd/module/module.go @@ -35,7 +35,7 @@ Module options for Deckhouse Kubernetes Platform. func NewCommand() *cobra.Command { moduleCmd := &cobra.Command{ - Use: "module", Short: "Module options DKP", + Use: "module", Short: "Operate the Deckhouse Kubernetes Platform modules", Long: moduleLong, } From 2c370623235d3d862c9e8401a5e1f0ee133b348f Mon Sep 17 00:00:00 2001 From: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> Date: Tue, 28 Jan 2025 17:08:28 +0400 Subject: [PATCH 13/23] Update internal/platform/cmd/module/module.go Co-authored-by: Maxim Vasilenko <5184586+mvasl@users.noreply.github.com> Signed-off-by: Denisenko Dmitry <54986280+d2285@users.noreply.github.com> --- internal/platform/cmd/module/module.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/module.go b/internal/platform/cmd/module/module.go index 0b0b4a89..db287dc0 100644 --- a/internal/platform/cmd/module/module.go +++ b/internal/platform/cmd/module/module.go @@ -29,7 +29,7 @@ import ( ) var moduleLong = templates.LongDesc(` -Module options for Deckhouse Kubernetes Platform. +Operate the Deckhouse Kubernetes Platform modules. © Flant JSC 2025`) From 72692409d9ba4103a125b7a206676601504688dc Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Tue, 28 Jan 2025 17:42:08 +0400 Subject: [PATCH 14/23] ++ --- .../platform/cmd/module/disable/disable.go | 12 ++++++++- internal/platform/cmd/module/enable/enable.go | 12 ++++++++- internal/platform/cmd/module/list/list.go | 13 +++++++++- .../cmd/module/operatemodule/optionsmodule.go | 25 +++++-------------- .../cmd/module/operatemodule/switchmodule.go | 14 ++--------- .../cmd/module/snapshots/snapshots.go | 12 ++++++++- internal/platform/cmd/module/values/values.go | 15 +++++++++-- 7 files changed, 66 insertions(+), 37 deletions(-) diff --git a/internal/platform/cmd/module/disable/disable.go b/internal/platform/cmd/module/disable/disable.go index f1296264..bd40f709 100644 --- a/internal/platform/cmd/module/disable/disable.go +++ b/internal/platform/cmd/module/disable/disable.go @@ -19,6 +19,7 @@ package disable import ( "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + "github.com/deckhouse/deckhouse-cli/internal/utilk8s" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" "github.com/spf13/cobra" @@ -45,7 +46,16 @@ func NewCommand() *cobra.Command { } func disableModule(cmd *cobra.Command, moduleName []string) error { - err := operatemodule.OperateModule(cmd, moduleName[0], false) + kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + config, _, err := utilk8s.SetupK8sClientSet(kubeconfigPath) + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + err = operatemodule.OperateModule(config, moduleName[0], false) if err != nil { return fmt.Errorf("Error disable module: %w", err) } diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index 3348e72d..c6ee7f30 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -19,6 +19,7 @@ package enable import ( "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + "github.com/deckhouse/deckhouse-cli/internal/utilk8s" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" "github.com/spf13/cobra" @@ -45,7 +46,16 @@ func NewCommand() *cobra.Command { } func enableModule(cmd *cobra.Command, moduleName []string) error { - err := operatemodule.OperateModule(cmd, moduleName[0], true) + kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + config, _, err := utilk8s.SetupK8sClientSet(kubeconfigPath) + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + err = operatemodule.OperateModule(config, moduleName[0], true) if err != nil { return fmt.Errorf("Error enable module: %w", err) } diff --git a/internal/platform/cmd/module/list/list.go b/internal/platform/cmd/module/list/list.go index ca64d0f6..30908aea 100644 --- a/internal/platform/cmd/module/list/list.go +++ b/internal/platform/cmd/module/list/list.go @@ -19,6 +19,7 @@ package list import ( "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + "github.com/deckhouse/deckhouse-cli/internal/utilk8s" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" "github.com/spf13/cobra" @@ -44,7 +45,17 @@ func NewCommand() *cobra.Command { } func listModule(cmd *cobra.Command, args []string) error { - err := operatemodule.OptionsModule(cmd, "list.yaml") + kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + config, kubeCl, err := utilk8s.SetupK8sClientSet(kubeconfigPath) + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + err = operatemodule.OptionsModule(config, kubeCl, "list.yaml") if err != nil { return fmt.Errorf("Error list modules: %w", err) } diff --git a/internal/platform/cmd/module/operatemodule/optionsmodule.go b/internal/platform/cmd/module/operatemodule/optionsmodule.go index a0d67d95..135b4c34 100644 --- a/internal/platform/cmd/module/operatemodule/optionsmodule.go +++ b/internal/platform/cmd/module/operatemodule/optionsmodule.go @@ -4,8 +4,6 @@ import ( "bytes" "context" "fmt" - "github.com/deckhouse/deckhouse-cli/internal/utilk8s" - "github.com/spf13/cobra" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -14,24 +12,13 @@ import ( "k8s.io/client-go/tools/remotecommand" ) -func OptionsModule(cmd *cobra.Command, pathFromOption string) error { - - kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") - if err != nil { - return fmt.Errorf("Failed to setup Kubernetes client: %w", err) - } - - config, kubeCl, err := utilk8s.SetupK8sClientSet(kubeconfigPath) - if err != nil { - return fmt.Errorf("Failed to setup Kubernetes client: %w", err) - } - +func OptionsModule(config *rest.Config, kubeCl *kubernetes.Clientset, pathFromOption string) error { const ( - apiProtocol = "http" - apiEndpoint = "127.0.0.1" - apiPort = "9652" - modulePath = "module" - + apiProtocol = "http" + apiEndpoint = "127.0.0.1" + apiPort = "9652" + modulePath = "module" + labelSelector = "leader=true" namespace = "d8-system" containerName = "deckhouse" diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go index da1dcba1..02d8786c 100644 --- a/internal/platform/cmd/module/operatemodule/switchmodule.go +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -4,26 +4,16 @@ import ( "context" "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/v1alpha1" - "github.com/deckhouse/deckhouse-cli/internal/utilk8s" - "github.com/spf13/cobra" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" "k8s.io/utils/ptr" ) -func OperateModule(cmd *cobra.Command, name string, enabled bool) error { - kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") - if err != nil { - return fmt.Errorf("Failed to setup Kubernetes client: %w", err) - } - - config, _, err := utilk8s.SetupK8sClientSet(kubeconfigPath) - if err != nil { - return fmt.Errorf("Failed to setup Kubernetes client: %w", err) - } +func OperateModule(config *rest.Config, name string, enabled bool) error { dynamicClient, err := dynamic.NewForConfig(config) if err != nil { return fmt.Errorf("Failed to create dynamic client: %v", err) diff --git a/internal/platform/cmd/module/snapshots/snapshots.go b/internal/platform/cmd/module/snapshots/snapshots.go index 58648c82..03b4057a 100644 --- a/internal/platform/cmd/module/snapshots/snapshots.go +++ b/internal/platform/cmd/module/snapshots/snapshots.go @@ -19,6 +19,7 @@ package snapshots import ( "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + "github.com/deckhouse/deckhouse-cli/internal/utilk8s" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" "github.com/spf13/cobra" @@ -45,8 +46,17 @@ func NewCommand() *cobra.Command { } func snapshotsModule(cmd *cobra.Command, moduleName []string) error { + kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + config, kubeCl, err := utilk8s.SetupK8sClientSet(kubeconfigPath) + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } pathFromOption := fmt.Sprintf("%s/snapshots.yaml", moduleName[0]) - err := operatemodule.OptionsModule(cmd, pathFromOption) + err = operatemodule.OptionsModule(config, kubeCl, pathFromOption) if err != nil { return fmt.Errorf("Error snapshot module: %w", err) } diff --git a/internal/platform/cmd/module/values/values.go b/internal/platform/cmd/module/values/values.go index 7754dc50..daf9a870 100644 --- a/internal/platform/cmd/module/values/values.go +++ b/internal/platform/cmd/module/values/values.go @@ -20,6 +20,7 @@ import ( "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" + "github.com/deckhouse/deckhouse-cli/internal/utilk8s" "github.com/spf13/cobra" "k8s.io/kubectl/pkg/util/templates" ) @@ -32,7 +33,7 @@ Dump module hooks values. func NewCommand() *cobra.Command { valuesCmd := &cobra.Command{ Use: "values", - Short: "Dump values", + Short: "Dump values.", Long: valuesLong, ValidArgs: []string{"module_name"}, SilenceErrors: true, @@ -44,8 +45,18 @@ func NewCommand() *cobra.Command { } func valuesModule(cmd *cobra.Command, moduleName []string) error { + kubeconfigPath, err := cmd.Flags().GetString("kubeconfig") + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + + config, kubeCl, err := utilk8s.SetupK8sClientSet(kubeconfigPath) + if err != nil { + return fmt.Errorf("Failed to setup Kubernetes client: %w", err) + } + pathFromOption := fmt.Sprintf("%s/values.yaml", moduleName[0]) - err := operatemodule.OptionsModule(cmd, pathFromOption) + err = operatemodule.OptionsModule(config, kubeCl, pathFromOption) if err != nil { return fmt.Errorf("Error print values: %w", err) } From 81a72715aa9bb84af9f61108b45c050e21371f9b Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Tue, 28 Jan 2025 17:43:28 +0400 Subject: [PATCH 15/23] ++ --- .../cmd/module/operatemodule/optionsmodule.go | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/internal/platform/cmd/module/operatemodule/optionsmodule.go b/internal/platform/cmd/module/operatemodule/optionsmodule.go index 135b4c34..9354b1fa 100644 --- a/internal/platform/cmd/module/operatemodule/optionsmodule.go +++ b/internal/platform/cmd/module/operatemodule/optionsmodule.go @@ -26,7 +26,7 @@ func OptionsModule(config *rest.Config, kubeCl *kubernetes.Clientset, pathFromOp fullEndpointUrl := fmt.Sprintf("%s://%s:%s/%s/%s", apiProtocol, apiEndpoint, apiPort, modulePath, pathFromOption) getApi := []string{"curl", fullEndpointUrl} - podName, err := getDeckhousePod(kubeCl, namespace, labelSelector, containerName) + podName, err := getDeckhousePod(kubeCl, namespace, labelSelector) executor, err := execInPod(config, kubeCl, getApi, podName, namespace, containerName) var stdout bytes.Buffer @@ -44,7 +44,7 @@ func OptionsModule(config *rest.Config, kubeCl *kubernetes.Clientset, pathFromOp return err } -func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelector string, containerName string) (string, error) { +func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelector string) (string, error) { pods, err := kubeCl.CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{ LabelSelector: labelSelector, }) @@ -58,16 +58,6 @@ func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelect pod := pods.Items[0] podName := pod.Name - var containerFound bool - for _, c := range pod.Spec.Containers { - if c.Name == containerName { - containerFound = true - break - } - } - if !containerFound { - return "", fmt.Errorf("Container %q not found in pod %q", containerName, podName) - } return podName, nil } From c6767c815649783a9aa15fa63259dabc4ddeaa60 Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Tue, 28 Jan 2025 18:26:45 +0400 Subject: [PATCH 16/23] ++ --- .../cmd/edit/editconfig/editconfig.go | 3 +-- .../cmd/module/operatemodule/switchmodule.go | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/internal/platform/cmd/edit/editconfig/editconfig.go b/internal/platform/cmd/edit/editconfig/editconfig.go index 29a20f2f..914b7f86 100644 --- a/internal/platform/cmd/edit/editconfig/editconfig.go +++ b/internal/platform/cmd/edit/editconfig/editconfig.go @@ -69,8 +69,7 @@ func BaseEditConfigCMD(cmd *cobra.Command, name, secret, dataKey string) error { encodedValue, err := encodeSecretTmp(updatedContent, dataKey) _, err = kubeCl.CoreV1(). - Secrets("kube-system"). - Patch(context.TODO(), secret, types.MergePatchType, encodedValue, metav1.PatchOptions{}) + Secrets("kube-system").Patch(context.TODO(), secret, types.MergePatchType, encodedValue, metav1.PatchOptions{}) if err != nil { return fmt.Errorf("Error updating secret: %w", err) } diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go index 02d8786c..42e7306a 100644 --- a/internal/platform/cmd/module/operatemodule/switchmodule.go +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -2,12 +2,14 @@ package operatemodule import ( "context" + "encoding/json" "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/v1alpha1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/dynamic" "k8s.io/client-go/rest" "k8s.io/utils/ptr" @@ -31,11 +33,12 @@ func OperateModule(config *rest.Config, name string, enabled bool) error { if err != nil { return fmt.Errorf("Error get options module '%s': %w", name, err) } + patchSpec, err := patchSpec(enabled) if customResource != nil { if err = unstructured.SetNestedField(customResource.Object, enabled, "spec", "enabled"); err != nil { return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", enabled, name, err) } - if _, err = resourceClient.Update(context.TODO(), customResource, metav1.UpdateOptions{}); err != nil { + if _, err = resourceClient.Patch(context.TODO(), name, types.MergePatchType, patchSpec, metav1.PatchOptions{}); err != nil { return fmt.Errorf("failed to update the '%s' module config: %w", name, err) } return nil @@ -67,3 +70,18 @@ func createModuleConfig(name string, enabled bool) (*unstructured.Unstructured, content, err := runtime.DefaultUnstructuredConverter.ToUnstructured(newCfg) return &unstructured.Unstructured{Object: content}, err } + +func patchSpec(enabled bool) ([]byte, error) { + patchData := map[string]interface{}{ + "spec": map[string]interface{}{ + "enabled": enabled, + }, + } + + patchBytes, err := json.Marshal(patchData) + if err != nil { + return nil, fmt.Errorf("Error convert to json updated data: %w", err) + } + + return patchBytes, nil +} From b24166e762984a00f67ef30d42a99180594b437f Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Tue, 28 Jan 2025 18:34:24 +0400 Subject: [PATCH 17/23] ++ --- internal/platform/cmd/module/operatemodule/switchmodule.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go index 42e7306a..928e0ef6 100644 --- a/internal/platform/cmd/module/operatemodule/switchmodule.go +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -31,7 +31,7 @@ func OperateModule(config *rest.Config, name string, enabled bool) error { customResource, err := resourceClient.Get(context.TODO(), name, metav1.GetOptions{}) if err != nil { - return fmt.Errorf("Error get options module '%s': %w", name, err) + //fmt.Errorf("Error get options module '%s': %w", name, err) } patchSpec, err := patchSpec(enabled) if customResource != nil { From 174bb36dad4ccd218fa79f8cc9dde2561b6101f5 Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Tue, 28 Jan 2025 19:42:12 +0400 Subject: [PATCH 18/23] ++ --- internal/platform/cmd/module/enable/enable.go | 1 + .../cmd/module/operatemodule/switchmodule.go | 25 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index c6ee7f30..76b09d0c 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -55,6 +55,7 @@ func enableModule(cmd *cobra.Command, moduleName []string) error { if err != nil { return fmt.Errorf("Failed to setup Kubernetes client: %w", err) } + err = operatemodule.OperateModule(config, moduleName[0], true) if err != nil { return fmt.Errorf("Error enable module: %w", err) diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go index 928e0ef6..24f876a5 100644 --- a/internal/platform/cmd/module/operatemodule/switchmodule.go +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -15,7 +15,14 @@ import ( "k8s.io/utils/ptr" ) -func OperateModule(config *rest.Config, name string, enabled bool) error { +type ModuleState bool + +const ( + ModuleEnabled ModuleState = true + ModuleDisabled ModuleState = false +) + +func OperateModule(config *rest.Config, name string, moduleState ModuleState) error { dynamicClient, err := dynamic.NewForConfig(config) if err != nil { return fmt.Errorf("Failed to create dynamic client: %v", err) @@ -33,10 +40,10 @@ func OperateModule(config *rest.Config, name string, enabled bool) error { if err != nil { //fmt.Errorf("Error get options module '%s': %w", name, err) } - patchSpec, err := patchSpec(enabled) + patchSpec, err := patchSpec(moduleState) if customResource != nil { - if err = unstructured.SetNestedField(customResource.Object, enabled, "spec", "enabled"); err != nil { - return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", enabled, name, err) + if err = unstructured.SetNestedField(customResource.Object, moduleState, "spec", "enabled"); err != nil { + return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", moduleState, name, err) } if _, err = resourceClient.Patch(context.TODO(), name, types.MergePatchType, patchSpec, metav1.PatchOptions{}); err != nil { return fmt.Errorf("failed to update the '%s' module config: %w", name, err) @@ -44,7 +51,7 @@ func OperateModule(config *rest.Config, name string, enabled bool) error { return nil } - obj, err := createModuleConfig(name, enabled) + obj, err := createModuleConfig(name, moduleState) if err != nil { return fmt.Errorf("failed to convert the '%s' module config: %w", name, err) } @@ -54,7 +61,7 @@ func OperateModule(config *rest.Config, name string, enabled bool) error { return err } -func createModuleConfig(name string, enabled bool) (*unstructured.Unstructured, error) { +func createModuleConfig(name string, moduleState ModuleState) (*unstructured.Unstructured, error) { newCfg := &v1alpha1.ModuleConfigMeta{ TypeMeta: metav1.TypeMeta{ Kind: "ModuleConfig", @@ -64,17 +71,17 @@ func createModuleConfig(name string, enabled bool) (*unstructured.Unstructured, Name: name, }, Spec: v1alpha1.ModuleConfigSpec{ - Enabled: ptr.To(enabled), + Enabled: (*bool)(ptr.To(moduleState)), }, } content, err := runtime.DefaultUnstructuredConverter.ToUnstructured(newCfg) return &unstructured.Unstructured{Object: content}, err } -func patchSpec(enabled bool) ([]byte, error) { +func patchSpec(moduleState ModuleState) ([]byte, error) { patchData := map[string]interface{}{ "spec": map[string]interface{}{ - "enabled": enabled, + "enabled": moduleState, }, } From 4daf9753498f6001646e9b508698a3de0f7eb107 Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Tue, 28 Jan 2025 19:53:22 +0400 Subject: [PATCH 19/23] ++ --- internal/platform/cmd/module/disable/disable.go | 2 +- internal/platform/cmd/module/enable/enable.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/platform/cmd/module/disable/disable.go b/internal/platform/cmd/module/disable/disable.go index bd40f709..01e65652 100644 --- a/internal/platform/cmd/module/disable/disable.go +++ b/internal/platform/cmd/module/disable/disable.go @@ -55,7 +55,7 @@ func disableModule(cmd *cobra.Command, moduleName []string) error { if err != nil { return fmt.Errorf("Failed to setup Kubernetes client: %w", err) } - err = operatemodule.OperateModule(config, moduleName[0], false) + err = operatemodule.OperateModule(config, moduleName[0], operatemodule.ModuleDisabled) if err != nil { return fmt.Errorf("Error disable module: %w", err) } diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index 76b09d0c..019709fa 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -56,7 +56,7 @@ func enableModule(cmd *cobra.Command, moduleName []string) error { return fmt.Errorf("Failed to setup Kubernetes client: %w", err) } - err = operatemodule.OperateModule(config, moduleName[0], true) + err = operatemodule.OperateModule(config, moduleName[0], operatemodule.ModuleEnabled) if err != nil { return fmt.Errorf("Error enable module: %w", err) } From 616f396434560d5370517fb009119b077b2082ab Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Tue, 28 Jan 2025 20:03:35 +0400 Subject: [PATCH 20/23] ++ --- internal/platform/cmd/module/enable/enable.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index 019709fa..76b09d0c 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -56,7 +56,7 @@ func enableModule(cmd *cobra.Command, moduleName []string) error { return fmt.Errorf("Failed to setup Kubernetes client: %w", err) } - err = operatemodule.OperateModule(config, moduleName[0], operatemodule.ModuleEnabled) + err = operatemodule.OperateModule(config, moduleName[0], true) if err != nil { return fmt.Errorf("Error enable module: %w", err) } From dbd0583489fff66f0b87b15fbfefb2f104b4fe7f Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Wed, 29 Jan 2025 12:41:03 +0400 Subject: [PATCH 21/23] ++ --- internal/platform/cmd/module/enable/enable.go | 2 +- .../platform/cmd/module/operatemodule/switchmodule.go | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index 76b09d0c..019709fa 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -56,7 +56,7 @@ func enableModule(cmd *cobra.Command, moduleName []string) error { return fmt.Errorf("Failed to setup Kubernetes client: %w", err) } - err = operatemodule.OperateModule(config, moduleName[0], true) + err = operatemodule.OperateModule(config, moduleName[0], operatemodule.ModuleEnabled) if err != nil { return fmt.Errorf("Error enable module: %w", err) } diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go index 24f876a5..3b4018df 100644 --- a/internal/platform/cmd/module/operatemodule/switchmodule.go +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -15,11 +15,11 @@ import ( "k8s.io/utils/ptr" ) -type ModuleState bool +type ModuleState string const ( - ModuleEnabled ModuleState = true - ModuleDisabled ModuleState = false + ModuleEnabled ModuleState = "enabled" + ModuleDisabled ModuleState = "disabled" ) func OperateModule(config *rest.Config, name string, moduleState ModuleState) error { @@ -42,7 +42,7 @@ func OperateModule(config *rest.Config, name string, moduleState ModuleState) er } patchSpec, err := patchSpec(moduleState) if customResource != nil { - if err = unstructured.SetNestedField(customResource.Object, moduleState, "spec", "enabled"); err != nil { + if err = unstructured.SetNestedField(customResource.Object, moduleState == ModuleEnabled, "spec", "enabled"); err != nil { return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", moduleState, name, err) } if _, err = resourceClient.Patch(context.TODO(), name, types.MergePatchType, patchSpec, metav1.PatchOptions{}); err != nil { @@ -71,7 +71,7 @@ func createModuleConfig(name string, moduleState ModuleState) (*unstructured.Uns Name: name, }, Spec: v1alpha1.ModuleConfigSpec{ - Enabled: (*bool)(ptr.To(moduleState)), + Enabled: ptr.To(moduleState == ModuleEnabled), }, } content, err := runtime.DefaultUnstructuredConverter.ToUnstructured(newCfg) From 87eb42e3dd9303e37488b1bf7af229d72e17b1c7 Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Wed, 29 Jan 2025 12:50:58 +0400 Subject: [PATCH 22/23] ++ --- .../platform/cmd/module/operatemodule/switchmodule.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go index 3b4018df..7e9703ab 100644 --- a/internal/platform/cmd/module/operatemodule/switchmodule.go +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -42,9 +42,9 @@ func OperateModule(config *rest.Config, name string, moduleState ModuleState) er } patchSpec, err := patchSpec(moduleState) if customResource != nil { - if err = unstructured.SetNestedField(customResource.Object, moduleState == ModuleEnabled, "spec", "enabled"); err != nil { - return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", moduleState, name, err) - } + //if err = unstructured.SetNestedField(customResource.Object, moduleState == ModuleEnabled, "spec", "enabled"); err != nil { + // return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", moduleState, name, err) + //} if _, err = resourceClient.Patch(context.TODO(), name, types.MergePatchType, patchSpec, metav1.PatchOptions{}); err != nil { return fmt.Errorf("failed to update the '%s' module config: %w", name, err) } @@ -81,7 +81,7 @@ func createModuleConfig(name string, moduleState ModuleState) (*unstructured.Uns func patchSpec(moduleState ModuleState) ([]byte, error) { patchData := map[string]interface{}{ "spec": map[string]interface{}{ - "enabled": moduleState, + "enabled": moduleState == ModuleEnabled, }, } From 5f5766d5b7f6f7467338e473770e9dabe51a20a7 Mon Sep 17 00:00:00 2001 From: "dmitry.denisenko" Date: Wed, 29 Jan 2025 13:49:06 +0400 Subject: [PATCH 23/23] ++ --- .../platform/cmd/module/disable/disable.go | 7 ++- internal/platform/cmd/module/enable/enable.go | 7 ++- .../cmd/module/operatemodule/optionsmodule.go | 6 +- .../cmd/module/operatemodule/switchmodule.go | 20 ++---- .../module/operatemodule/switchmodule_test.go | 62 +++++++++++++++++++ 5 files changed, 83 insertions(+), 19 deletions(-) create mode 100644 internal/platform/cmd/module/operatemodule/switchmodule_test.go diff --git a/internal/platform/cmd/module/disable/disable.go b/internal/platform/cmd/module/disable/disable.go index 01e65652..6a55c04e 100644 --- a/internal/platform/cmd/module/disable/disable.go +++ b/internal/platform/cmd/module/disable/disable.go @@ -20,6 +20,7 @@ import ( "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" "github.com/deckhouse/deckhouse-cli/internal/utilk8s" + "k8s.io/client-go/dynamic" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" "github.com/spf13/cobra" @@ -55,7 +56,11 @@ func disableModule(cmd *cobra.Command, moduleName []string) error { if err != nil { return fmt.Errorf("Failed to setup Kubernetes client: %w", err) } - err = operatemodule.OperateModule(config, moduleName[0], operatemodule.ModuleDisabled) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + return fmt.Errorf("Failed to create dynamic client: %v", err) + } + err = operatemodule.OperateModule(dynamicClient, moduleName[0], operatemodule.ModuleDisabled) if err != nil { return fmt.Errorf("Error disable module: %w", err) } diff --git a/internal/platform/cmd/module/enable/enable.go b/internal/platform/cmd/module/enable/enable.go index 019709fa..fd786d91 100644 --- a/internal/platform/cmd/module/enable/enable.go +++ b/internal/platform/cmd/module/enable/enable.go @@ -20,6 +20,7 @@ import ( "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/operatemodule" "github.com/deckhouse/deckhouse-cli/internal/utilk8s" + "k8s.io/client-go/dynamic" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/edit/flags" "github.com/spf13/cobra" @@ -56,7 +57,11 @@ func enableModule(cmd *cobra.Command, moduleName []string) error { return fmt.Errorf("Failed to setup Kubernetes client: %w", err) } - err = operatemodule.OperateModule(config, moduleName[0], operatemodule.ModuleEnabled) + dynamicClient, err := dynamic.NewForConfig(config) + if err != nil { + return fmt.Errorf("Failed to create dynamic client: %v", err) + } + err = operatemodule.OperateModule(dynamicClient, moduleName[0], operatemodule.ModuleEnabled) if err != nil { return fmt.Errorf("Error enable module: %w", err) } diff --git a/internal/platform/cmd/module/operatemodule/optionsmodule.go b/internal/platform/cmd/module/operatemodule/optionsmodule.go index 9354b1fa..d298347b 100644 --- a/internal/platform/cmd/module/operatemodule/optionsmodule.go +++ b/internal/platform/cmd/module/operatemodule/optionsmodule.go @@ -12,7 +12,7 @@ import ( "k8s.io/client-go/tools/remotecommand" ) -func OptionsModule(config *rest.Config, kubeCl *kubernetes.Clientset, pathFromOption string) error { +func OptionsModule(config *rest.Config, kubeCl kubernetes.Interface, pathFromOption string) error { const ( apiProtocol = "http" apiEndpoint = "127.0.0.1" @@ -44,7 +44,7 @@ func OptionsModule(config *rest.Config, kubeCl *kubernetes.Clientset, pathFromOp return err } -func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelector string) (string, error) { +func getDeckhousePod(kubeCl kubernetes.Interface, namespace string, labelSelector string) (string, error) { pods, err := kubeCl.CoreV1().Pods(namespace).List(context.Background(), metav1.ListOptions{ LabelSelector: labelSelector, }) @@ -61,7 +61,7 @@ func getDeckhousePod(kubeCl *kubernetes.Clientset, namespace string, labelSelect return podName, nil } -func execInPod(config *rest.Config, kubeCl *kubernetes.Clientset, getApi []string, podName string, namespace string, containerName string) (remotecommand.Executor, error) { +func execInPod(config *rest.Config, kubeCl kubernetes.Interface, getApi []string, podName string, namespace string, containerName string) (remotecommand.Executor, error) { scheme := runtime.NewScheme() parameterCodec := runtime.NewParameterCodec(scheme) if err := v1.AddToScheme(scheme); err != nil { diff --git a/internal/platform/cmd/module/operatemodule/switchmodule.go b/internal/platform/cmd/module/operatemodule/switchmodule.go index 7e9703ab..8b649e0a 100644 --- a/internal/platform/cmd/module/operatemodule/switchmodule.go +++ b/internal/platform/cmd/module/operatemodule/switchmodule.go @@ -5,13 +5,13 @@ import ( "encoding/json" "fmt" "github.com/deckhouse/deckhouse-cli/internal/platform/cmd/module/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/dynamic" - "k8s.io/client-go/rest" "k8s.io/utils/ptr" ) @@ -22,12 +22,7 @@ const ( ModuleDisabled ModuleState = "disabled" ) -func OperateModule(config *rest.Config, name string, moduleState ModuleState) error { - dynamicClient, err := dynamic.NewForConfig(config) - if err != nil { - return fmt.Errorf("Failed to create dynamic client: %v", err) - } - +func OperateModule(dynamicClient dynamic.Interface, name string, moduleState ModuleState) error { resourceClient := dynamicClient.Resource( schema.GroupVersionResource{ Group: "deckhouse.io", @@ -37,15 +32,12 @@ func OperateModule(config *rest.Config, name string, moduleState ModuleState) er ) customResource, err := resourceClient.Get(context.TODO(), name, metav1.GetOptions{}) - if err != nil { - //fmt.Errorf("Error get options module '%s': %w", name, err) + if err != nil && !errors.IsNotFound(err) { + return err } - patchSpec, err := patchSpec(moduleState) + enabledSpec, err := patchSpec(moduleState) if customResource != nil { - //if err = unstructured.SetNestedField(customResource.Object, moduleState == ModuleEnabled, "spec", "enabled"); err != nil { - // return fmt.Errorf("failed to change spec.enabled to %v in the '%s' module config: %w", moduleState, name, err) - //} - if _, err = resourceClient.Patch(context.TODO(), name, types.MergePatchType, patchSpec, metav1.PatchOptions{}); err != nil { + if _, err = resourceClient.Patch(context.TODO(), name, types.MergePatchType, enabledSpec, metav1.PatchOptions{}); err != nil { return fmt.Errorf("failed to update the '%s' module config: %w", name, err) } return nil diff --git a/internal/platform/cmd/module/operatemodule/switchmodule_test.go b/internal/platform/cmd/module/operatemodule/switchmodule_test.go new file mode 100644 index 00000000..32652252 --- /dev/null +++ b/internal/platform/cmd/module/operatemodule/switchmodule_test.go @@ -0,0 +1,62 @@ +package operatemodule + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/dynamic/fake" + + "testing" +) + +func TestOperateModule(t *testing.T) { + type args struct { + dynamicClient dynamic.Interface + name string + moduleState ModuleState + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "check enabled test", + args: args{ + dynamicClient: fake.NewSimpleDynamicClient(runtime.NewScheme(), &unstructured.Unstructured{Object: map[string]interface{}{ + "apiVersion": "deckhouse.io/v1alpha1", + "kind": "ModuleConfig", + "metadata": map[string]any{"name": "stronghold", "namespace": ""}, + "spec": map[string]interface{}{ + "enabled": false, + }, + }}), + name: "stronghold", + moduleState: ModuleEnabled, + }, + }, + { + name: "check not exist module", + wantErr: false, + args: args{ + dynamicClient: fake.NewSimpleDynamicClient(runtime.NewScheme(), &unstructured.Unstructured{Object: map[string]interface{}{ + "apiVersion": "deckhouse.io/v1alpha1", + "kind": "ModuleConfig", + "metadata": map[string]any{"name": "deckhouse", "namespace": ""}, + "spec": map[string]interface{}{ + "enabled": false, + }, + }}), + name: "stronghold", + moduleState: ModuleEnabled, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := OperateModule(tt.args.dynamicClient, tt.args.name, tt.args.moduleState); (err != nil) != tt.wantErr { + t.Errorf("OperateModule() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +}