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  }