github.com/IBM-Cloud/bluemix-go@v0.0.0-20240314082800-4e02a69b84b2/api/cis/cisv1/ratelimit.go (about) 1 package cisv1 2 3 import ( 4 "fmt" 5 6 "github.com/IBM-Cloud/bluemix-go/client" 7 ) 8 9 // RateLimitRecord is a policy than can be applied to limit traffic within a customer domain 10 type RateLimitRecord struct { 11 ID string `json:"id,omitempty"` 12 Disabled bool `json:"disabled,omitempty"` 13 Description string `json:"description,omitempty"` 14 Bypass []RateLimitByPass `json:"bypass,omitempty"` 15 Threshold int `json:"threshold"` 16 Period int `json:"period"` 17 Correlate *RateLimitCorrelate `json:"correlate,omitempty"` 18 Action RateLimitAction `json:"action"` 19 Match RateLimitMatch `json:"match"` 20 } 21 22 // RateLimitByPass ... 23 type RateLimitByPass struct { 24 Name string `json:"name"` 25 Value string `json:"value"` 26 } 27 28 // RateLimitCorrelate ... 29 type RateLimitCorrelate struct { 30 By string `json:"by"` 31 } 32 33 // RateLimitAction ... 34 type RateLimitAction struct { 35 Mode string `json:"mode"` 36 Timeout int `json:"timeout,omitempty"` 37 Response *ActionResponse `json:"response,omitempty"` 38 } 39 40 // ActionResponse ... 41 type ActionResponse struct { 42 ContentType string `json:"content_type,omitempty"` 43 Body string `json:"body,omitempty"` 44 } 45 46 // RateLimitMatch ... 47 type RateLimitMatch struct { 48 Request MatchRequest `json:"request"` 49 Response MatchResponse `json:"response"` 50 } 51 52 // MatchRequest ... 53 type MatchRequest struct { 54 Methods []string `json:"methods,omitempty"` 55 Schemes []string `json:"schemes,omitempty"` 56 URL string `json:"url,omitempty"` 57 } 58 59 // MatchResponse ... 60 type MatchResponse struct { 61 Statuses []int `json:"status,omitempty"` 62 OriginTraffic *bool `json:"origin_traffic,omitempty"` // api defaults to true so we need an explicit empty value 63 Headers []MatchResponseHeader `json:"headers,omitempty"` 64 } 65 66 // MatchResponseHeader ... 67 type MatchResponseHeader struct { 68 Name string `json:"name,omitempty"` 69 Op string `json:"op,omitempty"` 70 Value string `json:"value,omitempty"` 71 } 72 73 //RateLimitResult ... 74 type RateLimitResult struct { 75 RateLimit RateLimitRecord `json:"result"` 76 Success bool `json:"success"` 77 Errors []Error `json:"errors"` 78 Messages []string `json:"messages"` 79 } 80 81 //RateLimitResults ... 82 type RateLimitResults struct { 83 RateLimitList []RateLimitRecord `json:"result"` 84 ResultsInfo ResultsCount `json:"result_info"` 85 Success bool `json:"success"` 86 Errors []Error `json:"errors"` 87 } 88 89 //RateLimit ... 90 type RateLimit interface { 91 ListRateLimit(cisID string, zoneID string) ([]RateLimitRecord, error) 92 GetRateLimit(cisID string, zoneID string, rateLimitID string) (*RateLimitRecord, error) 93 CreateRateLimit(cisID string, zoneID string, rateLimitBody RateLimitRecord) (*RateLimitRecord, error) 94 DeleteRateLimit(cisID string, zoneID string, rateLimitID string) error 95 UpdateRateLimit(cisID string, zoneID string, rateLimitID string, rateLimitBody RateLimitRecord) (*RateLimitRecord, error) 96 } 97 98 //RateLimit ... 99 type ratelimit struct { 100 client *client.Client 101 } 102 103 func newRateLimitAPI(c *client.Client) RateLimit { 104 return &ratelimit{ 105 client: c, 106 } 107 } 108 109 func (r *ratelimit) ListRateLimit(cisID string, zoneID string) ([]RateLimitRecord, error) { 110 rateLimitResults := RateLimitResults{} 111 112 var rawURL string 113 rawURL = fmt.Sprintf("/v1/%s/zones/%s/rate_limits", cisID, zoneID) 114 _, err := r.client.Get(rawURL, &rateLimitResults, nil) 115 if err != nil { 116 return nil, err 117 } 118 return rateLimitResults.RateLimitList, err 119 } 120 121 func (r *ratelimit) GetRateLimit(cisID string, zoneID string, rateLimitID string) (*RateLimitRecord, error) { 122 rateLimitResult := RateLimitResult{} 123 var rawURL string 124 rawURL = fmt.Sprintf("/v1/%s/zones/%s/rate_limits/%s", cisID, zoneID, rateLimitID) 125 _, err := r.client.Get(rawURL, &rateLimitResult, nil) 126 if err != nil { 127 return nil, err 128 } 129 return &rateLimitResult.RateLimit, nil 130 } 131 132 func (r *ratelimit) DeleteRateLimit(cisID string, zoneID string, rateLimitID string) error { 133 var rawURL string 134 rawURL = fmt.Sprintf("/v1/%s/zones/%s/rate_limits/%s", cisID, zoneID, rateLimitID) 135 _, err := r.client.Delete(rawURL) 136 if err != nil { 137 return err 138 } 139 return nil 140 } 141 142 func (r *ratelimit) CreateRateLimit(cisID string, zoneID string, rateLimitBody RateLimitRecord) (*RateLimitRecord, error) { 143 rateLimitResult := RateLimitResult{} 144 var rawURL string 145 rawURL = fmt.Sprintf("/v1/%s/zones/%s/rate_limits", cisID, zoneID) 146 _, err := r.client.Post(rawURL, &rateLimitBody, &rateLimitResult) 147 if err != nil { 148 return nil, err 149 } 150 return &rateLimitResult.RateLimit, nil 151 } 152 153 func (r *ratelimit) UpdateRateLimit(cisID string, zoneID string, rateLimitID string, rateLimitBody RateLimitRecord) (*RateLimitRecord, error) { 154 rateLimitResult := RateLimitResult{} 155 var rawURL string 156 rawURL = fmt.Sprintf("/v1/%s/zones/%s/rate_limits/%s", cisID, zoneID, rateLimitID) 157 _, err := r.client.Put(rawURL, &rateLimitBody, &rateLimitResult) 158 if err != nil { 159 return nil, err 160 } 161 return &rateLimitResult.RateLimit, nil 162 }