terraform/vendor/github.com/Ensighten/udnssdk/notification.go

135 lines
3.9 KiB
Go

package udnssdk
import (
"fmt"
"log"
"net/http"
"time"
)
// NotificationsService manages Probes
type NotificationsService struct {
client *Client
}
// NotificationDTO manages notifications
type NotificationDTO struct {
Email string `json:"email"`
PoolRecords []NotificationPoolRecord `json:"poolRecords"`
}
// NotificationPoolRecord does things unknown
type NotificationPoolRecord struct {
PoolRecord string `json:"poolRecord"`
Notification NotificationInfoDTO `json:"notification"`
}
// NotificationInfoDTO does things unknown
type NotificationInfoDTO struct {
Probe bool `json:"probe"`
Record bool `json:"record"`
Scheduled bool `json:"scheduled"`
}
// NotificationListDTO does things unknown
type NotificationListDTO struct {
Notifications []NotificationDTO `json:"notifications"`
Queryinfo QueryInfo `json:"queryInfo"`
Resultinfo ResultInfo `json:"resultInfo"`
}
// NotificationKey collects the identifiers of an Notification
type NotificationKey struct {
Zone string
Type string
Name string
Email string
}
// RRSetKey generates the RRSetKey for the NotificationKey
func (k NotificationKey) RRSetKey() RRSetKey {
return RRSetKey{
Zone: k.Zone,
Type: k.Type,
Name: k.Name,
}
}
// URI generates the URI for a probe
func (k NotificationKey) URI() string {
return fmt.Sprintf("%s/%s", k.RRSetKey().NotificationsURI(), k.Email)
}
// Select requests all notifications by RRSetKey and optional query, using pagination and error handling
func (s *NotificationsService) Select(k RRSetKey, query string) ([]NotificationDTO, *http.Response, error) {
// TODO: Sane Configuration for timeouts / retries
maxerrs := 5
waittime := 5 * time.Second
// init accumulators
pis := []NotificationDTO{}
errcnt := 0
offset := 0
for {
reqNotifications, ri, res, err := s.SelectWithOffset(k, query, offset)
if err != nil {
if res != nil && res.StatusCode >= 500 {
errcnt = errcnt + 1
if errcnt < maxerrs {
time.Sleep(waittime)
continue
}
}
return pis, res, err
}
log.Printf("[DEBUG] ResultInfo: %+v\n", ri)
for _, pi := range reqNotifications {
pis = append(pis, pi)
}
if ri.ReturnedCount+ri.Offset >= ri.TotalCount {
return pis, res, nil
}
offset = ri.ReturnedCount + ri.Offset
continue
}
}
// SelectWithOffset requests list of notifications by RRSetKey, query and offset, also returning list metadata, the actual response, or an error
func (s *NotificationsService) SelectWithOffset(k RRSetKey, query string, offset int) ([]NotificationDTO, ResultInfo, *http.Response, error) {
var tld NotificationListDTO
uri := k.NotificationsQueryURI(query, offset)
res, err := s.client.get(uri, &tld)
log.Printf("DEBUG - ResultInfo: %+v\n", tld.Resultinfo)
pis := []NotificationDTO{}
for _, pi := range tld.Notifications {
pis = append(pis, pi)
}
return pis, tld.Resultinfo, res, err
}
// Find requests a notification by NotificationKey,returning the actual response, or an error
func (s *NotificationsService) Find(k NotificationKey) (NotificationDTO, *http.Response, error) {
var t NotificationDTO
res, err := s.client.get(k.URI(), &t)
return t, res, err
}
// Create requests creation of an event by RRSetKey, with provided NotificationInfoDTO, returning actual response or an error
func (s *NotificationsService) Create(k NotificationKey, n NotificationDTO) (*http.Response, error) {
return s.client.post(k.URI(), n, nil)
}
// Update requests update of an event by NotificationKey, with provided NotificationInfoDTO, returning the actual response or an error
func (s *NotificationsService) Update(k NotificationKey, n NotificationDTO) (*http.Response, error) {
return s.client.put(k.URI(), n, nil)
}
// Delete requests deletion of an event by NotificationKey, returning the actual response or an error
func (s *NotificationsService) Delete(k NotificationKey) (*http.Response, error) {
return s.client.delete(k.URI(), nil)
}