mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Update to latest goamz
Also add dep on goamz/elb, for future use
This commit is contained in:
parent
da8dc5360e
commit
c69fe231f4
8
Godeps/Godeps.json
generated
8
Godeps/Godeps.json
generated
@ -140,11 +140,15 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/mitchellh/goamz/aws",
|
"ImportPath": "github.com/mitchellh/goamz/aws",
|
||||||
"Rev": "9cad7da945e699385c1a3e115aa255211921c9bb"
|
"Rev": "703cfb45985762869e465f37ed030ff01615ff1e"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/mitchellh/goamz/ec2",
|
"ImportPath": "github.com/mitchellh/goamz/ec2",
|
||||||
"Rev": "9cad7da945e699385c1a3e115aa255211921c9bb"
|
"Rev": "703cfb45985762869e465f37ed030ff01615ff1e"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ImportPath": "github.com/mitchellh/goamz/elb",
|
||||||
|
"Rev": "703cfb45985762869e465f37ed030ff01615ff1e"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/mitchellh/mapstructure",
|
"ImportPath": "github.com/mitchellh/mapstructure",
|
||||||
|
26
Godeps/_workspace/src/github.com/mitchellh/goamz/aws/aws.go
generated
vendored
26
Godeps/_workspace/src/github.com/mitchellh/goamz/aws/aws.go
generated
vendored
@ -13,9 +13,10 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/vaughan0/go-ini"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/vaughan0/go-ini"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Region defines the URLs where AWS services may be accessed.
|
// Region defines the URLs where AWS services may be accessed.
|
||||||
@ -123,6 +124,23 @@ var EUWest = Region{
|
|||||||
"https://route53.amazonaws.com",
|
"https://route53.amazonaws.com",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var EUCentral = Region{
|
||||||
|
"eu-central-1",
|
||||||
|
"https://ec2.eu-central-1.amazonaws.com",
|
||||||
|
"https://s3-eu-central-1.amazonaws.com",
|
||||||
|
"",
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
"",
|
||||||
|
"https://sns.eu-central-1.amazonaws.com",
|
||||||
|
"https://sqs.eu-central-1.amazonaws.com",
|
||||||
|
"https://iam.amazonaws.com",
|
||||||
|
"https://elasticloadbalancing.eu-central-1.amazonaws.com",
|
||||||
|
"https://autoscaling.eu-central-1.amazonaws.com",
|
||||||
|
"https://rds.eu-central-1.amazonaws.com",
|
||||||
|
"https://route53.amazonaws.com",
|
||||||
|
}
|
||||||
|
|
||||||
var APSoutheast = Region{
|
var APSoutheast = Region{
|
||||||
"ap-southeast-1",
|
"ap-southeast-1",
|
||||||
"https://ec2.ap-southeast-1.amazonaws.com",
|
"https://ec2.ap-southeast-1.amazonaws.com",
|
||||||
@ -213,6 +231,7 @@ var Regions = map[string]Region{
|
|||||||
APSoutheast.Name: APSoutheast,
|
APSoutheast.Name: APSoutheast,
|
||||||
APSoutheast2.Name: APSoutheast2,
|
APSoutheast2.Name: APSoutheast2,
|
||||||
EUWest.Name: EUWest,
|
EUWest.Name: EUWest,
|
||||||
|
EUCentral.Name: EUCentral,
|
||||||
USEast.Name: USEast,
|
USEast.Name: USEast,
|
||||||
USWest.Name: USWest,
|
USWest.Name: USWest,
|
||||||
USWest2.Name: USWest2,
|
USWest2.Name: USWest2,
|
||||||
@ -334,13 +353,16 @@ func SharedAuth() (auth Auth, err error) {
|
|||||||
profileName = "default"
|
profileName = "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var credentialsFile = os.Getenv("AWS_CREDENTIAL_FILE")
|
||||||
|
if credentialsFile == "" {
|
||||||
var homeDir = os.Getenv("HOME")
|
var homeDir = os.Getenv("HOME")
|
||||||
if homeDir == "" {
|
if homeDir == "" {
|
||||||
err = errors.New("Could not get HOME")
|
err = errors.New("Could not get HOME")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
credentialsFile = homeDir + "/.aws/credentials"
|
||||||
|
}
|
||||||
|
|
||||||
var credentialsFile = homeDir + "/.aws/credentials"
|
|
||||||
file, err := ini.LoadFile(credentialsFile)
|
file, err := ini.LoadFile(credentialsFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err = errors.New("Couldn't parse AWS credentials file")
|
err = errors.New("Couldn't parse AWS credentials file")
|
||||||
|
504
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/ec2.go
generated
vendored
504
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/ec2.go
generated
vendored
@ -127,7 +127,7 @@ type xmlErrors struct {
|
|||||||
var timeNow = time.Now
|
var timeNow = time.Now
|
||||||
|
|
||||||
func (ec2 *EC2) query(params map[string]string, resp interface{}) error {
|
func (ec2 *EC2) query(params map[string]string, resp interface{}) error {
|
||||||
params["Version"] = "2014-05-01"
|
params["Version"] = "2014-06-15"
|
||||||
params["Timestamp"] = timeNow().In(time.UTC).Format(time.RFC3339)
|
params["Timestamp"] = timeNow().In(time.UTC).Format(time.RFC3339)
|
||||||
endpoint, err := url.Parse(ec2.Region.EC2Endpoint)
|
endpoint, err := url.Parse(ec2.Region.EC2Endpoint)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -178,7 +178,7 @@ func buildError(r *http.Response) error {
|
|||||||
err.RequestId = errors.RequestId
|
err.RequestId = errors.RequestId
|
||||||
err.StatusCode = r.StatusCode
|
err.StatusCode = r.StatusCode
|
||||||
if err.Message == "" {
|
if err.Message == "" {
|
||||||
err.Message = r.Status
|
err.Message = err.Code
|
||||||
}
|
}
|
||||||
return &err
|
return &err
|
||||||
}
|
}
|
||||||
@ -203,9 +203,12 @@ func addBlockDeviceParams(prename string, params map[string]string, blockdevices
|
|||||||
if k.DeviceName != "" {
|
if k.DeviceName != "" {
|
||||||
params[prefix+"DeviceName"] = k.DeviceName
|
params[prefix+"DeviceName"] = k.DeviceName
|
||||||
}
|
}
|
||||||
|
|
||||||
if k.VirtualName != "" {
|
if k.VirtualName != "" {
|
||||||
params[prefix+"VirtualName"] = k.VirtualName
|
params[prefix+"VirtualName"] = k.VirtualName
|
||||||
}
|
} else if k.NoDevice {
|
||||||
|
params[prefix+"NoDevice"] = ""
|
||||||
|
} else {
|
||||||
if k.SnapshotId != "" {
|
if k.SnapshotId != "" {
|
||||||
params[prefix+"Ebs.SnapshotId"] = k.SnapshotId
|
params[prefix+"Ebs.SnapshotId"] = k.SnapshotId
|
||||||
}
|
}
|
||||||
@ -220,12 +223,12 @@ func addBlockDeviceParams(prename string, params map[string]string, blockdevices
|
|||||||
}
|
}
|
||||||
if k.DeleteOnTermination {
|
if k.DeleteOnTermination {
|
||||||
params[prefix+"Ebs.DeleteOnTermination"] = "true"
|
params[prefix+"Ebs.DeleteOnTermination"] = "true"
|
||||||
|
} else {
|
||||||
|
params[prefix+"Ebs.DeleteOnTermination"] = "false"
|
||||||
}
|
}
|
||||||
if k.Encrypted {
|
if k.Encrypted {
|
||||||
params[prefix+"Ebs.Encrypted"] = "true"
|
params[prefix+"Ebs.Encrypted"] = "true"
|
||||||
}
|
}
|
||||||
if k.NoDevice {
|
|
||||||
params[prefix+"NoDevice"] = ""
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,9 +256,11 @@ type RunInstances struct {
|
|||||||
SubnetId string
|
SubnetId string
|
||||||
AssociatePublicIpAddress bool
|
AssociatePublicIpAddress bool
|
||||||
DisableAPITermination bool
|
DisableAPITermination bool
|
||||||
|
EbsOptimized bool
|
||||||
ShutdownBehavior string
|
ShutdownBehavior string
|
||||||
PrivateIPAddress string
|
PrivateIPAddress string
|
||||||
BlockDevices []BlockDeviceMapping
|
BlockDevices []BlockDeviceMapping
|
||||||
|
Tenancy string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Response to a RunInstances request.
|
// Response to a RunInstances request.
|
||||||
@ -269,6 +274,15 @@ type RunInstancesResp struct {
|
|||||||
Instances []Instance `xml:"instancesSet>item"`
|
Instances []Instance `xml:"instancesSet>item"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BlockDevice represents the association of a block device with an instance.
|
||||||
|
type BlockDevice struct {
|
||||||
|
DeviceName string `xml:"deviceName"`
|
||||||
|
VolumeId string `xml:"ebs>volumeId"`
|
||||||
|
Status string `xml:"ebs>status"`
|
||||||
|
AttachTime string `xml:"ebs>attachTime"`
|
||||||
|
DeleteOnTermination bool `xml:"ebs>deleteOnTermination"`
|
||||||
|
}
|
||||||
|
|
||||||
// Instance encapsulates a running instance in EC2.
|
// Instance encapsulates a running instance in EC2.
|
||||||
//
|
//
|
||||||
// See http://goo.gl/OCH8a for more details.
|
// See http://goo.gl/OCH8a for more details.
|
||||||
@ -284,6 +298,7 @@ type Instance struct {
|
|||||||
VirtType string `xml:"virtualizationType"`
|
VirtType string `xml:"virtualizationType"`
|
||||||
Monitoring string `xml:"monitoring>state"`
|
Monitoring string `xml:"monitoring>state"`
|
||||||
AvailZone string `xml:"placement>availabilityZone"`
|
AvailZone string `xml:"placement>availabilityZone"`
|
||||||
|
Tenancy string `xml:"placement>tenancy"`
|
||||||
PlacementGroupName string `xml:"placement>groupName"`
|
PlacementGroupName string `xml:"placement>groupName"`
|
||||||
State InstanceState `xml:"instanceState"`
|
State InstanceState `xml:"instanceState"`
|
||||||
Tags []Tag `xml:"tagSet>item"`
|
Tags []Tag `xml:"tagSet>item"`
|
||||||
@ -296,6 +311,8 @@ type Instance struct {
|
|||||||
LaunchTime time.Time `xml:"launchTime"`
|
LaunchTime time.Time `xml:"launchTime"`
|
||||||
SourceDestCheck bool `xml:"sourceDestCheck"`
|
SourceDestCheck bool `xml:"sourceDestCheck"`
|
||||||
SecurityGroups []SecurityGroup `xml:"groupSet>item"`
|
SecurityGroups []SecurityGroup `xml:"groupSet>item"`
|
||||||
|
EbsOptimized string `xml:"ebsOptimized"`
|
||||||
|
BlockDevices []BlockDevice `xml:"blockDeviceMapping>item"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// RunInstances starts new instances in EC2.
|
// RunInstances starts new instances in EC2.
|
||||||
@ -350,6 +367,9 @@ func (ec2 *EC2) RunInstances(options *RunInstances) (resp *RunInstancesResp, err
|
|||||||
if options.Monitoring {
|
if options.Monitoring {
|
||||||
params["Monitoring.Enabled"] = "true"
|
params["Monitoring.Enabled"] = "true"
|
||||||
}
|
}
|
||||||
|
if options.Tenancy != "" {
|
||||||
|
params["Placement.Tenancy"] = options.Tenancy
|
||||||
|
}
|
||||||
if options.SubnetId != "" && options.AssociatePublicIpAddress {
|
if options.SubnetId != "" && options.AssociatePublicIpAddress {
|
||||||
// If we have a non-default VPC / Subnet specified, we can flag
|
// If we have a non-default VPC / Subnet specified, we can flag
|
||||||
// AssociatePublicIpAddress to get a Public IP assigned. By default these are not provided.
|
// AssociatePublicIpAddress to get a Public IP assigned. By default these are not provided.
|
||||||
@ -362,6 +382,10 @@ func (ec2 *EC2) RunInstances(options *RunInstances) (resp *RunInstancesResp, err
|
|||||||
params["NetworkInterface.0.AssociatePublicIpAddress"] = "true"
|
params["NetworkInterface.0.AssociatePublicIpAddress"] = "true"
|
||||||
params["NetworkInterface.0.SubnetId"] = options.SubnetId
|
params["NetworkInterface.0.SubnetId"] = options.SubnetId
|
||||||
|
|
||||||
|
if options.PrivateIPAddress != "" {
|
||||||
|
params["NetworkInterface.0.PrivateIpAddress"] = options.PrivateIPAddress
|
||||||
|
}
|
||||||
|
|
||||||
i := 1
|
i := 1
|
||||||
for _, g := range options.SecurityGroups {
|
for _, g := range options.SecurityGroups {
|
||||||
// We only have SecurityGroupId's on NetworkInterface's, no SecurityGroup params.
|
// We only have SecurityGroupId's on NetworkInterface's, no SecurityGroup params.
|
||||||
@ -375,6 +399,10 @@ func (ec2 *EC2) RunInstances(options *RunInstances) (resp *RunInstancesResp, err
|
|||||||
params["SubnetId"] = options.SubnetId
|
params["SubnetId"] = options.SubnetId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if options.PrivateIPAddress != "" {
|
||||||
|
params["PrivateIpAddress"] = options.PrivateIPAddress
|
||||||
|
}
|
||||||
|
|
||||||
i, j := 1, 1
|
i, j := 1, 1
|
||||||
for _, g := range options.SecurityGroups {
|
for _, g := range options.SecurityGroups {
|
||||||
if g.Id != "" {
|
if g.Id != "" {
|
||||||
@ -392,12 +420,12 @@ func (ec2 *EC2) RunInstances(options *RunInstances) (resp *RunInstancesResp, err
|
|||||||
if options.DisableAPITermination {
|
if options.DisableAPITermination {
|
||||||
params["DisableApiTermination"] = "true"
|
params["DisableApiTermination"] = "true"
|
||||||
}
|
}
|
||||||
|
if options.EbsOptimized {
|
||||||
|
params["EbsOptimized"] = "true"
|
||||||
|
}
|
||||||
if options.ShutdownBehavior != "" {
|
if options.ShutdownBehavior != "" {
|
||||||
params["InstanceInitiatedShutdownBehavior"] = options.ShutdownBehavior
|
params["InstanceInitiatedShutdownBehavior"] = options.ShutdownBehavior
|
||||||
}
|
}
|
||||||
if options.PrivateIPAddress != "" {
|
|
||||||
params["PrivateIpAddress"] = options.PrivateIPAddress
|
|
||||||
}
|
|
||||||
addBlockDeviceParams("", params, options.BlockDevices)
|
addBlockDeviceParams("", params, options.BlockDevices)
|
||||||
|
|
||||||
resp = &RunInstancesResp{}
|
resp = &RunInstancesResp{}
|
||||||
@ -419,6 +447,111 @@ func clientToken() (string, error) {
|
|||||||
return hex.EncodeToString(buf), nil
|
return hex.EncodeToString(buf), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The GetConsoleOutput type encapsulates options for the respective request in EC2.
|
||||||
|
//
|
||||||
|
// See http://goo.gl/EY70zb for more details.
|
||||||
|
type GetConsoleOutput struct {
|
||||||
|
InstanceId string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response to a GetConsoleOutput request. Note that Output is base64-encoded,
|
||||||
|
// as in the underlying AWS API.
|
||||||
|
//
|
||||||
|
// See http://goo.gl/EY70zb for more details.
|
||||||
|
type GetConsoleOutputResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
InstanceId string `xml:"instanceId"`
|
||||||
|
Timestamp time.Time `xml:"timestamp"`
|
||||||
|
Output string `xml:"output"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetConsoleOutput returns the console output for the sepcified instance. Note
|
||||||
|
// that console output is base64-encoded, as in the underlying AWS API.
|
||||||
|
//
|
||||||
|
// See http://goo.gl/EY70zb for more details.
|
||||||
|
func (ec2 *EC2) GetConsoleOutput(options *GetConsoleOutput) (resp *GetConsoleOutputResp, err error) {
|
||||||
|
params := makeParams("GetConsoleOutput")
|
||||||
|
params["InstanceId"] = options.InstanceId
|
||||||
|
resp = &GetConsoleOutputResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Instance events and status functions and types.
|
||||||
|
|
||||||
|
// The DescribeInstanceStatus type encapsulates options for the respective request in EC2.
|
||||||
|
//
|
||||||
|
// See http://goo.gl/DFySJY for more details.
|
||||||
|
type EventsSet struct {
|
||||||
|
Code string `xml:"code"`
|
||||||
|
Description string `xml:"description"`
|
||||||
|
NotBefore string `xml:"notBefore"`
|
||||||
|
NotAfter string `xml:"notAfter"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type StatusDetails struct {
|
||||||
|
Name string `xml:"name"`
|
||||||
|
Status string `xml:"status"`
|
||||||
|
ImpairedSince string `xml:"impairedSince"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Status struct {
|
||||||
|
Status string `xml:"status"`
|
||||||
|
Details []StatusDetails `xml:"details>item"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type InstanceStatusSet struct {
|
||||||
|
InstanceId string `xml:"instanceId"`
|
||||||
|
AvailabilityZone string `xml:"availabilityZone"`
|
||||||
|
InstanceState InstanceState `xml:"instanceState"`
|
||||||
|
SystemStatus Status `xml:"systemStatus"`
|
||||||
|
InstanceStatus Status `xml:"instanceStatus"`
|
||||||
|
Events []EventsSet `xml:"eventsSet>item"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DescribeInstanceStatusResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
InstanceStatus []InstanceStatusSet `xml:"instanceStatusSet>item"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DescribeInstanceStatus struct {
|
||||||
|
InstanceIds []string
|
||||||
|
IncludeAllInstances bool
|
||||||
|
MaxResults int64
|
||||||
|
NextToken string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ec2 *EC2) DescribeInstanceStatus(options *DescribeInstanceStatus, filter *Filter) (resp *DescribeInstanceStatusResp, err error) {
|
||||||
|
params := makeParams("DescribeInstanceStatus")
|
||||||
|
if options.IncludeAllInstances {
|
||||||
|
params["IncludeAllInstances"] = "true"
|
||||||
|
}
|
||||||
|
if len(options.InstanceIds) > 0 {
|
||||||
|
addParamsList(params, "InstanceId", options.InstanceIds)
|
||||||
|
}
|
||||||
|
if options.MaxResults > 0 {
|
||||||
|
params["MaxResults"] = strconv.FormatInt(options.MaxResults, 10)
|
||||||
|
}
|
||||||
|
if options.NextToken != "" {
|
||||||
|
params["NextToken"] = options.NextToken
|
||||||
|
}
|
||||||
|
if filter != nil {
|
||||||
|
filter.addParams(params)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &DescribeInstanceStatusResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Spot Instance management functions and types.
|
// Spot Instance management functions and types.
|
||||||
|
|
||||||
@ -643,6 +776,61 @@ func (ec2 *EC2) CancelSpotRequests(spotrequestIds []string) (resp *CancelSpotReq
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DescribeSpotPriceHistory struct {
|
||||||
|
InstanceType []string
|
||||||
|
ProductDescription []string
|
||||||
|
AvailabilityZone string
|
||||||
|
StartTime, EndTime time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response to a DescribeSpotPriceHisotyr request.
|
||||||
|
//
|
||||||
|
// See http://goo.gl/3BKHj for more details.
|
||||||
|
type DescribeSpotPriceHistoryResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
History []SpotPriceHistory `xml:"spotPriceHistorySet>item"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SpotPriceHistory struct {
|
||||||
|
InstanceType string `xml:"instanceType"`
|
||||||
|
ProductDescription string `xml:"productDescription"`
|
||||||
|
SpotPrice string `xml:"spotPrice"`
|
||||||
|
Timestamp time.Time `xml:"timestamp"`
|
||||||
|
AvailabilityZone string `xml:"availabilityZone"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DescribeSpotPriceHistory gets the spot pricing history.
|
||||||
|
//
|
||||||
|
// See http://goo.gl/3BKHj for more details.
|
||||||
|
func (ec2 *EC2) DescribeSpotPriceHistory(o *DescribeSpotPriceHistory) (resp *DescribeSpotPriceHistoryResp, err error) {
|
||||||
|
params := makeParams("DescribeSpotPriceHistory")
|
||||||
|
if o.AvailabilityZone != "" {
|
||||||
|
params["AvailabilityZone"] = o.AvailabilityZone
|
||||||
|
}
|
||||||
|
|
||||||
|
if !o.StartTime.IsZero() {
|
||||||
|
params["StartTime"] = o.StartTime.In(time.UTC).Format(time.RFC3339)
|
||||||
|
}
|
||||||
|
if !o.EndTime.IsZero() {
|
||||||
|
params["EndTime"] = o.EndTime.In(time.UTC).Format(time.RFC3339)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(o.InstanceType) > 0 {
|
||||||
|
addParamsList(params, "InstanceType", o.InstanceType)
|
||||||
|
}
|
||||||
|
if len(o.ProductDescription) > 0 {
|
||||||
|
addParamsList(params, "ProductDescription", o.ProductDescription)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &DescribeSpotPriceHistoryResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Response to a TerminateInstances request.
|
// Response to a TerminateInstances request.
|
||||||
//
|
//
|
||||||
// See http://goo.gl/3BKHj for more details.
|
// See http://goo.gl/3BKHj for more details.
|
||||||
@ -871,6 +1059,47 @@ func (ec2 *EC2) Volumes(volIds []string, filter *Filter) (resp *VolumesResp, err
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Availability zone management functions and types.
|
||||||
|
// See http://goo.gl/ylxT4R for more details.
|
||||||
|
|
||||||
|
// DescribeAvailabilityZonesResp represents a response to a DescribeAvailabilityZones
|
||||||
|
// request in EC2.
|
||||||
|
type DescribeAvailabilityZonesResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
Zones []AvailabilityZoneInfo `xml:"availabilityZoneInfo>item"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// AvailabilityZoneInfo encapsulates details for an availability zone in EC2.
|
||||||
|
type AvailabilityZoneInfo struct {
|
||||||
|
AvailabilityZone
|
||||||
|
State string `xml:"zoneState"`
|
||||||
|
MessageSet []string `xml:"messageSet>item"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// AvailabilityZone represents an EC2 availability zone.
|
||||||
|
type AvailabilityZone struct {
|
||||||
|
Name string `xml:"zoneName"`
|
||||||
|
Region string `xml:"regionName"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DescribeAvailabilityZones returns details about availability zones in EC2.
|
||||||
|
// The filter parameter is optional, and if provided will limit the
|
||||||
|
// availability zones returned to those matching the given filtering
|
||||||
|
// rules.
|
||||||
|
//
|
||||||
|
// See http://goo.gl/ylxT4R for more details.
|
||||||
|
func (ec2 *EC2) DescribeAvailabilityZones(filter *Filter) (resp *DescribeAvailabilityZonesResp, err error) {
|
||||||
|
params := makeParams("DescribeAvailabilityZones")
|
||||||
|
filter.addParams(params)
|
||||||
|
resp = &DescribeAvailabilityZonesResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// ElasticIp management (for VPC)
|
// ElasticIp management (for VPC)
|
||||||
|
|
||||||
@ -1003,6 +1232,20 @@ func (ec2 *EC2) DisassociateAddress(id string) (resp *SimpleResp, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Disassociate an address from a VPC instance.
|
||||||
|
func (ec2 *EC2) DisassociateAddressClassic(ip string) (resp *SimpleResp, err error) {
|
||||||
|
params := makeParams("DisassociateAddress")
|
||||||
|
params["PublicIp"] = ip
|
||||||
|
|
||||||
|
resp = &SimpleResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// DescribeAddresses returns details about one or more
|
// DescribeAddresses returns details about one or more
|
||||||
// Elastic IP Addresses. Returned addresses can be
|
// Elastic IP Addresses. Returned addresses can be
|
||||||
// filtered by Public IP, Allocation ID or multiple filters
|
// filtered by Public IP, Allocation ID or multiple filters
|
||||||
@ -1683,6 +1926,7 @@ type SecurityGroup struct {
|
|||||||
Name string `xml:"groupName"`
|
Name string `xml:"groupName"`
|
||||||
Description string `xml:"groupDescription"`
|
Description string `xml:"groupDescription"`
|
||||||
VpcId string `xml:"vpcId"`
|
VpcId string `xml:"vpcId"`
|
||||||
|
Tags []Tag `xml:"tagSet>item"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// SecurityGroupNames is a convenience function that
|
// SecurityGroupNames is a convenience function that
|
||||||
@ -1841,6 +2085,28 @@ func (ec2 *EC2) CreateTags(resourceIds []string, tags []Tag) (resp *SimpleResp,
|
|||||||
return resp, nil
|
return resp, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DeleteTags deletes tags.
|
||||||
|
func (ec2 *EC2) DeleteTags(resourceIds []string, tags []Tag) (resp *SimpleResp, err error) {
|
||||||
|
params := makeParams("DeleteTags")
|
||||||
|
addParamsList(params, "ResourceId", resourceIds)
|
||||||
|
|
||||||
|
for j, tag := range tags {
|
||||||
|
params["Tag."+strconv.Itoa(j+1)+".Key"] = tag.Key
|
||||||
|
|
||||||
|
if tag.Value != "" {
|
||||||
|
params["Tag."+strconv.Itoa(j+1)+".Value"] = tag.Value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &SimpleResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
type TagsResp struct {
|
type TagsResp struct {
|
||||||
RequestId string `xml:"requestId"`
|
RequestId string `xml:"requestId"`
|
||||||
Tags []ResourceTag `xml:"tagSet>item"`
|
Tags []ResourceTag `xml:"tagSet>item"`
|
||||||
@ -2125,6 +2391,38 @@ type CreateSubnetResp struct {
|
|||||||
Subnet Subnet `xml:"subnet"`
|
Subnet Subnet `xml:"subnet"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The ModifySubnetAttribute request parameters
|
||||||
|
//
|
||||||
|
// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySubnetAttribute.html
|
||||||
|
type ModifySubnetAttribute struct {
|
||||||
|
SubnetId string
|
||||||
|
MapPublicIpOnLaunch bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type ModifySubnetAttributeResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
Return bool `xml:"return"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// The CreateNetworkAcl request parameters
|
||||||
|
//
|
||||||
|
// http://goo.gl/BZmCRF
|
||||||
|
type CreateNetworkAcl struct {
|
||||||
|
VpcId string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response to a CreateNetworkAcl request
|
||||||
|
type CreateNetworkAclResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
NetworkAcl NetworkAcl `xml:"networkAcl"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response to CreateNetworkAclEntry request
|
||||||
|
type CreateNetworkAclEntryResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
Return bool `xml:"return"`
|
||||||
|
}
|
||||||
|
|
||||||
// Response to a DescribeInternetGateways request.
|
// Response to a DescribeInternetGateways request.
|
||||||
type InternetGatewaysResp struct {
|
type InternetGatewaysResp struct {
|
||||||
RequestId string `xml:"requestId"`
|
RequestId string `xml:"requestId"`
|
||||||
@ -2195,6 +2493,52 @@ type Subnet struct {
|
|||||||
Tags []Tag `xml:"tagSet>item"`
|
Tags []Tag `xml:"tagSet>item"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NetworkAcl represent network acl
|
||||||
|
type NetworkAcl struct {
|
||||||
|
NetworkAclId string `xml:"networkAclId"`
|
||||||
|
VpcId string `xml:"vpcId"`
|
||||||
|
Default string `xml:"default"`
|
||||||
|
EntrySet []NetworkAclEntry `xml:"entrySet>item"`
|
||||||
|
AssociationSet []NetworkAclAssociation `xml:"associationSet>item"`
|
||||||
|
Tags []Tag `xml:"tagSet>item"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkAclAssociation
|
||||||
|
type NetworkAclAssociation struct {
|
||||||
|
NetworkAclAssociationId string `xml:"networkAclAssociationId"`
|
||||||
|
NetworkAclId string `xml:"networkAclId"`
|
||||||
|
SubnetId string `xml:"subnetId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkAclEntry represent a rule within NetworkAcl
|
||||||
|
type NetworkAclEntry struct {
|
||||||
|
RuleNumber int `xml:"ruleNumber"`
|
||||||
|
Protocol int `xml:"protocol"`
|
||||||
|
RuleAction string `xml:"ruleAction"`
|
||||||
|
Egress bool `xml:"egress"`
|
||||||
|
CidrBlock string `xml:"cidrBlock"`
|
||||||
|
IcmpCode IcmpCode `xml:"icmpTypeCode"`
|
||||||
|
PortRange PortRange `xml:"portRange"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// IcmpCode
|
||||||
|
type IcmpCode struct {
|
||||||
|
Code int `xml:"code"`
|
||||||
|
Type int `xml:"type"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PortRange
|
||||||
|
type PortRange struct {
|
||||||
|
From int `xml:"from"`
|
||||||
|
To int `xml:"to"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response to describe NetworkAcls
|
||||||
|
type NetworkAclsResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
NetworkAcls []NetworkAcl `xml:"networkAclSet>item"`
|
||||||
|
}
|
||||||
|
|
||||||
// VPC represents a single VPC.
|
// VPC represents a single VPC.
|
||||||
type VPC struct {
|
type VPC struct {
|
||||||
VpcId string `xml:"vpcId"`
|
VpcId string `xml:"vpcId"`
|
||||||
@ -2331,6 +2675,26 @@ func (ec2 *EC2) DeleteSubnet(id string) (resp *SimpleResp, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ModifySubnetAttribute
|
||||||
|
//
|
||||||
|
// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-ModifySubnetAttribute.html
|
||||||
|
func (ec2 *EC2) ModifySubnetAttribute(options *ModifySubnetAttribute) (resp *ModifySubnetAttributeResp, err error) {
|
||||||
|
params := makeParams("ModifySubnetAttribute")
|
||||||
|
params["SubnetId"] = options.SubnetId
|
||||||
|
if options.MapPublicIpOnLaunch {
|
||||||
|
params["MapPublicIpOnLaunch.Value"] = "true"
|
||||||
|
} else {
|
||||||
|
params["MapPublicIpOnLaunch.Value"] = "false"
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &ModifySubnetAttributeResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// DescribeSubnets
|
// DescribeSubnets
|
||||||
//
|
//
|
||||||
// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html
|
// http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSubnets.html
|
||||||
@ -2348,6 +2712,130 @@ func (ec2 *EC2) DescribeSubnets(ids []string, filter *Filter) (resp *SubnetsResp
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateNetworkAcl creates a network ACL in a VPC.
|
||||||
|
//
|
||||||
|
// http://goo.gl/51X7db
|
||||||
|
func (ec2 *EC2) CreateNetworkAcl(options *CreateNetworkAcl) (resp *CreateNetworkAclResp, err error) {
|
||||||
|
params := makeParams("CreateNetworkAcl")
|
||||||
|
params["VpcId"] = options.VpcId
|
||||||
|
|
||||||
|
resp = &CreateNetworkAclResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateNetworkAclEntry creates an entry (a rule) in a network ACL with the specified rule number.
|
||||||
|
//
|
||||||
|
// http://goo.gl/BtXhtj
|
||||||
|
func (ec2 *EC2) CreateNetworkAclEntry(networkAclId string, options *NetworkAclEntry) (resp *CreateNetworkAclEntryResp, err error) {
|
||||||
|
|
||||||
|
params := makeParams("CreateNetworkAclEntry")
|
||||||
|
params["NetworkAclId"] = networkAclId
|
||||||
|
params["RuleNumber"] = strconv.Itoa(options.RuleNumber)
|
||||||
|
params["Protocol"] = strconv.Itoa(options.Protocol)
|
||||||
|
params["RuleAction"] = options.RuleAction
|
||||||
|
params["Egress"] = strconv.FormatBool(options.Egress)
|
||||||
|
params["CidrBlock"] = options.CidrBlock
|
||||||
|
if params["Protocol"] == "-1" {
|
||||||
|
params["Icmp.Type"] = strconv.Itoa(options.IcmpCode.Type)
|
||||||
|
params["Icmp.Code"] = strconv.Itoa(options.IcmpCode.Code)
|
||||||
|
}
|
||||||
|
params["PortRange.From"] = strconv.Itoa(options.PortRange.From)
|
||||||
|
params["PortRange.To"] = strconv.Itoa(options.PortRange.To)
|
||||||
|
|
||||||
|
resp = &CreateNetworkAclEntryResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NetworkAcls describes one or more of your network ACLs for given filter.
|
||||||
|
//
|
||||||
|
// http://goo.gl/mk9RsV
|
||||||
|
func (ec2 *EC2) NetworkAcls(networkAclIds []string, filter *Filter) (resp *NetworkAclsResp, err error) {
|
||||||
|
params := makeParams("DescribeNetworkAcls")
|
||||||
|
addParamsList(params, "NetworkAclId", networkAclIds)
|
||||||
|
filter.addParams(params)
|
||||||
|
resp = &NetworkAclsResp{}
|
||||||
|
if err = ec2.query(params, resp); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response to a DeleteNetworkAcl request.
|
||||||
|
type DeleteNetworkAclResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
Return bool `xml:"return"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteNetworkAcl deletes the network ACL with specified id.
|
||||||
|
//
|
||||||
|
// http://goo.gl/nC78Wx
|
||||||
|
func (ec2 *EC2) DeleteNetworkAcl(id string) (resp *DeleteNetworkAclResp, err error) {
|
||||||
|
params := makeParams("DeleteNetworkAcl")
|
||||||
|
params["NetworkAclId"] = id
|
||||||
|
|
||||||
|
resp = &DeleteNetworkAclResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response to a DeleteNetworkAclEntry request.
|
||||||
|
type DeleteNetworkAclEntryResp struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
Return bool `xml:"return"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteNetworkAclEntry deletes the specified ingress or egress entry (rule) from the specified network ACL.
|
||||||
|
//
|
||||||
|
// http://goo.gl/moQbE2
|
||||||
|
func (ec2 *EC2) DeleteNetworkAclEntry(id string, ruleNumber int, egress bool) (resp *DeleteNetworkAclEntryResp, err error) {
|
||||||
|
params := makeParams("DeleteNetworkAclEntry")
|
||||||
|
params["NetworkAclId"] = id
|
||||||
|
params["RuleNumber"] = strconv.Itoa(ruleNumber)
|
||||||
|
params["Egress"] = strconv.FormatBool(egress)
|
||||||
|
|
||||||
|
resp = &DeleteNetworkAclEntryResp{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReplaceNetworkAclAssociationResponse struct {
|
||||||
|
RequestId string `xml:"requestId"`
|
||||||
|
NewAssociationId string `xml:"newAssociationId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReplaceNetworkAclAssociation changes which network ACL a subnet is associated with.
|
||||||
|
//
|
||||||
|
// http://goo.gl/ar0MH5
|
||||||
|
func (ec2 *EC2) ReplaceNetworkAclAssociation(associationId string, networkAclId string) (resp *ReplaceNetworkAclAssociationResponse, err error) {
|
||||||
|
params := makeParams("ReplaceNetworkAclAssociation")
|
||||||
|
params["NetworkAclId"] = networkAclId
|
||||||
|
params["AssociationId"] = associationId
|
||||||
|
|
||||||
|
resp = &ReplaceNetworkAclAssociationResponse{}
|
||||||
|
err = ec2.query(params, resp)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Create a new internet gateway.
|
// Create a new internet gateway.
|
||||||
func (ec2 *EC2) CreateInternetGateway(
|
func (ec2 *EC2) CreateInternetGateway(
|
||||||
options *CreateInternetGateway) (resp *CreateInternetGatewayResp, err error) {
|
options *CreateInternetGateway) (resp *CreateInternetGatewayResp, err error) {
|
||||||
|
209
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/ec2_test.go
generated
vendored
209
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/ec2_test.go
generated
vendored
@ -1,12 +1,11 @@
|
|||||||
package ec2_test
|
package ec2_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/mitchellh/goamz/aws"
|
"github.com/mitchellh/goamz/aws"
|
||||||
"github.com/mitchellh/goamz/ec2"
|
"github.com/mitchellh/goamz/ec2"
|
||||||
"github.com/mitchellh/goamz/testutil"
|
"github.com/mitchellh/goamz/testutil"
|
||||||
. "github.com/motain/gocheck"
|
. "github.com/motain/gocheck"
|
||||||
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
@ -95,13 +94,13 @@ func (s *S) TestRunInstancesErrorWithoutXML(c *C) {
|
|||||||
testServer.WaitRequest()
|
testServer.WaitRequest()
|
||||||
|
|
||||||
c.Assert(resp, IsNil)
|
c.Assert(resp, IsNil)
|
||||||
c.Assert(err, ErrorMatches, "500 Internal Server Error")
|
c.Assert(err, ErrorMatches, "")
|
||||||
|
|
||||||
ec2err, ok := err.(*ec2.Error)
|
ec2err, ok := err.(*ec2.Error)
|
||||||
c.Assert(ok, Equals, true)
|
c.Assert(ok, Equals, true)
|
||||||
c.Assert(ec2err.StatusCode, Equals, 500)
|
c.Assert(ec2err.StatusCode, Equals, 500)
|
||||||
c.Assert(ec2err.Code, Equals, "")
|
c.Assert(ec2err.Code, Equals, "")
|
||||||
c.Assert(ec2err.Message, Equals, "500 Internal Server Error")
|
c.Assert(ec2err.Message, Equals, "")
|
||||||
c.Assert(ec2err.RequestId, Equals, "")
|
c.Assert(ec2err.RequestId, Equals, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,13 +113,13 @@ func (s *S) TestRequestSpotInstancesErrorWithoutXML(c *C) {
|
|||||||
testServer.WaitRequest()
|
testServer.WaitRequest()
|
||||||
|
|
||||||
c.Assert(resp, IsNil)
|
c.Assert(resp, IsNil)
|
||||||
c.Assert(err, ErrorMatches, "500 Internal Server Error")
|
c.Assert(err, ErrorMatches, "")
|
||||||
|
|
||||||
ec2err, ok := err.(*ec2.Error)
|
ec2err, ok := err.(*ec2.Error)
|
||||||
c.Assert(ok, Equals, true)
|
c.Assert(ok, Equals, true)
|
||||||
c.Assert(ec2err.StatusCode, Equals, 500)
|
c.Assert(ec2err.StatusCode, Equals, 500)
|
||||||
c.Assert(ec2err.Code, Equals, "")
|
c.Assert(ec2err.Code, Equals, "")
|
||||||
c.Assert(ec2err.Message, Equals, "500 Internal Server Error")
|
c.Assert(ec2err.Message, Equals, "")
|
||||||
c.Assert(ec2err.RequestId, Equals, "")
|
c.Assert(ec2err.RequestId, Equals, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,10 +135,12 @@ func (s *S) TestRunInstancesExample(c *C) {
|
|||||||
KernelId: "kernel-id",
|
KernelId: "kernel-id",
|
||||||
RamdiskId: "ramdisk-id",
|
RamdiskId: "ramdisk-id",
|
||||||
AvailZone: "zone",
|
AvailZone: "zone",
|
||||||
|
Tenancy: "dedicated",
|
||||||
PlacementGroupName: "group",
|
PlacementGroupName: "group",
|
||||||
Monitoring: true,
|
Monitoring: true,
|
||||||
SubnetId: "subnet-id",
|
SubnetId: "subnet-id",
|
||||||
DisableAPITermination: true,
|
DisableAPITermination: true,
|
||||||
|
EbsOptimized: true,
|
||||||
ShutdownBehavior: "terminate",
|
ShutdownBehavior: "terminate",
|
||||||
PrivateIPAddress: "10.0.0.25",
|
PrivateIPAddress: "10.0.0.25",
|
||||||
BlockDevices: []ec2.BlockDeviceMapping{
|
BlockDevices: []ec2.BlockDeviceMapping{
|
||||||
@ -168,6 +169,7 @@ func (s *S) TestRunInstancesExample(c *C) {
|
|||||||
c.Assert(req.Form["Monitoring.Enabled"], DeepEquals, []string{"true"})
|
c.Assert(req.Form["Monitoring.Enabled"], DeepEquals, []string{"true"})
|
||||||
c.Assert(req.Form["SubnetId"], DeepEquals, []string{"subnet-id"})
|
c.Assert(req.Form["SubnetId"], DeepEquals, []string{"subnet-id"})
|
||||||
c.Assert(req.Form["DisableApiTermination"], DeepEquals, []string{"true"})
|
c.Assert(req.Form["DisableApiTermination"], DeepEquals, []string{"true"})
|
||||||
|
c.Assert(req.Form["EbsOptimized"], DeepEquals, []string{"true"})
|
||||||
c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], DeepEquals, []string{"terminate"})
|
c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], DeepEquals, []string{"terminate"})
|
||||||
c.Assert(req.Form["PrivateIpAddress"], DeepEquals, []string{"10.0.0.25"})
|
c.Assert(req.Form["PrivateIpAddress"], DeepEquals, []string{"10.0.0.25"})
|
||||||
c.Assert(req.Form["BlockDeviceMapping.1.DeviceName"], DeepEquals, []string{"/dev/sdb"})
|
c.Assert(req.Form["BlockDeviceMapping.1.DeviceName"], DeepEquals, []string{"/dev/sdb"})
|
||||||
@ -304,6 +306,7 @@ func (s *S) TestTerminateInstancesExample(c *C) {
|
|||||||
c.Assert(req.Form["Monitoring.Enabled"], IsNil)
|
c.Assert(req.Form["Monitoring.Enabled"], IsNil)
|
||||||
c.Assert(req.Form["SubnetId"], IsNil)
|
c.Assert(req.Form["SubnetId"], IsNil)
|
||||||
c.Assert(req.Form["DisableApiTermination"], IsNil)
|
c.Assert(req.Form["DisableApiTermination"], IsNil)
|
||||||
|
c.Assert(req.Form["EbsOptimized"], IsNil)
|
||||||
c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], IsNil)
|
c.Assert(req.Form["InstanceInitiatedShutdownBehavior"], IsNil)
|
||||||
c.Assert(req.Form["PrivateIpAddress"], IsNil)
|
c.Assert(req.Form["PrivateIpAddress"], IsNil)
|
||||||
|
|
||||||
@ -372,6 +375,13 @@ func (s *S) TestDescribeInstancesExample1(c *C) {
|
|||||||
c.Assert(r0i.PrivateDNSName, Equals, "domU-12-31-39-10-56-34.compute-1.internal")
|
c.Assert(r0i.PrivateDNSName, Equals, "domU-12-31-39-10-56-34.compute-1.internal")
|
||||||
c.Assert(r0i.DNSName, Equals, "ec2-174-129-165-232.compute-1.amazonaws.com")
|
c.Assert(r0i.DNSName, Equals, "ec2-174-129-165-232.compute-1.amazonaws.com")
|
||||||
c.Assert(r0i.AvailZone, Equals, "us-east-1b")
|
c.Assert(r0i.AvailZone, Equals, "us-east-1b")
|
||||||
|
|
||||||
|
b0 := r0i.BlockDevices[0]
|
||||||
|
c.Assert(b0.DeviceName, Equals, "/dev/sda1")
|
||||||
|
c.Assert(b0.VolumeId, Equals, "vol-a082c1c9")
|
||||||
|
c.Assert(b0.Status, Equals, "attached")
|
||||||
|
c.Assert(b0.AttachTime, Equals, "2010-08-17T01:15:21.000Z")
|
||||||
|
c.Assert(b0.DeleteOnTermination, Equals, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *S) TestDescribeInstancesExample2(c *C) {
|
func (s *S) TestDescribeInstancesExample2(c *C) {
|
||||||
@ -1044,7 +1054,32 @@ func (s *S) TestSignatureWithEndpointPath(c *C) {
|
|||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
req := testServer.WaitRequest()
|
req := testServer.WaitRequest()
|
||||||
c.Assert(req.Form["Signature"], DeepEquals, []string{"QmvgkYGn19WirCuCz/jRp3RmRgFwWR5WRkKZ5AZnyXQ="})
|
c.Assert(req.Form["Signature"], DeepEquals, []string{"tyOTQ0c0T5ujskCPTWa5ATMtv7UyErgT339cU8O2+Q8="})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDescribeInstanceStatusExample(c *C) {
|
||||||
|
testServer.Response(200, nil, DescribeInstanceStatusExample)
|
||||||
|
options := &ec2.DescribeInstanceStatus{}
|
||||||
|
resp, err := s.ec2.DescribeInstanceStatus(options, nil)
|
||||||
|
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeInstanceStatus"})
|
||||||
|
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "3be1508e-c444-4fef-89cc-0b1223c4f02fEXAMPLE")
|
||||||
|
c.Assert(resp.InstanceStatus[0].InstanceId, Equals, "i-1a2b3c4d")
|
||||||
|
c.Assert(resp.InstanceStatus[0].InstanceState.Code, Equals, 16)
|
||||||
|
c.Assert(resp.InstanceStatus[0].SystemStatus.Status, Equals, "impaired")
|
||||||
|
c.Assert(resp.InstanceStatus[0].SystemStatus.Details[0].Name, Equals, "reachability")
|
||||||
|
c.Assert(resp.InstanceStatus[0].SystemStatus.Details[0].Status, Equals, "failed")
|
||||||
|
c.Assert(resp.InstanceStatus[0].SystemStatus.Details[0].ImpairedSince, Equals, "YYYY-MM-DDTHH:MM:SS.000Z")
|
||||||
|
c.Assert(resp.InstanceStatus[0].InstanceStatus.Details[0].Name, Equals, "reachability")
|
||||||
|
c.Assert(resp.InstanceStatus[0].InstanceStatus.Details[0].Status, Equals, "failed")
|
||||||
|
c.Assert(resp.InstanceStatus[0].InstanceStatus.Details[0].ImpairedSince, Equals, "YYYY-MM-DDTHH:MM:SS.000Z")
|
||||||
|
c.Assert(resp.InstanceStatus[0].Events[0].Code, Equals, "instance-retirement")
|
||||||
|
c.Assert(resp.InstanceStatus[0].Events[0].Description, Equals, "The instance is running on degraded hardware")
|
||||||
|
c.Assert(resp.InstanceStatus[0].Events[0].NotBefore, Equals, "YYYY-MM-DDTHH:MM:SS+0000")
|
||||||
|
c.Assert(resp.InstanceStatus[0].Events[0].NotAfter, Equals, "YYYY-MM-DDTHH:MM:SS+0000")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *S) TestAllocateAddressExample(c *C) {
|
func (s *S) TestAllocateAddressExample(c *C) {
|
||||||
@ -1229,6 +1264,24 @@ func (s *S) TestCreateSubnet(c *C) {
|
|||||||
c.Assert(resp.Subnet.AvailableIpAddressCount, Equals, 251)
|
c.Assert(resp.Subnet.AvailableIpAddressCount, Equals, 251)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *S) TestModifySubnetAttribute(c *C) {
|
||||||
|
testServer.Response(200, nil, ModifySubnetAttributeExample)
|
||||||
|
|
||||||
|
options := &ec2.ModifySubnetAttribute{
|
||||||
|
SubnetId: "foo",
|
||||||
|
MapPublicIpOnLaunch: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.ec2.ModifySubnetAttribute(options)
|
||||||
|
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
c.Assert(req.Form["SubnetId"], DeepEquals, []string{"foo"})
|
||||||
|
c.Assert(req.Form["MapPublicIpOnLaunch.Value"], DeepEquals, []string{"true"})
|
||||||
|
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *S) TestResetImageAttribute(c *C) {
|
func (s *S) TestResetImageAttribute(c *C) {
|
||||||
testServer.Response(200, nil, ResetImageAttributeExample)
|
testServer.Response(200, nil, ResetImageAttributeExample)
|
||||||
|
|
||||||
@ -1241,3 +1294,145 @@ func (s *S) TestResetImageAttribute(c *C) {
|
|||||||
c.Assert(err, IsNil)
|
c.Assert(err, IsNil)
|
||||||
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDescribeAvailabilityZonesExample1(c *C) {
|
||||||
|
testServer.Response(200, nil, DescribeAvailabilityZonesExample1)
|
||||||
|
|
||||||
|
resp, err := s.ec2.DescribeAvailabilityZones(nil)
|
||||||
|
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeAvailabilityZones"})
|
||||||
|
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
|
c.Assert(resp.Zones, HasLen, 4)
|
||||||
|
|
||||||
|
z0 := resp.Zones[0]
|
||||||
|
c.Assert(z0.Name, Equals, "us-east-1a")
|
||||||
|
c.Assert(z0.Region, Equals, "us-east-1")
|
||||||
|
c.Assert(z0.State, Equals, "available")
|
||||||
|
c.Assert(z0.MessageSet, HasLen, 0)
|
||||||
|
|
||||||
|
z1 := resp.Zones[1]
|
||||||
|
c.Assert(z1.Name, Equals, "us-east-1b")
|
||||||
|
c.Assert(z1.Region, Equals, "us-east-1")
|
||||||
|
c.Assert(z1.State, Equals, "available")
|
||||||
|
c.Assert(z1.MessageSet, HasLen, 0)
|
||||||
|
|
||||||
|
z2 := resp.Zones[2]
|
||||||
|
c.Assert(z2.Name, Equals, "us-east-1c")
|
||||||
|
c.Assert(z2.Region, Equals, "us-east-1")
|
||||||
|
c.Assert(z2.State, Equals, "available")
|
||||||
|
c.Assert(z2.MessageSet, HasLen, 0)
|
||||||
|
|
||||||
|
z3 := resp.Zones[3]
|
||||||
|
c.Assert(z3.Name, Equals, "us-east-1d")
|
||||||
|
c.Assert(z3.Region, Equals, "us-east-1")
|
||||||
|
c.Assert(z3.State, Equals, "available")
|
||||||
|
c.Assert(z3.MessageSet, HasLen, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDescribeAvailabilityZonesExample2(c *C) {
|
||||||
|
testServer.Response(200, nil, DescribeAvailabilityZonesExample2)
|
||||||
|
|
||||||
|
resp, err := s.ec2.DescribeAvailabilityZones(nil)
|
||||||
|
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeAvailabilityZones"})
|
||||||
|
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
|
c.Assert(resp.Zones, HasLen, 2)
|
||||||
|
|
||||||
|
z0 := resp.Zones[0]
|
||||||
|
c.Assert(z0.Name, Equals, "us-east-1a")
|
||||||
|
c.Assert(z0.Region, Equals, "us-east-1")
|
||||||
|
c.Assert(z0.State, Equals, "impaired")
|
||||||
|
c.Assert(z0.MessageSet, HasLen, 0)
|
||||||
|
|
||||||
|
z1 := resp.Zones[1]
|
||||||
|
c.Assert(z1.Name, Equals, "us-east-1b")
|
||||||
|
c.Assert(z1.Region, Equals, "us-east-1")
|
||||||
|
c.Assert(z1.State, Equals, "unavailable")
|
||||||
|
c.Assert(z1.MessageSet, DeepEquals, []string{"us-east-1b is currently down for maintenance."})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestCreateNetworkAcl(c *C) {
|
||||||
|
testServer.Response(200, nil, CreateNetworkAclExample)
|
||||||
|
|
||||||
|
options := &ec2.CreateNetworkAcl{
|
||||||
|
VpcId: "vpc-11ad4878",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.ec2.CreateNetworkAcl(options)
|
||||||
|
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
c.Assert(req.Form["VpcId"], DeepEquals, []string{"vpc-11ad4878"})
|
||||||
|
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
|
c.Assert(resp.NetworkAcl.VpcId, Equals, "vpc-11ad4878")
|
||||||
|
c.Assert(resp.NetworkAcl.NetworkAclId, Equals, "acl-5fb85d36")
|
||||||
|
c.Assert(resp.NetworkAcl.Default, Equals, "false")
|
||||||
|
c.Assert(resp.NetworkAcl.EntrySet, HasLen, 2)
|
||||||
|
c.Assert(resp.NetworkAcl.EntrySet[0].RuleNumber, Equals, 32767)
|
||||||
|
c.Assert(resp.NetworkAcl.EntrySet[0].Protocol, Equals, -1)
|
||||||
|
c.Assert(resp.NetworkAcl.EntrySet[0].RuleAction, Equals, "deny")
|
||||||
|
c.Assert(resp.NetworkAcl.EntrySet[0].Egress, Equals, true)
|
||||||
|
c.Assert(resp.NetworkAcl.EntrySet[0].CidrBlock, Equals, "0.0.0.0/0")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestCreateNetworkAclEntry(c *C) {
|
||||||
|
testServer.Response(200, nil, CreateNetworkAclEntryRespExample)
|
||||||
|
|
||||||
|
options := &ec2.NetworkAclEntry{
|
||||||
|
RuleNumber: 32767,
|
||||||
|
Protocol: 6,
|
||||||
|
RuleAction: "deny",
|
||||||
|
Egress: true,
|
||||||
|
CidrBlock: "0.0.0.0/0",
|
||||||
|
PortRange: ec2.PortRange{
|
||||||
|
To: 22,
|
||||||
|
From: 22,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.ec2.CreateNetworkAclEntry("acl-11ad4878", options)
|
||||||
|
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["NetworkAclId"], DeepEquals, []string{"acl-11ad4878"})
|
||||||
|
c.Assert(req.Form["RuleNumber"], DeepEquals, []string{"32767"})
|
||||||
|
c.Assert(req.Form["Protocol"], DeepEquals, []string{"6"})
|
||||||
|
c.Assert(req.Form["RuleAction"], DeepEquals, []string{"deny"})
|
||||||
|
c.Assert(req.Form["Egress"], DeepEquals, []string{"true"})
|
||||||
|
c.Assert(req.Form["CidrBlock"], DeepEquals, []string{"0.0.0.0/0"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDescribeNetworkAcls(c *C) {
|
||||||
|
testServer.Response(200, nil, DescribeNetworkAclsExample)
|
||||||
|
|
||||||
|
filter := ec2.NewFilter()
|
||||||
|
filter.Add("vpc-id", "vpc-5266953b")
|
||||||
|
|
||||||
|
resp, err := s.ec2.NetworkAcls([]string{"acl-5566953c", "acl-5d659634"}, filter)
|
||||||
|
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
|
c.Assert(resp.NetworkAcls, HasLen, 2)
|
||||||
|
c.Assert(resp.NetworkAcls[1].AssociationSet, HasLen, 2)
|
||||||
|
c.Assert(resp.NetworkAcls[1].AssociationSet[0].NetworkAclAssociationId, Equals, "aclassoc-5c659635")
|
||||||
|
c.Assert(resp.NetworkAcls[1].AssociationSet[0].NetworkAclId, Equals, "acl-5d659634")
|
||||||
|
c.Assert(resp.NetworkAcls[1].AssociationSet[0].SubnetId, Equals, "subnet-ff669596")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestReplaceNetworkAclAssociation(c *C) {
|
||||||
|
testServer.Response(200, nil, ReplaceNetworkAclAssociationResponseExample)
|
||||||
|
|
||||||
|
resp, err := s.ec2.ReplaceNetworkAclAssociation("aclassoc-e5b95c8c", "acl-5fb85d36")
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "59dbff89-35bd-4eac-99ed-be587EXAMPLE")
|
||||||
|
c.Assert(resp.NewAssociationId, Equals, "aclassoc-17b85d7e")
|
||||||
|
}
|
||||||
|
1
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/ec2i_test.go
generated
vendored
1
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/ec2i_test.go
generated
vendored
@ -166,6 +166,7 @@ var allRegions = []aws.Region{
|
|||||||
aws.USEast,
|
aws.USEast,
|
||||||
aws.USWest,
|
aws.USWest,
|
||||||
aws.EUWest,
|
aws.EUWest,
|
||||||
|
aws.EUCentral,
|
||||||
aws.APSoutheast,
|
aws.APSoutheast,
|
||||||
aws.APNortheast,
|
aws.APNortheast,
|
||||||
}
|
}
|
||||||
|
353
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/responses_test.go
generated
vendored
353
Godeps/_workspace/src/github.com/mitchellh/goamz/ec2/responses_test.go
generated
vendored
@ -766,6 +766,137 @@ var AllocateAddressExample = `
|
|||||||
</AllocateAddressResponse>
|
</AllocateAddressResponse>
|
||||||
`
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/DFySJY
|
||||||
|
var DescribeInstanceStatusExample = `
|
||||||
|
<DescribeInstanceStatusResponse xmlns="http://ec2.amazonaws.com/doc/2014-06-15/">
|
||||||
|
<requestId>3be1508e-c444-4fef-89cc-0b1223c4f02fEXAMPLE</requestId>
|
||||||
|
<instanceStatusSet>
|
||||||
|
<item>
|
||||||
|
<instanceId>i-1a2b3c4d</instanceId>
|
||||||
|
<availabilityZone>us-east-1d</availabilityZone>
|
||||||
|
<instanceState>
|
||||||
|
<code>16</code>
|
||||||
|
<name>running</name>
|
||||||
|
</instanceState>
|
||||||
|
<systemStatus>
|
||||||
|
<status>impaired</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>failed</status>
|
||||||
|
<impairedSince>YYYY-MM-DDTHH:MM:SS.000Z</impairedSince>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</systemStatus>
|
||||||
|
<instanceStatus>
|
||||||
|
<status>impaired</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>failed</status>
|
||||||
|
<impairedSince>YYYY-MM-DDTHH:MM:SS.000Z</impairedSince>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</instanceStatus>
|
||||||
|
<eventsSet>
|
||||||
|
<item>
|
||||||
|
<code>instance-retirement</code>
|
||||||
|
<description>The instance is running on degraded hardware</description>
|
||||||
|
<notBefore>YYYY-MM-DDTHH:MM:SS+0000</notBefore>
|
||||||
|
<notAfter>YYYY-MM-DDTHH:MM:SS+0000</notAfter>
|
||||||
|
</item>
|
||||||
|
</eventsSet>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<instanceId>i-2a2b3c4d</instanceId>
|
||||||
|
<availabilityZone>us-east-1d</availabilityZone>
|
||||||
|
<instanceState>
|
||||||
|
<code>16</code>
|
||||||
|
<name>running</name>
|
||||||
|
</instanceState>
|
||||||
|
<systemStatus>
|
||||||
|
<status>ok</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>passed</status>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</systemStatus>
|
||||||
|
<instanceStatus>
|
||||||
|
<status>ok</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>passed</status>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</instanceStatus>
|
||||||
|
<eventsSet>
|
||||||
|
<item>
|
||||||
|
<code>instance-reboot</code>
|
||||||
|
<description>The instance is scheduled for a reboot</description>
|
||||||
|
<notBefore>YYYY-MM-DDTHH:MM:SS+0000</notBefore>
|
||||||
|
<notAfter>YYYY-MM-DDTHH:MM:SS+0000</notAfter>
|
||||||
|
</item>
|
||||||
|
</eventsSet>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<instanceId>i-3a2b3c4d</instanceId>
|
||||||
|
<availabilityZone>us-east-1c</availabilityZone>
|
||||||
|
<instanceState>
|
||||||
|
<code>16</code>
|
||||||
|
<name>running</name>
|
||||||
|
</instanceState>
|
||||||
|
<systemStatus>
|
||||||
|
<status>ok</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>passed</status>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</systemStatus>
|
||||||
|
<instanceStatus>
|
||||||
|
<status>ok</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>passed</status>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</instanceStatus>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<instanceId>i-4a2b3c4d</instanceId>
|
||||||
|
<availabilityZone>us-east-1c</availabilityZone>
|
||||||
|
<instanceState>
|
||||||
|
<code>16</code>
|
||||||
|
<name>running</name>
|
||||||
|
</instanceState>
|
||||||
|
<systemStatus>
|
||||||
|
<status>ok</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>passed</status>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</systemStatus>
|
||||||
|
<instanceStatus>
|
||||||
|
<status>insufficient-data</status>
|
||||||
|
<details>
|
||||||
|
<item>
|
||||||
|
<name>reachability</name>
|
||||||
|
<status>insufficient-data</status>
|
||||||
|
</item>
|
||||||
|
</details>
|
||||||
|
</instanceStatus>
|
||||||
|
</item>
|
||||||
|
</instanceStatusSet>
|
||||||
|
</DescribeInstanceStatusResponse>
|
||||||
|
`
|
||||||
|
|
||||||
// http://goo.gl/3Q0oCc
|
// http://goo.gl/3Q0oCc
|
||||||
var ReleaseAddressExample = `
|
var ReleaseAddressExample = `
|
||||||
<ReleaseAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
<ReleaseAddressResponse xmlns="http://ec2.amazonaws.com/doc/2013-10-15/">
|
||||||
@ -845,6 +976,14 @@ var CreateSubnetExample = `
|
|||||||
</CreateSubnetResponse>
|
</CreateSubnetResponse>
|
||||||
`
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/tu2Kxm
|
||||||
|
var ModifySubnetAttributeExample = `
|
||||||
|
<ModifySubnetAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2014-06-15/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<return>true</return>
|
||||||
|
</ModifySubnetAttributeResponse>
|
||||||
|
`
|
||||||
|
|
||||||
// http://goo.gl/r6ZCPm
|
// http://goo.gl/r6ZCPm
|
||||||
var ResetImageAttributeExample = `
|
var ResetImageAttributeExample = `
|
||||||
<ResetImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2014-06-15/">
|
<ResetImageAttributeResponse xmlns="http://ec2.amazonaws.com/doc/2014-06-15/">
|
||||||
@ -852,3 +991,217 @@ var ResetImageAttributeExample = `
|
|||||||
<return>true</return>
|
<return>true</return>
|
||||||
</ResetImageAttributeResponse>
|
</ResetImageAttributeResponse>
|
||||||
`
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/ylxT4R
|
||||||
|
var DescribeAvailabilityZonesExample1 = `
|
||||||
|
<DescribeAvailabilityZonesResponse xmlns="http://ec2.amazonaws.com/doc/2014-05-01/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<availabilityZoneInfo>
|
||||||
|
<item>
|
||||||
|
<zoneName>us-east-1a</zoneName>
|
||||||
|
<zoneState>available</zoneState>
|
||||||
|
<regionName>us-east-1</regionName>
|
||||||
|
<messageSet/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<zoneName>us-east-1b</zoneName>
|
||||||
|
<zoneState>available</zoneState>
|
||||||
|
<regionName>us-east-1</regionName>
|
||||||
|
<messageSet/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<zoneName>us-east-1c</zoneName>
|
||||||
|
<zoneState>available</zoneState>
|
||||||
|
<regionName>us-east-1</regionName>
|
||||||
|
<messageSet/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<zoneName>us-east-1d</zoneName>
|
||||||
|
<zoneState>available</zoneState>
|
||||||
|
<regionName>us-east-1</regionName>
|
||||||
|
<messageSet/>
|
||||||
|
</item>
|
||||||
|
</availabilityZoneInfo>
|
||||||
|
</DescribeAvailabilityZonesResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/ylxT4R
|
||||||
|
var DescribeAvailabilityZonesExample2 = `
|
||||||
|
<DescribeAvailabilityZonesResponse xmlns="http://ec2.amazonaws.com/doc/2014-05-01/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<availabilityZoneInfo>
|
||||||
|
<item>
|
||||||
|
<zoneName>us-east-1a</zoneName>
|
||||||
|
<zoneState>impaired</zoneState>
|
||||||
|
<regionName>us-east-1</regionName>
|
||||||
|
<messageSet/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<zoneName>us-east-1b</zoneName>
|
||||||
|
<zoneState>unavailable</zoneState>
|
||||||
|
<regionName>us-east-1</regionName>
|
||||||
|
<messageSet>
|
||||||
|
<item>us-east-1b is currently down for maintenance.</item>
|
||||||
|
</messageSet>
|
||||||
|
</item>
|
||||||
|
</availabilityZoneInfo>
|
||||||
|
</DescribeAvailabilityZonesResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/sdomyE
|
||||||
|
var CreateNetworkAclExample = `
|
||||||
|
<CreateNetworkAclResponse xmlns="http://ec2.amazonaws.com/doc/2014-10-01/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<networkAcl>
|
||||||
|
<networkAclId>acl-5fb85d36</networkAclId>
|
||||||
|
<vpcId>vpc-11ad4878</vpcId>
|
||||||
|
<default>false</default>
|
||||||
|
<entrySet>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>32767</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>deny</ruleAction>
|
||||||
|
<egress>true</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>32767</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>deny</ruleAction>
|
||||||
|
<egress>false</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
</entrySet>
|
||||||
|
<associationSet/>
|
||||||
|
<tagSet/>
|
||||||
|
</networkAcl>
|
||||||
|
</CreateNetworkAclResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/6sYloC
|
||||||
|
var CreateNetworkAclEntryRespExample = `
|
||||||
|
<CreateNetworkAclEntryResponse xmlns="http://ec2.amazonaws.com/doc/2014-10-01/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<return>true</return>
|
||||||
|
</CreateNetworkAclEntryResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/5tqceF
|
||||||
|
var DescribeNetworkAclsExample = `
|
||||||
|
<DescribeNetworkAclsResponse xmlns="http://ec2.amazonaws.com/doc/2014-10-01/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<networkAclSet>
|
||||||
|
<item>
|
||||||
|
<networkAclId>acl-5566953c</networkAclId>
|
||||||
|
<vpcId>vpc-5266953b</vpcId>
|
||||||
|
<default>true</default>
|
||||||
|
<entrySet>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>100</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>allow</ruleAction>
|
||||||
|
<egress>true</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>32767</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>deny</ruleAction>
|
||||||
|
<egress>true</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>100</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>allow</ruleAction>
|
||||||
|
<egress>false</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>32767</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>deny</ruleAction>
|
||||||
|
<egress>false</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
</entrySet>
|
||||||
|
<associationSet/>
|
||||||
|
<tagSet/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<networkAclId>acl-5d659634</networkAclId>
|
||||||
|
<vpcId>vpc-5266953b</vpcId>
|
||||||
|
<default>false</default>
|
||||||
|
<entrySet>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>110</ruleNumber>
|
||||||
|
<protocol>6</protocol>
|
||||||
|
<ruleAction>allow</ruleAction>
|
||||||
|
<egress>true</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
<portRange>
|
||||||
|
<from>49152</from>
|
||||||
|
<to>65535</to>
|
||||||
|
</portRange>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>32767</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>deny</ruleAction>
|
||||||
|
<egress>true</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>110</ruleNumber>
|
||||||
|
<protocol>6</protocol>
|
||||||
|
<ruleAction>allow</ruleAction>
|
||||||
|
<egress>false</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
<portRange>
|
||||||
|
<from>80</from>
|
||||||
|
<to>80</to>
|
||||||
|
</portRange>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>120</ruleNumber>
|
||||||
|
<protocol>6</protocol>
|
||||||
|
<ruleAction>allow</ruleAction>
|
||||||
|
<egress>false</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
<portRange>
|
||||||
|
<from>443</from>
|
||||||
|
<to>443</to>
|
||||||
|
</portRange>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<ruleNumber>32767</ruleNumber>
|
||||||
|
<protocol>-1</protocol>
|
||||||
|
<ruleAction>deny</ruleAction>
|
||||||
|
<egress>false</egress>
|
||||||
|
<cidrBlock>0.0.0.0/0</cidrBlock>
|
||||||
|
</item>
|
||||||
|
</entrySet>
|
||||||
|
<associationSet>
|
||||||
|
<item>
|
||||||
|
<networkAclAssociationId>aclassoc-5c659635</networkAclAssociationId>
|
||||||
|
<networkAclId>acl-5d659634</networkAclId>
|
||||||
|
<subnetId>subnet-ff669596</subnetId>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<networkAclAssociationId>aclassoc-c26596ab</networkAclAssociationId>
|
||||||
|
<networkAclId>acl-5d659634</networkAclId>
|
||||||
|
<subnetId>subnet-f0669599</subnetId>
|
||||||
|
</item>
|
||||||
|
</associationSet>
|
||||||
|
<tagSet/>
|
||||||
|
</item>
|
||||||
|
</networkAclSet>
|
||||||
|
</DescribeNetworkAclsResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
var ReplaceNetworkAclAssociationResponseExample = `
|
||||||
|
<ReplaceNetworkAclAssociationResponse xmlns="http://ec2.amazonaws.com/doc/2014-10-01/">
|
||||||
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
||||||
|
<newAssociationId>aclassoc-17b85d7e</newAssociationId>
|
||||||
|
</ReplaceNetworkAclAssociationResponse>
|
||||||
|
`
|
||||||
|
575
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/elb.go
generated
vendored
Normal file
575
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/elb.go
generated
vendored
Normal file
@ -0,0 +1,575 @@
|
|||||||
|
// The elb package provides types and functions for interaction with the AWS
|
||||||
|
// Elastic Load Balancing service (ELB)
|
||||||
|
package elb
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/mitchellh/goamz/aws"
|
||||||
|
)
|
||||||
|
|
||||||
|
// The ELB type encapsulates operations operations with the elb endpoint.
|
||||||
|
type ELB struct {
|
||||||
|
aws.Auth
|
||||||
|
aws.Region
|
||||||
|
httpClient *http.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
const APIVersion = "2012-06-01"
|
||||||
|
|
||||||
|
// New creates a new ELB instance.
|
||||||
|
func New(auth aws.Auth, region aws.Region) *ELB {
|
||||||
|
return NewWithClient(auth, region, aws.RetryingClient)
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewWithClient(auth aws.Auth, region aws.Region, httpClient *http.Client) *ELB {
|
||||||
|
return &ELB{auth, region, httpClient}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) query(params map[string]string, resp interface{}) error {
|
||||||
|
params["Version"] = APIVersion
|
||||||
|
params["Timestamp"] = time.Now().In(time.UTC).Format(time.RFC3339)
|
||||||
|
|
||||||
|
endpoint, err := url.Parse(elb.Region.ELBEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
sign(elb.Auth, "GET", "/", params, endpoint.Host)
|
||||||
|
endpoint.RawQuery = multimap(params).Encode()
|
||||||
|
r, err := elb.httpClient.Get(endpoint.String())
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer r.Body.Close()
|
||||||
|
if r.StatusCode > 200 {
|
||||||
|
return buildError(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
decoder := xml.NewDecoder(r.Body)
|
||||||
|
decodedBody := decoder.Decode(resp)
|
||||||
|
|
||||||
|
return decodedBody
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildError(r *http.Response) error {
|
||||||
|
var (
|
||||||
|
err Error
|
||||||
|
errors xmlErrors
|
||||||
|
)
|
||||||
|
xml.NewDecoder(r.Body).Decode(&errors)
|
||||||
|
if len(errors.Errors) > 0 {
|
||||||
|
err = errors.Errors[0]
|
||||||
|
}
|
||||||
|
err.StatusCode = r.StatusCode
|
||||||
|
if err.Message == "" {
|
||||||
|
err.Message = r.Status
|
||||||
|
}
|
||||||
|
return &err
|
||||||
|
}
|
||||||
|
|
||||||
|
func multimap(p map[string]string) url.Values {
|
||||||
|
q := make(url.Values, len(p))
|
||||||
|
for k, v := range p {
|
||||||
|
q[k] = []string{v}
|
||||||
|
}
|
||||||
|
return q
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeParams(action string) map[string]string {
|
||||||
|
params := make(map[string]string)
|
||||||
|
params["Action"] = action
|
||||||
|
return params
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// ELB objects
|
||||||
|
|
||||||
|
// A listener attaches to an elb
|
||||||
|
type Listener struct {
|
||||||
|
InstancePort int64 `xml:"Listener>InstancePort"`
|
||||||
|
InstanceProtocol string `xml:"Listener>InstanceProtocol"`
|
||||||
|
SSLCertificateId string `xml:"Listener>SSLCertificateId"`
|
||||||
|
LoadBalancerPort int64 `xml:"Listener>LoadBalancerPort"`
|
||||||
|
Protocol string `xml:"Listener>Protocol"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// An Instance attaches to an elb
|
||||||
|
type Instance struct {
|
||||||
|
InstanceId string `xml:"InstanceId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// A tag attached to an elb
|
||||||
|
type Tag struct {
|
||||||
|
Key string `xml:"Key"`
|
||||||
|
Value string `xml:"Value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// An InstanceState from an elb health query
|
||||||
|
type InstanceState struct {
|
||||||
|
InstanceId string `xml:"InstanceId"`
|
||||||
|
Description string `xml:"Description"`
|
||||||
|
State string `xml:"State"`
|
||||||
|
ReasonCode string `xml:"ReasonCode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// AddTags
|
||||||
|
|
||||||
|
type AddTags struct {
|
||||||
|
LoadBalancerNames []string
|
||||||
|
Tags []Tag
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddTagsResp struct {
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) AddTags(options *AddTags) (resp *AddTagsResp, err error) {
|
||||||
|
params := makeParams("AddTags")
|
||||||
|
|
||||||
|
for i, v := range options.LoadBalancerNames {
|
||||||
|
params["LoadBalancerNames.member."+strconv.Itoa(i+1)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range options.Tags {
|
||||||
|
params["Tags.member."+strconv.Itoa(i+1)+".Key"] = v.Key
|
||||||
|
params["Tags.member."+strconv.Itoa(i+1)+".Value"] = v.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &AddTagsResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// RemoveTags
|
||||||
|
|
||||||
|
type RemoveTags struct {
|
||||||
|
LoadBalancerNames []string
|
||||||
|
TagKeys []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoveTagsResp struct {
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) RemoveTags(options *RemoveTags) (resp *RemoveTagsResp, err error) {
|
||||||
|
params := makeParams("RemoveTags")
|
||||||
|
|
||||||
|
for i, v := range options.LoadBalancerNames {
|
||||||
|
params["LoadBalancerNames.member."+strconv.Itoa(i+1)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range options.TagKeys {
|
||||||
|
params["Tags.member."+strconv.Itoa(i+1)+".Key"] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &RemoveTagsResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Create
|
||||||
|
|
||||||
|
// The CreateLoadBalancer request parameters
|
||||||
|
type CreateLoadBalancer struct {
|
||||||
|
AvailZone []string
|
||||||
|
Listeners []Listener
|
||||||
|
LoadBalancerName string
|
||||||
|
Internal bool // true for vpc elbs
|
||||||
|
SecurityGroups []string
|
||||||
|
Subnets []string
|
||||||
|
Tags []Tag
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateLoadBalancerResp struct {
|
||||||
|
DNSName string `xml:"CreateLoadBalancerResult>DNSName"`
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) CreateLoadBalancer(options *CreateLoadBalancer) (resp *CreateLoadBalancerResp, err error) {
|
||||||
|
params := makeParams("CreateLoadBalancer")
|
||||||
|
|
||||||
|
params["LoadBalancerName"] = options.LoadBalancerName
|
||||||
|
|
||||||
|
for i, v := range options.AvailZone {
|
||||||
|
params["AvailabilityZones.member."+strconv.Itoa(i+1)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range options.SecurityGroups {
|
||||||
|
params["SecurityGroups.member."+strconv.Itoa(i+1)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range options.Subnets {
|
||||||
|
params["Subnets.member."+strconv.Itoa(i+1)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range options.Listeners {
|
||||||
|
params["Listeners.member."+strconv.Itoa(i+1)+".LoadBalancerPort"] = strconv.FormatInt(v.LoadBalancerPort, 10)
|
||||||
|
params["Listeners.member."+strconv.Itoa(i+1)+".InstancePort"] = strconv.FormatInt(v.InstancePort, 10)
|
||||||
|
params["Listeners.member."+strconv.Itoa(i+1)+".Protocol"] = v.Protocol
|
||||||
|
params["Listeners.member."+strconv.Itoa(i+1)+".InstanceProtocol"] = v.InstanceProtocol
|
||||||
|
params["Listeners.member."+strconv.Itoa(i+1)+".SSLCertificateId"] = v.SSLCertificateId
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, v := range options.Tags {
|
||||||
|
params["Tags.member."+strconv.Itoa(i+1)+".Key"] = v.Key
|
||||||
|
params["Tags.member."+strconv.Itoa(i+1)+".Value"] = v.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.Internal {
|
||||||
|
params["Scheme"] = "internal"
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &CreateLoadBalancerResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Destroy
|
||||||
|
|
||||||
|
// The DestroyLoadBalancer request parameters
|
||||||
|
type DeleteLoadBalancer struct {
|
||||||
|
LoadBalancerName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) DeleteLoadBalancer(options *DeleteLoadBalancer) (resp *SimpleResp, err error) {
|
||||||
|
params := makeParams("DeleteLoadBalancer")
|
||||||
|
|
||||||
|
params["LoadBalancerName"] = options.LoadBalancerName
|
||||||
|
|
||||||
|
resp = &SimpleResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Describe
|
||||||
|
|
||||||
|
// An individual load balancer
|
||||||
|
type LoadBalancer struct {
|
||||||
|
LoadBalancerName string `xml:"LoadBalancerName"`
|
||||||
|
Listeners []Listener `xml:"ListenerDescriptions>member"`
|
||||||
|
Instances []Instance `xml:"Instances>member"`
|
||||||
|
HealthCheck HealthCheck `xml:"HealthCheck"`
|
||||||
|
AvailabilityZones []string `xml:"AvailabilityZones>member"`
|
||||||
|
HostedZoneNameID string `xml:"CanonicalHostedZoneNameID"`
|
||||||
|
DNSName string `xml:"DNSName"`
|
||||||
|
SecurityGroups []string `xml:"SecurityGroups>member"`
|
||||||
|
Scheme string `xml:"Scheme"`
|
||||||
|
Subnets []string `xml:"Subnets>member"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DescribeLoadBalancer request params
|
||||||
|
type DescribeLoadBalancer struct {
|
||||||
|
Names []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type DescribeLoadBalancersResp struct {
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
LoadBalancers []LoadBalancer `xml:"DescribeLoadBalancersResult>LoadBalancerDescriptions>member"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) DescribeLoadBalancers(options *DescribeLoadBalancer) (resp *DescribeLoadBalancersResp, err error) {
|
||||||
|
params := makeParams("DescribeLoadBalancers")
|
||||||
|
|
||||||
|
for i, v := range options.Names {
|
||||||
|
params["LoadBalancerNames.member."+strconv.Itoa(i+1)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &DescribeLoadBalancersResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Attributes
|
||||||
|
|
||||||
|
type AccessLog struct {
|
||||||
|
EmitInterval int64
|
||||||
|
Enabled bool
|
||||||
|
S3BucketName string
|
||||||
|
S3BucketPrefix string
|
||||||
|
}
|
||||||
|
|
||||||
|
type ConnectionDraining struct {
|
||||||
|
Enabled bool
|
||||||
|
Timeout int64
|
||||||
|
}
|
||||||
|
|
||||||
|
type LoadBalancerAttributes struct {
|
||||||
|
CrossZoneLoadBalancingEnabled bool
|
||||||
|
ConnectionSettingsIdleTimeout int64
|
||||||
|
ConnectionDraining ConnectionDraining
|
||||||
|
AccessLog AccessLog
|
||||||
|
}
|
||||||
|
|
||||||
|
type ModifyLoadBalancerAttributes struct {
|
||||||
|
LoadBalancerName string
|
||||||
|
LoadBalancerAttributes LoadBalancerAttributes
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) ModifyLoadBalancerAttributes(options *ModifyLoadBalancerAttributes) (resp *SimpleResp, err error) {
|
||||||
|
params := makeParams("ModifyLoadBalancerAttributes")
|
||||||
|
|
||||||
|
params["LoadBalancerName"] = options.LoadBalancerName
|
||||||
|
params["LoadBalancerAttributes.CrossZoneLoadBalancing.Enabled"] = strconv.FormatBool(options.LoadBalancerAttributes.CrossZoneLoadBalancingEnabled)
|
||||||
|
if options.LoadBalancerAttributes.ConnectionSettingsIdleTimeout > 0 {
|
||||||
|
params["LoadBalancerAttributes.ConnectionSettings.IdleTimeout"] = strconv.Itoa(int(options.LoadBalancerAttributes.ConnectionSettingsIdleTimeout))
|
||||||
|
}
|
||||||
|
if options.LoadBalancerAttributes.ConnectionDraining.Timeout > 0 {
|
||||||
|
params["LoadBalancerAttributes.ConnectionDraining.Timeout"] = strconv.Itoa(int(options.LoadBalancerAttributes.ConnectionDraining.Timeout))
|
||||||
|
}
|
||||||
|
params["LoadBalancerAttributes.ConnectionDraining.Enabled"] = strconv.FormatBool(options.LoadBalancerAttributes.ConnectionDraining.Enabled)
|
||||||
|
params["LoadBalancerAttributes.AccessLog.Enabled"] = strconv.FormatBool(options.LoadBalancerAttributes.AccessLog.Enabled)
|
||||||
|
if options.LoadBalancerAttributes.AccessLog.Enabled {
|
||||||
|
params["LoadBalancerAttributes.AccessLog.EmitInterval"] = strconv.Itoa(int(options.LoadBalancerAttributes.AccessLog.EmitInterval))
|
||||||
|
params["LoadBalancerAttributes.AccessLog.S3BucketName"] = options.LoadBalancerAttributes.AccessLog.S3BucketName
|
||||||
|
params["LoadBalancerAttributes.AccessLog.S3BucketPrefix"] = options.LoadBalancerAttributes.AccessLog.S3BucketPrefix
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &SimpleResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Instance Registration / deregistration
|
||||||
|
|
||||||
|
// The RegisterInstancesWithLoadBalancer request parameters
|
||||||
|
type RegisterInstancesWithLoadBalancer struct {
|
||||||
|
LoadBalancerName string
|
||||||
|
Instances []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type RegisterInstancesWithLoadBalancerResp struct {
|
||||||
|
Instances []Instance `xml:"RegisterInstancesWithLoadBalancerResult>Instances>member"`
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) RegisterInstancesWithLoadBalancer(options *RegisterInstancesWithLoadBalancer) (resp *RegisterInstancesWithLoadBalancerResp, err error) {
|
||||||
|
params := makeParams("RegisterInstancesWithLoadBalancer")
|
||||||
|
|
||||||
|
params["LoadBalancerName"] = options.LoadBalancerName
|
||||||
|
|
||||||
|
for i, v := range options.Instances {
|
||||||
|
params["Instances.member."+strconv.Itoa(i+1)+".InstanceId"] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &RegisterInstancesWithLoadBalancerResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// The DeregisterInstancesFromLoadBalancer request parameters
|
||||||
|
type DeregisterInstancesFromLoadBalancer struct {
|
||||||
|
LoadBalancerName string
|
||||||
|
Instances []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type DeregisterInstancesFromLoadBalancerResp struct {
|
||||||
|
Instances []Instance `xml:"DeregisterInstancesFromLoadBalancerResult>Instances>member"`
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) DeregisterInstancesFromLoadBalancer(options *DeregisterInstancesFromLoadBalancer) (resp *DeregisterInstancesFromLoadBalancerResp, err error) {
|
||||||
|
params := makeParams("DeregisterInstancesFromLoadBalancer")
|
||||||
|
|
||||||
|
params["LoadBalancerName"] = options.LoadBalancerName
|
||||||
|
|
||||||
|
for i, v := range options.Instances {
|
||||||
|
params["Instances.member."+strconv.Itoa(i+1)+".InstanceId"] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &DeregisterInstancesFromLoadBalancerResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// DescribeTags
|
||||||
|
|
||||||
|
type DescribeTags struct {
|
||||||
|
LoadBalancerNames []string
|
||||||
|
}
|
||||||
|
|
||||||
|
type LoadBalancerTag struct {
|
||||||
|
Tags []Tag `xml:"Tags>member"`
|
||||||
|
LoadBalancerName string `xml:"LoadBalancerName"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type DescribeTagsResp struct {
|
||||||
|
LoadBalancerTags []LoadBalancerTag `xml:"DescribeTagsResult>TagDescriptions>member"`
|
||||||
|
NextToken string `xml:"DescribeTagsResult>NextToken"`
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) DescribeTags(options *DescribeTags) (resp *DescribeTagsResp, err error) {
|
||||||
|
params := makeParams("DescribeTags")
|
||||||
|
|
||||||
|
for i, v := range options.LoadBalancerNames {
|
||||||
|
params["LoadBalancerNames.member."+strconv.Itoa(i+1)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
resp = &DescribeTagsResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Health Checks
|
||||||
|
|
||||||
|
type HealthCheck struct {
|
||||||
|
HealthyThreshold int64 `xml:"HealthyThreshold"`
|
||||||
|
UnhealthyThreshold int64 `xml:"UnhealthyThreshold"`
|
||||||
|
Interval int64 `xml:"Interval"`
|
||||||
|
Target string `xml:"Target"`
|
||||||
|
Timeout int64 `xml:"Timeout"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ConfigureHealthCheck struct {
|
||||||
|
LoadBalancerName string
|
||||||
|
Check HealthCheck
|
||||||
|
}
|
||||||
|
|
||||||
|
type ConfigureHealthCheckResp struct {
|
||||||
|
Check HealthCheck `xml:"ConfigureHealthCheckResult>HealthCheck"`
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) ConfigureHealthCheck(options *ConfigureHealthCheck) (resp *ConfigureHealthCheckResp, err error) {
|
||||||
|
params := makeParams("ConfigureHealthCheck")
|
||||||
|
|
||||||
|
params["LoadBalancerName"] = options.LoadBalancerName
|
||||||
|
params["HealthCheck.HealthyThreshold"] = strconv.Itoa(int(options.Check.HealthyThreshold))
|
||||||
|
params["HealthCheck.UnhealthyThreshold"] = strconv.Itoa(int(options.Check.UnhealthyThreshold))
|
||||||
|
params["HealthCheck.Interval"] = strconv.Itoa(int(options.Check.Interval))
|
||||||
|
params["HealthCheck.Target"] = options.Check.Target
|
||||||
|
params["HealthCheck.Timeout"] = strconv.Itoa(int(options.Check.Timeout))
|
||||||
|
|
||||||
|
resp = &ConfigureHealthCheckResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Instance Health
|
||||||
|
|
||||||
|
// The DescribeInstanceHealth request parameters
|
||||||
|
type DescribeInstanceHealth struct {
|
||||||
|
LoadBalancerName string
|
||||||
|
}
|
||||||
|
|
||||||
|
type DescribeInstanceHealthResp struct {
|
||||||
|
InstanceStates []InstanceState `xml:"DescribeInstanceHealthResult>InstanceStates>member"`
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (elb *ELB) DescribeInstanceHealth(options *DescribeInstanceHealth) (resp *DescribeInstanceHealthResp, err error) {
|
||||||
|
params := makeParams("DescribeInstanceHealth")
|
||||||
|
|
||||||
|
params["LoadBalancerName"] = options.LoadBalancerName
|
||||||
|
|
||||||
|
resp = &DescribeInstanceHealthResp{}
|
||||||
|
|
||||||
|
err = elb.query(params, resp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
resp = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Responses
|
||||||
|
|
||||||
|
type SimpleResp struct {
|
||||||
|
RequestId string `xml:"ResponseMetadata>RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type xmlErrors struct {
|
||||||
|
Errors []Error `xml:"Error"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error encapsulates an elb error.
|
||||||
|
type Error struct {
|
||||||
|
// HTTP status code of the error.
|
||||||
|
StatusCode int
|
||||||
|
|
||||||
|
// AWS code of the error.
|
||||||
|
Code string
|
||||||
|
|
||||||
|
// Message explaining the error.
|
||||||
|
Message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Error) Error() string {
|
||||||
|
var prefix string
|
||||||
|
if e.Code != "" {
|
||||||
|
prefix = e.Code + ": "
|
||||||
|
}
|
||||||
|
if prefix == "" && e.StatusCode > 0 {
|
||||||
|
prefix = strconv.Itoa(e.StatusCode) + ": "
|
||||||
|
}
|
||||||
|
return prefix + e.Message
|
||||||
|
}
|
235
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/elb_test.go
generated
vendored
Normal file
235
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/elb_test.go
generated
vendored
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
package elb_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mitchellh/goamz/aws"
|
||||||
|
"github.com/mitchellh/goamz/elb"
|
||||||
|
"github.com/mitchellh/goamz/testutil"
|
||||||
|
. "github.com/motain/gocheck"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Test(t *testing.T) {
|
||||||
|
TestingT(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
type S struct {
|
||||||
|
elb *elb.ELB
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ = Suite(&S{})
|
||||||
|
|
||||||
|
var testServer = testutil.NewHTTPServer()
|
||||||
|
|
||||||
|
func (s *S) SetUpSuite(c *C) {
|
||||||
|
testServer.Start()
|
||||||
|
auth := aws.Auth{"abc", "123", ""}
|
||||||
|
s.elb = elb.NewWithClient(auth, aws.Region{ELBEndpoint: testServer.URL}, testutil.DefaultClient)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TearDownTest(c *C) {
|
||||||
|
testServer.Flush()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestAddTags(c *C) {
|
||||||
|
testServer.Response(200, nil, AddTagsExample)
|
||||||
|
|
||||||
|
options := elb.AddTags{
|
||||||
|
LoadBalancerNames: []string{"foobar"},
|
||||||
|
Tags: []elb.Tag{
|
||||||
|
{
|
||||||
|
Key: "hello",
|
||||||
|
Value: "world",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.AddTags(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"AddTags"})
|
||||||
|
c.Assert(req.Form["LoadBalancerNames.member.1"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(req.Form["Tags.member.1.Key"], DeepEquals, []string{"hello"})
|
||||||
|
c.Assert(req.Form["Tags.member.1.Value"], DeepEquals, []string{"world"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "360e81f7-1100-11e4-b6ed-0f30EXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestRemoveTags(c *C) {
|
||||||
|
testServer.Response(200, nil, RemoveTagsExample)
|
||||||
|
|
||||||
|
options := elb.RemoveTags{
|
||||||
|
LoadBalancerNames: []string{"foobar"},
|
||||||
|
TagKeys: []string{"hello"},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.RemoveTags(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"RemoveTags"})
|
||||||
|
c.Assert(req.Form["LoadBalancerNames.member.1"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(req.Form["Tags.member.1.Key"], DeepEquals, []string{"hello"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestCreateLoadBalancer(c *C) {
|
||||||
|
testServer.Response(200, nil, CreateLoadBalancerExample)
|
||||||
|
|
||||||
|
options := elb.CreateLoadBalancer{
|
||||||
|
AvailZone: []string{"us-east-1a"},
|
||||||
|
Listeners: []elb.Listener{elb.Listener{
|
||||||
|
InstancePort: 80,
|
||||||
|
InstanceProtocol: "http",
|
||||||
|
SSLCertificateId: "needToAddASSLCertToYourAWSAccount",
|
||||||
|
LoadBalancerPort: 80,
|
||||||
|
Protocol: "http",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
LoadBalancerName: "foobar",
|
||||||
|
Internal: false,
|
||||||
|
SecurityGroups: []string{"sg1"},
|
||||||
|
Subnets: []string{"sn1"},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.CreateLoadBalancer(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"CreateLoadBalancer"})
|
||||||
|
c.Assert(req.Form["LoadBalancerName"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "1549581b-12b7-11e3-895e-1334aEXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDeleteLoadBalancer(c *C) {
|
||||||
|
testServer.Response(200, nil, DeleteLoadBalancerExample)
|
||||||
|
|
||||||
|
options := elb.DeleteLoadBalancer{
|
||||||
|
LoadBalancerName: "foobar",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.DeleteLoadBalancer(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"DeleteLoadBalancer"})
|
||||||
|
c.Assert(req.Form["LoadBalancerName"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "1549581b-12b7-11e3-895e-1334aEXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDescribeLoadBalancers(c *C) {
|
||||||
|
testServer.Response(200, nil, DescribeLoadBalancersExample)
|
||||||
|
|
||||||
|
options := elb.DescribeLoadBalancer{
|
||||||
|
Names: []string{"foobar"},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.DescribeLoadBalancers(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeLoadBalancers"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
|
||||||
|
c.Assert(resp.LoadBalancers[0].LoadBalancerName, Equals, "MyLoadBalancer")
|
||||||
|
c.Assert(resp.LoadBalancers[0].Listeners[0].Protocol, Equals, "HTTP")
|
||||||
|
c.Assert(resp.LoadBalancers[0].Instances[0].InstanceId, Equals, "i-e4cbe38d")
|
||||||
|
c.Assert(resp.LoadBalancers[0].AvailabilityZones[0].AvailabilityZone, Equals, "us-east-1a")
|
||||||
|
c.Assert(resp.LoadBalancers[0].Scheme, Equals, "internet-facing")
|
||||||
|
c.Assert(resp.LoadBalancers[0].DNSName, Equals, "MyLoadBalancer-123456789.us-east-1.elb.amazonaws.com")
|
||||||
|
c.Assert(resp.LoadBalancers[0].HealthCheck.HealthyThreshold, Equals, int64(2))
|
||||||
|
c.Assert(resp.LoadBalancers[0].HealthCheck.UnhealthyThreshold, Equals, int64(10))
|
||||||
|
c.Assert(resp.LoadBalancers[0].HealthCheck.Interval, Equals, int64(90))
|
||||||
|
c.Assert(resp.LoadBalancers[0].HealthCheck.Target, Equals, "HTTP:80/")
|
||||||
|
c.Assert(resp.LoadBalancers[0].HealthCheck.Timeout, Equals, int64(60))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestRegisterInstancesWithLoadBalancer(c *C) {
|
||||||
|
testServer.Response(200, nil, RegisterInstancesWithLoadBalancerExample)
|
||||||
|
|
||||||
|
options := elb.RegisterInstancesWithLoadBalancer{
|
||||||
|
LoadBalancerName: "foobar",
|
||||||
|
Instances: []string{"instance-1", "instance-2"},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.RegisterInstancesWithLoadBalancer(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"RegisterInstancesWithLoadBalancer"})
|
||||||
|
c.Assert(req.Form["LoadBalancerName"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(req.Form["Instances.member.1.InstanceId"], DeepEquals, []string{"instance-1"})
|
||||||
|
c.Assert(req.Form["Instances.member.2.InstanceId"], DeepEquals, []string{"instance-2"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
|
c.Assert(resp.Instances[0].InstanceId, Equals, "i-315b7e51")
|
||||||
|
c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDeregisterInstancesFromLoadBalancer(c *C) {
|
||||||
|
testServer.Response(200, nil, DeregisterInstancesFromLoadBalancerExample)
|
||||||
|
|
||||||
|
options := elb.DeregisterInstancesFromLoadBalancer{
|
||||||
|
LoadBalancerName: "foobar",
|
||||||
|
Instances: []string{"instance-1", "instance-2"},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.DeregisterInstancesFromLoadBalancer(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"DeregisterInstancesFromLoadBalancer"})
|
||||||
|
c.Assert(req.Form["LoadBalancerName"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(req.Form["Instances.member.1.InstanceId"], DeepEquals, []string{"instance-1"})
|
||||||
|
c.Assert(req.Form["Instances.member.2.InstanceId"], DeepEquals, []string{"instance-2"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
|
c.Assert(resp.Instances[0].InstanceId, Equals, "i-6ec63d59")
|
||||||
|
c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestConfigureHealthCheck(c *C) {
|
||||||
|
testServer.Response(200, nil, ConfigureHealthCheckExample)
|
||||||
|
|
||||||
|
options := elb.ConfigureHealthCheck{
|
||||||
|
LoadBalancerName: "foobar",
|
||||||
|
Check: elb.HealthCheck{
|
||||||
|
HealthyThreshold: 2,
|
||||||
|
UnhealthyThreshold: 2,
|
||||||
|
Interval: 30,
|
||||||
|
Target: "HTTP:80/ping",
|
||||||
|
Timeout: 3,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.ConfigureHealthCheck(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"ConfigureHealthCheck"})
|
||||||
|
c.Assert(req.Form["LoadBalancerName"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
|
c.Assert(resp.Check.HealthyThreshold, Equals, int64(2))
|
||||||
|
c.Assert(resp.Check.UnhealthyThreshold, Equals, int64(2))
|
||||||
|
c.Assert(resp.Check.Interval, Equals, int64(30))
|
||||||
|
c.Assert(resp.Check.Target, Equals, "HTTP:80/ping")
|
||||||
|
c.Assert(resp.Check.Timeout, Equals, int64(3))
|
||||||
|
c.Assert(resp.RequestId, Equals, "83c88b9d-12b7-11e3-8b82-87b12EXAMPLE")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *S) TestDescribeInstanceHealth(c *C) {
|
||||||
|
testServer.Response(200, nil, DescribeInstanceHealthExample)
|
||||||
|
|
||||||
|
options := elb.DescribeInstanceHealth{
|
||||||
|
LoadBalancerName: "foobar",
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.elb.DescribeInstanceHealth(&options)
|
||||||
|
req := testServer.WaitRequest()
|
||||||
|
|
||||||
|
c.Assert(req.Form["Action"], DeepEquals, []string{"DescribeInstanceHealth"})
|
||||||
|
c.Assert(req.Form["LoadBalancerName"], DeepEquals, []string{"foobar"})
|
||||||
|
c.Assert(err, IsNil)
|
||||||
|
|
||||||
|
c.Assert(resp.InstanceStates[0].InstanceId, Equals, "i-90d8c2a5")
|
||||||
|
c.Assert(resp.InstanceStates[0].State, Equals, "InService")
|
||||||
|
c.Assert(resp.InstanceStates[1].InstanceId, Equals, "i-06ea3e60")
|
||||||
|
c.Assert(resp.InstanceStates[1].State, Equals, "OutOfService")
|
||||||
|
c.Assert(resp.RequestId, Equals, "1549581b-12b7-11e3-895e-1334aEXAMPLE")
|
||||||
|
}
|
182
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/responses_test.go
generated
vendored
Normal file
182
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/responses_test.go
generated
vendored
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
package elb_test
|
||||||
|
|
||||||
|
var ErrorDump = `
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Response><Errors><Error><Code>UnsupportedOperation</Code>
|
||||||
|
<Message></Message>
|
||||||
|
</Error></Errors><RequestID>0503f4e9-bbd6-483c-b54f-c4ae9f3b30f4</RequestID></Response>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/OkMdtJ
|
||||||
|
var AddTagsExample = `
|
||||||
|
<AddTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<AddTagsResult/>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>360e81f7-1100-11e4-b6ed-0f30EXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</AddTagsResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/nT2E89
|
||||||
|
var RemoveTagsExample = `
|
||||||
|
<RemoveTagsResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<RemoveTagsResult/>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</RemoveTagsResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/gQRD2H
|
||||||
|
var CreateLoadBalancerExample = `
|
||||||
|
<CreateLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<CreateLoadBalancerResult>
|
||||||
|
<DNSName>MyLoadBalancer-1234567890.us-east-1.elb.amazonaws.com</DNSName>
|
||||||
|
</CreateLoadBalancerResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</CreateLoadBalancerResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/GLZeBN
|
||||||
|
var DeleteLoadBalancerExample = `
|
||||||
|
<DeleteLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</DeleteLoadBalancerResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/8UgpQ8
|
||||||
|
var DescribeLoadBalancersExample = `
|
||||||
|
<DescribeLoadBalancersResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<DescribeLoadBalancersResult>
|
||||||
|
<LoadBalancerDescriptions>
|
||||||
|
<member>
|
||||||
|
<SecurityGroups/>
|
||||||
|
<LoadBalancerName>MyLoadBalancer</LoadBalancerName>
|
||||||
|
<CreatedTime>2013-05-24T21:15:31.280Z</CreatedTime>
|
||||||
|
<HealthCheck>
|
||||||
|
<Interval>90</Interval>
|
||||||
|
<Target>HTTP:80/</Target>
|
||||||
|
<HealthyThreshold>2</HealthyThreshold>
|
||||||
|
<Timeout>60</Timeout>
|
||||||
|
<UnhealthyThreshold>10</UnhealthyThreshold>
|
||||||
|
</HealthCheck>
|
||||||
|
<ListenerDescriptions>
|
||||||
|
<member>
|
||||||
|
<PolicyNames/>
|
||||||
|
<Listener>
|
||||||
|
<Protocol>HTTP</Protocol>
|
||||||
|
<LoadBalancerPort>80</LoadBalancerPort>
|
||||||
|
<InstanceProtocol>HTTP</InstanceProtocol>
|
||||||
|
<SSLCertificateId>needToAddASSLCertToYourAWSAccount</SSLCertificateId>
|
||||||
|
<InstancePort>80</InstancePort>
|
||||||
|
</Listener>
|
||||||
|
</member>
|
||||||
|
</ListenerDescriptions>
|
||||||
|
<Instances>
|
||||||
|
<member>
|
||||||
|
<InstanceId>i-e4cbe38d</InstanceId>
|
||||||
|
</member>
|
||||||
|
</Instances>
|
||||||
|
<Policies>
|
||||||
|
<AppCookieStickinessPolicies/>
|
||||||
|
<OtherPolicies/>
|
||||||
|
<LBCookieStickinessPolicies/>
|
||||||
|
</Policies>
|
||||||
|
<AvailabilityZones>
|
||||||
|
<member>us-east-1a</member>
|
||||||
|
</AvailabilityZones>
|
||||||
|
<CanonicalHostedZoneNameID>ZZZZZZZZZZZ123X</CanonicalHostedZoneNameID>
|
||||||
|
<CanonicalHostedZoneName>MyLoadBalancer-123456789.us-east-1.elb.amazonaws.com</CanonicalHostedZoneName>
|
||||||
|
<Scheme>internet-facing</Scheme>
|
||||||
|
<SourceSecurityGroup>
|
||||||
|
<OwnerAlias>amazon-elb</OwnerAlias>
|
||||||
|
<GroupName>amazon-elb-sg</GroupName>
|
||||||
|
</SourceSecurityGroup>
|
||||||
|
<DNSName>MyLoadBalancer-123456789.us-east-1.elb.amazonaws.com</DNSName>
|
||||||
|
<BackendServerDescriptions/>
|
||||||
|
<Subnets/>
|
||||||
|
</member>
|
||||||
|
</LoadBalancerDescriptions>
|
||||||
|
</DescribeLoadBalancersResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</DescribeLoadBalancersResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/Uz1N66
|
||||||
|
var RegisterInstancesWithLoadBalancerExample = `
|
||||||
|
<RegisterInstancesWithLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<RegisterInstancesWithLoadBalancerResult>
|
||||||
|
<Instances>
|
||||||
|
<member>
|
||||||
|
<InstanceId>i-315b7e51</InstanceId>
|
||||||
|
</member>
|
||||||
|
</Instances>
|
||||||
|
</RegisterInstancesWithLoadBalancerResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</RegisterInstancesWithLoadBalancerResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://goo.gl/5OMv62
|
||||||
|
var DeregisterInstancesFromLoadBalancerExample = `
|
||||||
|
<DeregisterInstancesFromLoadBalancerResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<DeregisterInstancesFromLoadBalancerResult>
|
||||||
|
<Instances>
|
||||||
|
<member>
|
||||||
|
<InstanceId>i-6ec63d59</InstanceId>
|
||||||
|
</member>
|
||||||
|
</Instances>
|
||||||
|
</DeregisterInstancesFromLoadBalancerResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</DeregisterInstancesFromLoadBalancerResponse>
|
||||||
|
`
|
||||||
|
|
||||||
|
// http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_ConfigureHealthCheck.html
|
||||||
|
var ConfigureHealthCheckExample = `
|
||||||
|
<ConfigureHealthCheckResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<ConfigureHealthCheckResult>
|
||||||
|
<HealthCheck>
|
||||||
|
<Interval>30</Interval>
|
||||||
|
<Target>HTTP:80/ping</Target>
|
||||||
|
<HealthyThreshold>2</HealthyThreshold>
|
||||||
|
<Timeout>3</Timeout>
|
||||||
|
<UnhealthyThreshold>2</UnhealthyThreshold>
|
||||||
|
</HealthCheck>
|
||||||
|
</ConfigureHealthCheckResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>83c88b9d-12b7-11e3-8b82-87b12EXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</ConfigureHealthCheckResponse>`
|
||||||
|
|
||||||
|
// http://goo.gl/cGNxfj
|
||||||
|
var DescribeInstanceHealthExample = `
|
||||||
|
<DescribeInstanceHealthResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
|
||||||
|
<DescribeInstanceHealthResult>
|
||||||
|
<InstanceStates>
|
||||||
|
<member>
|
||||||
|
<Description>N/A</Description>
|
||||||
|
<InstanceId>i-90d8c2a5</InstanceId>
|
||||||
|
<State>InService</State>
|
||||||
|
<ReasonCode>N/A</ReasonCode>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<Description>N/A</Description>
|
||||||
|
<InstanceId>i-06ea3e60</InstanceId>
|
||||||
|
<State>OutOfService</State>
|
||||||
|
<ReasonCode>N/A</ReasonCode>
|
||||||
|
</member>
|
||||||
|
</InstanceStates>
|
||||||
|
</DescribeInstanceHealthResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>1549581b-12b7-11e3-895e-1334aEXAMPLE</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</DescribeInstanceHealthResponse>`
|
38
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/sign.go
generated
vendored
Normal file
38
Godeps/_workspace/src/github.com/mitchellh/goamz/elb/sign.go
generated
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package elb
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/sha256"
|
||||||
|
"encoding/base64"
|
||||||
|
"github.com/mitchellh/goamz/aws"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Version 2 signing (http://goo.gl/RSRp5)
|
||||||
|
|
||||||
|
var b64 = base64.StdEncoding
|
||||||
|
|
||||||
|
func sign(auth aws.Auth, method, path string, params map[string]string, host string) {
|
||||||
|
params["AWSAccessKeyId"] = auth.AccessKey
|
||||||
|
params["SignatureVersion"] = "2"
|
||||||
|
params["SignatureMethod"] = "HmacSHA256"
|
||||||
|
if auth.Token != "" {
|
||||||
|
params["SecurityToken"] = auth.Token
|
||||||
|
}
|
||||||
|
|
||||||
|
var sarray []string
|
||||||
|
for k, v := range params {
|
||||||
|
sarray = append(sarray, aws.Encode(k)+"="+aws.Encode(v))
|
||||||
|
}
|
||||||
|
sort.StringSlice(sarray).Sort()
|
||||||
|
joined := strings.Join(sarray, "&")
|
||||||
|
payload := method + "\n" + host + "\n" + path + "\n" + joined
|
||||||
|
hash := hmac.New(sha256.New, []byte(auth.SecretKey))
|
||||||
|
hash.Write([]byte(payload))
|
||||||
|
signature := make([]byte, b64.EncodedLen(hash.Size()))
|
||||||
|
b64.Encode(signature, hash.Sum(nil))
|
||||||
|
|
||||||
|
params["Signature"] = string(signature)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user