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)
}