setup.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package commands
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/aws/aws-sdk-go/aws/awserr"
  6. "github.com/aws/aws-sdk-go/aws/credentials"
  7. "github.com/docker/cli/cli-plugins/plugin"
  8. contextStore "github.com/docker/ecs-plugin/pkg/docker"
  9. "github.com/spf13/cobra"
  10. "gopkg.in/ini.v1"
  11. )
  12. func SetupCommand() *cobra.Command {
  13. var opts contextStore.AwsContext
  14. var name string
  15. var accessKeyID string
  16. var secretAccessKey string
  17. cmd := &cobra.Command{
  18. Use: "setup",
  19. Short: "",
  20. PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
  21. //Override the root command PersistentPreRun
  22. //We just need to initialize the top parent command
  23. return plugin.PersistentPreRunE(cmd, args)
  24. },
  25. RunE: func(cmd *cobra.Command, args []string) error {
  26. if accessKeyID != "" && secretAccessKey != "" {
  27. if err := saveCredentials(opts.Profile, accessKeyID, secretAccessKey); err != nil {
  28. return err
  29. }
  30. }
  31. return contextStore.NewContext(name, &opts)
  32. },
  33. }
  34. cmd.Flags().StringVarP(&name, "name", "n", "aws", "Context Name")
  35. cmd.Flags().StringVarP(&opts.Profile, "profile", "p", "", "AWS Profile")
  36. cmd.Flags().StringVarP(&opts.Cluster, "cluster", "c", "", "ECS cluster")
  37. cmd.Flags().StringVarP(&opts.Region, "region", "r", "", "AWS region")
  38. cmd.Flags().StringVarP(&accessKeyID, "aws-key-id", "k", "", "AWS Access Key ID")
  39. cmd.Flags().StringVarP(&secretAccessKey, "aws-secret-key", "s", "", "AWS Secret Access Key")
  40. cmd.MarkFlagRequired("profile")
  41. cmd.MarkFlagRequired("cluster")
  42. cmd.MarkFlagRequired("region")
  43. return cmd
  44. }
  45. func saveCredentials(profile string, accessKeyID string, secretAccessKey string) error {
  46. p := credentials.SharedCredentialsProvider{Profile: profile}
  47. _, err := p.Retrieve()
  48. if err == nil {
  49. fmt.Println("credentials already exists!")
  50. return nil
  51. }
  52. if err.(awserr.Error).Code() == "SharedCredsLoad" {
  53. os.Create(p.Filename)
  54. }
  55. credIni, err := ini.Load(p.Filename)
  56. if err != nil {
  57. return err
  58. }
  59. section := credIni.Section(profile)
  60. section.Key("aws_access_key_id").SetValue(accessKeyID)
  61. section.Key("aws_secret_access_key").SetValue(secretAccessKey)
  62. credFile, err := os.OpenFile(p.Filename, os.O_WRONLY, 0600)
  63. if err != nil {
  64. return err
  65. }
  66. if _, err = credIni.WriteTo(credFile); err != nil {
  67. return err
  68. }
  69. return credFile.Close()
  70. }