From de92b7ef99bc98b5a1ff2b634c120b2f9018d480 Mon Sep 17 00:00:00 2001 From: Bill Monkman Date: Tue, 23 Jun 2020 11:06:48 -0700 Subject: [PATCH] Added code to get env vars from project credentials struct --- cmd/apply_test.go | 11 ------ cmd/init_test.go | 30 --------------- internal/apply/apply.go | 11 +++++- internal/apply/apply_test.go | 4 +- internal/config/globalconfig/global_config.go | 38 +++++++++++++++++-- .../config/globalconfig/global_config_test.go | 29 +++++++++++--- internal/init/init.go | 2 +- tests/test_data/apply/project1/Makefile | 1 + 8 files changed, 71 insertions(+), 55 deletions(-) delete mode 100644 cmd/apply_test.go delete mode 100644 cmd/init_test.go diff --git a/cmd/apply_test.go b/cmd/apply_test.go deleted file mode 100644 index d72b42cc4..000000000 --- a/cmd/apply_test.go +++ /dev/null @@ -1,11 +0,0 @@ -package cmd_test - -import ( - "testing" -) - -func TestApply(t *testing.T) { - // if false { - // t.Fatalf("apply failed!") - // } -} diff --git a/cmd/init_test.go b/cmd/init_test.go deleted file mode 100644 index dfde5e131..000000000 --- a/cmd/init_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package cmd_test - -import ( - "testing" -) - -func TestInitWorks(t *testing.T) { - // @TODO : Figure out a way to test this - // tmpdir, err := ioutil.TempDir("", "commit0-") - // if err != nil { - // t.Fatal(err) - // } - - // projectName := "test-project" - - // templates := packr.New("templates", "../templates") - // templator := templator.NewTemplator(templates) - - // root := cmd.Create(projectName, tmpdir, templator) - // defer os.RemoveAll(tmpdir) - - // st, err := os.Stat(path.Join(root, util.CommitYml)) - // if err != nil { - // t.Fatal(err) - // } - - // if st.Size() == 0 { - // t.Fatalf("zero.yml is empty") - // } -} diff --git a/internal/apply/apply.go b/internal/apply/apply.go index e14b6e405..53f9d2832 100644 --- a/internal/apply/apply.go +++ b/internal/apply/apply.go @@ -12,6 +12,7 @@ import ( "github.com/commitdev/zero/internal/module" "github.com/commitdev/zero/internal/util" + "github.com/commitdev/zero/internal/config/globalconfig" "github.com/commitdev/zero/internal/config/projectconfig" "github.com/commitdev/zero/pkg/util/exit" "github.com/commitdev/zero/pkg/util/flog" @@ -52,8 +53,11 @@ func applyAll(dir string, projectConfig projectconfig.ZeroProjectConfig, applyEn environmentArg := fmt.Sprintf("ENVIRONMENT=%s", strings.Join(applyEnvironments, ",")) for _, mod := range projectConfig.Modules { - dirArg := fmt.Sprintf("PROJECT_DIR=%s", path.Join(dir, mod.Files.Directory)) - envList := []string{environmentArg, dirArg} + envList := []string{ + environmentArg, + fmt.Sprintf("PROJECT_DIR=%s", path.Join(dir, mod.Files.Directory)), + fmt.Sprintf("REPOSITORY=%s", mod.Files.Repository), + } modulePath := module.GetSourceDir(mod.Files.Source) // Passed in `dir` will only be used to find the project path, not the module path, @@ -62,7 +66,10 @@ func applyAll(dir string, projectConfig projectconfig.ZeroProjectConfig, applyEn modulePath = filepath.Join(dir, modulePath) } + credentials := globalconfig.GetProjectCredentials(projectConfig.Name) + envList = util.AppendProjectEnvToCmdEnv(mod.Parameters, envList) + envList = util.AppendProjectEnvToCmdEnv(credentials.AsEnvVars(), envList) util.ExecuteCommand(exec.Command("make"), modulePath, envList) } } diff --git a/internal/apply/apply_test.go b/internal/apply/apply_test.go index 7f83f9dce..a88daee54 100644 --- a/internal/apply/apply_test.go +++ b/internal/apply/apply_test.go @@ -32,10 +32,10 @@ func TestApply(t *testing.T) { content, err := ioutil.ReadFile(filepath.Join(tmpDir, "project1/project.out")) assert.NoError(t, err) - assert.Equal(t, string(content), "foo: bar\n") + assert.Equal(t, "foo: bar\nrepo: github.com/commitdev/project1\n", string(content)) content, err = ioutil.ReadFile(filepath.Join(tmpDir, "project2/project.out")) assert.NoError(t, err) - assert.Equal(t, string(content), "baz: qux\n") + assert.Equal(t, "baz: qux\n", string(content)) }) } diff --git a/internal/config/globalconfig/global_config.go b/internal/config/globalconfig/global_config.go index 0f1cf91ff..9feb5ddf5 100644 --- a/internal/config/globalconfig/global_config.go +++ b/internal/config/globalconfig/global_config.go @@ -7,6 +7,7 @@ import ( "os" "os/user" "path" + "reflect" "github.com/commitdev/zero/internal/constants" "github.com/commitdev/zero/pkg/util/exit" @@ -25,14 +26,14 @@ type ProjectCredential struct { } type AWSResourceConfig struct { - AccessKeyId string `yaml:"accessKeyId,omitempty"` - SecretAccessKey string `yaml:"secretAccessKey,omitempty"` + AccessKeyID string `yaml:"accessKeyId,omitempty" env:"AWS_ACCESS_KEY_ID"` + SecretAccessKey string `yaml:"secretAccessKey,omitempty" env:"AWS_SECRET_ACCESS_KEY"` } type GithubResourceConfig struct { - AccessToken string `yaml:"accessToken,omitempty"` + AccessToken string `yaml:"accessToken,omitempty" env:"GITHUB_ACCESS_TOKEN"` } type CircleCiResourceConfig struct { - ApiKey string `yaml:"apiKey,omitempty"` + ApiKey string `yaml:"apiKey,omitempty" env:"CIRCLECI_API_KEY"` } func (p ProjectCredentials) Unmarshal(data []byte) error { @@ -50,6 +51,35 @@ func (p ProjectCredentials) Unmarshal(data []byte) error { return nil } +// AsEnvVars marshals ProjectCredential as a map of key/value strings suitable for environment variables +func (p ProjectCredential) AsEnvVars() map[string]string { + t := reflect.ValueOf(p) + + list := make(map[string]string) + list = gatherFieldTags(t, list) + + return list +} + +func gatherFieldTags(t reflect.Value, list map[string]string) map[string]string { + reflectType := t.Type() + + for i := 0; i < t.NumField(); i++ { + fieldValue := t.Field(i) + fieldType := reflectType.Field(i) + + if fieldType.Type.Kind() == reflect.Struct { + list = gatherFieldTags(fieldValue, list) + continue + } + + if env := fieldType.Tag.Get("env"); env != "" { + list[env] = fieldValue.String() + } + } + return list +} + func LoadUserCredentials() ProjectCredentials { data := readOrCreateUserCredentialsFile() diff --git a/internal/config/globalconfig/global_config_test.go b/internal/config/globalconfig/global_config_test.go index 12c47eb4a..9f9278220 100644 --- a/internal/config/globalconfig/global_config_test.go +++ b/internal/config/globalconfig/global_config_test.go @@ -66,7 +66,7 @@ func TestGetUserCredentials(t *testing.T) { project := globalconfig.GetProjectCredentials(projectName) // Reading from fixtures: tests/test_data/configs/credentials.yml - assert.Equal(t, "AKIAABCD", project.AWSResourceConfig.AccessKeyId) + assert.Equal(t, "AKIAABCD", project.AWSResourceConfig.AccessKeyID) assert.Equal(t, "ZXCV", project.AWSResourceConfig.SecretAccessKey) assert.Equal(t, "0987", project.GithubResourceConfig.AccessToken) assert.Equal(t, "SOME_API_KEY", project.CircleCiResourceConfig.ApiKey) @@ -87,17 +87,36 @@ func TestEditUserCredentials(t *testing.T) { t.Run("Should create new project if not exist", func(t *testing.T) { projectName := "test-project3" project := globalconfig.GetProjectCredentials(projectName) - project.AWSResourceConfig.AccessKeyId = "TEST_KEY_ID_1" + project.AWSResourceConfig.AccessKeyID = "TEST_KEY_ID_1" globalconfig.Save(project) - newKeyID := globalconfig.GetProjectCredentials(projectName).AWSResourceConfig.AccessKeyId + newKeyID := globalconfig.GetProjectCredentials(projectName).AWSResourceConfig.AccessKeyID assert.Equal(t, "TEST_KEY_ID_1", newKeyID) }) t.Run("Should edit old project if already exist", func(t *testing.T) { projectName := "my-project" project := globalconfig.GetProjectCredentials(projectName) - project.AWSResourceConfig.AccessKeyId = "EDITED_ACCESS_KEY_ID" + project.AWSResourceConfig.AccessKeyID = "EDITED_ACCESS_KEY_ID" globalconfig.Save(project) - newKeyID := globalconfig.GetProjectCredentials(projectName).AWSResourceConfig.AccessKeyId + newKeyID := globalconfig.GetProjectCredentials(projectName).AWSResourceConfig.AccessKeyID assert.Equal(t, "EDITED_ACCESS_KEY_ID", newKeyID) }) } + +func TestMarshalProjectCredentialAsEnvVars(t *testing.T) { + t.Run("Should be able to marshal a ProjectCredential into env vars", func(t *testing.T) { + pc := globalconfig.ProjectCredential{ + AWSResourceConfig: globalconfig.AWSResourceConfig{ + AccessKeyID: "AKID", + SecretAccessKey: "SAK", + }, + CircleCiResourceConfig: globalconfig.CircleCiResourceConfig{ + ApiKey: "APIKEY", + }, + } + + envVars := pc.AsEnvVars() + assert.Equal(t, "AKID", envVars["AWS_ACCESS_KEY_ID"]) + assert.Equal(t, "SAK", envVars["AWS_SECRET_ACCESS_KEY"]) + assert.Equal(t, "APIKEY", envVars["CIRCLECI_API_KEY"]) + }) +} diff --git a/internal/init/init.go b/internal/init/init.go index 9e72b62b8..67b93e5c8 100644 --- a/internal/init/init.go +++ b/internal/init/init.go @@ -239,7 +239,7 @@ func mapVendorToPrompts(projectCred globalconfig.ProjectCredential, vendor strin moduleconfig.Parameter{ Field: "accessKeyId", Label: "AWS Access Key ID", - Default: projectCred.AWSResourceConfig.AccessKeyId, + Default: projectCred.AWSResourceConfig.AccessKeyID, }, CustomCondition(customAwsMustInputCondition), project.ValidateAKID, diff --git a/tests/test_data/apply/project1/Makefile b/tests/test_data/apply/project1/Makefile index 3df071059..a60a27603 100644 --- a/tests/test_data/apply/project1/Makefile +++ b/tests/test_data/apply/project1/Makefile @@ -1,2 +1,3 @@ current_dir: @echo "foo: ${foo}" > project.out + @echo "repo: ${REPOSITORY}" >> project.out