github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cloudlets/loadbalancer_activation.go (about) 1 package cloudlets 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 "strconv" 10 11 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 12 13 validation "github.com/go-ozzo/ozzo-validation/v4" 14 ) 15 16 type ( 17 // LoadBalancerActivations is a cloudlets LoadBalancer Activation API interface. 18 LoadBalancerActivations interface { 19 // ListLoadBalancerActivations fetches activations with the most recent listed first. 20 // 21 // See: https://techdocs.akamai.com/cloudlets/v2/reference/get-origin-activations 22 ListLoadBalancerActivations(context.Context, ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error) 23 24 // ActivateLoadBalancerVersion activates the load balancing version. 25 // 26 // See: https://techdocs.akamai.com/cloudlets/v2/reference/post-origin-activations 27 ActivateLoadBalancerVersion(context.Context, ActivateLoadBalancerVersionRequest) (*LoadBalancerActivation, error) 28 } 29 30 // ListLoadBalancerActivationsRequest contains request parameters for ListLoadBalancerActivations 31 ListLoadBalancerActivationsRequest struct { 32 OriginID string 33 Network LoadBalancerActivationNetwork 34 LatestOnly bool 35 PageSize *int64 36 Page *int64 37 } 38 39 // ActivateLoadBalancerVersionRequest contains request parameters for LoadBalancer version activation 40 ActivateLoadBalancerVersionRequest struct { 41 OriginID string 42 Async bool 43 LoadBalancerVersionActivation 44 } 45 46 // LoadBalancerVersionActivation contains request parameters for ActivateLoadBalancerVersionRequest 47 LoadBalancerVersionActivation struct { 48 Network LoadBalancerActivationNetwork `json:"network"` 49 DryRun bool `json:"dryrun,omitempty"` 50 Version int64 `json:"version"` 51 } 52 53 // LoadBalancerActivation contains response data for a single LB Version Activation 54 LoadBalancerActivation struct { 55 ActivatedBy string `json:"activatedBy,omitempty"` 56 ActivatedDate string `json:"activatedDate,omitempty"` 57 Network LoadBalancerActivationNetwork `json:"network"` 58 OriginID string `json:"originId,omitempty"` 59 Status LoadBalancerActivationStatus `json:"status,omitempty"` 60 DryRun bool `json:"dryrun,omitempty"` 61 Version int64 `json:"version"` 62 } 63 64 //LoadBalancerActivationNetwork is the activation network type for load balancer 65 LoadBalancerActivationNetwork string 66 67 // LoadBalancerActivationStatus is an activation status type for load balancer 68 LoadBalancerActivationStatus string 69 ) 70 71 const ( 72 // LoadBalancerActivationStatusActive is an activation that is currently active 73 LoadBalancerActivationStatusActive LoadBalancerActivationStatus = "active" 74 // LoadBalancerActivationStatusDeactivated is an activation that is deactivated 75 LoadBalancerActivationStatusDeactivated LoadBalancerActivationStatus = "deactivated" 76 // LoadBalancerActivationStatusInactive is an activation that is not active 77 LoadBalancerActivationStatusInactive LoadBalancerActivationStatus = "inactive" 78 // LoadBalancerActivationStatusPending is status of a pending activation 79 LoadBalancerActivationStatusPending LoadBalancerActivationStatus = "pending" 80 // LoadBalancerActivationStatusFailed is status of a failed activation 81 LoadBalancerActivationStatusFailed LoadBalancerActivationStatus = "failed" 82 83 // LoadBalancerActivationNetworkStaging is the staging network value for load balancer 84 LoadBalancerActivationNetworkStaging LoadBalancerActivationNetwork = "STAGING" 85 // LoadBalancerActivationNetworkProduction is the production network value for load balancer 86 LoadBalancerActivationNetworkProduction LoadBalancerActivationNetwork = "PRODUCTION" 87 88 // NetworkParamStaging is the staging network param value for ListLoadBalancerActivationsRequest 89 NetworkParamStaging LoadBalancerActivationNetwork = "staging" 90 // NetworkParamProduction is the production network param value for ListLoadBalancerActivationsRequest 91 NetworkParamProduction LoadBalancerActivationNetwork = "prod" 92 ) 93 94 var ( 95 // ErrListLoadBalancerActivations is returned when ListLoadBalancerActivations fails 96 ErrListLoadBalancerActivations = errors.New("list load balancer activations") 97 // ErrActivateLoadBalancerVersion is returned when ActivateLoadBalancerVersion fails 98 ErrActivateLoadBalancerVersion = errors.New("activate load balancer version") 99 ) 100 101 // Validate validates ActivateLoadBalancerVersionRequest 102 func (v ActivateLoadBalancerVersionRequest) Validate() error { 103 errs := validation.Errors{ 104 "OriginID": validation.Validate(v.OriginID, validation.Required), 105 "Params": validation.Validate(v.LoadBalancerVersionActivation), 106 } 107 return edgegriderr.ParseValidationErrors(errs) 108 } 109 110 // Validate validates ListLoadBalancerActivationsRequest 111 func (v ListLoadBalancerActivationsRequest) Validate() error { 112 errs := validation.Errors{ 113 "OriginID": validation.Validate(v.OriginID, validation.Required), 114 "Network": validation.Validate(v.Network, validation.In(NetworkParamStaging, NetworkParamProduction).Error( 115 fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s' or '' (empty)", v.Network, NetworkParamStaging, NetworkParamProduction))), 116 } 117 return edgegriderr.ParseValidationErrors(errs) 118 } 119 120 // Validate validates LoadBalancerVersionActivation struct 121 func (v LoadBalancerVersionActivation) Validate() error { 122 return validation.Errors{ 123 "Network": validation.Validate(v.Network, validation.Required, validation.In(LoadBalancerActivationNetworkStaging, LoadBalancerActivationNetworkProduction).Error( 124 fmt.Sprintf("value '%s' is invalid. Must be one of: 'STAGING' or 'PRODUCTION'", v.Network))), 125 "Version": validation.Validate(v.Version, validation.Min(0)), 126 }.Filter() 127 } 128 129 func (c *cloudlets) ListLoadBalancerActivations(ctx context.Context, params ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error) { 130 logger := c.Log(ctx) 131 logger.Debug("ListLoadBalancerActivations") 132 133 if err := params.Validate(); err != nil { 134 return nil, fmt.Errorf("%s: %w:\n%s", ErrListLoadBalancerActivations, ErrStructValidation, err) 135 } 136 137 uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID)) 138 if err != nil { 139 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListLoadBalancerActivations, err) 140 } 141 142 q := uri.Query() 143 if params.Network != "" { 144 q.Add("network", fmt.Sprintf("%s", params.Network)) 145 } 146 if params.PageSize != nil { 147 q.Add("pageSize", fmt.Sprintf("%d", *params.PageSize)) 148 } 149 if params.Page != nil { 150 q.Add("page", fmt.Sprintf("%d", *params.Page)) 151 } 152 if params.LatestOnly != false { 153 q.Add("latestOnly", fmt.Sprintf("%s", strconv.FormatBool(params.LatestOnly))) 154 } 155 uri.RawQuery = q.Encode() 156 157 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 158 if err != nil { 159 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListLoadBalancerActivations, err) 160 } 161 162 var result []LoadBalancerActivation 163 resp, err := c.Exec(req, &result) 164 if err != nil { 165 return nil, fmt.Errorf("%w: request failed: %s", ErrListLoadBalancerActivations, err) 166 } 167 168 if resp.StatusCode != http.StatusOK { 169 return nil, fmt.Errorf("%s: %w", ErrListLoadBalancerActivations, c.Error(resp)) 170 } 171 172 return result, nil 173 } 174 175 func (c *cloudlets) ActivateLoadBalancerVersion(ctx context.Context, params ActivateLoadBalancerVersionRequest) (*LoadBalancerActivation, error) { 176 logger := c.Log(ctx) 177 logger.Debug("ActivateLoadBalancerVersion") 178 179 if err := params.Validate(); err != nil { 180 return nil, fmt.Errorf("%s: %w:\n%s", ErrActivateLoadBalancerVersion, ErrStructValidation, err) 181 } 182 183 uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID)) 184 if err != nil { 185 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrActivateLoadBalancerVersion, err) 186 } 187 188 q := uri.Query() 189 q.Add("async", strconv.FormatBool(params.Async)) 190 uri.RawQuery = q.Encode() 191 192 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil) 193 if err != nil { 194 return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivateLoadBalancerVersion, err) 195 } 196 197 var result LoadBalancerActivation 198 199 resp, err := c.Exec(req, &result, params.LoadBalancerVersionActivation) 200 if err != nil { 201 return nil, fmt.Errorf("%w: request failed: %s", ErrActivateLoadBalancerVersion, err) 202 } 203 204 if resp.StatusCode != http.StatusOK { 205 return nil, fmt.Errorf("%s: %w", ErrActivateLoadBalancerVersion, c.Error(resp)) 206 } 207 208 return &result, nil 209 }