mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-20 11:48:24 -06:00
* Remove `make updatedeps` from Travis build. We'll follow up with more specific plans around dependency updating in subsequent PRs. * Update all `make` targets to set `GO15VENDOREXPERIMENT=1` and to filter out `/vendor/` from `./...` where appropriate. * Temporarily remove `vet` from the `make test` target until we can figure out how to get it to not vet `vendor/`. (Initial experimentation failed to yield the proper incantation.) Everything is pinned to current master, with the exception of: * Azure/azure-sdk-for-go which is pinned before the breaking change today * aws/aws-sdk-go which is pinned to the most recent tag The documentation still needs to be updated, which we can do in a follow up PR. The goal here is to unblock release.
192 lines
4.7 KiB
Go
192 lines
4.7 KiB
Go
package dnsmadeeasy
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/imdario/mergo"
|
|
"strconv"
|
|
)
|
|
|
|
// DataResponse is the response from a GET ie all records for
|
|
// a domainID
|
|
type DataResponse struct {
|
|
Data []Record `json:"data"`
|
|
}
|
|
|
|
// Record is used to represent a retrieved Record.
|
|
type Record struct {
|
|
Name string `json:"name"`
|
|
Value string `json:"value"`
|
|
RecordID int64 `json:"id"`
|
|
Type string `json:"type"`
|
|
Source int64 `json:"source"`
|
|
SourceID int64 `json:"sourceId"`
|
|
DynamicDNS bool `json:"dynamicDns"`
|
|
Password string `json:"password"`
|
|
TTL int64 `json:"ttl"`
|
|
Monitor bool `json:"monitor"`
|
|
Failover bool `json:"failover"`
|
|
Failed bool `json:"failed"`
|
|
GtdLocation string `json:"gtdLocation"`
|
|
Description string `json:"description"`
|
|
Keywords string `json:"keywords"`
|
|
Title string `json:"title"`
|
|
HardLink bool `json:"hardLink"`
|
|
MXLevel int64 `json:"mxLevel"`
|
|
Weight int64 `json:"weight"`
|
|
Priority int64 `json:"priority"`
|
|
Port int64 `json:"port"`
|
|
RedirectType string `json:"redirectType"`
|
|
}
|
|
|
|
// StringRecordID returns the record id as a string.
|
|
func (r *Record) StringRecordID() string {
|
|
return strconv.FormatInt(r.RecordID, 10)
|
|
}
|
|
|
|
// ttl, err := strconv.ParseInt(opts.Ttl, 0, 0)
|
|
|
|
type requestType int
|
|
|
|
const (
|
|
create requestType = iota
|
|
retrieve
|
|
update
|
|
destroy
|
|
)
|
|
|
|
func (rt requestType) endpoint(domainID string, recordID string) (result string) {
|
|
switch rt {
|
|
case create, retrieve:
|
|
result = fmt.Sprintf("/dns/managed/%s/records/", domainID)
|
|
case update, destroy:
|
|
result = fmt.Sprintf("/dns/managed/%s/records/%s/", domainID, recordID)
|
|
}
|
|
return result
|
|
}
|
|
|
|
// CRUD - Create, Read, Update, Delete
|
|
|
|
// CreateRecord creates a DNS record on DNSMadeEasy
|
|
func (c *Client) CreateRecord(domainID string, cr map[string]interface{}) (string, error) {
|
|
|
|
path := create.endpoint(domainID, "")
|
|
buf := bytes.NewBuffer(nil)
|
|
enc := json.NewEncoder(buf)
|
|
if err := enc.Encode(cr); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
req, err := c.NewRequest("POST", path, buf, "")
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error from NewRequest: %s", err)
|
|
}
|
|
|
|
resp, err := checkResp(c.HTTP.Do(req))
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error creating record: %s", err)
|
|
}
|
|
|
|
record := new(Record)
|
|
|
|
err = decodeBody(resp, &record)
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error parsing record response: %s", err)
|
|
}
|
|
|
|
// The request was successful
|
|
return record.StringRecordID(), nil
|
|
}
|
|
|
|
// ReadRecord gets a record by the ID specified and returns a Record and an
|
|
// error.
|
|
func (c *Client) ReadRecord(domainID string, recordID string) (*Record, error) {
|
|
body := bytes.NewBuffer(nil)
|
|
path := retrieve.endpoint(domainID, recordID)
|
|
req, err := c.NewRequest("GET", path, body, "")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resp, err := checkResp(c.HTTP.Do(req))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error retrieving record: %s", err)
|
|
}
|
|
|
|
dataResp := DataResponse{}
|
|
err = decodeBody(resp, &dataResp)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Error decoding data response: %s", err)
|
|
}
|
|
var result Record
|
|
var found bool
|
|
for _, record := range dataResp.Data {
|
|
if record.StringRecordID() == recordID {
|
|
result = record // not pointer, so data copied
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
return nil, fmt.Errorf("Unable to find record %s", recordID)
|
|
}
|
|
return &result, nil
|
|
}
|
|
|
|
// UpdateRecord updated a record from the parameters specified and
|
|
// returns an error if it fails.
|
|
func (c *Client) UpdateRecord(domainID string, recordID string, cr map[string]interface{}) (string, error) {
|
|
|
|
current, err := c.ReadRecord(domainID, recordID)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
err = mergo.Map(current, cr)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
buf := bytes.NewBuffer(nil)
|
|
enc := json.NewEncoder(buf)
|
|
if err := enc.Encode(current); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
path := update.endpoint(domainID, recordID)
|
|
req, err := c.NewRequest("PUT", path, buf, "")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
_, err = checkResp(c.HTTP.Do(req))
|
|
if err != nil {
|
|
return "", fmt.Errorf("Error updating record: %s", err)
|
|
}
|
|
|
|
// The request was successful
|
|
return recordID, nil
|
|
}
|
|
|
|
// DeleteRecord destroys a record by the ID specified and
|
|
// returns an error if it fails. If no error is returned,
|
|
// the Record was succesfully destroyed.
|
|
func (c *Client) DeleteRecord(domainID string, recordID string) error {
|
|
body := bytes.NewBuffer(nil)
|
|
path := destroy.endpoint(domainID, recordID)
|
|
req, err := c.NewRequest("DELETE", path, body, "")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = checkResp(c.HTTP.Do(req))
|
|
if err != nil {
|
|
return fmt.Errorf("Unable to find record %s", recordID)
|
|
}
|
|
|
|
// The request was successful
|
|
return nil
|
|
}
|