stack.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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, 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, 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, featureFlags config.FeatureFlags, args []string) error {
  88. if featureFlags.ValidateApplyV2Enabled {
  89. err := v2.StackAddEnvGroup(ctx)
  90. if err != nil {
  91. return err
  92. }
  93. return nil
  94. }
  95. envGroupName := args[0]
  96. if len(envGroupName) == 0 {
  97. return fmt.Errorf("empty env group name")
  98. } else if len(name) == 0 {
  99. return fmt.Errorf("empty stack name")
  100. } else if len(normalEnvGroupVars) == 0 && len(secretEnvGroupVars) == 0 {
  101. return fmt.Errorf("one or more variables are required to create the env group")
  102. }
  103. listStacks, err := client.ListStacks(ctx, cliConf.Project, cliConf.Cluster, namespace)
  104. if err != nil {
  105. return err
  106. }
  107. stacks := *listStacks
  108. var stackID string
  109. for _, stk := range stacks {
  110. if stk.Name == name {
  111. stackID = stk.ID
  112. }
  113. }
  114. if len(stackID) == 0 {
  115. return fmt.Errorf("stack not found")
  116. }
  117. normalVariables := make(map[string]string)
  118. secretVariables := make(map[string]string)
  119. for _, v := range normalEnvGroupVars {
  120. key, val, err := validateVarValue(v)
  121. if err != nil {
  122. return err
  123. }
  124. normalVariables[key] = val
  125. }
  126. for _, v := range secretEnvGroupVars {
  127. key, val, err := validateVarValue(v)
  128. if err != nil {
  129. return err
  130. }
  131. secretVariables[key] = val
  132. }
  133. err = client.AddEnvGroupToStack(
  134. ctx, cliConf.Project, cliConf.Cluster, namespace, stackID,
  135. &types.CreateStackEnvGroupRequest{
  136. Name: envGroupName,
  137. Variables: normalVariables,
  138. SecretVariables: secretVariables,
  139. LinkedApplications: linkedApps,
  140. },
  141. )
  142. if err != nil {
  143. return err
  144. }
  145. color.New(color.FgGreen).Println("successfully added env group")
  146. return nil
  147. }
  148. func stackRemoveEnvGroup(ctx context.Context, _ *types.GetAuthenticatedUserResponse, client api.Client, cliConf config.CLIConfig, featureFlags config.FeatureFlags, args []string) error {
  149. if featureFlags.ValidateApplyV2Enabled {
  150. err := v2.StackRemoveEnvGroup(ctx)
  151. if err != nil {
  152. return err
  153. }
  154. return nil
  155. }
  156. envGroupName := args[0]
  157. if len(envGroupName) == 0 {
  158. return fmt.Errorf("empty env group name")
  159. } else if len(name) == 0 {
  160. return fmt.Errorf("empty stack name")
  161. }
  162. listStacks, err := client.ListStacks(ctx, cliConf.Project, cliConf.Cluster, namespace)
  163. if err != nil {
  164. return err
  165. }
  166. stacks := *listStacks
  167. var stackID string
  168. for _, stk := range stacks {
  169. if stk.Name == name {
  170. stackID = stk.ID
  171. }
  172. }
  173. if len(stackID) == 0 {
  174. return fmt.Errorf("stack not found")
  175. }
  176. err = client.RemoveEnvGroupFromStack(ctx, cliConf.Project, cliConf.Cluster, namespace, stackID,
  177. envGroupName)
  178. if err != nil {
  179. return err
  180. }
  181. color.New(color.FgGreen).Println("successfully removed env group")
  182. return nil
  183. }