From e41266e971cf6dd4c1005bb30c03e5b11b6acd24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Tu=CC=88rken?= Date: Sun, 7 Feb 2016 23:40:51 +0200 Subject: [PATCH] Move endpoint options into endpoints block --- builtin/providers/aws/config.go | 48 ++++----- builtin/providers/aws/provider.go | 102 ++++++++++++------ .../docs/providers/aws/index.html.markdown | 3 - 3 files changed, 93 insertions(+), 60 deletions(-) diff --git a/builtin/providers/aws/config.go b/builtin/providers/aws/config.go index 4a48df0c7..5178b4119 100644 --- a/builtin/providers/aws/config.go +++ b/builtin/providers/aws/config.go @@ -11,6 +11,8 @@ import ( "github.com/hashicorp/go-cleanhttp" "github.com/hashicorp/go-multierror" + "crypto/tls" + "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" awsCredentials "github.com/aws/aws-sdk-go/aws/credentials" @@ -45,8 +47,6 @@ import ( "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/sns" "github.com/aws/aws-sdk-go/service/sqs" - "net/http" - "crypto/tls" ) type Config struct { @@ -63,10 +63,10 @@ type Config struct { DynamoDBEndpoint string KinesisEndpoint string - Ec2Endpoint string - IamEndpoint string - ElbEndpoint string - Insecure bool + Ec2Endpoint string + IamEndpoint string + ElbEndpoint string + Insecure bool } type AWSClient struct { @@ -142,21 +142,21 @@ func (c *Config) Client() (interface{}, error) { HTTPClient: cleanhttp.DefaultClient(), } - if c.Insecure { - transport := awsConfig.HTTPClient.Transport.(*http.Transport) - transport.TLSClientConfig = &tls.Config{ - InsecureSkipVerify:true, - } - } + if c.Insecure { + transport := awsConfig.HTTPClient.Transport.(*http.Transport) + transport.TLSClientConfig = &tls.Config{ + InsecureSkipVerify: true, + } + } log.Println("[INFO] Initializing IAM Connection") sess := session.New(awsConfig) - awsIamConfig := *awsConfig - awsIamConfig.Endpoint = aws.String(c.IamEndpoint) + awsIamConfig := *awsConfig + awsIamConfig.Endpoint = aws.String(c.IamEndpoint) - awsIamSess := session.New(&awsIamConfig) - client.iamconn = iam.New(awsIamSess) + awsIamSess := session.New(&awsIamConfig) + client.iamconn = iam.New(awsIamSess) err = c.ValidateCredentials(client.iamconn) if err != nil { @@ -184,12 +184,12 @@ func (c *Config) Client() (interface{}, error) { client.dynamodbconn = dynamodb.New(dynamoSess) log.Println("[INFO] Initializing ELB connection") - awsElbConfig := *awsConfig - awsElbConfig.Endpoint = aws.String(c.ElbEndpoint) + awsElbConfig := *awsConfig + awsElbConfig.Endpoint = aws.String(c.ElbEndpoint) - awsElbSess := session.New(&awsElbConfig) + awsElbSess := session.New(&awsElbConfig) - client.elbconn = elb.New(awsElbSess) + client.elbconn = elb.New(awsElbSess) log.Println("[INFO] Initializing S3 connection") client.s3conn = s3.New(sess) @@ -223,11 +223,11 @@ func (c *Config) Client() (interface{}, error) { log.Println("[INFO] Initializing EC2 Connection") - awsEc2Config := *awsConfig - awsEc2Config.Endpoint = aws.String(c.Ec2Endpoint) + awsEc2Config := *awsConfig + awsEc2Config.Endpoint = aws.String(c.Ec2Endpoint) - awsEc2Sess := session.New(&awsEc2Config) - client.ec2conn = ec2.New(awsEc2Sess) + awsEc2Sess := session.New(&awsEc2Config) + client.ec2conn = ec2.New(awsEc2Sess) log.Println("[INFO] Initializing ECR Connection") client.ecrconn = ecr.New(sess) diff --git a/builtin/providers/aws/provider.go b/builtin/providers/aws/provider.go index 4de4059db..4cc9c5980 100644 --- a/builtin/providers/aws/provider.go +++ b/builtin/providers/aws/provider.go @@ -1,6 +1,10 @@ package aws import ( + "bytes" + "fmt" + + "github.com/hashicorp/terraform/helper/hashcode" "github.com/hashicorp/terraform/helper/mutexkv" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/terraform" @@ -96,31 +100,14 @@ func Provider() terraform.ResourceProvider { Default: "", Description: descriptions["kinesis_endpoint"], }, - "iam_endpoint": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Default: "", - Description: descriptions["iam_endpoint"], - }, + "endpoints": endpointsSchema(), - "ec2_endpoint": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Default: "", - Description: descriptions["ec2_endpoint"], - }, - "elb_endpoint": &schema.Schema{ - Type: schema.TypeString, - Optional: true, - Default: "", - Description: descriptions["elb_endpoint"], - }, - "insecure": &schema.Schema{ - Type: schema.TypeBool, - Optional: true, - Default: false, - Description: descriptions["insecure"], - }, + "insecure": &schema.Schema{ + Type: schema.TypeBool, + Optional: true, + Default: false, + Description: descriptions["insecure"], + }, }, ResourcesMap: map[string]*schema.Resource{ @@ -275,14 +262,15 @@ func init() { "kinesis_endpoint": "Use this to override the default endpoint URL constructed from the `region`.\n" + "It's typically used to connect to kinesalite.", - "iam_endpoint": "Use this to override the default endpoint URL constructed from the `region`.\n", + "iam_endpoint": "Use this to override the default endpoint URL constructed from the `region`.\n", - "ec2_endpoint": "Use this to override the default endpoint URL constructed from the `region`.\n", + "ec2_endpoint": "Use this to override the default endpoint URL constructed from the `region`.\n", - "elb_endpoint": "Use this to override the default endpoint URL constructed from the `region`.\n", + "elb_endpoint": "Use this to override the default endpoint URL constructed from the `region`.\n", - "insecure" : "Explicitly allow the provider to perform \"insecure\" SSL requests. If omitted," + - "default value is `false`", + "insecure": "Explicitly allow the provider to perform \"insecure\" SSL requests. If omitted," + + "default value is `false`", + "default value is `false`", } } @@ -297,10 +285,16 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) { MaxRetries: d.Get("max_retries").(int), DynamoDBEndpoint: d.Get("dynamodb_endpoint").(string), KinesisEndpoint: d.Get("kinesis_endpoint").(string), - IamEndpoint: d.Get("iam_endpoint").(string), - Ec2Endpoint: d.Get("ec2_endpoint").(string), - ElbEndpoint: d.Get("elb_endpoint").(string), - Insecure: d.Get("insecure").(bool), + Insecure: d.Get("insecure").(bool), + } + + endpointsSet := d.Get("endpoints").(*schema.Set) + + for _, endpointsSetI := range endpointsSet.List() { + endpoints := endpointsSetI.(map[string]interface{}) + config.IamEndpoint = endpoints["iam"].(string) + config.Ec2Endpoint = endpoints["ec2"].(string) + config.ElbEndpoint = endpoints["elb"].(string) } if v, ok := d.GetOk("allowed_account_ids"); ok { @@ -316,3 +310,45 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) { // This is a global MutexKV for use within this plugin. var awsMutexKV = mutexkv.NewMutexKV() + +func endpointsSchema() *schema.Schema { + return &schema.Schema{ + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "iam": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Default: "", + Description: descriptions["iam_endpoint"], + }, + + "ec2": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Default: "", + Description: descriptions["ec2_endpoint"], + }, + + "elb": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Default: "", + Description: descriptions["elb_endpoint"], + }, + }, + }, + Set: endpointsToHash, + } +} + +func endpointsToHash(v interface{}) int { + var buf bytes.Buffer + m := v.(map[string]interface{}) + buf.WriteString(fmt.Sprintf("%s-", m["iam"].(string))) + buf.WriteString(fmt.Sprintf("%s-", m["ec2"].(string))) + buf.WriteString(fmt.Sprintf("%s-", m["elb"].(string))) + + return hashcode.String(buf.String()) +} diff --git a/website/source/docs/providers/aws/index.html.markdown b/website/source/docs/providers/aws/index.html.markdown index 3b4430472..f89cd9fa4 100644 --- a/website/source/docs/providers/aws/index.html.markdown +++ b/website/source/docs/providers/aws/index.html.markdown @@ -149,9 +149,6 @@ The following arguments are supported in the `provider` block: URL constructed from the `region`. It's typically used to connect to custom ec2 endpoints. -* `elb_endpoint` - (Optional) Use this to override the default endpoint - URL constructed from the `region`. It's typically used to connect to - custom elb endpoints. * `token` - (Optional) Use this to set an MFA token. It can also be sourced from the `AWS_SECURITY_TOKEN` environment variable.