summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/route53/route53.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/goamz/goamz/route53/route53.go')
-rw-r--r--vendor/github.com/goamz/goamz/route53/route53.go254
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
+}