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