Skip to content

Commit

Permalink
rework for precedence
Browse files Browse the repository at this point in the history
  • Loading branch information
GGabriele committed Jan 31, 2022
1 parent 3f5e513 commit bcbe6f6
Show file tree
Hide file tree
Showing 6 changed files with 261 additions and 174 deletions.
56 changes: 12 additions & 44 deletions file/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,11 @@ func (b *stateBuilder) build() (*utils.KongRawState, *utils.KonnectRawState, err
return nil, nil, err
}

// defaulter
var kongDefaults KongDefaults
if b.targetContent.Info != nil {
kongDefaults = b.targetContent.Info.Defaults
}
if !isKongDefaultEmpty(kongDefaults) || b.defaulter == nil {
b.defaulter, err = defaulter(kongDefaults)
if err != nil {
return nil, nil, fmt.Errorf("creating defaulter: %w", err)
}
defaulter, err := defaulter(b.ctx, b.client, b.targetContent)
if err != nil {
return nil, nil, err
}
b.defaulter = defaulter

// build
b.certificates()
Expand Down Expand Up @@ -870,40 +864,14 @@ func pluginRelations(plugin *kong.Plugin) (cID, rID, sID string) {
return
}

func defaulter(defaults KongDefaults) (*utils.Defaulter, error) {
d, err := utils.GetKongDefaulter()
if err != nil {
return nil, err
}
if defaults.Route != nil {
if err = d.Register(defaults.Route); err != nil {
return nil, err
}
}
if defaults.Service != nil {
if err = d.Register(defaults.Service); err != nil {
return nil, err
}
}
if defaults.Upstream != nil {
if err = d.Register(defaults.Upstream); err != nil {
return nil, err
}
}
if defaults.Target != nil {
if err = d.Register(defaults.Target); err != nil {
return nil, err
}
func defaulter(ctx context.Context, client *kong.Client, fileContent *Content) (*utils.Defaulter, error) {
var kongDefaults KongDefaults
if fileContent.Info != nil {
kongDefaults = fileContent.Info.Defaults
}
return d, nil
}

func isKongDefaultEmpty(kongDefault KongDefaults) bool {
if kongDefault.Service != nil ||
kongDefault.Route != nil ||
kongDefault.Upstream != nil ||
kongDefault.Target != nil {
return false
defaulter, err := utils.GetDefaulter(ctx, client, kongDefaults)
if err != nil {
return nil, fmt.Errorf("creating defaulter: %w", err)
}
return true
return defaulter, nil
}
106 changes: 95 additions & 11 deletions file/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,77 @@ import (
"github.com/stretchr/testify/assert"
)

const (
defaultPort = 80
defaultTimeout = 60000
defaultSlots = 10000
defaultWeight = 100
defaultConcurrency = 10
)

var kong130Version = semver.MustParse("1.3.0")

var kongDefaults = KongDefaults{
Service: &kong.Service{
Port: kong.Int(defaultPort),
Protocol: kong.String("http"),
ConnectTimeout: kong.Int(defaultTimeout),
WriteTimeout: kong.Int(defaultTimeout),
ReadTimeout: kong.Int(defaultTimeout),
},
Route: &kong.Route{
PreserveHost: kong.Bool(false),
RegexPriority: kong.Int(0),
StripPath: kong.Bool(false),
Protocols: kong.StringSlice("http", "https"),
},
Upstream: &kong.Upstream{
Slots: kong.Int(defaultSlots),
Healthchecks: &kong.Healthcheck{
Active: &kong.ActiveHealthcheck{
Concurrency: kong.Int(defaultConcurrency),
Healthy: &kong.Healthy{
HTTPStatuses: []int{200, 302},
Interval: kong.Int(0),
Successes: kong.Int(0),
},
HTTPPath: kong.String("/"),
Type: kong.String("http"),
Timeout: kong.Int(1),
Unhealthy: &kong.Unhealthy{
HTTPFailures: kong.Int(0),
TCPFailures: kong.Int(0),
Timeouts: kong.Int(0),
Interval: kong.Int(0),
HTTPStatuses: []int{429, 404, 500, 501, 502, 503, 504, 505},
},
},
Passive: &kong.PassiveHealthcheck{
Healthy: &kong.Healthy{
HTTPStatuses: []int{
200, 201, 202, 203, 204, 205,
206, 207, 208, 226, 300, 301, 302, 303, 304, 305,
306, 307, 308,
},
Successes: kong.Int(0),
},
Unhealthy: &kong.Unhealthy{
HTTPFailures: kong.Int(0),
TCPFailures: kong.Int(0),
Timeouts: kong.Int(0),
HTTPStatuses: []int{429, 500, 503},
},
},
},
HashOn: kong.String("none"),
HashFallback: kong.String("none"),
HashOnCookiePath: kong.String("/"),
},
Target: &kong.Target{
Weight: kong.Int(defaultWeight),
},
}

func emptyState() *state.KongState {
s, _ := state.NewKongState()
return s
Expand Down Expand Up @@ -309,7 +378,9 @@ func Test_stateBuilder_services(t *testing.T) {
name: "matches ID of an existing service",
fields: fields{
targetContent: &Content{
Info: &Info{},
Info: &Info{
Defaults: kongDefaults,
},
Services: []FService{
{
Service: kong.Service{
Expand Down Expand Up @@ -339,6 +410,9 @@ func Test_stateBuilder_services(t *testing.T) {
name: "process a non-existent service",
fields: fields{
targetContent: &Content{
Info: &Info{
Defaults: kongDefaults,
},
Services: []FService{
{
Service: kong.Service{
Expand Down Expand Up @@ -453,7 +527,7 @@ func Test_stateBuilder_ingestRoute(t *testing.T) {
currentState: tt.fields.currentState,
}
b.rawState = &utils.KongRawState{}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
b.defaulter = d
b.intermediate, _ = state.NewKongState()
if err := b.ingestRoute(tt.args.route); (err != nil) != tt.wantErr {
Expand Down Expand Up @@ -559,7 +633,7 @@ func Test_stateBuilder_ingestTargets(t *testing.T) {
currentState: tt.fields.currentState,
}
b.rawState = &utils.KongRawState{}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
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 @@ -1196,7 +1270,7 @@ func Test_stateBuilder_consumers(t *testing.T) {
if tt.fields.kongVersion != nil {
b.kongVersion = *tt.fields.kongVersion
}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down Expand Up @@ -1363,7 +1437,7 @@ func Test_stateBuilder_certificates(t *testing.T) {
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down Expand Up @@ -1436,7 +1510,7 @@ func Test_stateBuilder_caCertificates(t *testing.T) {
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand All @@ -1460,7 +1534,9 @@ func Test_stateBuilder_upstream(t *testing.T) {
name: "process a non-existent upstream",
fields: fields{
targetContent: &Content{
Info: &Info{},
Info: &Info{
Defaults: kongDefaults,
},
Upstreams: []FUpstream{
{
Upstream: kong.Upstream{
Expand Down Expand Up @@ -1525,6 +1601,9 @@ func Test_stateBuilder_upstream(t *testing.T) {
name: "matches ID of an existing service",
fields: fields{
targetContent: &Content{
Info: &Info{
Defaults: kongDefaults,
},
Upstreams: []FUpstream{
{
Upstream: kong.Upstream{
Expand Down Expand Up @@ -1588,6 +1667,9 @@ func Test_stateBuilder_upstream(t *testing.T) {
name: "multiple upstreams are handled correctly",
fields: fields{
targetContent: &Content{
Info: &Info{
Defaults: kongDefaults,
},
Upstreams: []FUpstream{
{
Upstream: kong.Upstream{
Expand Down Expand Up @@ -1703,7 +1785,7 @@ func Test_stateBuilder_upstream(t *testing.T) {
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down Expand Up @@ -1806,7 +1888,7 @@ func Test_stateBuilder_documents(t *testing.T) {
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.konnectRawState)
Expand All @@ -1829,7 +1911,9 @@ func Test_stateBuilder(t *testing.T) {
name: "end to end test with all entities",
fields: fields{
targetContent: &Content{
Info: &Info{},
Info: &Info{
Defaults: kongDefaults,
},
Services: []FService{
{
Service: kong.Service{
Expand Down Expand Up @@ -2351,7 +2435,7 @@ func Test_stateBuilder(t *testing.T) {
targetContent: tt.fields.targetContent,
currentState: tt.fields.currentState,
}
d, _ := utils.GetKongDefaulter()
d, _ := utils.GetKongDefaulter(kongDefaults)
b.defaulter = d
b.build()
assert.Equal(tt.want, b.rawState)
Expand Down
12 changes: 0 additions & 12 deletions file/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,6 @@ func GetForKonnect(ctx context.Context, fileContent *Content,
builder.client = client
builder.ctx = ctx

defaulter, err := utils.GetDefaulter(ctx, client)
if err != nil {
return nil, nil, fmt.Errorf("creating defaulter: %w", err)
}
builder.defaulter = defaulter

if fileContent.Transform != nil && !*fileContent.Transform {
return nil, nil, ErrorTransformFalseNotSupported
}
Expand Down Expand Up @@ -90,12 +84,6 @@ func Get(ctx context.Context, fileContent *Content, opt RenderConfig, dumpConfig
return nil, ErrorTransformFalseNotSupported
}

defaulter, err := utils.GetDefaulter(ctx, wsClient)
if err != nil {
return nil, fmt.Errorf("creating defaulter: %w", err)
}
builder.defaulter = defaulter

state, _, err := builder.build()
if err != nil {
return nil, fmt.Errorf("building state: %w", err)
Expand Down
73 changes: 0 additions & 73 deletions utils/constants.go
Original file line number Diff line number Diff line change
@@ -1,78 +1,5 @@
package utils

import (
"github.com/kong/go-kong/kong"
)

const (
defaultPort = 80
defaultTimeout = 60000
defaultSlots = 10000
defaultWeight = 100
defaultConcurrency = 10
)

var (
serviceDefaults = kong.Service{
Port: kong.Int(defaultPort),
Protocol: kong.String("http"),
ConnectTimeout: kong.Int(defaultTimeout),
WriteTimeout: kong.Int(defaultTimeout),
ReadTimeout: kong.Int(defaultTimeout),
}
routeDefaults = kong.Route{
PreserveHost: kong.Bool(false),
RegexPriority: kong.Int(0),
StripPath: kong.Bool(false),
Protocols: kong.StringSlice("http", "https"),
}
targetDefaults = kong.Target{
Weight: kong.Int(defaultWeight),
}
upstreamDefaults = kong.Upstream{
Slots: kong.Int(defaultSlots),
Healthchecks: &kong.Healthcheck{
Active: &kong.ActiveHealthcheck{
Concurrency: kong.Int(defaultConcurrency),
Healthy: &kong.Healthy{
HTTPStatuses: []int{200, 302},
Interval: kong.Int(0),
Successes: kong.Int(0),
},
HTTPPath: kong.String("/"),
Type: kong.String("http"),
Timeout: kong.Int(1),
Unhealthy: &kong.Unhealthy{
HTTPFailures: kong.Int(0),
TCPFailures: kong.Int(0),
Timeouts: kong.Int(0),
Interval: kong.Int(0),
HTTPStatuses: []int{429, 404, 500, 501, 502, 503, 504, 505},
},
},
Passive: &kong.PassiveHealthcheck{
Healthy: &kong.Healthy{
HTTPStatuses: []int{
200, 201, 202, 203, 204, 205,
206, 207, 208, 226, 300, 301, 302, 303, 304, 305,
306, 307, 308,
},
Successes: kong.Int(0),
},
Unhealthy: &kong.Unhealthy{
HTTPFailures: kong.Int(0),
TCPFailures: kong.Int(0),
Timeouts: kong.Int(0),
HTTPStatuses: []int{429, 500, 503},
},
},
},
HashOn: kong.String("none"),
HashFallback: kong.String("none"),
HashOnCookiePath: kong.String("/"),
}
)

const (
// ImplementationTypeKongGateway indicates an implementation backed by Kong Gateway.
ImplementationTypeKongGateway = "kong-gateway"
Expand Down
Loading

0 comments on commit bcbe6f6

Please sign in to comment.