Skip to content

Commit 2e6a7d3

Browse files
hbagdiTravis Raines
authored and
Travis Raines
committed
fix(file) correctly parse routes and plugins for routes
Correctly parse service-less routes and regular routes. Fix #103 Fix #104 From #107
1 parent 43070f5 commit 2e6a7d3

File tree

2 files changed

+252
-55
lines changed

2 files changed

+252
-55
lines changed

file/builder.go

+40-48
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ func (b *stateBuilder) build() (*utils.KongRawState, error) {
4848
b.routes()
4949
b.upstreams()
5050
b.consumers()
51-
b.plugins() //left
52-
// credentials left
51+
b.plugins()
5352

5453
// result
5554
if b.err != nil {
@@ -362,17 +361,6 @@ func (b *stateBuilder) services() {
362361
return
363362
}
364363

365-
// routes for the service
366-
var routes []kong.Route
367-
for _, r := range s.Routes {
368-
r.Service = &kong.Service{ID: kong.String(*s.ID)}
369-
routes = append(routes, r.Route)
370-
}
371-
if err := b.ingestRoutes(routes); err != nil {
372-
b.err = err
373-
return
374-
}
375-
376364
// plugins for the service
377365
var plugins []kong.Plugin
378366
for _, p := range s.Plugins {
@@ -383,6 +371,16 @@ func (b *stateBuilder) services() {
383371
b.err = err
384372
return
385373
}
374+
375+
// routes for the service
376+
for _, r := range s.Routes {
377+
r := r
378+
r.Service = &kong.Service{ID: kong.String(*s.ID)}
379+
if err := b.ingestRoute(*r); err != nil {
380+
b.err = err
381+
return
382+
}
383+
}
386384
}
387385
}
388386

@@ -391,27 +389,12 @@ func (b *stateBuilder) routes() {
391389
return
392390
}
393391

394-
var routes []kong.Route
395392
for _, r := range b.targetContent.Routes {
396393
r := r
397-
routes = append(routes, r.Route)
398-
399-
if err := b.ingestRoutes(routes); err != nil {
394+
if err := b.ingestRoute(r); err != nil {
400395
b.err = err
401396
return
402397
}
403-
404-
// plugins for the route
405-
var plugins []kong.Plugin
406-
for _, p := range r.Plugins {
407-
p.Route = &kong.Route{ID: kong.String(*r.ID)}
408-
plugins = append(plugins, p.Plugin)
409-
}
410-
if err := b.ingestPlugins(plugins); err != nil {
411-
b.err = err
412-
return
413-
}
414-
b.rawState.Routes = append(b.rawState.Routes, &r.Route)
415398
}
416399
}
417400

@@ -523,28 +506,37 @@ func (b *stateBuilder) plugins() {
523506
}
524507
}
525508

