Allow custom endpoint URLs to be supplied to make EC2 API calls

This commit is contained in:
vishalnayak 2016-05-02 17:21:52 -04:00
parent 33541d4574
commit 9f2a111e85
4 changed files with 63 additions and 2 deletions

View File

@ -467,6 +467,37 @@ func TestBackend_ConfigClient(t *testing.T) {
if !exists { if !exists {
t.Fatal("existence check should have returned 'true' for 'config/client'") t.Fatal("existence check should have returned 'true' for 'config/client'")
} }
endpointData := map[string]interface{}{
"secret_key": "secretkey",
"access_key": "accesskey",
"endpoint": "endpointvalue",
}
endpointReq := &logical.Request{
Operation: logical.UpdateOperation,
Path: "config/client",
Storage: storage,
Data: endpointData,
}
_, err = b.HandleRequest(endpointReq)
if err != nil {
t.Fatal(err)
}
endpointReq.Operation = logical.ReadOperation
resp, err := b.HandleRequest(endpointReq)
if err != nil {
t.Fatal(err)
}
if resp == nil ||
resp.IsError() {
t.Fatalf("")
}
actual := resp.Data["endpoint"].(string)
if actual != "endpointvalue" {
t.Fatalf("bad: endpoint: expected:endpointvalue actual:%s\n", actual)
}
} }
func TestBackend_pathConfigCertificate(t *testing.T) { func TestBackend_pathConfigCertificate(t *testing.T) {

View File

@ -65,11 +65,17 @@ func (b *backend) getClientConfig(s logical.Storage, region string) (*aws.Config
} }
// Create a config that can be used to make the API calls. // Create a config that can be used to make the API calls.
return &aws.Config{ cfg := &aws.Config{
Credentials: creds, Credentials: creds,
Region: aws.String(region), Region: aws.String(region),
HTTPClient: cleanhttp.DefaultClient(), HTTPClient: cleanhttp.DefaultClient(),
}, nil }
// Override the default endpoint with the configured endpoint.
if config.Endpoint != "" {
cfg.Endpoint = aws.String(config.Endpoint)
}
return cfg, nil
} }
// flushCachedEC2Clients deletes all the cached ec2 client objects from the backend. // flushCachedEC2Clients deletes all the cached ec2 client objects from the backend.

View File

@ -19,6 +19,11 @@ func pathConfigClient(b *backend) *framework.Path {
Type: framework.TypeString, Type: framework.TypeString,
Description: "AWS Secret key with permissions to query EC2 instance metadata.", Description: "AWS Secret key with permissions to query EC2 instance metadata.",
}, },
"endpoint": &framework.FieldSchema{
Type: framework.TypeString,
Description: "The endpoint to be used to make API calls to AWS EC2.",
},
}, },
ExistenceCheck: b.pathConfigClientExistenceCheck, ExistenceCheck: b.pathConfigClientExistenceCheck,
@ -134,6 +139,16 @@ func (b *backend) pathConfigClientCreateUpdate(
configEntry.SecretKey = data.Get("secret_key").(string) configEntry.SecretKey = data.Get("secret_key").(string)
} }
endpointStr, ok := data.GetOk("endpoint")
if ok {
if configEntry.Endpoint != endpointStr.(string) {
changedCreds = true
configEntry.Endpoint = endpointStr.(string)
}
} else if req.Operation == logical.CreateOperation {
configEntry.Endpoint = data.Get("endpoint").(string)
}
b.configMutex.Lock() b.configMutex.Lock()
defer b.configMutex.Unlock() defer b.configMutex.Unlock()
@ -158,6 +173,7 @@ func (b *backend) pathConfigClientCreateUpdate(
type clientConfig struct { type clientConfig struct {
AccessKey string `json:"access_key" structs:"access_key" mapstructure:"access_key"` AccessKey string `json:"access_key" structs:"access_key" mapstructure:"access_key"`
SecretKey string `json:"secret_key" structs:"secret_key" mapstructure:"secret_key"` SecretKey string `json:"secret_key" structs:"secret_key" mapstructure:"secret_key"`
Endpoint string `json:"endpoint" structs:"endpoint" mapstructure:"endpoint"`
} }
const pathConfigClientHelpSyn = ` const pathConfigClientHelpSyn = `

View File

@ -383,6 +383,13 @@ The response will be in JSON. For example:
AWS Secret key with permissions to query EC2 instance metadata. AWS Secret key with permissions to query EC2 instance metadata.
</li> </li>
</ul> </ul>
<ul>
<li>
<span class="param">endpoint</span>
<span class="param-flags">optional</span>
URL to override the default generated endpoint for making AWS EC2 API calls.
</li>
</ul>
</dd> </dd>
<dt>Returns</dt> <dt>Returns</dt>
@ -419,6 +426,7 @@ The response will be in JSON. For example:
"data": { "data": {
"secret_key": "vCtSM8ZUEQ3mOFVlYPBQkf2sO6F/W7a5TVzrl3Oj", "secret_key": "vCtSM8ZUEQ3mOFVlYPBQkf2sO6F/W7a5TVzrl3Oj",
"access_key": "VKIAJBRHKH6EVTTNXDHA" "access_key": "VKIAJBRHKH6EVTTNXDHA"
"endpoint" "",
}, },
"lease_duration": 0, "lease_duration": 0,
"renewable": false, "renewable": false,