github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cloudlets/loadbalancer.go (about) 1 package cloudlets 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 10 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 11 12 validation "github.com/go-ozzo/ozzo-validation/v4" 13 ) 14 15 type ( 16 // LoadBalancers is a cloudlets LoadBalancer API interface. 17 LoadBalancers interface { 18 // ListOrigins lists all origins of specified type for the current account. 19 // 20 // See: https://techdocs.akamai.com/cloudlets/v2/reference/get-origins 21 ListOrigins(context.Context, ListOriginsRequest) ([]OriginResponse, error) 22 23 // GetOrigin gets specific origin by originID. 24 // This operation is only available for the APPLICATION_LOAD_BALANCER origin type. 25 // 26 // See: https://techdocs.akamai.com/cloudlets/v2/reference/get-origin 27 GetOrigin(context.Context, GetOriginRequest) (*Origin, error) 28 29 // CreateOrigin creates configuration for an origin. 30 // This operation is only available for the APPLICATION_LOAD_BALANCER origin type. 31 // 32 // See: https://techdocs.akamai.com/cloudlets/v2/reference/post-origin 33 CreateOrigin(context.Context, CreateOriginRequest) (*Origin, error) 34 35 // UpdateOrigin creates configuration for an origin. 36 // This operation is only available for the APPLICATION_LOAD_BALANCER origin type. 37 // 38 // See: https://techdocs.akamai.com/cloudlets/v2/reference/put-origin 39 UpdateOrigin(context.Context, UpdateOriginRequest) (*Origin, error) 40 } 41 42 // OriginResponse is an Origin returned in ListOrigins 43 OriginResponse struct { 44 Hostname string `json:"hostname"` 45 Origin 46 } 47 48 // OriginType is a type for Origin Type 49 OriginType string 50 51 // ListOriginsRequest describes the parameters of the ListOrigins request 52 ListOriginsRequest struct { 53 Type OriginType 54 } 55 56 // GetOriginRequest describes the parameters of the get origins request 57 GetOriginRequest struct { 58 OriginID string 59 } 60 61 // CreateOriginRequest describes the parameters of the create origin request 62 CreateOriginRequest struct { 63 OriginID string `json:"originId"` 64 Description 65 } 66 67 // UpdateOriginRequest describes the parameters of the update origin request 68 UpdateOriginRequest struct { 69 OriginID string 70 Description 71 } 72 73 // Description describes description for the Origin 74 Description struct { 75 Description string `json:"description,omitempty"` 76 } 77 78 // Origin is a response returned by CreateOrigin 79 Origin struct { 80 OriginID string `json:"originId"` 81 Description string `json:"description"` 82 Akamaized bool `json:"akamaized"` 83 Checksum string `json:"checksum"` 84 Type OriginType `json:"type"` 85 } 86 ) 87 88 const ( 89 // OriginTypeAll is a value to use when you want ListOrigins to return origins of all types 90 OriginTypeAll OriginType = "" 91 // OriginTypeCustomer is a value to use when you want ListOrigins to return only origins of CUSTOMER type 92 OriginTypeCustomer OriginType = "CUSTOMER" 93 // OriginTypeApplicationLoadBalancer is a value to use when you want ListOrigins to return only origins of APPLICATION_LOAD_BALANCER type 94 OriginTypeApplicationLoadBalancer OriginType = "APPLICATION_LOAD_BALANCER" 95 // OriginTypeNetStorage is a value to use when you want ListOrigins to return only origins of NETSTORAGE type 96 OriginTypeNetStorage OriginType = "NETSTORAGE" 97 ) 98 99 var ( 100 // ErrListOrigins is returned when ListOrigins fails 101 ErrListOrigins = errors.New("list origins") 102 // ErrGetOrigin is returned when GetOrigin fails 103 ErrGetOrigin = errors.New("get origin") 104 // ErrCreateOrigin is returned when CreateOrigin fails 105 ErrCreateOrigin = errors.New("create origin") 106 // ErrUpdateOrigin is returned when UpdateOrigin fails 107 ErrUpdateOrigin = errors.New("update origin") 108 ) 109 110 // Validate validates ListOriginsRequest 111 func (v ListOriginsRequest) Validate() error { 112 errs := validation.Errors{ 113 "Type": validation.Validate(v.Type, validation.In(OriginTypeCustomer, OriginTypeApplicationLoadBalancer, OriginTypeNetStorage, OriginTypeAll).Error( 114 fmt.Sprintf("value '%s' is invalid. Must be one of: 'CUSTOMER', 'APPLICATION_LOAD_BALANCER', 'NETSTORAGE' or '' (empty)", (&v).Type))), 115 } 116 return edgegriderr.ParseValidationErrors(errs) 117 } 118 119 // Validate validates CreateOriginRequest 120 func (v CreateOriginRequest) Validate() error { 121 errs := validation.Errors{ 122 "OriginID": validation.Validate(v.OriginID, validation.Required, validation.Length(2, 63)), 123 "Description": validation.Validate(v.Description.Description, validation.Length(0, 255)), 124 } 125 return edgegriderr.ParseValidationErrors(errs) 126 } 127 128 // Validate validates UpdateOriginRequest 129 func (v UpdateOriginRequest) Validate() error { 130 errs := validation.Errors{ 131 "OriginID": validation.Validate(v.OriginID, validation.Required, validation.Length(2, 63)), 132 "Description": validation.Validate(v.Description.Description, validation.Length(0, 255)), 133 } 134 return edgegriderr.ParseValidationErrors(errs) 135 } 136 137 func (c *cloudlets) ListOrigins(ctx context.Context, params ListOriginsRequest) ([]OriginResponse, error) { 138 logger := c.Log(ctx) 139 logger.Debug("ListOrigins") 140 141 if err := params.Validate(); err != nil { 142 return nil, fmt.Errorf("%s: %w:\n%s", ErrListOrigins, ErrStructValidation, err) 143 } 144 145 uri, err := url.Parse("/cloudlets/api/v2/origins") 146 if err != nil { 147 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListOrigins, err) 148 } 149 if params.Type != OriginTypeAll { 150 q := uri.Query() 151 q.Add("type", string(params.Type)) 152 uri.RawQuery = q.Encode() 153 } 154 155 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 156 if err != nil { 157 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListOrigins, err) 158 } 159 160 var result []OriginResponse 161 resp, err := c.Exec(req, &result) 162 if err != nil { 163 return nil, fmt.Errorf("%w: request failed: %s", ErrListOrigins, err) 164 } 165 166 if resp.StatusCode != http.StatusOK { 167 return nil, fmt.Errorf("%s: %w", ErrListOrigins, c.Error(resp)) 168 } 169 170 return result, nil 171 } 172 173 func (c *cloudlets) GetOrigin(ctx context.Context, params GetOriginRequest) (*Origin, error) { 174 logger := c.Log(ctx) 175 logger.Debug("GetOrigin") 176 177 uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s", params.OriginID)) 178 if err != nil { 179 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrGetOrigin, err) 180 } 181 182 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 183 if err != nil { 184 return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetOrigin, err) 185 } 186 187 var result Origin 188 resp, err := c.Exec(req, &result) 189 if err != nil { 190 return nil, fmt.Errorf("%w: request failed: %s", ErrGetOrigin, err) 191 } 192 193 if resp.StatusCode != http.StatusOK { 194 return nil, fmt.Errorf("%s: %w", ErrGetOrigin, c.Error(resp)) 195 } 196 197 return &result, nil 198 } 199 200 func (c *cloudlets) CreateOrigin(ctx context.Context, params CreateOriginRequest) (*Origin, error) { 201 logger := c.Log(ctx) 202 logger.Debug("CreateOrigin") 203 204 if err := params.Validate(); err != nil { 205 return nil, fmt.Errorf("%s: %w:\n%s", ErrCreateOrigin, ErrStructValidation, err) 206 } 207 208 uri, err := url.Parse("/cloudlets/api/v2/origins") 209 if err != nil { 210 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrCreateOrigin, err) 211 } 212 213 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil) 214 if err != nil { 215 return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreateOrigin, err) 216 } 217 218 var result Origin 219 220 resp, err := c.Exec(req, &result, params) 221 if err != nil { 222 return nil, fmt.Errorf("%w: request failed: %s", ErrCreateOrigin, err) 223 } 224 225 if resp.StatusCode != http.StatusCreated { 226 return nil, fmt.Errorf("%s: %w", ErrCreateOrigin, c.Error(resp)) 227 } 228 229 return &result, nil 230 } 231 232 func (c *cloudlets) UpdateOrigin(ctx context.Context, params UpdateOriginRequest) (*Origin, error) { 233 logger := c.Log(ctx) 234 logger.Debug("UpdateOrigin") 235 236 if err := params.Validate(); err != nil { 237 return nil, fmt.Errorf("%s: %w:\n%s", ErrUpdateOrigin, ErrStructValidation, err) 238 } 239 240 uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s", params.OriginID)) 241 if err != nil { 242 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrUpdateOrigin, err) 243 } 244 245 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri.String(), nil) 246 if err != nil { 247 return nil, fmt.Errorf("%w: failed to create request: %s", ErrUpdateOrigin, err) 248 } 249 250 var result Origin 251 252 resp, err := c.Exec(req, &result, params.Description) 253 if err != nil { 254 return nil, fmt.Errorf("%w: request failed: %s", ErrUpdateOrigin, err) 255 } 256 257 if resp.StatusCode != http.StatusOK { 258 return nil, fmt.Errorf("%s: %w", ErrUpdateOrigin, c.Error(resp)) 259 } 260 261 return &result, nil 262 }