service.go raw

   1  package record
   2  
   3  import (
   4  	"net/http"
   5  
   6  	"github.com/ultradns/ultradns-go-sdk/pkg/client"
   7  	"github.com/ultradns/ultradns-go-sdk/pkg/errors"
   8  	"github.com/ultradns/ultradns-go-sdk/pkg/helper"
   9  	"github.com/ultradns/ultradns-go-sdk/pkg/rrset"
  10  )
  11  
  12  const serviceName = "Record"
  13  
  14  type Service struct {
  15  	c *client.Client
  16  }
  17  
  18  func New(cnf client.Config) (*Service, error) {
  19  	c, err := client.NewClient(cnf)
  20  
  21  	if err != nil {
  22  		return nil, errors.ServiceConfigError(serviceName, err)
  23  	}
  24  
  25  	return &Service{c}, nil
  26  }
  27  
  28  func Get(c *client.Client) (*Service, error) {
  29  	if c == nil {
  30  		return nil, errors.ServiceError(serviceName)
  31  	}
  32  
  33  	return &Service{c}, nil
  34  }
  35  
  36  func (s *Service) Create(rrSetKey *rrset.RRSetKey, rrSet *rrset.RRSet) (*http.Response, error) {
  37  	target := client.Target(&client.SuccessResponse{})
  38  
  39  	if s.c == nil {
  40  		return nil, errors.ServiceError(serviceName)
  41  	}
  42  
  43  	s.c.Trace("%s create started", serviceName)
  44  
  45  	if err := validatePoolProfile(rrSet); err != nil {
  46  		s.c.Error("%s create failed with error: %v", serviceName, err)
  47  		return nil, err
  48  	}
  49  
  50  	res, err := s.c.Do(http.MethodPost, rrSetKey.RecordURI(), rrSet, target)
  51  
  52  	if err != nil {
  53  		s.c.Error("%s create failed with error: %v", serviceName, err)
  54  		return res, errors.CreateError(serviceName, rrSetKey.RecordID(), err)
  55  	}
  56  
  57  	s.c.Trace("%s create completed successfully", serviceName)
  58  
  59  	return res, nil
  60  }
  61  
  62  func (s *Service) Read(rrSetKey *rrset.RRSetKey) (*http.Response, *rrset.ResponseList, error) {
  63  	target := client.Target(&rrset.ResponseList{})
  64  
  65  	if s.c == nil {
  66  		return nil, nil, errors.ServiceError(serviceName)
  67  	}
  68  
  69  	s.c.Trace("%s read started", serviceName)
  70  
  71  	res, err := s.c.Do(http.MethodGet, rrSetKey.RecordURI(), nil, target)
  72  
  73  	if err != nil {
  74  		s.c.Error("%s read failed with error: %v", serviceName, err)
  75  		return res, nil, errors.ReadError(serviceName, rrSetKey.RecordID(), err)
  76  	}
  77  
  78  	rrsetList := target.Data.(*rrset.ResponseList)
  79  
  80  	if len(rrsetList.RRSets) != 1 {
  81  		s.c.Error("%s read failed with error: multiple resource for the filter applied", serviceName)
  82  		return nil, nil, errors.MultipleResourceFoundError(serviceName, rrSetKey.RecordID())
  83  	}
  84  
  85  	profile := rrsetList.RRSets[0].Profile
  86  
  87  	if profile != nil && getPoolSchema(rrSetKey.PType) != profile.GetContext() {
  88  		s.c.Error("%s read failed with error: queried pool data not available for the owner name", serviceName)
  89  		return nil, nil, errors.ResourceTypeNotFoundError(serviceName, rrSetKey.PType, rrSetKey.RecordID())
  90  	}
  91  
  92  	s.c.Trace("%s read completed successfully", serviceName)
  93  
  94  	return res, rrsetList, nil
  95  }
  96  
  97  func (s *Service) Update(rrSetKey *rrset.RRSetKey, rrSet *rrset.RRSet) (*http.Response, error) {
  98  	target := client.Target(&client.SuccessResponse{})
  99  
 100  	if s.c == nil {
 101  		return nil, errors.ServiceError(serviceName)
 102  	}
 103  
 104  	s.c.Trace("%s update started", serviceName)
 105  
 106  	if err := validatePoolProfile(rrSet); err != nil {
 107  		s.c.Error("%s update failed with error: %v", serviceName, err)
 108  		return nil, err
 109  	}
 110  
 111  	res, err := s.c.Do(http.MethodPut, rrSetKey.RecordURI(), rrSet, target)
 112  
 113  	if err != nil {
 114  		s.c.Error("%s update failed with error: %v", serviceName, err)
 115  		return res, errors.UpdateError(serviceName, rrSetKey.RecordID(), err)
 116  	}
 117  
 118  	s.c.Trace("%s update completed successfully", serviceName)
 119  
 120  	return res, nil
 121  }
 122  
 123  func (s *Service) PartialUpdate(rrSetKey *rrset.RRSetKey, rrSet *rrset.RRSet) (*http.Response, error) {
 124  	target := client.Target(&client.SuccessResponse{})
 125  
 126  	if s.c == nil {
 127  		return nil, errors.ServiceError(serviceName)
 128  	}
 129  
 130  	s.c.Trace("%s partial update started", serviceName)
 131  
 132  	res, err := s.c.Do(http.MethodPatch, rrSetKey.RecordURI(), rrSet, target)
 133  
 134  	if err != nil {
 135  		s.c.Error("%s partial update failed with error: %v", serviceName, err)
 136  		return res, errors.PartialUpdateError(serviceName, rrSetKey.RecordID(), err)
 137  	}
 138  
 139  	s.c.Trace("%s partial update completed successfully", serviceName)
 140  
 141  	return res, nil
 142  }
 143  
 144  func (s *Service) Delete(rrSetKey *rrset.RRSetKey) (*http.Response, error) {
 145  	target := client.Target(&client.SuccessResponse{})
 146  
 147  	if s.c == nil {
 148  		return nil, errors.ServiceError(serviceName)
 149  	}
 150  
 151  	s.c.Trace("%s delete started", serviceName)
 152  
 153  	res, err := s.c.Do(http.MethodDelete, rrSetKey.RecordURI(), nil, target)
 154  
 155  	if err != nil {
 156  		s.c.Error("%s delete failed with error: %v", serviceName, err)
 157  		return res, errors.DeleteError(serviceName, rrSetKey.RecordID(), err)
 158  	}
 159  
 160  	s.c.Trace("%s delete completed successfully", serviceName)
 161  
 162  	return res, nil
 163  }
 164  
 165  func (s *Service) List(rrSetKey *rrset.RRSetKey, queryInfo *helper.QueryInfo) (*http.Response, *rrset.ResponseList, error) {
 166  	target := client.Target(&rrset.ResponseList{})
 167  
 168  	if s.c == nil {
 169  		return nil, nil, errors.ServiceError(serviceName)
 170  	}
 171  
 172  	s.c.Trace("%s list started", serviceName)
 173  
 174  	res, err := s.c.Do(http.MethodGet, rrSetKey.RecordURI()+queryInfo.URI(), nil, target)
 175  
 176  	if err != nil {
 177  		s.c.Error("%s list failed with error: %v", serviceName, err)
 178  		return res, nil, errors.ListError(serviceName, rrSetKey.RecordID()+queryInfo.URI(), err)
 179  	}
 180  
 181  	rrsetList := target.Data.(*rrset.ResponseList)
 182  
 183  	s.c.Trace("%s list completed successfully", serviceName)
 184  
 185  	return res, rrsetList, nil
 186  }
 187