Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use standard AWS environment variables #851

Merged
merged 5 commits into from
Jan 25, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions builtin/providers/aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,32 @@ func Provider() terraform.ResourceProvider {
return &schema.Provider{
Schema: map[string]*schema.Schema{
"access_key": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("AWS_ACCESS_KEY", nil),
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.MultiEnvDefaultFunc([]string{
"AWS_ACCESS_KEY",
"AWS_ACCESS_KEY_ID",
}, nil),
Description: descriptions["access_key"],
},

"secret_key": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("AWS_SECRET_KEY", nil),
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.MultiEnvDefaultFunc([]string{
"AWS_SECRET_KEY",
"AWS_SECRET_ACCESS_KEY",
}, nil),
Description: descriptions["secret_key"],
},

"region": &schema.Schema{
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.EnvDefaultFunc("AWS_REGION", nil),
Type: schema.TypeString,
Required: true,
DefaultFunc: schema.MultiEnvDefaultFunc([]string{
"AWS_REGION",
"AWS_DEFAULT_REGION",
}, nil),
Description: descriptions["region"],
InputDefault: "us-east-1",
},
Expand Down
12 changes: 6 additions & 6 deletions builtin/providers/aws/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,14 @@ func TestProvider_impl(t *testing.T) {
}

func testAccPreCheck(t *testing.T) {
if v := os.Getenv("AWS_ACCESS_KEY"); v == "" {
t.Fatal("AWS_ACCESS_KEY must be set for acceptance tests")
if v := os.Getenv("AWS_ACCESS_KEY_ID"); v == "" {
t.Fatal("AWS_ACCESS_KEY_ID must be set for acceptance tests")
}
if v := os.Getenv("AWS_SECRET_KEY"); v == "" {
t.Fatal("AWS_SECRET_KEY must be set for acceptance tests")
if v := os.Getenv("AWS_SECRET_ACCESS_KEY"); v == "" {
t.Fatal("AWS_SECRET_ACCESS_KEY must be set for acceptance tests")
}
if v := os.Getenv("AWS_REGION"); v == "" {
if v := os.Getenv("AWS_DEFAULT_REGION"); v == "" {
log.Println("[INFO] Test: Using us-west-2 as test region")
os.Setenv("AWS_REGION", "us-west-2")
os.Setenv("AWS_DEFAULT_REGION", "us-west-2")
}
}
15 changes: 15 additions & 0 deletions helper/schema/schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,21 @@ func EnvDefaultFunc(k string, dv interface{}) SchemaDefaultFunc {
}
}

// MultiEnvDefaultFunc is a helper function that returns the value of the first
// environment variable in the given list that returns a non-empty value. If
// none of the environment variables return a value, the default value is
// returned.
func MultiEnvDefaultFunc(ks []string, dv interface{}) SchemaDefaultFunc {
return func() (interface{}, error) {
for _, k := range ks {
if v := os.Getenv(k); v != "" {
return v, nil
}
}
return dv, nil
}
}

// SchemaSetFunc is a function that must return a unique ID for the given
// element. This unique ID is used to store the element in a hash.
type SchemaSetFunc func(interface{}) int
Expand Down
57 changes: 57 additions & 0 deletions helper/schema/schema_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,63 @@ func TestEnvDefaultFunc(t *testing.T) {
}
}

func TestMultiEnvDefaultFunc(t *testing.T) {
keys := []string{
"TF_TEST_MULTI_ENV_DEFAULT_FUNC1",
"TF_TEST_MULTI_ENV_DEFAULT_FUNC2",
}
defer func() {
for _, k := range keys {
os.Unsetenv(k)
}
}()

// Test that the first key is returned first
f := MultiEnvDefaultFunc(keys, "42")
if err := os.Setenv(keys[0], "foo"); err != nil {
t.Fatalf("err: %s", err)
}

actual, err := f()
if err != nil {
t.Fatalf("err: %s", err)
}
if actual != "foo" {
t.Fatalf("bad: %#v", actual)
}

if err := os.Unsetenv(keys[0]); err != nil {
t.Fatalf("err: %s", err)
}

// Test that the second key is returned if the first one is empty
f = MultiEnvDefaultFunc(keys, "42")
if err := os.Setenv(keys[1], "foo"); err != nil {
t.Fatalf("err: %s", err)
}

actual, err = f()
if err != nil {
t.Fatalf("err: %s", err)
}
if actual != "foo" {
t.Fatalf("bad: %#v", actual)
}

if err := os.Unsetenv(keys[1]); err != nil {
t.Fatalf("err: %s", err)
}

// Test that the default value is returned when no keys are set
actual, err = f()
if err != nil {
t.Fatalf("err: %s", err)
}
if actual != "42" {
t.Fatalf("bad: %#v", actual)
}
}

func TestValueType_Zero(t *testing.T) {
cases := []struct {
Type ValueType
Expand Down
56 changes: 30 additions & 26 deletions website/Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
GIT
remote: git://github.com/hashicorp/middleman-hashicorp.git
revision: b82c2c2fdc244cd0bd529ff27cfab24e43f07708
revision: 30c15f93fb501041cff97c490b60ddc96c8314c9
specs:
middleman-hashicorp (0.1.0)
bootstrap-sass (~> 3.2)
Expand All @@ -20,14 +20,18 @@ GIT
GEM
remote: https://rubygems.org/
specs:
activesupport (4.1.8)
activesupport (4.1.9)
i18n (~> 0.6, >= 0.6.9)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.1)
tzinfo (~> 1.1)
bootstrap-sass (3.3.1.0)
sass (~> 3.2)
autoprefixer-rails (5.0.0.2)
execjs
json
bootstrap-sass (3.3.3)
autoprefixer-rails (>= 5.0.0.1)
sass (>= 3.2.19)
builder (3.2.2)
celluloid (0.16.0)
timers (~> 4.0.0)
Expand All @@ -37,14 +41,14 @@ GEM
execjs
coffee-script-source (1.8.0)
commonjs (0.2.7)
compass (1.0.1)
compass (1.0.3)
chunky_png (~> 1.2)
compass-core (~> 1.0.1)
compass-core (~> 1.0.2)
compass-import-once (~> 1.0.5)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
sass (>= 3.3.13, < 3.5)
compass-core (1.0.1)
compass-core (1.0.3)
multi_json (~> 1.0)
sass (>= 3.3.0, < 3.5)
compass-import-once (1.0.5)
Expand All @@ -54,10 +58,10 @@ GEM
eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0)
erubis (2.7.0)
eventmachine (1.0.3)
eventmachine (1.0.4)
execjs (2.2.2)
ffi (1.9.6)
haml (4.0.5)
haml (4.0.6)
tilt
hike (1.2.3)
hitimes (1.2.2)
Expand All @@ -66,12 +70,12 @@ GEM
htmlcompressor (0.1.2)
http_parser.rb (0.6.0)
i18n (0.6.11)
json (1.8.1)
json (1.8.2)
kramdown (1.5.0)
less (2.6.0)
commonjs (~> 0.2.7)
libv8 (3.16.14.7)
listen (2.8.0)
listen (2.8.5)
celluloid (>= 0.15.2)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
Expand All @@ -98,53 +102,53 @@ GEM
rack-test (~> 0.6.2)
thor (>= 0.15.2, < 2.0)
tilt (~> 1.4.1, < 2.0)
middleman-livereload (3.3.4)
middleman-livereload (3.4.2)
em-websocket (~> 0.5.1)
middleman-core (~> 3.2)
middleman-core (>= 3.3)
rack-livereload (~> 0.3.15)
middleman-minify-html (3.4.0)
htmlcompressor (~> 0.1.0)
middleman-core (>= 3.2)
middleman-sprockets (3.3.10)
middleman-core (~> 3.3)
middleman-sprockets (3.4.1)
middleman-core (>= 3.3)
sprockets (~> 2.12.1)
sprockets-helpers (~> 1.1.0)
sprockets-sass (~> 1.2.0)
sprockets-sass (~> 1.3.0)
middleman-syntax (2.0.0)
middleman-core (~> 3.2)
rouge (~> 1.0)
minitest (5.4.3)
minitest (5.5.1)
multi_json (1.10.1)
padrino-helpers (0.12.4)
i18n (~> 0.6, >= 0.6.7)
padrino-support (= 0.12.4)
tilt (~> 1.4.1)
padrino-support (0.12.4)
activesupport (>= 3.1)
rack (1.5.2)
rack (1.6.0)
rack-contrib (1.2.0)
rack (>= 0.9.1)
rack-livereload (0.3.15)
rack
rack-rewrite (1.5.0)
rack-rewrite (1.5.1)
rack-ssl-enforcer (0.2.8)
rack-test (0.6.2)
rack-test (0.6.3)
rack (>= 1.0)
rb-fsevent (0.9.4)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
redcarpet (3.2.0)
redcarpet (3.2.2)
ref (1.0.5)
rouge (1.7.3)
sass (3.4.8)
rouge (1.7.7)
sass (3.4.10)
sprockets (2.12.3)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
sprockets-helpers (1.1.0)
sprockets (~> 2.0)
sprockets-sass (1.2.0)
sprockets-sass (1.3.1)
sprockets (~> 2.0)
tilt (~> 1.1)
therubyracer (0.12.1)
Expand All @@ -161,8 +165,8 @@ GEM
hitimes
tzinfo (1.2.2)
thread_safe (~> 0.1)
uber (0.0.11)
uglifier (2.5.3)
uber (0.0.13)
uglifier (2.7.0)
execjs (>= 0.3.0)
json (>= 1.8.0)

Expand Down
7 changes: 3 additions & 4 deletions website/source/docs/providers/aws/index.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,10 @@ resource "aws_instance" "web" {
The following arguments are supported:

* `access_key` - (Required) This is the AWS access key. It must be provided, but
it can also be sourced from the `AWS_ACCESS_KEY` environment variable.
it can also be sourced from the `AWS_ACCESS_KEY_ID` environment variable.

* `secret_key` - (Required) This is the AWS secret key. It must be provided, but
it can also be sourced from the `AWS_SECRET_KEY` environment variable.
it can also be sourced from the `AWS_SECRET_ACCESS_KEY` environment variable.

* `region` - (Required) This is the AWS region. It must be provided, but
it can also be sourced from the `AWS_REGION` environment variables.

it can also be sourced from the `AWS_DEFAULT_REGION` environment variables.