stack.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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 stackAddCmd = &cobra.Command{
  20. Use: "add",
  21. Short: "Commands to add resources to a stack",
  22. Run: func(cmd *cobra.Command, args []string) {
  23. color.New(color.FgRed).Println("need to specify an operation to continue")
  24. },
  25. }
  26. var stackAddEnvGroupCmd = &cobra.Command{
  27. Use: "env-group [name]",
  28. Args: cobra.ExactArgs(1),
  29. Aliases: []string{"eg", "envgroup", "env-groups", "envgroups"},
  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. func init() {
  39. rootCmd.AddCommand(stackCmd)
  40. stackCmd.AddCommand(stackAddCmd)
  41. stackAddCmd.PersistentFlags().StringVar(
  42. &name,
  43. "name",
  44. "",
  45. "the name of the stack",
  46. )
  47. stackAddCmd.PersistentFlags().StringVar(
  48. &namespace,
  49. "namespace",
  50. "default",
  51. "the namespace of the stack",
  52. )
  53. stackAddEnvGroupCmd.PersistentFlags().StringArrayVarP(
  54. &normalEnvGroupVars,
  55. "normal",
  56. "n",
  57. []string{},
  58. "list of variables to set, in the form VAR=VALUE",
  59. )
  60. stackAddEnvGroupCmd.PersistentFlags().StringArrayVarP(
  61. &secretEnvGroupVars,
  62. "secret",
  63. "s",
  64. []string{},
  65. "list of secret variables to set, in the form VAR=VALUE",
  66. )
  67. stackAddEnvGroupCmd.PersistentFlags().StringArrayVar(
  68. &linkedApps,
  69. "linked-apps",
  70. []string{},
  71. "list of stack apps to link this env group with",
  72. )
  73. stackAddCmd.AddCommand(stackAddEnvGroupCmd)
  74. }
  75. func stackAddEnvGroup(_ *types.GetAuthenticatedUserResponse, client *api.Client, args []string) error {
  76. envGroupName := args[0]
  77. if len(envGroupName) == 0 {
  78. return fmt.Errorf("empty env group name")
  79. } else if len(name) == 0 {
  80. return fmt.Errorf("empty stack name")
  81. } else if len(normalEnvGroupVars) == 0 && len(secretEnvGroupVars) == 0 {
  82. return fmt.Errorf("one or more variables are required to create the env group")
  83. }
  84. listStacks, err := client.ListStacks(context.Background(), cliConf.Project, cliConf.Cluster, namespace)
  85. if err != nil {
  86. return err
  87. }
  88. stacks := *listStacks
  89. var stackID string
  90. for _, stk := range stacks {
  91. if stk.Name == name {
  92. stackID = stk.ID
  93. }
  94. }
  95. if len(stackID) == 0 {
  96. return fmt.Errorf("stack not found")
  97. }
  98. normalVariables := make(map[string]string)
  99. secretVariables := make(map[string]string)
  100. for _, v := range normalEnvGroupVars {
  101. key, val, err := validateVarValue(v)
  102. if err != nil {
  103. return err
  104. }
  105. normalVariables[key] = val
  106. }
  107. for _, v := range secretEnvGroupVars {
  108. key, val, err := validateVarValue(v)
  109. if err != nil {
  110. return err
  111. }
  112. secretVariables[key] = val
  113. }
  114. err = client.AddEnvGroupToStack(
  115. context.Background(), cliConf.Project, cliConf.Cluster, namespace, stackID,
  116. &types.CreateStackEnvGroupRequest{
  117. Name: envGroupName,
  118. Variables: normalVariables,
  119. SecretVariables: secretVariables,
  120. LinkedApplications: linkedApps,
  121. },
  122. )
  123. if err != nil {
  124. return err
  125. }
  126. color.New(color.FgGreen).Println("successfully added env group")
  127. return nil
  128. }