Skip to content

Commit

Permalink
move ruleset to the new internal resource abstraction
Browse files Browse the repository at this point in the history
  • Loading branch information
frankgreco committed Jan 6, 2022
1 parent 817bca8 commit 0658deb
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 127 deletions.
2 changes: 1 addition & 1 deletion internal/provider/resource_firewall_port_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ func (r resourceFirewallPortGroupType) GetSchema(_ context.Context) (tfsdk.Schem
Type: tfftypes.ListType{ElemType: tfftypes.NumberType},
Optional: true,
Description: "A list of port numbers.",
Validators: []tfsdk.AttributeValidator{
Validators: []tfsdk.AttributeValidator{
validators.NoOverlap(),
},
},
Expand Down
141 changes: 15 additions & 126 deletions internal/provider/resource_firewall_ruleset.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ package provider

import (
"context"
"encoding/json"
"log"

"terraform-provider-edge/internal/utils"

Expand Down Expand Up @@ -189,141 +187,32 @@ func (r resourceFirewallRulesetType) GetSchema(_ context.Context) (tfsdk.Schema,
}

func (r resourceFirewallRulesetType) NewResource(_ context.Context, p tfsdk.Provider) (tfsdk.Resource, diag.Diagnostics) {
return resourceFirewallRuleset{
p: *(p.(*provider)),
return utils.Resource{
Name: "firewall ruleset",
Attribute: "name",
IsConfigured: (p.(*provider)).configured,
Api: resourceFirewallRuleset{p: *(p.(*provider))},
Type: types.Ruleset{},
}, nil
}

type resourceFirewallRuleset struct {
p provider
}

func (r resourceFirewallRuleset) Create(ctx context.Context, req tfsdk.CreateResourceRequest, resp *tfsdk.CreateResourceResponse) {
utils.CreateFunc(
ctx,
req,
resp,
types.Ruleset{},
"firewall ruleset",
r.p.configured,
func(ctx context.Context, plan interface{}) (interface{}, error) {
ruleset := plan.(types.Ruleset)
return r.p.client.Firewall.CreateRuleset(ctx, &ruleset)
},
)
func (r resourceFirewallRuleset) Read(ctx context.Context, id string) (interface{}, error) {
return r.p.client.Firewall.GetRuleset(ctx, id)
}

func (r resourceFirewallRuleset) Read(ctx context.Context, req tfsdk.ReadResourceRequest, resp *tfsdk.ReadResourceResponse) {
utils.ReadFunc(
ctx,
req,
resp,
"name",
"port group",
r.p.configured,
func(ctx context.Context, id string) (interface{}, error) {
return r.p.client.Firewall.GetRuleset(ctx, id)
},
)
}

func (r resourceFirewallRuleset) Update(ctx context.Context, req tfsdk.UpdateResourceRequest, resp *tfsdk.UpdateResourceResponse) {
var current types.Ruleset
{
diagnostics := req.State.Get(ctx, &current)
resp.Diagnostics.Append(diagnostics...)
if resp.Diagnostics.HasError() {
return
}

(&current).SetCodecMode(types.CodecModeLocal)
log.Printf("[TRACE] current ruleset struct: %+v", current)
}

var desired types.Ruleset
{
diags := req.Plan.Get(ctx, &desired)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
(&desired).SetCodecMode(types.CodecModeLocal)
log.Printf("[TRACE] desired ruleset struct: %+v", desired)
}

var patches []jsonpatch.JsonPatchOperation
{
cData, err := json.Marshal(&current)
if err != nil {
resp.Diagnostics.AddError(
"Could not marshal ruleset from state",
err.Error(),
)
return
}
log.Printf("[TRACE] current ruleset json: %s", string(cData))

dData, err := json.Marshal(&desired)
if err != nil {
resp.Diagnostics.AddError(
"Could not marshal ruleset from plan",
err.Error(),
)
return
}
log.Printf("[TRACE] desired ruleset json: %s", string(dData))

p, err := jsonpatch.CreatePatch(cData, dData)
if err != nil {
resp.Diagnostics.AddError(
"Could not create patch document.",
err.Error(),
)
return
}
patches = p
log.Printf("[DEBUG] patch document: %+v", patches)
}

updated, err := r.p.client.Firewall.UpdateRuleset(ctx, &current, patches)
if err != nil {
resp.Diagnostics.AddError(
"There was an issue updating the ruleset.",
err.Error(),
)
return
}

diagnostics := resp.State.Set(ctx, *updated)
resp.Diagnostics.Append(diagnostics...)
if resp.Diagnostics.HasError() {
return
}
func (r resourceFirewallRuleset) Create(ctx context.Context, plan interface{}) (interface{}, error) {
ruleset := plan.(types.Ruleset)
return r.p.client.Firewall.CreateRuleset(ctx, &ruleset)
}

func (r resourceFirewallRuleset) Delete(ctx context.Context, req tfsdk.DeleteResourceRequest, resp *tfsdk.DeleteResourceResponse) {
utils.DeleteFunc(
ctx,
req,
resp,
"name",
"firewall ruleset",
r.p.configured,
func(ctx context.Context, id string) error {
return r.p.client.Firewall.DeleteRuleset(ctx, id)
},
)
func (r resourceFirewallRuleset) Update(ctx context.Context, current interface{}, patches []jsonpatch.JsonPatchOperation) (interface{}, error) {
return r.p.client.Firewall.UpdateRuleset(ctx, current.(*types.Ruleset), patches)
}

func (r resourceFirewallRuleset) ImportState(ctx context.Context, req tfsdk.ImportResourceStateRequest, resp *tfsdk.ImportResourceStateResponse) {
utils.ImportFunc(
ctx,
req,
resp,
"firewall ruleset",
r.p.configured,
func(ctx context.Context, id string) (interface{}, error) {
return r.p.client.Firewall.GetRuleset(ctx, id)
},
)
func (r resourceFirewallRuleset) Delete(ctx context.Context, id string) error {
return r.p.client.Firewall.DeleteRuleset(ctx, id)
}
1 change: 1 addition & 0 deletions internal/utils/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func retrieve(ctx context.Context, r terraformRetriever, target interface{}) (in
case types.Ruleset:
var tmp types.Ruleset
diags := r.Get(ctx, &tmp)
(&tmp).SetCodecMode(types.CodecModeLocal)
return tmp, diags
default:
var diags diag.Diagnostics
Expand Down

0 comments on commit 0658deb

Please sign in to comment.