Skip to content

Commit 23ac32f

Browse files
authored
fix: consumer lookups while using default lookup tags for consumer-goups (#1749)
* fix: consumer lookups while using default lookup tags for consumer-goups * chore: diff test expanded to konnect * chore: updated gdr to v1.27.1
1 parent 8e4e308 commit 23ac32f

File tree

8 files changed

+154
-13
lines changed

8 files changed

+154
-13
lines changed

cmd/common.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,13 @@ func syncMain(ctx context.Context, filenames []string, dry bool, parallelism,
291291
}
292292
for _, c := range consumerGroupsGlobal {
293293
targetContent.ConsumerGroups = append(targetContent.ConsumerGroups,
294-
file.FConsumerGroupObject{ConsumerGroup: *c.ConsumerGroup})
294+
file.FConsumerGroupObject{
295+
ConsumerGroup: *c.ConsumerGroup,
296+
Consumers: c.Consumers,
297+
})
298+
if len(c.Consumers) > 0 {
299+
addUniqueConsumersInTargetContent(targetContent, c.Consumers, c.ConsumerGroup)
300+
}
295301
}
296302
}
297303

@@ -389,7 +395,6 @@ func syncMain(ctx context.Context, filenames []string, dry bool, parallelism,
389395
}
390396
}
391397
}
392-
393398
// read the target state
394399
rawState, err := file.Get(ctx, targetContent, file.RenderConfig{
395400
CurrentState: currentState,
@@ -440,6 +445,34 @@ func syncMain(ctx context.Context, filenames []string, dry bool, parallelism,
440445
return nil
441446
}
442447

448+
func addUniqueConsumersInTargetContent(targetContent *file.Content, consumers []*kong.Consumer,
449+
consumerGroup *kong.ConsumerGroup,
450+
) {
451+
containsConsumerInTargetContent := func(consumer *kong.Consumer) bool {
452+
for _, c := range targetContent.Consumers {
453+
if c.Consumer.ID != nil && consumer.ID != nil && *c.Consumer.ID == *consumer.ID {
454+
return true
455+
} else if c.Consumer.Username != nil && consumer.Username != nil && *c.Consumer.Username == *consumer.Username {
456+
return true
457+
} else if c.Consumer.CustomID != nil && consumer.CustomID != nil && *c.Consumer.CustomID == *consumer.CustomID {
458+
return true
459+
}
460+
}
461+
return false
462+
}
463+
464+
for _, consumer := range consumers {
465+
if !containsConsumerInTargetContent(consumer) {
466+
targetContent.Consumers = append(targetContent.Consumers, file.FConsumer{
467+
Consumer: *consumer,
468+
Groups: []*kong.ConsumerGroup{
469+
consumerGroup,
470+
},
471+
})
472+
}
473+
}
474+
}
475+
443476
func validateSkipConsumersWithConsumerGroups(targetContent file.Content, config dump.Config) (bool, error) {
444477
if len(targetContent.Consumers) > 0 {
445478
for _, consumer := range targetContent.Consumers {

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ require (
1414
github.com/fatih/color v1.18.0
1515
github.com/google/go-cmp v0.7.0
1616
github.com/kong/go-apiops v0.1.49
17-
github.com/kong/go-database-reconciler v1.26.0
18-
github.com/kong/go-kong v0.67.0
17+
github.com/kong/go-database-reconciler v1.27.1
18+
github.com/kong/go-kong v0.68.0
1919
github.com/mitchellh/go-homedir v1.1.0
2020
github.com/spf13/cobra v1.9.1
2121
github.com/spf13/pflag v1.0.6
@@ -53,7 +53,7 @@ require (
5353
github.com/felixge/httpsnoop v1.0.4 // indirect
5454
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
5555
github.com/go-errors/errors v1.4.2 // indirect
56-
github.com/go-viper/mapstructure/v2 v2.3.0 // indirect
56+
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
5757
github.com/google/btree v1.1.3 // indirect
5858
github.com/google/go-querystring v1.1.0 // indirect
5959
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8Wd
147147
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
148148
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
149149
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
150-
github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk=
151-
github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
150+
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
151+
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
152152
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
153153
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
154154
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
@@ -244,10 +244,10 @@ github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/q
244244
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
245245
github.com/kong/go-apiops v0.1.49 h1:/gjzH31qUUxvmg/lkePrh2b6trI5lrv7jJD2w9I7JPg=
246246
github.com/kong/go-apiops v0.1.49/go.mod h1:yPwbl3P2eQinVGAEA0d3legaYmzPJ+WtJf9fSeGF4b8=
247-
github.com/kong/go-database-reconciler v1.26.0 h1:x074dbSwYbTaUVmrCbDy1z9dy2oWu/XTbpxFJ/YEccQ=
248-
github.com/kong/go-database-reconciler v1.26.0/go.mod h1:wq48xbXrcs1NCm7MlPhOIuYFjw66NR0zu+du+Br9q0I=
249-
github.com/kong/go-kong v0.67.0 h1:54zXKc58IZpZdlJCv8p95SJjejTxT+cwbWXw97icCak=
250-
github.com/kong/go-kong v0.67.0/go.mod h1:J0vGB3wsZ2i99zly1zTRe3v7rOKpkhQZRwbcTFP76qM=
247+
github.com/kong/go-database-reconciler v1.27.1 h1:a5EyqQsY5BF2p964J2PQW9BMIMvTz30A2FInIAf1TcA=
248+
github.com/kong/go-database-reconciler v1.27.1/go.mod h1:6EnCqJqkYWwf9UjkiIKXCv29kapPFUBQ2+FVjR9ZslE=
249+
github.com/kong/go-kong v0.68.0 h1:rQrLYRKXD6/xf41GBXj9Ns+woAH9p6a4VvcXNMiPZPI=
250+
github.com/kong/go-kong v0.68.0/go.mod h1:J0vGB3wsZ2i99zly1zTRe3v7rOKpkhQZRwbcTFP76qM=
251251
github.com/kong/go-slugify v1.0.0 h1:vCFAyf2sdoSlBtLcrmDWUFn0ohlpKiKvQfXZkO5vSKY=
252252
github.com/kong/go-slugify v1.0.0/go.mod h1:dbR2h3J2QKXQ1k0aww6cN7o4cIcwlWflr6RKRdcoaiw=
253253
github.com/kong/kubernetes-configuration v1.4.2 h1:/OafLbl2NucvgQV7Xf/uneIgjxmPPUeE92BrssfVAQY=

tests/integration/diff_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,3 +839,39 @@ func Test_Diff_NoDiffCompressedTarget(t *testing.T) {
839839
assert.Equal(t, emptyOutput, out)
840840
reset(t)
841841
}
842+
843+
func Test_Diff_Consumers_Default_Lookup_Tag(t *testing.T) {
844+
runWhenEnterpriseOrKonnect(t, ">=2.8.0")
845+
setup(t)
846+
847+
ctx := context.Background()
848+
849+
expectedDiff := `creating consumer user2
850+
creating consumer-group-consumer user2
851+
Summary:
852+
Created: 2
853+
Updated: 0
854+
Deleted: 0
855+
`
856+
857+
// sync consumer-group and consumer-1 file
858+
require.NoError(t, sync(ctx, "testdata/sync/015-consumer-groups/kong-cg.yaml"))
859+
require.NoError(t, sync(ctx, "testdata/sync/015-consumer-groups/kong-consumer-1.yaml"))
860+
861+
out, err := diff("testdata/sync/015-consumer-groups/kong-consumer-2.yaml")
862+
require.NoError(t, err)
863+
assert.Equal(t, expectedDiff, out)
864+
865+
// sync consumer file 2
866+
require.NoError(t, sync(ctx, "testdata/sync/015-consumer-groups/kong-consumer-2.yaml"))
867+
868+
// diff consumer file 1 again to verify no diff
869+
out, err = diff("testdata/sync/015-consumer-groups/kong-consumer-1.yaml")
870+
require.NoError(t, err)
871+
assert.Equal(t, emptyOutput, out)
872+
873+
// finally sync consumer file 2 to verify no diff
874+
out, err = diff("testdata/sync/015-consumer-groups/kong-consumer-2.yaml")
875+
require.NoError(t, err)
876+
assert.Equal(t, emptyOutput, out)
877+
}

tests/integration/sync_test.go

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8612,7 +8612,8 @@ func Test_Sync_Partials(t *testing.T) {
86128612

86138613
func Test_Sync_Consumers_Default_Lookup_Tag(t *testing.T) {
86148614
runWhenEnterpriseOrKonnect(t, ">=2.8.0")
8615-
8615+
client, err := getTestClient()
8616+
require.NoError(t, err)
86168617
ctx := context.Background()
86178618

86188619
t.Run("no errors occur in case of subsequent syncs with distributed config and defaultLookupTags for consumer-group",
@@ -8650,6 +8651,47 @@ func Test_Sync_Consumers_Default_Lookup_Tag(t *testing.T) {
86508651
err = sync(ctx, "testdata/sync/015-consumer-groups/kong-consumers-no-tag.yaml")
86518652
require.NoError(t, err)
86528653
})
8654+
t.Run("no errors occur in case of distributed config when >1 consumers are tagged with different tags",
8655+
func(t *testing.T) {
8656+
// sync consumer-group file first
8657+
err := sync(ctx, "testdata/sync/015-consumer-groups/kong-cg.yaml")
8658+
t.Cleanup(func() {
8659+
reset(t)
8660+
})
8661+
require.NoError(t, err)
8662+
8663+
// sync consumer file 1
8664+
err = sync(ctx, "testdata/sync/015-consumer-groups/kong-consumer-1.yaml")
8665+
require.NoError(t, err)
8666+
8667+
// sync consumer file 2
8668+
err = sync(ctx, "testdata/sync/015-consumer-groups/kong-consumer-2.yaml")
8669+
require.NoError(t, err)
8670+
8671+
// re-sync with no error
8672+
err = sync(ctx, "testdata/sync/015-consumer-groups/kong-consumer-1.yaml")
8673+
require.NoError(t, err)
8674+
err = sync(ctx, "testdata/sync/015-consumer-groups/kong-consumer-2.yaml")
8675+
require.NoError(t, err)
8676+
8677+
// check number of consumerGroupConsumers
8678+
currentState, err := fetchCurrentState(ctx, client, deckDump.Config{
8679+
LookUpSelectorTagsConsumerGroups: []string{"group-tag"},
8680+
}, t)
8681+
require.NoError(t, err)
8682+
8683+
consumerGroupConsumers, err := currentState.ConsumerGroupConsumers.GetAll()
8684+
require.NoError(t, err)
8685+
require.NotNil(t, consumerGroupConsumers)
8686+
require.Len(t, consumerGroupConsumers, 2)
8687+
8688+
consumerNames := []string{"user1", "user2"}
8689+
8690+
for _, consumerGroupConsumer := range consumerGroupConsumers {
8691+
assert.Contains(t, consumerNames, *consumerGroupConsumer.Consumer.Username)
8692+
assert.Equal(t, "foo-group", *consumerGroupConsumer.ConsumerGroup.Name)
8693+
}
8694+
})
86538695
}
86548696

86558697
// test scope:

tests/integration/test_utils.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ func multiFileSync(ctx context.Context, kongFiles []string, opts ...string) erro
361361

362362
func diff(kongFile string, opts ...string) (string, error) {
363363
deckCmd := cmd.NewRootCmd()
364-
args := []string{"diff", "-s", kongFile}
364+
args := []string{"gateway", "diff", kongFile}
365365
if len(opts) > 0 {
366366
args = append(args, opts...)
367367
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# user1.yaml
2+
_format_version: "3.0"
3+
_info:
4+
default_lookup_tags:
5+
consumer_groups:
6+
- group-tag
7+
select_tags:
8+
- user1
9+
consumers:
10+
- custom_id: user1
11+
username: user1
12+
groups:
13+
- name: foo-group
14+
tags:
15+
- group-tag
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# user2.yaml
2+
_format_version: "3.0"
3+
_info:
4+
default_lookup_tags:
5+
consumer_groups:
6+
- group-tag
7+
select_tags:
8+
- user2
9+
consumers:
10+
- custom_id: user2
11+
username: user2
12+
groups:
13+
- name: foo-group
14+
tags:
15+
- group-tag

0 commit comments

Comments
 (0)