diff options
Diffstat (limited to 'vendor/github.com/goamz/goamz/route53/route53.go')
-rw-r--r-- | vendor/github.com/goamz/goamz/route53/route53.go | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/route53/route53.go b/vendor/github.com/goamz/goamz/route53/route53.go new file mode 100644 index 000000000..0e26a6f73 --- /dev/null +++ b/vendor/github.com/goamz/goamz/route53/route53.go @@ -0,0 +1,254 @@ +package route53 + +import ( + "bytes" + "encoding/xml" + "fmt" + "github.com/goamz/goamz/aws" + "io" + "net/http" +) + +type Route53 struct { + Auth aws.Auth + Endpoint string + Signer *aws.Route53Signer + Service *aws.Service +} + +const route53_host = "https://route53.amazonaws.com" + +// Factory for the route53 type +func NewRoute53(auth aws.Auth) (*Route53, error) { + signer := aws.NewRoute53Signer(auth) + + return &Route53{ + Auth: auth, + Signer: signer, + Endpoint: route53_host + "/2013-04-01/hostedzone", + }, nil +} + +// General Structs used in all types of requests +type HostedZone struct { + XMLName xml.Name `xml:"HostedZone"` + Id string + Name string + CallerReference string + Config Config + ResourceRecordSetCount int +} + +type Config struct { + XMLName xml.Name `xml:"Config"` + Comment string +} + +// Structs for getting the existing Hosted Zones +type ListHostedZonesResponse struct { + XMLName xml.Name `xml:"ListHostedZonesResponse"` + HostedZones []HostedZone `xml:"HostedZones>HostedZone"` + Marker string + IsTruncated bool + NextMarker string + MaxItems int +} + +// Structs for Creating a New Host +type CreateHostedZoneRequest struct { + XMLName xml.Name `xml:"CreateHostedZoneRequest"` + Xmlns string `xml:"xmlns,attr"` + Name string + CallerReference string + HostedZoneConfig HostedZoneConfig +} + +type ResourceRecordValue struct { + Value string `xml:"Value"` +} + +type AliasTarget struct { + HostedZoneId string `xml:"HostedZoneId"` + DNSName string `xml:"DNSName"` + EvaluateTargetHealth bool `xml:"EvaluateTargetHealth"` +} + +// Wrapper for all the different resource record sets +type ResourceRecordSet interface{} + +// Basic Change +type Change struct { + Action string `xml:"Action"` + Name string `xml:"ResourceRecordSet>Name"` + Type string `xml:"ResourceRecordSet>Type"` + TTL int `xml:"ResourceRecordSet>TTL,omitempty"` + Values []ResourceRecordValue `xml:"ResourceRecordSet>ResourceRecords>ResourceRecord"` + HealthCheckId string `xml:"ResourceRecordSet>HealthCheckId,omitempty"` +} + +// Basic Resource Recod Set +type BasicResourceRecordSet struct { + Action string `xml:"Action"` + Name string `xml:"ResourceRecordSet>Name"` + Type string `xml:"ResourceRecordSet>Type"` + TTL int `xml:"ResourceRecordSet>TTL,omitempty"` + Values []ResourceRecordValue `xml:"ResourceRecordSet>ResourceRecords>ResourceRecord"` + HealthCheckId string `xml:"ResourceRecordSet>HealthCheckId,omitempty"` +} + +// Alias Resource Record Set +type AliasResourceRecordSet struct { + Action string `xml:"Action"` + Name string `xml:"ResourceRecordSet>Name"` + Type string `xml:"ResourceRecordSet>Type"` + AliasTarget AliasTarget `xml:"ResourceRecordSet>AliasTarget"` + HealthCheckId string `xml:"ResourceRecordSet>HealthCheckId,omitempty"` +} + +type ChangeResourceRecordSetsRequest struct { + XMLName xml.Name `xml:"ChangeResourceRecordSetsRequest"` + Xmlns string `xml:"xmlns,attr"` + Changes []ResourceRecordSet `xml:"ChangeBatch>Changes>Change"` +} + +type HostedZoneConfig struct { + XMLName xml.Name `xml:"HostedZoneConfig"` + Comment string +} + +type CreateHostedZoneResponse struct { + XMLName xml.Name `xml:"CreateHostedZoneResponse"` + HostedZone HostedZone + ChangeInfo ChangeInfo + DelegationSet DelegationSet +} + +type ChangeResourceRecordSetsResponse struct { + XMLName xml.Name `xml:"ChangeResourceRecordSetsResponse"` + Id string `xml:"ChangeInfo>Id"` + Status string `xml:"ChangeInfo>Status"` + SubmittedAt string `xml:"ChangeInfo>SubmittedAt"` +} + +type ChangeInfo struct { + XMLName xml.Name `xml:"ChangeInfo"` + Id string + Status string + SubmittedAt string +} + +type DelegationSet struct { + XMLName xml.Name `xml:"DelegationSet` + NameServers NameServers +} + +type NameServers struct { + XMLName xml.Name `xml:"NameServers` + NameServer []string +} + +type GetHostedZoneResponse struct { + XMLName xml.Name `xml:"GetHostedZoneResponse"` + HostedZone HostedZone + DelegationSet DelegationSet +} + +type DeleteHostedZoneResponse struct { + XMLName xml.Name `xml:"DeleteHostedZoneResponse"` + Xmlns string `xml:"xmlns,attr"` + ChangeInfo ChangeInfo +} + +// query sends the specified HTTP request to the path and signs the request +// with the required authentication and headers based on the Auth. +// +// Automatically decodes the response into the the result interface +func (r *Route53) query(method string, path string, body io.Reader, result interface{}) error { + var err error + + // Create the POST request and sign the headers + req, err := http.NewRequest(method, path, body) + r.Signer.Sign(req) + + // Send the request and capture the response + client := &http.Client{} + res, err := client.Do(req) + if err != nil { + return err + } + + if method == "POST" { + defer req.Body.Close() + } + + if res.StatusCode != 201 && res.StatusCode != 200 { + err = r.Service.BuildError(res) + return err + } + + err = xml.NewDecoder(res.Body).Decode(result) + + return err +} + +// CreateHostedZone send a creation request to the AWS Route53 API +func (r *Route53) CreateHostedZone(hostedZoneReq *CreateHostedZoneRequest) (*CreateHostedZoneResponse, error) { + xmlBytes, err := xml.Marshal(hostedZoneReq) + if err != nil { + return nil, err + } + + result := new(CreateHostedZoneResponse) + err = r.query("POST", r.Endpoint, bytes.NewBuffer(xmlBytes), result) + + return result, err +} + +// ChangeResourceRecordSet send a change resource record request to the AWS Route53 API +func (r *Route53) ChangeResourceRecordSet(req *ChangeResourceRecordSetsRequest, zoneId string) (*ChangeResourceRecordSetsResponse, error) { + xmlBytes, err := xml.Marshal(req) + if err != nil { + return nil, err + } + xmlBytes = []byte(xml.Header + string(xmlBytes)) + + result := new(ChangeResourceRecordSetsResponse) + path := fmt.Sprintf("%s/%s/rrset", r.Endpoint, zoneId) + err = r.query("POST", path, bytes.NewBuffer(xmlBytes), result) + + return result, err +} + +// ListedHostedZones fetches a collection of HostedZones through the AWS Route53 API +func (r *Route53) ListHostedZones(marker string, maxItems int) (result *ListHostedZonesResponse, err error) { + path := "" + + if marker == "" { + path = fmt.Sprintf("%s?maxitems=%d", r.Endpoint, maxItems) + } else { + path = fmt.Sprintf("%s?marker=%v&maxitems=%d", r.Endpoint, marker, maxItems) + } + + result = new(ListHostedZonesResponse) + err = r.query("GET", path, nil, result) + + return +} + +// GetHostedZone fetches a particular hostedzones DelegationSet by id +func (r *Route53) GetHostedZone(id string) (result *GetHostedZoneResponse, err error) { + result = new(GetHostedZoneResponse) + err = r.query("GET", fmt.Sprintf("%s/%v", r.Endpoint, id), nil, result) + + return +} + +// DeleteHostedZone deletes the hosted zone with the given id +func (r *Route53) DeleteHostedZone(id string) (result *DeleteHostedZoneResponse, err error) { + path := fmt.Sprintf("%s/%s", r.Endpoint, id) + + result = new(DeleteHostedZoneResponse) + err = r.query("DELETE", path, nil, result) + + return +} |