From 8e6054be7cbd62242ed0b50f0a099dbec3a13f97 Mon Sep 17 00:00:00 2001 From: sjcsjc123 <1401189096@qq.com> Date: Wed, 7 Feb 2024 22:00:24 +0800 Subject: [PATCH 1/5] feat: hgctl upgrade support from-helm flag --- pkg/cmd/hgctl/install.go | 2 +- pkg/cmd/hgctl/installer/installer.go | 4 ++-- pkg/cmd/hgctl/installer/installer_k8s.go | 5 ++++- pkg/cmd/hgctl/manifest.go | 2 +- pkg/cmd/hgctl/uninstall.go | 2 +- pkg/cmd/hgctl/upgrade.go | 14 +++++++++----- 6 files changed, 18 insertions(+), 11 deletions(-) diff --git a/pkg/cmd/hgctl/install.go b/pkg/cmd/hgctl/install.go index 8ee744d087..b42ce08ca7 100644 --- a/pkg/cmd/hgctl/install.go +++ b/pkg/cmd/hgctl/install.go @@ -196,7 +196,7 @@ func promptProfileName(writer io.Writer) string { } func installManifests(profile *helm.Profile, writer io.Writer, devel bool) error { - installer, err := installer.NewInstaller(profile, writer, false, devel, installer.InstallInstallerMode) + installer, err := installer.NewInstaller(profile, writer, false, devel, false, installer.InstallInstallerMode) if err != nil { return err } diff --git a/pkg/cmd/hgctl/installer/installer.go b/pkg/cmd/hgctl/installer/installer.go index 996df4d213..87e4f8c80c 100644 --- a/pkg/cmd/hgctl/installer/installer.go +++ b/pkg/cmd/hgctl/installer/installer.go @@ -51,14 +51,14 @@ type Installer interface { Upgrade() error } -func NewInstaller(profile *helm.Profile, writer io.Writer, quiet bool, devel bool, installerMode InstallerMode) (Installer, error) { +func NewInstaller(profile *helm.Profile, writer io.Writer, quiet bool, devel bool, fromHelm bool, installerMode InstallerMode) (Installer, error) { switch profile.Global.Install { case helm.InstallK8s, helm.InstallLocalK8s: cliClient, err := kubernetes.NewCLIClient(options.DefaultConfigFlags.ToRawKubeConfigLoader()) if err != nil { return nil, fmt.Errorf("failed to build kubernetes client: %w", err) } - installer, err := NewK8sInstaller(profile, cliClient, writer, quiet, devel, installerMode) + installer, err := NewK8sInstaller(profile, cliClient, writer, quiet, devel, fromHelm, installerMode) return installer, err case helm.InstallLocalDocker: installer, err := NewDockerInstaller(profile, writer, quiet) diff --git a/pkg/cmd/hgctl/installer/installer_k8s.go b/pkg/cmd/hgctl/installer/installer_k8s.go index 5966ef7b97..1fa9fe28ca 100644 --- a/pkg/cmd/hgctl/installer/installer_k8s.go +++ b/pkg/cmd/hgctl/installer/installer_k8s.go @@ -254,7 +254,7 @@ func (o *K8sInstaller) isNamespacedObject(obj *object.K8sObject) bool { return false } -func NewK8sInstaller(profile *helm.Profile, cli kubernetes.CLIClient, writer io.Writer, quiet bool, devel bool, installerMode InstallerMode) (*K8sInstaller, error) { +func NewK8sInstaller(profile *helm.Profile, cli kubernetes.CLIClient, writer io.Writer, quiet bool, devel bool, fromHelm bool, installerMode InstallerMode) (*K8sInstaller, error) { if profile == nil { return nil, errors.New("install profile is empty") } @@ -272,6 +272,9 @@ func NewK8sInstaller(profile *helm.Profile, cli kubernetes.CLIClient, writer io. // uninstall higressVersion = profile.HigressVersion } + if fromHelm { + higressVersion = helm.RepoLatestVersion + } components := make(map[ComponentName]Component) opts := []ComponentOption{ WithComponentNamespace(profile.Global.Namespace), diff --git a/pkg/cmd/hgctl/manifest.go b/pkg/cmd/hgctl/manifest.go index 307153eb6a..ccb4ac247d 100644 --- a/pkg/cmd/hgctl/manifest.go +++ b/pkg/cmd/hgctl/manifest.go @@ -129,7 +129,7 @@ func genManifests(profile *helm.Profile, writer io.Writer, devel bool) error { return fmt.Errorf("failed to build kubernetes client: %w", err) } - op, err := installer.NewK8sInstaller(profile, cliClient, writer, true, devel, installer.InstallInstallerMode) + op, err := installer.NewK8sInstaller(profile, cliClient, writer, true, devel, false, installer.InstallInstallerMode) if err != nil { return err } diff --git a/pkg/cmd/hgctl/uninstall.go b/pkg/cmd/hgctl/uninstall.go index ea1b6911bf..d55559755c 100644 --- a/pkg/cmd/hgctl/uninstall.go +++ b/pkg/cmd/hgctl/uninstall.go @@ -126,7 +126,7 @@ func promptUninstall(writer io.Writer) bool { } func uninstallManifests(profile *helm.Profile, writer io.Writer, uiArgs *uninstallArgs) error { - installer, err := installer.NewInstaller(profile, writer, false, false, installer.UninstallInstallerMode) + installer, err := installer.NewInstaller(profile, writer, false, false, false, installer.UninstallInstallerMode) if err != nil { return err } diff --git a/pkg/cmd/hgctl/upgrade.go b/pkg/cmd/hgctl/upgrade.go index 1a5df3ed73..0c712b332a 100644 --- a/pkg/cmd/hgctl/upgrade.go +++ b/pkg/cmd/hgctl/upgrade.go @@ -31,6 +31,8 @@ import ( type upgradeArgs struct { *InstallArgs + // FromHelm if set true, it will convert helm chart to higress profile + FromHelm bool } func addUpgradeFlags(cmd *cobra.Command, args *upgradeArgs) { @@ -38,12 +40,14 @@ func addUpgradeFlags(cmd *cobra.Command, args *upgradeArgs) { cmd.PersistentFlags().StringArrayVarP(&args.Set, "set", "s", nil, setFlagHelpStr) cmd.PersistentFlags().StringVarP(&args.ManifestsPath, "manifests", "d", "", manifestsFlagHelpStr) cmd.PersistentFlags().BoolVar(&args.Devel, "devel", false, "use development versions (alpha, beta, and release candidate releases), If version is set, this is ignored") + cmd.PersistentFlags().BoolVar(&args.FromHelm, "from-helm", false, "upgrade by read helm release") } // newUpgradeCmd upgrades Istio control plane in-place with eligibility checks. func newUpgradeCmd() *cobra.Command { upgradeArgs := &upgradeArgs{ InstallArgs: &InstallArgs{}, + FromHelm: false, } upgradeCmd := &cobra.Command{ Use: "upgrade", @@ -51,7 +55,7 @@ func newUpgradeCmd() *cobra.Command { Long: "The upgrade command is an alias for the install command" + " that performs additional upgrade-related checks.", RunE: func(cmd *cobra.Command, args []string) (e error) { - return upgrade(cmd.OutOrStdout(), upgradeArgs.InstallArgs) + return upgrade(cmd.OutOrStdout(), upgradeArgs) }, } addUpgradeFlags(upgradeCmd, upgradeArgs) @@ -61,7 +65,7 @@ func newUpgradeCmd() *cobra.Command { } // upgrade upgrade higress resources from the cluster. -func upgrade(writer io.Writer, iArgs *InstallArgs) error { +func upgrade(writer io.Writer, iArgs *upgradeArgs) error { setFlags := applyFlagAliases(iArgs.Set, iArgs.ManifestsPath) fmt.Fprintf(writer, "⌛️ Checking higress installed profiles...\n") profileContexts, _ := getAllProfiles() @@ -92,7 +96,7 @@ func upgrade(writer io.Writer, iArgs *InstallArgs) error { return nil } - err = upgradeManifests(profile, writer, iArgs.Devel) + err = upgradeManifests(profile, writer, iArgs.Devel, iArgs.FromHelm) if err != nil { return err } @@ -121,8 +125,8 @@ func promptUpgrade(writer io.Writer) bool { } } -func upgradeManifests(profile *helm.Profile, writer io.Writer, devel bool) error { - installer, err := installer.NewInstaller(profile, writer, false, devel, installer.UpgradeInstallerMode) +func upgradeManifests(profile *helm.Profile, writer io.Writer, devel bool, fromHelm bool) error { + installer, err := installer.NewInstaller(profile, writer, false, devel, fromHelm, installer.UpgradeInstallerMode) if err != nil { return err } From eaf8e37b52b4648476e5221d782175bc91339a9b Mon Sep 17 00:00:00 2001 From: sjcsjc123 <1401189096@qq.com> Date: Wed, 28 Feb 2024 12:59:11 +0800 Subject: [PATCH 2/5] save to remote Signed-off-by: sjcsjc123 <1401189096@qq.com> --- pkg/cmd/hgctl/installer/helm_agent.go | 70 ++++++++++++++++++++++-- pkg/cmd/hgctl/installer/installer.go | 4 +- pkg/cmd/hgctl/installer/installer_k8s.go | 30 +++++++--- pkg/cmd/hgctl/upgrade.go | 55 ++++++++++++------- 4 files changed, 126 insertions(+), 33 deletions(-) diff --git a/pkg/cmd/hgctl/installer/helm_agent.go b/pkg/cmd/hgctl/installer/helm_agent.go index 3d13eb49e1..5bbbe81f9f 100644 --- a/pkg/cmd/hgctl/installer/helm_agent.go +++ b/pkg/cmd/hgctl/installer/helm_agent.go @@ -19,6 +19,7 @@ import ( "fmt" "io" "os/exec" + "sigs.k8s.io/yaml" "strings" "github.com/alibaba/higress/pkg/cmd/hgctl/helm" @@ -51,7 +52,7 @@ func NewHelmAgent(profile *helm.Profile, writer io.Writer, quiet bool) *HelmAgen } } -func (h *HelmAgent) IsHigressInstalled() (bool, error) { +func (h *HelmAgent) GetHigressInformance() (bool, map[string]any, error) { args := []string{"list", "-n", h.profile.Global.Namespace, "-f", "higress"} if len(*options.DefaultConfigFlags.KubeConfig) > 0 { args = append(args, fmt.Sprintf("--kubeconfig=%s", *options.DefaultConfigFlags.KubeConfig)) @@ -69,7 +70,7 @@ func (h *HelmAgent) IsHigressInstalled() (bool, error) { cmd.Stderr = &stderr if err := cmd.Start(); err != nil { - return false, nil + return false, nil, nil } done := make(chan error, 1) @@ -84,10 +85,69 @@ func (h *HelmAgent) IsHigressInstalled() (bool, error) { if !h.quiet { fmt.Fprintf(h.writer, "\n%s\n", content) } - if strings.Contains(content, "deployed") { - return true, nil + split := strings.Split(content, "\n") + for i, line := range split { + if i == 0 { + continue + } + param := strings.Split(line, "\t") + if len(param) != 7 { + continue + } + // check chart contains higress + if strings.Contains(param[5], "higress") && strings.Contains(param[4], "deployed") { + releaseName := param[0] + valueFlag := h.getValueFlag(releaseName) + return true, valueFlag, nil + } } } } - return false, nil + return false, nil, nil +} + +func (h *HelmAgent) getValueFlag(releaseName string) map[string]any { + args := []string{"status", releaseName, "-n", h.profile.Global.Namespace, "-o", "yaml"} + if len(*options.DefaultConfigFlags.KubeConfig) > 0 { + args = append(args, fmt.Sprintf("--kubeconfig=%s", *options.DefaultConfigFlags.KubeConfig)) + } + if len(*options.DefaultConfigFlags.Context) > 0 { + args = append(args, fmt.Sprintf("--kube-context=%s", *options.DefaultConfigFlags.Context)) + } + if !h.quiet { + fmt.Fprintf(h.writer, "\n📦 Running command: %s %s\n\n", h.helmBinaryName, strings.Join(args, " ")) + } + cmd := exec.Command(h.helmBinaryName, args...) + var out bytes.Buffer + var stderr bytes.Buffer + cmd.Stdout = &out + cmd.Stderr = &stderr + + if err := cmd.Start(); err != nil { + return nil + } + + done := make(chan error, 1) + + go func() { + done <- cmd.Wait() + }() + + select { + case err := <-done: + if err == nil { + content := out.String() + statusMap := make(map[string]any) + err = yaml.Unmarshal([]byte(content), &statusMap) + if err != nil { + return nil + } + if config, ok := statusMap["config"]; ok { + if valueMap, ok := config.(map[string]any); ok { + return valueMap + } + } + } + } + return nil } diff --git a/pkg/cmd/hgctl/installer/installer.go b/pkg/cmd/hgctl/installer/installer.go index 87e4f8c80c..996df4d213 100644 --- a/pkg/cmd/hgctl/installer/installer.go +++ b/pkg/cmd/hgctl/installer/installer.go @@ -51,14 +51,14 @@ type Installer interface { Upgrade() error } -func NewInstaller(profile *helm.Profile, writer io.Writer, quiet bool, devel bool, fromHelm bool, installerMode InstallerMode) (Installer, error) { +func NewInstaller(profile *helm.Profile, writer io.Writer, quiet bool, devel bool, installerMode InstallerMode) (Installer, error) { switch profile.Global.Install { case helm.InstallK8s, helm.InstallLocalK8s: cliClient, err := kubernetes.NewCLIClient(options.DefaultConfigFlags.ToRawKubeConfigLoader()) if err != nil { return nil, fmt.Errorf("failed to build kubernetes client: %w", err) } - installer, err := NewK8sInstaller(profile, cliClient, writer, quiet, devel, fromHelm, installerMode) + installer, err := NewK8sInstaller(profile, cliClient, writer, quiet, devel, installerMode) return installer, err case helm.InstallLocalDocker: installer, err := NewDockerInstaller(profile, writer, quiet) diff --git a/pkg/cmd/hgctl/installer/installer_k8s.go b/pkg/cmd/hgctl/installer/installer_k8s.go index 1fa9fe28ca..d22345a93b 100644 --- a/pkg/cmd/hgctl/installer/installer_k8s.go +++ b/pkg/cmd/hgctl/installer/installer_k8s.go @@ -20,6 +20,7 @@ import ( "io" "os" "path/filepath" + "sigs.k8s.io/yaml" "strings" "github.com/alibaba/higress/pkg/cmd/hgctl/helm" @@ -34,6 +35,7 @@ type K8sInstaller struct { kubeCli kubernetes.CLIClient profile *helm.Profile writer io.Writer + upgrade bool profileStore ProfileStore } @@ -41,9 +43,25 @@ func (o *K8sInstaller) Install() error { // check if higress is installed by helm fmt.Fprintf(o.writer, "\n⌛️ Detecting higress installed by helm or not... \n\n") helmAgent := NewHelmAgent(o.profile, o.writer, false) - if helmInstalled, _ := helmAgent.IsHigressInstalled(); helmInstalled { - fmt.Fprintf(o.writer, "\n🧐 You have already installed higress by helm, please use \"helm upgrade\" to upgrade higress!\n") - return nil + if helmInstalled, valueMap, _ := helmAgent.GetHigressInformance(); helmInstalled { + if !o.upgrade { + fmt.Fprintf(o.writer, "\n🧐 You have already installed higress by helm, please use \"hgctl upgrade\" to upgrade higress!\n") + return nil + } + if o.profile.Values == nil { + o.profile.Values = valueMap + } else { + baseYaml := util.ToYAML(o.profile.Values) + overlayYaml := util.ToYAML(valueMap) + mergedYaml, err := util.OverlayYAML(baseYaml, overlayYaml) + if err != nil { + return err + } + err = yaml.Unmarshal([]byte(mergedYaml), &o.profile.Values) + if err != nil { + return err + } + } } if err := o.Run(); err != nil { @@ -107,6 +125,7 @@ func (o *K8sInstaller) UnInstall() error { } func (o *K8sInstaller) Upgrade() error { + o.upgrade = true return o.Install() } @@ -254,7 +273,7 @@ func (o *K8sInstaller) isNamespacedObject(obj *object.K8sObject) bool { return false } -func NewK8sInstaller(profile *helm.Profile, cli kubernetes.CLIClient, writer io.Writer, quiet bool, devel bool, fromHelm bool, installerMode InstallerMode) (*K8sInstaller, error) { +func NewK8sInstaller(profile *helm.Profile, cli kubernetes.CLIClient, writer io.Writer, quiet bool, devel bool, installerMode InstallerMode) (*K8sInstaller, error) { if profile == nil { return nil, errors.New("install profile is empty") } @@ -272,9 +291,6 @@ func NewK8sInstaller(profile *helm.Profile, cli kubernetes.CLIClient, writer io. // uninstall higressVersion = profile.HigressVersion } - if fromHelm { - higressVersion = helm.RepoLatestVersion - } components := make(map[ComponentName]Component) opts := []ComponentOption{ WithComponentNamespace(profile.Global.Namespace), diff --git a/pkg/cmd/hgctl/upgrade.go b/pkg/cmd/hgctl/upgrade.go index 0c712b332a..a6924c9b4a 100644 --- a/pkg/cmd/hgctl/upgrade.go +++ b/pkg/cmd/hgctl/upgrade.go @@ -67,27 +67,44 @@ func newUpgradeCmd() *cobra.Command { // upgrade upgrade higress resources from the cluster. func upgrade(writer io.Writer, iArgs *upgradeArgs) error { setFlags := applyFlagAliases(iArgs.Set, iArgs.ManifestsPath) - fmt.Fprintf(writer, "⌛️ Checking higress installed profiles...\n") - profileContexts, _ := getAllProfiles() - if len(profileContexts) == 0 { - fmt.Fprintf(writer, "\nHigress hasn't been installed yet!\n") - return nil - } - valuesOverlay, err := helm.GetValuesOverylayFromFiles(iArgs.InFilenames) - if err != nil { - return err - } + var profile *helm.Profile - profileContext := promptProfileContexts(writer, profileContexts) + if !iArgs.FromHelm { + fmt.Fprintf(writer, "⌛️ Checking higress installed profiles...\n") + profileContexts, _ := getAllProfiles() + if len(profileContexts) == 0 { + fmt.Fprintf(writer, "\nHigress hasn't been installed yet!\n") + return nil + } - _, profile, err := helm.GenProfileFromProfileContent(util.ToYAML(profileContext.Profile), valuesOverlay, setFlags) - if err != nil { - return err + valuesOverlay, err := helm.GetValuesOverylayFromFiles(iArgs.InFilenames) + if err != nil { + return err + } + + profileContext := promptProfileContexts(writer, profileContexts) + + _, profile, err = helm.GenProfileFromProfileContent(util.ToYAML(profileContext.Profile), valuesOverlay, setFlags) + if err != nil { + return err + } + + fmt.Fprintf(writer, "\n🧐 Validating Profile: \"%s\" \n", profileContext.PathOrName) + } else { + helmAgent := installer.NewHelmAgent(nil, writer, false) + installed, _, err := helmAgent.GetHigressInformance() + if err != nil { + return err + } + if !installed { + fmt.Fprintf(writer, "\nHigress hasn't been installed by helm yet!\n") + return nil + } + // TODO: convert helm values to higress profile } - fmt.Fprintf(writer, "\n🧐 Validating Profile: \"%s\" \n", profileContext.PathOrName) - err = profile.Validate() + err := profile.Validate() if err != nil { return err } @@ -96,7 +113,7 @@ func upgrade(writer io.Writer, iArgs *upgradeArgs) error { return nil } - err = upgradeManifests(profile, writer, iArgs.Devel, iArgs.FromHelm) + err = upgradeManifests(profile, writer, iArgs.Devel) if err != nil { return err } @@ -125,8 +142,8 @@ func promptUpgrade(writer io.Writer) bool { } } -func upgradeManifests(profile *helm.Profile, writer io.Writer, devel bool, fromHelm bool) error { - installer, err := installer.NewInstaller(profile, writer, false, devel, fromHelm, installer.UpgradeInstallerMode) +func upgradeManifests(profile *helm.Profile, writer io.Writer, devel bool) error { + installer, err := installer.NewInstaller(profile, writer, false, devel, installer.UpgradeInstallerMode) if err != nil { return err } From 87b2f7010f37b26ca72349a9eea6c9271de5413c Mon Sep 17 00:00:00 2001 From: sjcsjc123 <1401189096@qq.com> Date: Wed, 28 Feb 2024 13:00:11 +0800 Subject: [PATCH 3/5] save to remote Signed-off-by: sjcsjc123 <1401189096@qq.com> --- pkg/cmd/hgctl/install.go | 2 +- pkg/cmd/hgctl/uninstall.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cmd/hgctl/install.go b/pkg/cmd/hgctl/install.go index b42ce08ca7..8ee744d087 100644 --- a/pkg/cmd/hgctl/install.go +++ b/pkg/cmd/hgctl/install.go @@ -196,7 +196,7 @@ func promptProfileName(writer io.Writer) string { } func installManifests(profile *helm.Profile, writer io.Writer, devel bool) error { - installer, err := installer.NewInstaller(profile, writer, false, devel, false, installer.InstallInstallerMode) + installer, err := installer.NewInstaller(profile, writer, false, devel, installer.InstallInstallerMode) if err != nil { return err } diff --git a/pkg/cmd/hgctl/uninstall.go b/pkg/cmd/hgctl/uninstall.go index d55559755c..ea1b6911bf 100644 --- a/pkg/cmd/hgctl/uninstall.go +++ b/pkg/cmd/hgctl/uninstall.go @@ -126,7 +126,7 @@ func promptUninstall(writer io.Writer) bool { } func uninstallManifests(profile *helm.Profile, writer io.Writer, uiArgs *uninstallArgs) error { - installer, err := installer.NewInstaller(profile, writer, false, false, false, installer.UninstallInstallerMode) + installer, err := installer.NewInstaller(profile, writer, false, false, installer.UninstallInstallerMode) if err != nil { return err } From bcb9d4ada9f782250a6e9401f9cbf34a98a89a48 Mon Sep 17 00:00:00 2001 From: sjcsjc123 <1401189096@qq.com> Date: Wed, 28 Feb 2024 13:06:10 +0800 Subject: [PATCH 4/5] opt imports Signed-off-by: sjcsjc123 <1401189096@qq.com> --- pkg/cmd/hgctl/installer/installer_k8s.go | 2 +- pkg/cmd/hgctl/manifest.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/cmd/hgctl/installer/installer_k8s.go b/pkg/cmd/hgctl/installer/installer_k8s.go index d22345a93b..27a4d16993 100644 --- a/pkg/cmd/hgctl/installer/installer_k8s.go +++ b/pkg/cmd/hgctl/installer/installer_k8s.go @@ -20,13 +20,13 @@ import ( "io" "os" "path/filepath" - "sigs.k8s.io/yaml" "strings" "github.com/alibaba/higress/pkg/cmd/hgctl/helm" "github.com/alibaba/higress/pkg/cmd/hgctl/helm/object" "github.com/alibaba/higress/pkg/cmd/hgctl/kubernetes" "github.com/alibaba/higress/pkg/cmd/hgctl/util" + "sigs.k8s.io/yaml" ) type K8sInstaller struct { diff --git a/pkg/cmd/hgctl/manifest.go b/pkg/cmd/hgctl/manifest.go index ccb4ac247d..307153eb6a 100644 --- a/pkg/cmd/hgctl/manifest.go +++ b/pkg/cmd/hgctl/manifest.go @@ -129,7 +129,7 @@ func genManifests(profile *helm.Profile, writer io.Writer, devel bool) error { return fmt.Errorf("failed to build kubernetes client: %w", err) } - op, err := installer.NewK8sInstaller(profile, cliClient, writer, true, devel, false, installer.InstallInstallerMode) + op, err := installer.NewK8sInstaller(profile, cliClient, writer, true, devel, installer.InstallInstallerMode) if err != nil { return err } From e1cc05b0692a51daa56a1d565b366e6345bd05f9 Mon Sep 17 00:00:00 2001 From: sjcsjc123 <1401189096@qq.com> Date: Wed, 28 Feb 2024 13:06:45 +0800 Subject: [PATCH 5/5] opt imports Signed-off-by: sjcsjc123 <1401189096@qq.com> --- pkg/cmd/hgctl/installer/helm_agent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/cmd/hgctl/installer/helm_agent.go b/pkg/cmd/hgctl/installer/helm_agent.go index 5bbbe81f9f..4737cfe2bc 100644 --- a/pkg/cmd/hgctl/installer/helm_agent.go +++ b/pkg/cmd/hgctl/installer/helm_agent.go @@ -19,11 +19,11 @@ import ( "fmt" "io" "os/exec" - "sigs.k8s.io/yaml" "strings" "github.com/alibaba/higress/pkg/cmd/hgctl/helm" "github.com/alibaba/higress/pkg/cmd/options" + "sigs.k8s.io/yaml" ) type HelmRelease struct {