526-
func (b *stateBuilder) ingestRoutes(routes []kong.Route) error {
527-
for _, r := range routes {
528-
r := r
529-
if utils.Empty(r.ID) {
530-
route, err := b.currentState.Routes.Get(*r.Name)
531-
if err == state.ErrNotFound {
532-
r.ID = uuid()
533-
} else if err != nil {
534-
return err
535-
} else {
536-
r.ID = kong.String(*route.ID)
537-
}
538-
}
539-
utils.MustMergeTags(&r, b.selectTags)
540-
b.defaulter.MustSet(&r)
541-
b.rawState.Routes = append(b.rawState.Routes, &r)
542-
543-
err := b.intermediate.Routes.Add(state.Route{Route: r})
544-
if err != nil {
509+
func (b *stateBuilder) ingestRoute(r FRoute) error {
510+
if utils.Empty(r.ID) {
511+
route, err := b.currentState.Routes.Get(*r.Name)
512+
if err == state.ErrNotFound {
513+
r.ID = uuid()
514+
} else if err != nil {
545515
return err
516+
} else {
517+
r.ID = kong.String(*route.ID)
546518
}
547519
}
520+
521+
utils.MustMergeTags(&r, b.selectTags)
522+
b.defaulter.MustSet(&r.Route)
523+
524+
b.rawState.Routes = append(b.rawState.Routes, &r.Route)
525+
err := b.intermediate.Routes.Add(state.Route{Route: r.Route})
526+
if err != nil {
527+
return err
528+
}
529+
530+
// plugins for the route
531+
var plugins []kong.Plugin
532+
for _, p := range r.Plugins {
533+
p := p
534+
p.Route = &kong.Route{ID: kong.String(*r.ID)}
535+
plugins = append(plugins, p.Plugin)
536+
}
537+
if err := b.ingestPlugins(plugins); err != nil {
538+
return err
539+
}
548540
return nil
549541
}
550542

file/builder_test.go

+212-7
Original file line numberDiff line numberDiff line change
@@ -317,14 +317,14 @@ func Test_stateBuilder_services(t *testing.T) {
317317
}
318318
}
319319

320-
func Test_stateBuilder_ingestRoutes(t *testing.T) {
320+
func Test_stateBuilder_ingestRoute(t *testing.T) {
321321
assert := assert.New(t)
322322
rand.Seed(42)
323323
type fields struct {
324324
currentState *state.KongState
325325
}
326326
type args struct {
327-
routes []kong.Route
327+
route FRoute
328328
}
329329
tests := []struct {
330330
name string
@@ -339,8 +339,8 @@ func Test_stateBuilder_ingestRoutes(t *testing.T) {
339339
currentState: emptyState(),
340340
},
341341
args: args{
342-
routes: []kong.Route{
343-
{
342+
route: FRoute{
343+
Route: kong.Route{
344344
Name: kong.String("foo"),
345345
},
346346
},
@@ -365,8 +365,8 @@ func Test_stateBuilder_ingestRoutes(t *testing.T) {
365365
currentState: existingRouteState(),
366366
},
367367
args: args{
368-
routes: []kong.Route{
369-
{
368+
route: FRoute{
369+
Route: kong.Route{
370370
Name: kong.String("foo"),
371371
},
372372
},
@@ -395,7 +395,7 @@ func Test_stateBuilder_ingestRoutes(t *testing.T) {
395395
d, _ := utils.GetKongDefaulter()
396396
b.defaulter = d
397397
b.intermediate, _ = state.NewKongState()
398-
if err := b.ingestRoutes(tt.args.routes); (err != nil) != tt.wantErr {
398+
if err := b.ingestRoute(tt.args.route); (err != nil) != tt.wantErr {
399399
t.Errorf("stateBuilder.ingestPlugins() error = %v, wantErr %v", err, tt.wantErr)
400400
}
401401
assert.Equal(tt.wantState, b.rawState)
@@ -1418,3 +1418,208 @@ func Test_stateBuilder_upstream(t *testing.T) {
14181418
})
14191419
}
14201420
}
1421+
1422+
func Test_stateBuilder(t *testing.T) {
1423+
assert := assert.New(t)
1424+
rand.Seed(42)
1425+
type fields struct {
1426+
targetContent *Content
1427+
currentState *state.KongState
1428+
}
1429+
tests := []struct {
1430+
name string
1431+
fields fields
1432+
want *utils.KongRawState
1433+
}{
1434+
{
1435+
name: "end to end test with all entities",
1436+
fields: fields{
1437+
targetContent: &Content{
1438+
Info: &Info{
1439+
SelectorTags: []string{"tag1"},
1440+
},
1441+
Services: []FService{
1442+
{
1443+
Service: kong.Service{
1444+
Name: kong.String("foo-service"),
1445+
},
1446+
Routes: []*FRoute{
1447+
{
1448+
Route: kong.Route{
1449+
Name: kong.String("foo-route1"),
1450+
},
1451+
},
1452+
{
1453+
Route: kong.Route{
1454+
ID: kong.String("d125e79a-297c-414b-bc00-ad3a87be6c2b"),
1455+
Name: kong.String("foo-route2"),
1456+
},
1457+
},
1458+
},
1459+
},
1460+
{
1461+
Service: kong.Service{
1462+
Name: kong.String("bar-service"),
1463+
},
1464+
Routes: []*FRoute{
1465+
{
1466+
Route: kong.Route{
1467+
Name: kong.String("bar-route1"),
1468+
},
1469+
},
1470+
{
1471+
Route: kong.Route{
1472+
Name: kong.String("bar-route2"),
1473+
},
1474+
},
1475+
},
1476+
},
1477+
},
1478+
Upstreams: []FUpstream{
1479+
{
1480+
Upstream: kong.Upstream{
1481+
Name: kong.String("foo"),
1482+
Slots: kong.Int(42),
1483+
},
1484+
},
1485+
},
1486+
},
1487+
currentState: existingServiceState(),
1488+
},
1489+
want: &utils.KongRawState{
1490+
Services: []*kong.Service{
1491+
{
1492+
ID: kong.String("538c7f96-b164-4f1b-97bb-9f4bb472e89f"),
1493+
Name: kong.String("foo-service"),
1494+
Port: kong.Int(80),
1495+
Retries: kong.Int(5),
1496+
Protocol: kong.String("http"),
1497+
ConnectTimeout: kong.Int(60000),
1498+
WriteTimeout: kong.Int(60000),
1499+
ReadTimeout: kong.Int(60000),
1500+
Tags: kong.StringSlice("tag1"),
1501+
},
1502+
{
1503+
ID: kong.String("dfd79b4d-7642-4b61-ba0c-9f9f0d3ba55b"),
1504+
Name: kong.String("bar-service"),
1505+
Port: kong.Int(80),
1506+
Retries: kong.Int(5),
1507+
Protocol: kong.String("http"),
1508+
ConnectTimeout: kong.Int(60000),
1509+
WriteTimeout: kong.Int(60000),
1510+
ReadTimeout: kong.Int(60000),
1511+
Tags: kong.StringSlice("tag1"),
1512+
},
1513+
},
1514+
Routes: []*kong.Route{
1515+
{
1516+
ID: kong.String("5b1484f2-5209-49d9-b43e-92ba09dd9d52"),
1517+
Name: kong.String("foo-route1"),
1518+
PreserveHost: kong.Bool(false),
1519+
RegexPriority: kong.Int(0),
1520+
StripPath: kong.Bool(false),
1521+
Protocols: kong.StringSlice("http", "https"),
1522+
Service: &kong.Service{
1523+
ID: kong.String("538c7f96-b164-4f1b-97bb-9f4bb472e89f"),
1524+
},
1525+
Tags: kong.StringSlice("tag1"),
1526+
},
1527+
{
1528+
ID: kong.String("d125e79a-297c-414b-bc00-ad3a87be6c2b"),
1529+
Name: kong.String("foo-route2"),
1530+
PreserveHost: kong.Bool(false),
1531+
RegexPriority: kong.Int(0),
1532+
StripPath: kong.Bool(false),
1533+
Protocols: kong.StringSlice("http", "https"),
1534+
Service: &kong.Service{
1535+
ID: kong.String("538c7f96-b164-4f1b-97bb-9f4bb472e89f"),
1536+
},
1537+
Tags: kong.StringSlice("tag1"),
1538+
},
1539+
{
1540+
ID: kong.String("0cc0d614-4c88-4535-841a-cbe0709b0758"),
1541+
Name: kong.String("bar-route1"),
1542+
PreserveHost: kong.Bool(false),
1543+
RegexPriority: kong.Int(0),
1544+
StripPath: kong.Bool(false),
1545+
Protocols: kong.StringSlice("http", "https"),
1546+
Service: &kong.Service{
1547+
ID: kong.String("dfd79b4d-7642-4b61-ba0c-9f9f0d3ba55b"),
1548+
},
1549+
Tags: kong.StringSlice("tag1"),
1550+
},
1551+
{
1552+
ID: kong.String("083f61d3-75bc-42b4-9df4-f91929e18fda"),
1553+
Name: kong.String("bar-route2"),
1554+
PreserveHost: kong.Bool(false),
1555+
RegexPriority: kong.Int(0),
1556+
StripPath: kong.Bool(false),
1557+
Protocols: kong.StringSlice("http", "https"),
1558+
Service: &kong.Service{
1559+
ID: kong.String("dfd79b4d-7642-4b61-ba0c-9f9f0d3ba55b"),
1560+
},
1561+
Tags: kong.StringSlice("tag1"),
1562+
},
1563+
},
1564+
Upstreams: []*kong.Upstream{
1565+
{
1566+
ID: kong.String("9e6f82e5-4e74-4e81-a79e-4bbd6fe34cdc"),
1567+
Name: kong.String("foo"),
1568+
Slots: kong.Int(42),
1569+
Healthchecks: &kong.Healthcheck{
1570+
Active: &kong.ActiveHealthcheck{
1571+
Concurrency: kong.Int(10),
1572+
Healthy: &kong.Healthy{
1573+
HTTPStatuses: []int{200, 302},
1574+
Interval: kong.Int(0),
1575+
Successes: kong.Int(0),
1576+
},
1577+
HTTPPath: kong.String("/"),
1578+
HTTPSVerifyCertificate: kong.Bool(true),
1579+
Type: kong.String("http"),
1580+
Timeout: kong.Int(1),
1581+
Unhealthy: &kong.Unhealthy{
1582+
HTTPFailures: kong.Int(0),
1583+
TCPFailures: kong.Int(0),
1584+
Timeouts: kong.Int(0),
1585+
Interval: kong.Int(0),
1586+
HTTPStatuses: []int{429, 404, 500, 501, 502, 503, 504, 505},
1587+
},
1588+
},
1589+
Passive: &kong.PassiveHealthcheck{
1590+
Healthy: &kong.Healthy{
1591+
HTTPStatuses: []int{200, 201, 202, 203, 204, 205,
1592+
206, 207, 208, 226, 300, 301, 302, 303, 304, 305,
1593+
306, 307, 308},
1594+
Successes: kong.Int(0),
1595+
},
1596+
Unhealthy: &kong.Unhealthy{
1597+
HTTPFailures: kong.Int(0),
1598+
TCPFailures: kong.Int(0),
1599+
Timeouts: kong.Int(0),
1600+
HTTPStatuses: []int{429, 500, 503},
1601+
},
1602+
},
1603+
},
1604+
HashOn: kong.String("none"),
1605+
HashFallback: kong.String("none"),
1606+
HashOnCookiePath: kong.String("/"),
1607+
Tags: kong.StringSlice("tag1"),
1608+
},
1609+
},
1610+
},
1611+
},
1612+
}
1613+
for _, tt := range tests {
1614+
t.Run(tt.name, func(t *testing.T) {
1615+
b := &stateBuilder{
1616+
targetContent: tt.fields.targetContent,
1617+
currentState: tt.fields.currentState,
1618+
}
1619+
d, _ := utils.GetKongDefaulter()
1620+
b.defaulter = d
1621+
b.build()
1622+
assert.Equal(tt.want, b.rawState)
1623+
})
1624+
}
1625+
}

0 commit comments

Comments
 (0)