diff --git a/pkg/cmd/hgctl/install.go b/pkg/cmd/hgctl/install.go index 58f492254..aeab9346e 100644 --- a/pkg/cmd/hgctl/install.go +++ b/pkg/cmd/hgctl/install.go @@ -120,14 +120,16 @@ func Install(writer io.Writer, iArgs *InstallArgs) error { setFlags = append(setFlags, fmt.Sprintf("profile=%s", psf)) } + if !promptInstall(writer, psf) { + return nil + } + _, profile, profileName, err := helm.GenerateConfig(iArgs.InFilenames, setFlags) if err != nil { return fmt.Errorf("generate config: %v", err) } - fmt.Fprintf(writer, "start to install higress on profile:%s ......\n", profileName) - - fmt.Fprintf(writer, "start to validate profile:%s ......\n", profileName) + fmt.Fprintf(writer, "🧐 Validating Profile: \"%s\" \n", profileName) err = profile.Validate() if err != nil { return err @@ -140,6 +142,22 @@ func Install(writer io.Writer, iArgs *InstallArgs) error { return nil } +func promptInstall(writer io.Writer, profileName string) bool { + answer := "" + for { + fmt.Fprintf(writer, "\nThis will install Higress \"%s\" profile into the cluster. \nProceed? (y/N)", profileName) + fmt.Scanln(&answer) + if strings.TrimSpace(answer) == "y" { + fmt.Fprintf(writer, "\n") + return true + } + if strings.TrimSpace(answer) == "N" { + fmt.Fprintf(writer, "Cancelled.\n") + return false + } + } +} + func promptProfileName(writer io.Writer) string { answer := "" fmt.Fprintf(writer, "Please select higress install configration profile:\n") @@ -156,39 +174,31 @@ func promptProfileName(writer io.Writer) string { } } - return profileNameLocalK8s } func InstallManifests(profile *helm.Profile, writer io.Writer) error { - fmt.Fprintf(writer, "start to check kubernetes cluster enviroment ......\n") cliClient, err := kubernetes.NewCLIClient(options.DefaultConfigFlags.ToRawKubeConfigLoader()) if err != nil { return fmt.Errorf("failed to build kubernetes client: %w", err) } - fmt.Fprintf(writer, "start to init higress installer ......\n") + op, err := installer.NewInstaller(profile, cliClient, writer) if err != nil { return err } - fmt.Fprintf(writer, "start to run higress installer ......\n") if err := op.Run(); err != nil { return err } - fmt.Fprintf(writer, "start to render manifests ......\n") + manifestMap, err := op.RenderManifests() - - //for name, yaml := range manifestMap { - // fileName := "~/Downloads/higress/manifests/" + string(name) + ".yaml" - // os.WriteFile(fileName, []byte(yaml), 0640) - //} - if err != nil { return err } - fmt.Fprintf(writer, "start to apply manifests ......\n") + + fmt.Fprintf(writer, "\nāŒ›ļø Processing installation... \n\n") if err := op.ApplyManifests(manifestMap); err != nil { return err } - fmt.Fprintf(writer, "install higress complete!\n") + fmt.Fprintf(writer, "\nšŸŽŠ Install All Resources Complete!\n") return nil } diff --git a/pkg/cmd/hgctl/installer/component.go b/pkg/cmd/hgctl/installer/component.go index d3d6ed107..790b78c80 100644 --- a/pkg/cmd/hgctl/installer/component.go +++ b/pkg/cmd/hgctl/installer/component.go @@ -114,18 +114,19 @@ func (h *HigressComponent) Enabled() bool { func (h *HigressComponent) Run() error { // Parse latest version if h.opts.Version == helm.RepoLatestVersion { - fmt.Fprintf(h.writer, "start to get higress helm chart latest version ......") - } - latestVersion, err := helm.ParseLatestVersion(h.opts.RepoURL, h.opts.Version) - if err != nil { - return err - } - fmt.Fprintf(h.writer, "latest version is %s\n", latestVersion) - // Reset helm chart version - h.opts.Version = latestVersion - h.renderer.SetVersion(latestVersion) - fmt.Fprintf(h.writer, "start to download higress helm chart version: %s, url: %s\n", h.opts.Version, h.opts.RepoURL) + latestVersion, err := helm.ParseLatestVersion(h.opts.RepoURL, h.opts.Version) + if err != nil { + return err + } + fmt.Fprintf(h.writer, "āš”ļø Fetching Higress Helm Chart latest version \"%s\" \n", latestVersion) + + // Reset Helm Chart version + h.opts.Version = latestVersion + h.renderer.SetVersion(latestVersion) + } + + fmt.Fprintf(h.writer, "šŸ„ Downloading Higress Helm Chart version: %s, url: %s\n", h.opts.Version, h.opts.RepoURL) if err := h.renderer.Init(); err != nil { return err @@ -138,7 +139,7 @@ func (h *HigressComponent) RenderManifest() (string, error) { if !h.started { return "", nil } - fmt.Fprintf(h.writer, "start to render higress helm chart......\n") + fmt.Fprintf(h.writer, "šŸ“¦ Rendering Higress Helm Chart\n") valsYaml, err := h.profile.ValuesYaml() if err != nil { return "", err @@ -251,7 +252,7 @@ func (i *IstioCRDComponent) Enabled() bool { } func (i *IstioCRDComponent) Run() error { - fmt.Fprintf(i.writer, "start to download istio helm chart version: %s, url: %s\n", i.opts.Version, i.opts.RepoURL) + fmt.Fprintf(i.writer, "šŸ„ Downloading Istio Helm Chart version: %s, url: %s\n", i.opts.Version, i.opts.RepoURL) if err := i.renderer.Init(); err != nil { return err } @@ -263,7 +264,7 @@ func (i *IstioCRDComponent) RenderManifest() (string, error) { if !i.started { return "", nil } - fmt.Fprintf(i.writer, "start to render istio helm chart......\n") + fmt.Fprintf(i.writer, "šŸ“¦ Rendering Istio Helm Chart\n") values := make(map[string]any) manifest, err := renderComponentManifest(values, i.renderer, false, i.ComponentName(), i.opts.Namespace) if err != nil { diff --git a/pkg/cmd/hgctl/installer/installer.go b/pkg/cmd/hgctl/installer/installer.go index f2d7f32a7..e19ce0b33 100644 --- a/pkg/cmd/hgctl/installer/installer.go +++ b/pkg/cmd/hgctl/installer/installer.go @@ -94,9 +94,9 @@ func (o *Installer) applyManifest(manifest string, ns string) error { obj.UnstructuredObject().SetNamespace(ns) } if o.isNamespacedObject(obj) { - fmt.Fprintf(o.writer, "start to apply object kind: %s, object name: %s on namespace: %s ......\n", obj.Kind, obj.Name, obj.Namespace) + fmt.Fprintf(o.writer, "āœ”ļø Installed %s:%s:%s.\n", obj.Kind, obj.Name, obj.Namespace) } else { - fmt.Fprintf(o.writer, "start to apply object kind: %s, object name: %s ......\n", obj.Kind, obj.Name) + fmt.Fprintf(o.writer, "āœ”ļø Installed %s::%s.\n", obj.Kind, obj.Name) } if err := o.kubeCli.ApplyObject(obj.UnstructuredObject()); err != nil { return err @@ -132,9 +132,9 @@ func (o *Installer) deleteManifest(manifest string, ns string) error { obj.UnstructuredObject().SetNamespace(ns) } if o.isNamespacedObject(obj) { - fmt.Fprintf(o.writer, "start to delete object kind: %s, object name: %s on namespace: %s ......\n", obj.Kind, obj.Name, obj.Namespace) + fmt.Fprintf(o.writer, "āœ”ļø Removed %s:%s:%s.\n", obj.Kind, obj.Name, obj.Namespace) } else { - fmt.Fprintf(o.writer, "start to delete object kind: %s, object name: %s ......\n", obj.Kind, obj.Name) + fmt.Fprintf(o.writer, "āœ”ļø Removed %s::%s.\n", obj.Kind, obj.Name) } if err := o.kubeCli.DeleteObject(obj.UnstructuredObject()); err != nil { return err @@ -154,7 +154,7 @@ func (o *Installer) isNamespacedObject(obj *object.K8sObject) bool { func NewInstaller(profile *helm.Profile, cli kubernetes.CLIClient, writer io.Writer) (*Installer, error) { if profile == nil { - return nil, errors.New("Install profile is empty") + return nil, errors.New("install profile is empty") } // initialize components components := make(map[ComponentName]Component) diff --git a/pkg/cmd/hgctl/uninstall.go b/pkg/cmd/hgctl/uninstall.go index 7dd7cd44a..943b590bf 100644 --- a/pkg/cmd/hgctl/uninstall.go +++ b/pkg/cmd/hgctl/uninstall.go @@ -73,18 +73,17 @@ func newUninstallCmd() *cobra.Command { // uninstall uninstalls control plane by either pruning by target revision or deleting specified manifests. func uninstall(writer io.Writer, uiArgs *uninstallArgs) error { - if !promptUninstall(writer) { - return nil - } - - fmt.Fprintf(writer, "start to uninstall higress\n") setFlags := make([]string, 0) profileName := helm.GetUninstallProfileName() - fmt.Fprintf(writer, "start to uninstall higress profile:%s\n", profileName) _, profile, err := helm.GenProfile(profileName, "", setFlags) if err != nil { return err } + + if !promptUninstall(writer) { + return nil + } + profile.Global.EnableIstioAPI = uiArgs.purgeIstioCRD profile.Global.Namespace = uiArgs.namespace profile.Global.IstioNamespace = uiArgs.istioNamespace @@ -97,45 +96,43 @@ func uninstall(writer io.Writer, uiArgs *uninstallArgs) error { func promptUninstall(writer io.Writer) bool { answer := "" - fmt.Fprintf(writer, "Are you sure to uninstall higress?\n") for { - fmt.Fprintf(writer, "Please input yes or no to select, input your selection:") + fmt.Fprintf(writer, "All Higress resources will be uninstalled from the cluster. \nProceed? (y/N)") fmt.Scanln(&answer) - if strings.TrimSpace(answer) == "yes" { + if strings.TrimSpace(answer) == "y" { + fmt.Fprintf(writer, "\n") return true } - if strings.TrimSpace(answer) == "no" { + if strings.TrimSpace(answer) == "N" { + fmt.Fprintf(writer, "Cancelled.\n") return false } } - - return false } func UnInstallManifests(profile *helm.Profile, writer io.Writer) error { - fmt.Fprintf(writer, "start to check kubernetes cluster enviroment ......\n") cliClient, err := kubernetes.NewCLIClient(options.DefaultConfigFlags.ToRawKubeConfigLoader()) if err != nil { return fmt.Errorf("failed to build kubernetes client: %w", err) } - fmt.Fprintf(writer, "start to init higress installer ......\n") + op, err := installer.NewInstaller(profile, cliClient, writer) if err != nil { return err } - fmt.Fprintf(writer, "start to run higress installer ......\n") if err := op.Run(); err != nil { return err } - fmt.Fprintf(writer, "start to render manifests ......\n") + manifestMap, err := op.RenderManifests() if err != nil { return err } - fmt.Fprintf(writer, "start to delete manifests ......\n") + + fmt.Fprintf(writer, "\nāŒ›ļø Processing uninstallation... \n\n") if err := op.DeleteManifests(manifestMap); err != nil { return err } - fmt.Fprintf(writer, "uninstall higress complete!\n") + fmt.Fprintf(writer, "\nšŸŽŠ Uninstall All Resources Complete!\n") return nil }