stack.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package commands
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "github.com/porter-dev/porter/cli/cmd/config"
  7. v2 "github.com/porter-dev/porter/cli/cmd/v2"
  8. "github.com/fatih/color"
  9. api "github.com/porter-dev/porter/api/client"
  10. "github.com/porter-dev/porter/api/types"
  11. "github.com/spf13/cobra"
  12. )
  13. var linkedApps []string
  14. func registerCommand_Stack(cliConf config.CLIConfig) *cobra.Command {
  15. stackCmd := &cobra.Command{
  16. Use: "stack",
  17. Aliases: []string{"stacks"},
  18. Short: "Commands that control Porter Stacks",
  19. }
  20. stackEnvGroupCmd := &cobra.Command{
  21. Use: "env-group",
  22. Aliases: []string{"eg", "envgroup", "env-groups", "envgroups"},
  23. Short: "Commands to add or remove an env group in a stack",
  24. Run: func(cmd *cobra.Command, args []string) {
  25. _, _ = color.New(color.FgRed).Fprintln(os.Stderr, "need to specify an operation to continue")
  26. },
  27. }
  28. stackEnvGroupAddCmd := &cobra.Command{
  29. Use: "add [name]",
  30. Args: cobra.ExactArgs(1),
  31. Short: "Add an env group to a stack",
  32. Run: func(cmd *cobra.Command, args []string) {
  33. err := checkLoginAndRunWithConfig(cmd.Context(), cliConf, args, stackAddEnvGroup)
  34. if err != nil {
  35. os.Exit(1)
  36. }
  37. },
  38. }
  39. stackEnvGroupRemoveCmd := &cobra.Command{
  40. Use: "remove [name]",
  41. Args: cobra.ExactArgs(1),
  42. Short: "Remove an existing env group from a stack",
  43. Run: func(cmd *cobra.Command, args []string) {
  44. err := checkLoginAndRunWithConfig(cmd.Context(), cliConf, args, stackRemoveEnvGroup)
  45. if err != nil {
  46. os.Exit(1)
  47. }
  48. },
  49. }
  50. stackCmd.AddCommand(stackEnvGroupCmd)
  51. stackCmd.PersistentFlags().StringVar(
  52. &name,
  53. "name",
  54. "",
  55. "the name of the stack",
  56. )
  57. stackCmd.PersistentFlags().StringVar(
  58. &namespace,
  59. "namespace",
  60. "default",
  61. "the namespace of the stack",
  62. )
  63. stackEnvGroupAddCmd.PersistentFlags().StringArrayVarP(
  64. &normalEnvGroupVars,
  65. "normal",
  66. "n",
  67. []string{},
  68. "list of variables to set, in the form VAR=VALUE",
  69. )
  70. stackEnvGroupAddCmd.PersistentFlags().StringArrayVarP(
  71. &secretEnvGroupVars,
  72. "secret",
  73. "s",
  74. []string{},
  75. "list of secret variables to set, in the form VAR=VALUE",
  76. )
  77. stackEnvGroupAddCmd.PersistentFlags().StringArrayVar(
  78. &linkedApps,
  79. "linked-apps",
  80. []string{},
  81. "list of stack apps to link this env group with",
  82. )
  83. stackEnvGroupCmd.AddCommand(stackEnvGroupAddCmd)
  84. stackEnvGroupCmd.AddCommand(stackEnvGroupRemoveCmd)
  85. return stackCmd
  86. }
  87. func stackAddEnvGroup(ctx context.Context, _ *types.GetAuthenticatedUserResponse, client api.Client, cliConf config.CLIConfig, args []string) error {
  88. project, err := client.GetProject(ctx, cliConf.Project)
  89. if err != nil {
  90. return fmt.Errorf("could not retrieve project from Porter API. Please contact support@porter.run")
  91. }
  92. if project.ValidateApplyV2 {
  93. err = v2.StackAddEnvGroup(ctx)
  94. if err != nil {
  95. return err
  96. }
  97. return nil
  98. }
  99. envGroupName := args[0]
  100. if len(envGroupName) == 0 {
  101. return fmt.Errorf("empty env group name")
  102. } else if len(name) == 0 {
  103. return fmt.Errorf("empty stack name")
  104. } else if len(normalEnvGroupVars) == 0 && len(secretEnvGroupVars) == 0 {
  105. return fmt.Errorf("one or more variables are required to create the env group")
  106. }
  107. listStacks, err := client.ListStacks(ctx, cliConf.Project, cliConf.Cluster, namespace)
  108. if err != nil {
  109. return err
  110. }
  111. stacks := *listStacks
  112. var stackID string
  113. for _, stk := range stacks {
  114. if stk.Name == name {
  115. stackID = stk.ID
  116. }
  117. }
  118. if len(stackID) == 0 {
  119. return fmt.Errorf("stack not found")
  120. }
  121. normalVariables := make(map[string]string)
  122. secretVariables := make(map[string]string)
  123. for _, v := range normalEnvGroupVars {
  124. key, val, err := validateVarValue(v)
  125. if err != nil {
  126. return err
  127. }
  128. normalVariables[key] = val
  129. }
  130. for _, v := range secretEnvGroupVars {
  131. key, val, err := validateVarValue(v)
  132. if err != nil {
  133. return err
  134. }
  135. secretVariables[key] = val
  136. }
  137. err = client.AddEnvGroupToStack(
  138. ctx, cliConf.Project, cliConf.Cluster, namespace, stackID,
  139. &types.CreateStackEnvGroupRequest{
  140. Name: envGroupName,
  141. Variables: normalVariables,
  142. SecretVariables: secretVariables,
  143. LinkedApplications: linkedApps,
  144. },
  145. )
  146. if err != nil {
  147. return err
  148. }
  149. color.New(color.FgGreen).Println("successfully added env group")
  150. return nil
  151. }
  152. func stackRemoveEnvGroup(ctx context.Context, _ *types.GetAuthenticatedUserResponse, client api.Client, cliConf config.CLIConfig, args []string) error {
  153. project, err := client.GetProject(ctx, cliConf.Project)
  154. if err != nil {
  155. return fmt.Errorf("could not retrieve project from Porter API. Please contact support@porter.run")
  156. }
  157. if project.ValidateApplyV2 {
  158. err = v2.StackRemoveEnvGroup(ctx)
  159. if err != nil {
  160. return err
  161. }
  162. return nil
  163. }
  164. envGroupName := args[0]
  165. if len(envGroupName) == 0 {
  166. return fmt.Errorf("empty env group name")
  167. } else if len(name) == 0 {
  168. return fmt.Errorf("empty stack name")
  169. }
  170. listStacks, err := client.ListStacks(ctx, cliConf.Project, cliConf.Cluster, namespace)
  171. if err != nil {
  172. return err
  173. }
  174. stacks := *listStacks
  175. var stackID string
  176. for _, stk := range stacks {
  177. if stk.Name == name {
  178. stackID = stk.ID
  179. }
  180. }
  181. if len(stackID) == 0 {
  182. return fmt.Errorf("stack not found")
  183. }
  184. err = client.RemoveEnvGroupFromStack(ctx, cliConf.Project, cliConf.Cluster, namespace, stackID,
  185. envGroupName)
  186. if err != nil {
  187. return err
  188. }
  189. color.New(color.FgGreen).Println("successfully removed env group")
  190. return nil
  191. }