Skip to content

Commit

Permalink
feat: adding CreateRulesetRule in rulesets.go
Browse files Browse the repository at this point in the history
  • Loading branch information
tcinbis committed Apr 10, 2024
1 parent 3824f2e commit c348c3b
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 0 deletions.
27 changes: 27 additions & 0 deletions rulesets.go
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,10 @@ type UpdateRulesetParams struct {
Rules []RulesetRule `json:"rules"`
}

type CreateRulesetRuleParams struct {
RulesetRule
}

type UpdateRulesetRuleParams struct {
RulesetRule
}
Expand Down Expand Up @@ -846,6 +850,29 @@ func (api *API) UpdateRuleset(ctx context.Context, rc *ResourceContainer, params
return result.Result, nil
}

// CreateRulesetRule creates a new ruleset rule.
//
// API reference: https://developers.cloudflare.com/api/operations/createAccountRulesetRule
// API reference: https://developers.cloudflare.com/api/operations/createZoneRulesetRule
func (api *API) CreateRulesetRule(ctx context.Context, rc *ResourceContainer, rulesetID string, params CreateRulesetRuleParams) (Ruleset, error) {
uri := fmt.Sprintf("/%s/%s/rulesets/%s/rules", rc.Level, rc.Identifier, rulesetID)
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
if err != nil {
return Ruleset{}, err
}

result := CreateRulesetResponse{}
if err := json.Unmarshal(res, &result); err != nil {
return Ruleset{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}

return result.Result, nil
}

// UpdateRulesetRule updates a ruleset rule based on the ruleset and rule ID.
//
// API reference: https://developers.cloudflare.com/api/operations/updateAccountRulesetRule
// API reference: https://developers.cloudflare.com/api/operations/updateZoneRulesetRule
func (api *API) UpdateRulesetRule(ctx context.Context, rc *ResourceContainer, rulesetID string, params UpdateRulesetRuleParams) (Ruleset, error) {
if params.ID == "" {
return Ruleset{}, ErrMissingResourceIdentifier
Expand Down
87 changes: 87 additions & 0 deletions rulesets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,7 @@ func TestUpdateRulesetRule(t *testing.T) {
}`)
}

mux.HandleFunc("/accounts/"+testAccountID+"/rulesets/2c0fc9fa937b11eaa1b71c4d701ab86e/rules/62449e2e0de149619edb35e59c10d802", handler)
mux.HandleFunc("/zones/"+testZoneID+"/rulesets/2c0fc9fa937b11eaa1b71c4d701ab86e/rules/62449e2e0de149619edb35e59c10d802", handler)

lastUpdated, _ := time.Parse(time.RFC3339, "2020-12-02T20:24:07.776073Z")
Expand Down Expand Up @@ -940,4 +941,90 @@ func TestUpdateRulesetRule(t *testing.T) {
if assert.NoError(t, err) {
assert.Equal(t, want, zoneActual)
}

accountActual, err := client.UpdateRulesetRule(context.Background(), AccountIdentifier(testAccountID), "2c0fc9fa937b11eaa1b71c4d701ab86e", updated)
if assert.NoError(t, err) {
assert.Equal(t, want, accountActual)
}
}

func TestCreateRulesetRule(t *testing.T) {
setup()
defer teardown()

handler := func(w http.ResponseWriter, r *http.Request) {
assert.Equal(t, http.MethodPost, r.Method, "Expected method 'POST', got %s", r.Method)
w.Header().Set("content-type", "application/json")
fmt.Fprint(w, `{
"result": {
"id": "2c0fc9fa937b11eaa1b71c4d701ab86e",
"name": "my example ruleset",
"description": "Test magic transit ruleset",
"kind": "root",
"version": "1",
"last_updated": "2020-12-02T20:24:07.776073Z",
"phase": "magic_transit",
"rules": [
{
"id": "62449e2e0de149619edb35e59c10d801",
"version": "1",
"action": "skip",
"action_parameters":{
"ruleset":"current"
},
"expression": "tcp.dstport in { 32768..65535 }",
"description": "Allow TCP Ephemeral Ports",
"last_updated": "2020-12-02T20:24:07.776073Z",
"ref": "72449e2e0de149619edb35e59c10d801",
"enabled": true
}
]
},
"success": true,
"errors": [],
"messages": []
}`)
}

mux.HandleFunc("/accounts/"+testAccountID+"/rulesets/2c0fc9fa937b11eaa1b71c4d701ab86e/rules", handler)
mux.HandleFunc("/zones/"+testZoneID+"/rulesets/2c0fc9fa937b11eaa1b71c4d701ab86e/rules", handler)

lastUpdated, _ := time.Parse(time.RFC3339, "2020-12-02T20:24:07.776073Z")

rule := RulesetRule{
ID: "62449e2e0de149619edb35e59c10d801",
Version: StringPtr("1"),
Action: string(RulesetRuleActionSkip),
ActionParameters: &RulesetRuleActionParameters{
Ruleset: "current",
},
Expression: "tcp.dstport in { 32768..65535 }",
Description: "Allow TCP Ephemeral Ports",
LastUpdated: &lastUpdated,
Ref: "72449e2e0de149619edb35e59c10d801",
Enabled: BoolPtr(true),
}

newRule := CreateRulesetRuleParams{rule}

want := Ruleset{
ID: "2c0fc9fa937b11eaa1b71c4d701ab86e",
Name: "my example ruleset",
Description: "Test magic transit ruleset",
Kind: "root",
Version: StringPtr("1"),
LastUpdated: &lastUpdated,
Phase: string(RulesetPhaseMagicTransit),
Rules: []RulesetRule{rule},
}

zoneActual, err := client.CreateRulesetRule(context.Background(), ZoneIdentifier(testZoneID), "2c0fc9fa937b11eaa1b71c4d701ab86e", newRule)
if assert.NoError(t, err) {
assert.Equal(t, want, zoneActual)
}

accountActual, err := client.CreateRulesetRule(context.Background(), AccountIdentifier(testAccountID), "2c0fc9fa937b11eaa1b71c4d701ab86e", newRule)
if assert.NoError(t, err) {
assert.Equal(t, want, accountActual)
}
}

0 comments on commit c348c3b

Please sign in to comment.