Skip to content

Commit

Permalink
introduce DefaulterOpts and unexport GetKongDefaulter
Browse files Browse the repository at this point in the history
  • Loading branch information
GGabriele committed Feb 9, 2022
1 parent ea2d722 commit 3bb2182
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 41 deletions.
13 changes: 9 additions & 4 deletions file/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ type stateBuilder struct {

schemasCache map[string]map[string]interface{}

isKonnect bool
disableDynamicDefaults bool

err error
}
Expand All @@ -53,7 +53,7 @@ func (b *stateBuilder) build() (*utils.KongRawState, *utils.KonnectRawState, err
return nil, nil, err
}

defaulter, err := defaulter(b.ctx, b.client, b.targetContent, b.isKonnect)
defaulter, err := defaulter(b.ctx, b.client, b.targetContent, b.disableDynamicDefaults)
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -900,13 +900,18 @@ func pluginRelations(plugin *kong.Plugin) (cID, rID, sID string) {
}

func defaulter(
ctx context.Context, client *kong.Client, fileContent *Content, isKonnect bool,
ctx context.Context, client *kong.Client, fileContent *Content, disableDynamicDefaults bool,
) (*utils.Defaulter, error) {
var kongDefaults KongDefaults
if fileContent.Info != nil {
kongDefaults = fileContent.Info.Defaults
}
defaulter, err := utils.GetDefaulter(ctx, client, kongDefaults, isKonnect)
opts := utils.DefaulterOpts{
Client: client,
KongDefaults: kongDefaults,
DisableDynamicDefaults: disableDynamicDefaults,
}
defaulter, err := utils.GetDefaulter(ctx, opts)
if err != nil {
return nil, fmt.Errorf("creating defaulter: %w", err)
}
Expand Down
30 changes: 22 additions & 8 deletions file/builder_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package file

import (
"context"
"encoding/hex"
"math/rand"
"os"
Expand Down Expand Up @@ -86,6 +87,11 @@ var kongDefaults = KongDefaults{
},
}

var defaulterTestOpts = utils.DefaulterOpts{
KongDefaults: kongDefaults,
DisableDynamicDefaults: false,
}

func emptyState() *state.KongState {
s, _ := state.NewKongState()
return s
Expand Down Expand Up @@ -523,11 +529,12 @@ func Test_stateBuilder_ingestRoute(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
b := &stateBuilder{
currentState: tt.fields.currentState,
}
b.rawState = &utils.KongRawState{}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
b.intermediate, _ = state.NewKongState()
if err := b.ingestRoute(tt.args.route); (err != nil) != tt.wantErr {
Expand Down Expand Up @@ -629,11 +636,12 @@ func Test_stateBuilder_ingestTargets(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
b := &stateBuilder{
currentState: tt.fields.currentState,
}
b.rawState = &utils.KongRawState{}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
if err := b.ingestTargets(tt.args.targets); (err != nil) != tt.wantErr {
t.Errorf("stateBuilder.ingestPlugins() error = %v, wantErr %v", err, tt.wantErr)
Expand Down Expand Up @@ -1262,6 +1270,7 @@ func Test_stateBuilder_consumers(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
b := &stateBuilder{
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
Expand All @@ -1270,7 +1279,7 @@ func Test_stateBuilder_consumers(t *testing.T) {
if tt.fields.kongVersion != nil {
b.kongVersion = *tt.fields.kongVersion
}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down Expand Up @@ -1433,11 +1442,12 @@ func Test_stateBuilder_certificates(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
b := &stateBuilder{
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down Expand Up @@ -1506,11 +1516,12 @@ func Test_stateBuilder_caCertificates(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
b := &stateBuilder{
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down Expand Up @@ -1781,11 +1792,12 @@ func Test_stateBuilder_upstream(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
b := &stateBuilder{
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down Expand Up @@ -1884,11 +1896,12 @@ func Test_stateBuilder_documents(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
b := &stateBuilder{
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.konnectRawState)
Expand Down Expand Up @@ -2430,12 +2443,13 @@ func Test_stateBuilder(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctx := context.Background()
rand.Seed(42)
b := &stateBuilder{
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter(kongDefaults, false)
d, _ := utils.GetDefaulter(ctx, defaulterTestOpts)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down
2 changes: 1 addition & 1 deletion file/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ func GetForKonnect(ctx context.Context, fileContent *Content,
builder.kongVersion = opt.KongVersion
builder.client = client
builder.ctx = ctx
builder.isKonnect = true
builder.disableDynamicDefaults = true

if fileContent.Transform != nil && !*fileContent.Transform {
return nil, nil, ErrorTransformFalseNotSupported
Expand Down
32 changes: 17 additions & 15 deletions utils/defaulter.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ type Defaulter struct {
target *kong.Target
}

type DefaulterOpts struct {
KongDefaults interface{}
DisableDynamicDefaults bool
Client *kong.Client
}

// NewDefaulter initializes a Defaulter with empty entities.
func NewDefaulter() *Defaulter {
return &Defaulter{
Expand All @@ -33,14 +39,12 @@ func NewDefaulter() *Defaulter {
}
}

// GetKongDefaulter returns a defaulter which can set default values
// for Kong entities.
func GetKongDefaulter(kongDefaults interface{}, isKonnect bool) (*Defaulter, error) {
func getKongDefaulter(opts DefaulterOpts) (*Defaulter, error) {
d := NewDefaulter()
if err := d.populateDefaultsFromInput(kongDefaults); err != nil {
if err := d.populateDefaultsFromInput(opts.KongDefaults); err != nil {
return nil, err
}
if isKonnect {
if opts.DisableDynamicDefaults {
if err := d.populateStaticDefaultsForKonnect(); err != nil {
return nil, err
}
Expand Down Expand Up @@ -173,15 +177,14 @@ func (d *Defaulter) addEntityDefaults(entityType string, entity interface{}) err
return kong.FillEntityDefaults(entity, schema)
}

func getKongDefaulterWithClient(ctx context.Context, client *kong.Client,
kongDefaults interface{}) (*Defaulter, error) {
func getKongDefaulterWithClient(ctx context.Context, opts DefaulterOpts) (*Defaulter, error) {
// fills defaults from input
d, err := GetKongDefaulter(kongDefaults, false)
d, err := getKongDefaulter(opts)
if err != nil {
return nil, err
}
d.ctx = ctx
d.client = client
d.client = opts.Client

// fills defaults from Kong API
if err := d.addEntityDefaults("services", d.service); err != nil {
Expand Down Expand Up @@ -221,13 +224,12 @@ func getKongDefaulterWithClient(ctx context.Context, client *kong.Client,
// 2. values set in the {_info: defaults:} object in the state file
// 3. schema defaults coming from Admin API (excluded Konnect)
// 4. hardcoded defaults under utils/constants.go (Konnect-only)
func GetDefaulter(
ctx context.Context, client *kong.Client, kongDefaults interface{}, isKonnect bool,
) (*Defaulter, error) {
if client != nil && !isKonnect {
return getKongDefaulterWithClient(ctx, client, kongDefaults)
func GetDefaulter(ctx context.Context, opts DefaulterOpts) (*Defaulter, error) {
if opts.Client != nil && !opts.DisableDynamicDefaults {
return getKongDefaulterWithClient(ctx, opts)
}
return GetKongDefaulter(kongDefaults, isKonnect)
opts.DisableDynamicDefaults = true
return getKongDefaulter(opts)
}

func (d *Defaulter) populateDefaultsFromInput(defaults interface{}) error {
Expand Down
42 changes: 29 additions & 13 deletions utils/defaulter_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package utils

import (
"context"
"reflect"
"testing"

Expand All @@ -22,6 +23,11 @@ var kongDefaults = kongDefaultForTesting{
Target: &targetDefaults,
}

var defaulterTestOpts = DefaulterOpts{
KongDefaults: kongDefaults,
DisableDynamicDefaults: false,
}

func TestDefaulter(t *testing.T) {
assert := assert.New(t)

Expand Down Expand Up @@ -69,7 +75,8 @@ func TestDefaulter(t *testing.T) {

func TestServiceSetTest(t *testing.T) {
assert := assert.New(t)
d, err := GetKongDefaulter(kongDefaults, false)
ctx := context.Background()
d, err := GetDefaulter(ctx, defaulterTestOpts)
assert.NotNil(d)
assert.Nil(err)

Expand Down Expand Up @@ -154,7 +161,8 @@ func TestServiceSetTest(t *testing.T) {

func TestRouteSetTest(t *testing.T) {
assert := assert.New(t)
d, err := GetKongDefaulter(kongDefaults, false)
ctx := context.Background()
d, err := GetDefaulter(ctx, defaulterTestOpts)
assert.NotNil(d)
assert.Nil(err)

Expand Down Expand Up @@ -246,7 +254,8 @@ func TestRouteSetTest(t *testing.T) {

func TestUpstreamSetTest(t *testing.T) {
assert := assert.New(t)
d, err := GetKongDefaulter(kongDefaults, false)
ctx := context.Background()
d, err := GetDefaulter(ctx, defaulterTestOpts)
assert.NotNil(d)
assert.Nil(err)

Expand Down Expand Up @@ -496,17 +505,20 @@ func TestUpstreamSetTest(t *testing.T) {
}
}

func TestGetKongDefaulter_Konnect(t *testing.T) {
func TestGetDefaulter_Konnect(t *testing.T) {
assert := assert.New(t)

testCases := []struct {
desc string
userDefaults *kongDefaultForTesting
want *Defaulter
desc string
opts DefaulterOpts
want *Defaulter
}{
{
desc: "empty user defaults",
userDefaults: &kongDefaultForTesting{},
desc: "empty user defaults",
opts: DefaulterOpts{
KongDefaults: &kongDefaultForTesting{},
DisableDynamicDefaults: true,
},
want: &Defaulter{
service: &serviceDefaults,
route: &routeDefaults,
Expand All @@ -516,10 +528,13 @@ func TestGetKongDefaulter_Konnect(t *testing.T) {
},
{
desc: "user defaults take precedence",
userDefaults: &kongDefaultForTesting{
Service: &kong.Service{
Port: kong.Int(8080),
opts: DefaulterOpts{
KongDefaults: &kongDefaultForTesting{
Service: &kong.Service{
Port: kong.Int(8080),
},
},
DisableDynamicDefaults: true,
},
want: &Defaulter{
service: &kong.Service{
Expand All @@ -537,7 +552,8 @@ func TestGetKongDefaulter_Konnect(t *testing.T) {
}
for _, tc := range testCases {
t.Run(tc.desc, func(t *testing.T) {
d, err := GetKongDefaulter(tc.userDefaults, true)
ctx := context.Background()
d, err := GetDefaulter(ctx, tc.opts)
assert.NotNil(d)
assert.Nil(err)

Expand Down

0 comments on commit 3bb2182

Please sign in to comment.