diff --git a/file/builder.go b/file/builder.go index a3d76f998..d5c1a86bd 100644 --- a/file/builder.go +++ b/file/builder.go @@ -27,7 +27,7 @@ type stateBuilder struct { schemasCache map[string]map[string]interface{} - isKonnect bool + disableDynamicDefaults bool err error } @@ -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 } @@ -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) } diff --git a/file/builder_test.go b/file/builder_test.go index 74d8d2462..ba2501f38 100644 --- a/file/builder_test.go +++ b/file/builder_test.go @@ -1,6 +1,7 @@ package file import ( + "context" "encoding/hex" "math/rand" "os" @@ -86,6 +87,11 @@ var kongDefaults = KongDefaults{ }, } +var defaulterTestOpts = utils.DefaulterOpts{ + KongDefaults: kongDefaults, + DisableDynamicDefaults: false, +} + func emptyState() *state.KongState { s, _ := state.NewKongState() return s @@ -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 { @@ -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) @@ -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, @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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) diff --git a/file/reader.go b/file/reader.go index 1e62edbc2..842e6d13f 100644 --- a/file/reader.go +++ b/file/reader.go @@ -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 diff --git a/utils/defaulter.go b/utils/defaulter.go index 070e88538..2ae852b26 100644 --- a/utils/defaulter.go +++ b/utils/defaulter.go @@ -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{ @@ -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 } @@ -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 { @@ -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 { diff --git a/utils/defaulter_test.go b/utils/defaulter_test.go index 4f8062826..4b909f5ff 100644 --- a/utils/defaulter_test.go +++ b/utils/defaulter_test.go @@ -1,6 +1,7 @@ package utils import ( + "context" "reflect" "testing" @@ -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) @@ -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) @@ -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) @@ -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) @@ -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, @@ -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{ @@ -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)