func setupStackCommand()

in cmd/stack.go [73:324]


func setupStackCommand() *cobraext.Command {
	upCommand := &cobra.Command{
		Use:   "up",
		Short: "Boot up the stack",
		Long:  stackUpLongDescription,
		Args:  cobra.NoArgs,
		RunE: func(cmd *cobra.Command, args []string) error {
			cmd.Println("Boot up the Elastic stack")

			daemonMode, err := cmd.Flags().GetBool(cobraext.DaemonModeFlagName)
			if err != nil {
				return cobraext.FlagParsingError(err, cobraext.DaemonModeFlagName)
			}

			services, err := cmd.Flags().GetStringSlice(cobraext.StackServicesFlagName)
			if err != nil {
				return cobraext.FlagParsingError(err, cobraext.StackServicesFlagName)
			}

			common.TrimStringSlice(services)

			err = validateServicesFlag(services)
			if err != nil {
				return fmt.Errorf("validating services failed: %w", err)
			}

			stackVersion, err := cmd.Flags().GetString(cobraext.StackVersionFlagName)
			if err != nil {
				return cobraext.FlagParsingError(err, cobraext.StackVersionFlagName)
			}

			profile, err := cobraext.GetProfileFlag(cmd)
			if err != nil {
				return err
			}

			provider, err := cobraext.GetStackProviderFromProfile(cmd, profile, true)
			if err != nil {
				return err
			}

			// Parameters provided through the CLI are not persisted.
			// Stack providers can get them with `profile.Config`, and they
			// need to handle and store them if they need it.
			userParameters, err := cobraext.GetStackUserParameterFlags(cmd)
			if err != nil {
				return err
			}
			profile.RuntimeOverrides(userParameters)

			cmd.Printf("Using profile %s.\n", profile.ProfilePath)
			err = provider.BootUp(cmd.Context(), stack.Options{
				DaemonMode:   daemonMode,
				StackVersion: stackVersion,
				Services:     services,
				Profile:      profile,
				Printer:      cmd,
			})
			if err != nil {
				return fmt.Errorf("booting up the stack failed: %w", err)
			}

			cmd.Println("Done")
			return nil
		},
	}
	upCommand.Flags().BoolP(cobraext.DaemonModeFlagName, "d", false, cobraext.DaemonModeFlagDescription)
	upCommand.Flags().StringSliceP(cobraext.StackServicesFlagName, "s", nil,
		fmt.Sprintf(cobraext.StackServicesFlagDescription, strings.Join(availableServicesAsList(), ",")))
	upCommand.Flags().StringP(cobraext.StackVersionFlagName, "", install.DefaultStackVersion, cobraext.StackVersionFlagDescription)
	upCommand.Flags().String(cobraext.StackProviderFlagName, "", fmt.Sprintf(cobraext.StackProviderFlagDescription, strings.Join(stack.SupportedProviders, ", ")))
	upCommand.Flags().StringSliceP(cobraext.StackUserParameterFlagName, cobraext.StackUserParameterFlagShorthand, nil, cobraext.StackUserParameterDescription)

	downCommand := &cobra.Command{
		Use:   "down",
		Short: "Take down the stack",
		Args:  cobra.NoArgs,
		RunE: func(cmd *cobra.Command, args []string) error {
			cmd.Println("Take down the Elastic stack")

			profile, err := cobraext.GetProfileFlag(cmd)
			if err != nil {
				return err
			}

			provider, err := cobraext.GetStackProviderFromProfile(cmd, profile, false)
			if err != nil {
				return err
			}

			err = provider.TearDown(cmd.Context(), stack.Options{
				Profile: profile,
				Printer: cmd,
			})
			if err != nil {
				return fmt.Errorf("tearing down the stack failed: %w", err)
			}

			cmd.Println("Done")
			return nil
		},
	}

	updateCommand := &cobra.Command{
		Use:   "update",
		Short: "Update the stack to the most recent versions",
		Args:  cobra.NoArgs,
		RunE: func(cmd *cobra.Command, args []string) error {
			cmd.Println("Update the Elastic stack")

			profile, err := cobraext.GetProfileFlag(cmd)
			if err != nil {
				return err
			}

			provider, err := cobraext.GetStackProviderFromProfile(cmd, profile, false)
			if err != nil {
				return err
			}

			stackVersion, err := cmd.Flags().GetString(cobraext.StackVersionFlagName)
			if err != nil {
				return cobraext.FlagParsingError(err, cobraext.StackVersionFlagName)
			}

			err = provider.Update(cmd.Context(), stack.Options{
				StackVersion: stackVersion,
				Profile:      profile,
				Printer:      cmd,
			})
			if err != nil {
				return fmt.Errorf("failed updating the stack images: %w", err)
			}

			cmd.Println("Done")
			return nil
		},
	}
	updateCommand.Flags().StringP(cobraext.StackVersionFlagName, "", install.DefaultStackVersion, cobraext.StackVersionFlagDescription)

	shellInitCommand := &cobra.Command{
		Use:   "shellinit",
		Short: "Export environment variables",
		Long:  stackShellinitLongDescription,
		Args:  cobra.NoArgs,
		RunE: func(cmd *cobra.Command, args []string) error {
			shellName, err := cmd.Flags().GetString(cobraext.ShellInitShellFlagName)
			if err != nil {
				return cobraext.FlagParsingError(err, cobraext.ShellInitShellFlagName)
			}
			if shellName == cobraext.ShellInitShellDetect {
				shellName = stack.AutodetectShell()
				fmt.Fprintf(cmd.OutOrStderr(), "Detected shell: %s\n", shellName)
			}

			profile, err := cobraext.GetProfileFlag(cmd)
			if err != nil {
				return err
			}

			shellCode, err := stack.ShellInit(profile, shellName)
			if err != nil {
				return fmt.Errorf("shellinit failed: %w", err)
			}
			fmt.Println(shellCode)
			return nil
		},
	}
	// NOTE: cobraext.ShellInitShellDetect value is used to trigger automatic detection of parent shell from current process
	shellInitCommand.Flags().StringP(cobraext.ShellInitShellFlagName, "", cobraext.ShellInitShellDetect, cobraext.ShellInitShellDescription)

	dumpCommand := &cobra.Command{
		Use:   "dump",
		Short: "Dump stack data for debug purposes",
		Args:  cobra.NoArgs,
		RunE: func(cmd *cobra.Command, args []string) error {
			output, err := cmd.Flags().GetString(cobraext.StackDumpOutputFlagName)
			if err != nil {
				return cobraext.FlagParsingError(err, cobraext.StackDumpOutputFlagName)
			}

			profile, err := cobraext.GetProfileFlag(cmd)
			if err != nil {
				return err
			}

			provider, err := cobraext.GetStackProviderFromProfile(cmd, profile, false)
			if err != nil {
				return err
			}

			target, err := provider.Dump(cmd.Context(), stack.DumpOptions{
				Output:  output,
				Profile: profile,
			})
			if err != nil {
				return fmt.Errorf("dump failed: %w", err)
			}

			cmd.Printf("Path to stack dump: %s\n", target)

			cmd.Println("Done")
			return nil
		},
	}
	dumpCommand.Flags().StringP(cobraext.StackDumpOutputFlagName, "", "elastic-stack-dump", cobraext.StackDumpOutputFlagDescription)

	statusCommand := &cobra.Command{
		Use:   "status",
		Short: "Show status of the stack services",
		Args:  cobra.NoArgs,
		RunE: func(cmd *cobra.Command, args []string) error {
			profile, err := cobraext.GetProfileFlag(cmd)
			if err != nil {
				return err
			}

			provider, err := cobraext.GetStackProviderFromProfile(cmd, profile, false)
			if err != nil {
				return err
			}

			servicesStatus, err := provider.Status(cmd.Context(), stack.Options{
				Profile: profile,
				Printer: cmd,
			})
			if err != nil {
				return fmt.Errorf("failed getting stack status: %w", err)
			}

			cmd.Println("Status of Elastic stack services:")
			printStatus(cmd, servicesStatus)
			return nil
		},
	}

	cmd := &cobra.Command{
		Use:   "stack",
		Short: "Manage the Elastic stack",
		Long:  stackLongDescription,
	}
	cmd.PersistentFlags().StringP(cobraext.ProfileFlagName, "p", "", fmt.Sprintf(cobraext.ProfileFlagDescription, install.ProfileNameEnvVar))
	cmd.AddCommand(
		upCommand,
		downCommand,
		updateCommand,
		shellInitCommand,
		dumpCommand,
		statusCommand)

	return cobraext.NewCommand(cmd, cobraext.ContextGlobal)
}