dns_client.go raw

   1  package network
   2  
   3  import (
   4  	"fmt"
   5  
   6  	liquidweb "github.com/liquidweb/liquidweb-go"
   7  )
   8  
   9  type DNSZoneBackend interface {
  10  	List(liquidweb.ListMeta) (DNSZoneList, error)
  11  	ListAll() (DNSZoneList, error)
  12  	Create(DNSZoneCreateParams) (DNSZone, error)
  13  	Details(string) (DNSZone, error)
  14  	DeleteByName(string) error
  15  }
  16  
  17  type DNSZoneClient struct {
  18  	Backend liquidweb.Backend
  19  }
  20  
  21  func (c *DNSZoneClient) List(params liquidweb.ListMeta) (result DNSZoneList, err error) {
  22  	err = c.Backend.CallIntoInterface("bleed/Network/DNS/Zone/list", params, &result)
  23  	return
  24  }
  25  
  26  func (c *DNSZoneClient) ListAll() (result DNSZoneList, err error) {
  27  	var reqParams liquidweb.ListMeta
  28  	var incrementalResult DNSZoneList
  29  	incrementalResult.PageTotal = 2
  30  
  31  	for incrementalResult.PageTotal > incrementalResult.PageNum {
  32  		incrementalResult, err = c.List(reqParams)
  33  		if err != nil {
  34  			return DNSZoneList{}, err
  35  		}
  36  		result.Items = append(result.Items, incrementalResult.Items...)
  37  		reqParams.PageNum = incrementalResult.PageNum + 1
  38  	}
  39  	return
  40  }
  41  
  42  func (c *DNSZoneClient) Create(params DNSZoneCreateParams) (result DNSZone, err error) {
  43  	err = c.Backend.CallIntoInterface("bleed/Network/DNS/Zone/create", params, &result)
  44  	return
  45  }
  46  
  47  func (c *DNSZoneClient) DeleteByName(zoneName string) (err error) {
  48  	result := struct {
  49  		DeletedDomain string `json:"name"`
  50  	}{}
  51  	err = c.Backend.CallIntoInterface("bleed/Network/DNS/Zone/delete", struct {
  52  		Name string `json:"name"`
  53  	}{
  54  		Name: zoneName,
  55  	}, &result)
  56  	if err != nil {
  57  		return err
  58  	}
  59  	if result.DeletedDomain != zoneName {
  60  		return fmt.Errorf("requested delete of %s deleted %s", zoneName, result.DeletedDomain)
  61  	}
  62  	return nil
  63  }
  64  
  65  func (c *DNSZoneClient) Details(zoneName string) (zone DNSZone, err error) {
  66  	var result DNSZone
  67  	err = c.Backend.CallIntoInterface("bleed/Network/DNS/Zone/details", struct {
  68  		Name string `json:"name"`
  69  	}{
  70  		Name: zoneName,
  71  	}, &result)
  72  	return result, err
  73  }
  74  
  75  // DNSBackend describes the interface for interactions with the API.
  76  type DNSBackend interface {
  77  	Create(*DNSRecordParams) (*DNSRecord, error)
  78  	Details(int) (*DNSRecord, error)
  79  	List(*DNSRecordParams) (*DNSRecordList, error)
  80  	ListAll(string) (DNSRecordList, error)
  81  	Update(*DNSRecordParams) (*DNSRecord, error)
  82  	Delete(*DNSRecordParams) (*DNSRecordDeletion, error)
  83  }
  84  
  85  // DNSClient is the backend implementation for interacting with DNS Records.
  86  type DNSClient struct {
  87  	Backend liquidweb.Backend
  88  }
  89  
  90  // Create creates a new DNS Record.
  91  func (c *DNSClient) Create(params *DNSRecordParams) (*DNSRecord, error) {
  92  	var result DNSRecord
  93  	err := c.Backend.CallIntoInterface("v1/Network/DNS/Record/create", params, &result)
  94  	if err != nil {
  95  		return nil, err
  96  	}
  97  
  98  	return &result, nil
  99  }
 100  
 101  // Details returns details about a DNS Record.
 102  func (c *DNSClient) Details(id int) (*DNSRecord, error) {
 103  	var result DNSRecord
 104  	params := DNSRecordParams{ID: id}
 105  
 106  	err := c.Backend.CallIntoInterface("v1/Network/DNS/Record/details", params, &result)
 107  	if err != nil {
 108  		return nil, err
 109  	}
 110  	return &result, nil
 111  }
 112  
 113  // List returns a list of DNS Records.
 114  func (c *DNSClient) List(params *DNSRecordParams) (*DNSRecordList, error) {
 115  	list := &DNSRecordList{}
 116  
 117  	err := c.Backend.CallIntoInterface("v1/Network/DNS/Record/list", params, list)
 118  	if err != nil {
 119  		return nil, err
 120  	}
 121  	return list, nil
 122  }
 123  
 124  // List returns a list of DNS Records.
 125  func (c *DNSClient) ListAll(zone string) (result DNSRecordList, err error) {
 126  	var reqParams DNSRecordParams
 127  	incrementalResult := &DNSRecordList{}
 128  	reqParams.PageNum = 1
 129  	reqParams.Zone = zone
 130  	incrementalResult.PageTotal = 2
 131  
 132  	for incrementalResult.PageTotal > incrementalResult.PageNum {
 133  		incrementalResult, err = c.List(&reqParams)
 134  		if err != nil {
 135  			return DNSRecordList{}, err
 136  		}
 137  		result.Items = append(result.Items, incrementalResult.Items...)
 138  		reqParams.PageNum++
 139  	}
 140  	return
 141  }
 142  
 143  // Update will update a DNS Record.
 144  func (c *DNSClient) Update(params *DNSRecordParams) (*DNSRecord, error) {
 145  	var result DNSRecord
 146  	err := c.Backend.CallIntoInterface("v1/Network/DNS/Record/update", params, &result)
 147  	if err != nil {
 148  		return nil, err
 149  	}
 150  	return &result, nil
 151  }
 152  
 153  // Delete will delete a DNS Record.
 154  func (c *DNSClient) Delete(params *DNSRecordParams) (*DNSRecordDeletion, error) {
 155  	var result DNSRecordDeletion
 156  	err := c.Backend.CallIntoInterface("v1/Network/DNS/Record/delete", params, &result)
 157  	if err != nil {
 158  		return nil, err
 159  	}
 160  	return &result, nil
 161  }
 162