github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.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/v2/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://developer.akamai.com/api/web_performance/cloudlets/v2.html#getloadbalancingconfigactivations 22 ListLoadBalancerActivations(context.Context, ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error) 23 24 // ActivateLoadBalancerVersion activates the load balancing version 25 // 26 // See: https://developer.akamai.com/api/web_performance/cloudlets/v2.html#postloadbalancingconfigactivations 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 // ListLoadBalancerActivations fetches activations with the most recent listed first 130 func (c *cloudlets) ListLoadBalancerActivations(ctx context.Context, params ListLoadBalancerActivationsRequest) ([]LoadBalancerActivation, error) { 131 logger := c.Log(ctx) 132 logger.Debug("ListLoadBalancerActivations") 133 134 if err := params.Validate(); err != nil { 135 return nil, fmt.Errorf("%s: %w:\n%s", ErrListLoadBalancerActivations, ErrStructValidation, err) 136 } 137 138 uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID)) 139 if err != nil { 140 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListLoadBalancerActivations, err) 141 } 142 143 q := uri.Query() 144 if params.Network != "" { 145 q.Add("network", fmt.Sprintf("%s", params.Network)) 146 } 147 if params.PageSize != nil { 148 q.Add("pageSize", fmt.Sprintf("%d", *params.PageSize)) 149 } 150 if params.Page != nil { 151 q.Add("page", fmt.Sprintf("%d", *params.Page)) 152 } 153 if params.LatestOnly != false { 154 q.Add("latestOnly", fmt.Sprintf("%s", strconv.FormatBool(params.LatestOnly))) 155 } 156 uri.RawQuery = q.Encode() 157 158 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 159 if err != nil { 160 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListLoadBalancerActivations, err) 161 } 162 163 var result []LoadBalancerActivation 164 resp, err := c.Exec(req, &result) 165 if err != nil { 166 return nil, fmt.Errorf("%w: request failed: %s", ErrListLoadBalancerActivations, err) 167 } 168 169 if resp.StatusCode != http.StatusOK { 170 return nil, fmt.Errorf("%s: %w", ErrListLoadBalancerActivations, c.Error(resp)) 171 } 172 173 return result, nil 174 } 175 176 // ActivateLoadBalancerVersion activates the load balacing version 177 func (c *cloudlets) ActivateLoadBalancerVersion(ctx context.Context, params ActivateLoadBalancerVersionRequest) (*LoadBalancerActivation, error) { 178 logger := c.Log(ctx) 179 logger.Debug("ActivateLoadBalancerVersion") 180 181 if err := params.Validate(); err != nil { 182 return nil, fmt.Errorf("%s: %w:\n%s", ErrActivateLoadBalancerVersion, ErrStructValidation, err) 183 } 184 185 uri, err := url.Parse(fmt.Sprintf("/cloudlets/api/v2/origins/%s/activations", params.OriginID)) 186 if err != nil { 187 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrActivateLoadBalancerVersion, err) 188 } 189 190 q := uri.Query() 191 q.Add("async", strconv.FormatBool(params.Async)) 192 uri.RawQuery = q.Encode() 193 194 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri.String(), nil) 195 if err != nil { 196 return nil, fmt.Errorf("%w: failed to create request: %s", ErrActivateLoadBalancerVersion, err) 197 } 198 199 var result LoadBalancerActivation 200 201 resp, err := c.Exec(req, &result, params.LoadBalancerVersionActivation) 202 if err != nil { 203 return nil, fmt.Errorf("%w: request failed: %s", ErrActivateLoadBalancerVersion, err) 204 } 205 206 if resp.StatusCode != http.StatusOK { 207 return nil, fmt.Errorf("%s: %w", ErrActivateLoadBalancerVersion, c.Error(resp)) 208 } 209 210 return &result, nil 211 }