virtualdns.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package cloudflare
  2. import (
  3. "encoding/json"
  4. "net/url"
  5. "strings"
  6. "time"
  7. "github.com/pkg/errors"
  8. )
  9. // VirtualDNS represents a Virtual DNS configuration.
  10. type VirtualDNS struct {
  11. ID string `json:"id"`
  12. Name string `json:"name"`
  13. OriginIPs []string `json:"origin_ips"`
  14. VirtualDNSIPs []string `json:"virtual_dns_ips"`
  15. MinimumCacheTTL uint `json:"minimum_cache_ttl"`
  16. MaximumCacheTTL uint `json:"maximum_cache_ttl"`
  17. DeprecateAnyRequests bool `json:"deprecate_any_requests"`
  18. ModifiedOn string `json:"modified_on"`
  19. }
  20. // VirtualDNSAnalyticsMetrics respresents a group of aggregated Virtual DNS metrics.
  21. type VirtualDNSAnalyticsMetrics struct {
  22. QueryCount *int64 `json:"queryCount"`
  23. UncachedCount *int64 `json:"uncachedCount"`
  24. StaleCount *int64 `json:"staleCount"`
  25. ResponseTimeAvg *float64 `json:"responseTimeAvg"`
  26. ResponseTimeMedian *float64 `json:"responseTimeMedian"`
  27. ResponseTime90th *float64 `json:"responseTime90th"`
  28. ResponseTime99th *float64 `json:"responseTime99th"`
  29. }
  30. // VirtualDNSAnalytics represents a set of aggregated Virtual DNS metrics.
  31. // TODO: Add the queried data and not only the aggregated values.
  32. type VirtualDNSAnalytics struct {
  33. Totals VirtualDNSAnalyticsMetrics `json:"totals"`
  34. Min VirtualDNSAnalyticsMetrics `json:"min"`
  35. Max VirtualDNSAnalyticsMetrics `json:"max"`
  36. }
  37. // VirtualDNSUserAnalyticsOptions represents range and dimension selection on analytics endpoint
  38. type VirtualDNSUserAnalyticsOptions struct {
  39. Metrics []string
  40. Since *time.Time
  41. Until *time.Time
  42. }
  43. // VirtualDNSResponse represents a Virtual DNS response.
  44. type VirtualDNSResponse struct {
  45. Response
  46. Result *VirtualDNS `json:"result"`
  47. }
  48. // VirtualDNSListResponse represents an array of Virtual DNS responses.
  49. type VirtualDNSListResponse struct {
  50. Response
  51. Result []*VirtualDNS `json:"result"`
  52. }
  53. // VirtualDNSAnalyticsResponse represents a Virtual DNS analytics response.
  54. type VirtualDNSAnalyticsResponse struct {
  55. Response
  56. Result VirtualDNSAnalytics `json:"result"`
  57. }
  58. // CreateVirtualDNS creates a new Virtual DNS cluster.
  59. //
  60. // API reference: https://api.cloudflare.com/#virtual-dns-users--create-a-virtual-dns-cluster
  61. func (api *API) CreateVirtualDNS(v *VirtualDNS) (*VirtualDNS, error) {
  62. res, err := api.makeRequest("POST", "/user/virtual_dns", v)
  63. if err != nil {
  64. return nil, errors.Wrap(err, errMakeRequestError)
  65. }
  66. response := &VirtualDNSResponse{}
  67. err = json.Unmarshal(res, &response)
  68. if err != nil {
  69. return nil, errors.Wrap(err, errUnmarshalError)
  70. }
  71. return response.Result, nil
  72. }
  73. // VirtualDNS fetches a single virtual DNS cluster.
  74. //
  75. // API reference: https://api.cloudflare.com/#virtual-dns-users--get-a-virtual-dns-cluster
  76. func (api *API) VirtualDNS(virtualDNSID string) (*VirtualDNS, error) {
  77. uri := "/user/virtual_dns/" + virtualDNSID
  78. res, err := api.makeRequest("GET", uri, nil)
  79. if err != nil {
  80. return nil, errors.Wrap(err, errMakeRequestError)
  81. }
  82. response := &VirtualDNSResponse{}
  83. err = json.Unmarshal(res, &response)
  84. if err != nil {
  85. return nil, errors.Wrap(err, errUnmarshalError)
  86. }
  87. return response.Result, nil
  88. }
  89. // ListVirtualDNS lists the virtual DNS clusters associated with an account.
  90. //
  91. // API reference: https://api.cloudflare.com/#virtual-dns-users--get-virtual-dns-clusters
  92. func (api *API) ListVirtualDNS() ([]*VirtualDNS, error) {
  93. res, err := api.makeRequest("GET", "/user/virtual_dns", nil)
  94. if err != nil {
  95. return nil, errors.Wrap(err, errMakeRequestError)
  96. }
  97. response := &VirtualDNSListResponse{}
  98. err = json.Unmarshal(res, &response)
  99. if err != nil {
  100. return nil, errors.Wrap(err, errUnmarshalError)
  101. }
  102. return response.Result, nil
  103. }
  104. // UpdateVirtualDNS updates a Virtual DNS cluster.
  105. //
  106. // API reference: https://api.cloudflare.com/#virtual-dns-users--modify-a-virtual-dns-cluster
  107. func (api *API) UpdateVirtualDNS(virtualDNSID string, vv VirtualDNS) error {
  108. uri := "/user/virtual_dns/" + virtualDNSID
  109. res, err := api.makeRequest("PUT", uri, vv)
  110. if err != nil {
  111. return errors.Wrap(err, errMakeRequestError)
  112. }
  113. response := &VirtualDNSResponse{}
  114. err = json.Unmarshal(res, &response)
  115. if err != nil {
  116. return errors.Wrap(err, errUnmarshalError)
  117. }
  118. return nil
  119. }
  120. // DeleteVirtualDNS deletes a Virtual DNS cluster. Note that this cannot be
  121. // undone, and will stop all traffic to that cluster.
  122. //
  123. // API reference: https://api.cloudflare.com/#virtual-dns-users--delete-a-virtual-dns-cluster
  124. func (api *API) DeleteVirtualDNS(virtualDNSID string) error {
  125. uri := "/user/virtual_dns/" + virtualDNSID
  126. res, err := api.makeRequest("DELETE", uri, nil)
  127. if err != nil {
  128. return errors.Wrap(err, errMakeRequestError)
  129. }
  130. response := &VirtualDNSResponse{}
  131. err = json.Unmarshal(res, &response)
  132. if err != nil {
  133. return errors.Wrap(err, errUnmarshalError)
  134. }
  135. return nil
  136. }
  137. // encode encodes non-nil fields into URL encoded form.
  138. func (o VirtualDNSUserAnalyticsOptions) encode() string {
  139. v := url.Values{}
  140. if o.Since != nil {
  141. v.Set("since", (*o.Since).UTC().Format(time.RFC3339))
  142. }
  143. if o.Until != nil {
  144. v.Set("until", (*o.Until).UTC().Format(time.RFC3339))
  145. }
  146. if o.Metrics != nil {
  147. v.Set("metrics", strings.Join(o.Metrics, ","))
  148. }
  149. return v.Encode()
  150. }
  151. // VirtualDNSUserAnalytics retrieves analytics report for a specified dimension and time range
  152. func (api *API) VirtualDNSUserAnalytics(virtualDNSID string, o VirtualDNSUserAnalyticsOptions) (VirtualDNSAnalytics, error) {
  153. uri := "/user/virtual_dns/" + virtualDNSID + "/dns_analytics/report?" + o.encode()
  154. res, err := api.makeRequest("GET", uri, nil)
  155. if err != nil {
  156. return VirtualDNSAnalytics{}, errors.Wrap(err, errMakeRequestError)
  157. }
  158. response := VirtualDNSAnalyticsResponse{}
  159. err = json.Unmarshal(res, &response)
  160. if err != nil {
  161. return VirtualDNSAnalytics{}, errors.Wrap(err, errUnmarshalError)
  162. }
  163. return response.Result, nil
  164. }