stack.go 4.6 KB

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