Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package kumactl for openSUSE:Factory checked in at 2025-03-28 09:37:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/kumactl (Old) and /work/SRC/openSUSE:Factory/.kumactl.new.2696 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "kumactl" Fri Mar 28 09:37:09 2025 rev:9 rq:1264912 version:2.10.1 Changes: -------- --- /work/SRC/openSUSE:Factory/kumactl/kumactl.changes 2025-03-20 19:25:48.051643348 +0100 +++ /work/SRC/openSUSE:Factory/.kumactl.new.2696/kumactl.changes 2025-03-28 09:37:59.334513534 +0100 @@ -1,0 +2,16 @@ +Fri Mar 28 05:46:56 UTC 2025 - opensuse_buildserv...@ojkastl.de + +- Update to version 2.10.1: + * chore(deps): upgrade golang version from 1.23.6 to 1.23.7 + (#13247) + * chore(deps): upgrade envoy version from v1.32.4 to v1.32.5 + (#13241) + * ci(update-insecure-dependencies): no need to use -u for go get + (backport of #13205) (#13208) + * perf(rules): add `withNegation` flag to simplify `to` policy + flow (backport of #13151) (#13193) + * chore(deps): upgrade envoy version from v1.32.3 to v.1.32.4 + (#13159) + * chore(deps): security update (#13169) + +------------------------------------------------------------------- Old: ---- kumactl-2.10.0.obscpio New: ---- kumactl-2.10.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ kumactl.spec ++++++ --- /var/tmp/diff_new_pack.Mw7ZPS/_old 2025-03-28 09:38:00.466560421 +0100 +++ /var/tmp/diff_new_pack.Mw7ZPS/_new 2025-03-28 09:38:00.466560421 +0100 @@ -17,7 +17,7 @@ Name: kumactl -Version: 2.10.0 +Version: 2.10.1 Release: 0 Summary: CLI for the Kuma service mesh License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.Mw7ZPS/_old 2025-03-28 09:38:00.498561746 +0100 +++ /var/tmp/diff_new_pack.Mw7ZPS/_new 2025-03-28 09:38:00.502561912 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/kumahq/kuma</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">2.10.0</param> + <param name="revision">2.10.1</param> <param name="versionformat">@PARENT_TAG@</param> <param name="changesgenerate">enable</param> <param name="filename">kumactl</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.Mw7ZPS/_old 2025-03-28 09:38:00.518562574 +0100 +++ /var/tmp/diff_new_pack.Mw7ZPS/_new 2025-03-28 09:38:00.518562574 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/kumahq/kuma</param> - <param name="changesrevision">fed2256136e694d2a5deedb2490d382ee280fbbe</param></service></servicedata> + <param name="changesrevision">de16dff4b64312df4e1c112be993806311953614</param></service></servicedata> (No newline at EOF) ++++++ kumactl-2.10.0.obscpio -> kumactl-2.10.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/go.mod new/kumactl-2.10.1/go.mod --- old/kumactl-2.10.0/go.mod 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/go.mod 2025-03-27 13:32:55.000000000 +0100 @@ -1,6 +1,6 @@ module github.com/kumahq/kuma -go 1.23.6 +go 1.23.7 require ( cirello.io/pglock v1.16.0 @@ -23,7 +23,7 @@ github.com/go-logr/logr v1.4.2 github.com/go-logr/zapr v1.3.0 github.com/goburrow/cache v0.1.4 - github.com/golang-jwt/jwt/v4 v4.5.1 + github.com/golang-jwt/jwt/v4 v4.5.2 github.com/golang-migrate/migrate/v4 v4.18.2 github.com/golang/protobuf v1.5.4 github.com/google/go-cmp v0.7.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/go.sum new/kumactl-2.10.1/go.sum --- old/kumactl-2.10.0/go.sum 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/go.sum 2025-03-27 13:32:55.000000000 +0100 @@ -216,8 +216,8 @@ github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= -github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI= +github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-migrate/migrate/v4 v4.18.2 h1:2VSCMz7x7mjyTXx3m2zPokOY82LTRgxK1yQYKo6wWQ8= github.com/golang-migrate/migrate/v4 v4.18.2/go.mod h1:2CM6tJvn2kqPXwnXO/d3rAQYiyoIm180VsO8PRX6Rpk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/mk/dependencies/deps.lock new/kumactl-2.10.1/mk/dependencies/deps.lock --- old/kumactl-2.10.0/mk/dependencies/deps.lock 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/mk/dependencies/deps.lock 2025-03-27 13:32:55.000000000 +0100 @@ -1 +1 @@ -8a262293b9f4e62e0d5318bccb9459508d3a6803 +fd948017ccc5d7bf3238b7b556d98970c9d4c055 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/mk/dev.mk new/kumactl-2.10.1/mk/dev.mk --- old/kumactl-2.10.0/mk/dev.mk 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/mk/dev.mk 2025-03-27 13:32:55.000000000 +0100 @@ -7,7 +7,7 @@ GIT_COMMIT = $(word 3, $(BUILD_INFO)) BUILD_DATE = $(word 4, $(BUILD_INFO)) CI_TOOLS_VERSION = $(word 5, $(BUILD_INFO)) -ENVOY_VERSION ?= 1.32.3 +ENVOY_VERSION ?= 1.32.5 KUMA_CHARTS_URL ?= https://kumahq.github.io/charts CHART_REPO_NAME ?= kuma PROJECT_NAME ?= kuma diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/meshhttproute.golden.json new/kumactl-2.10.1/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/meshhttproute.golden.json --- old/kumactl-2.10.0/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/meshhttproute.golden.json 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/meshhttproute.golden.json 2025-03-27 13:32:55.000000000 +0100 @@ -40,7 +40,15 @@ "backendRefs": [ { "kind": "MeshServiceSubset", - "name": "backend_kuma-demo_svc_3001", + "name": "other-svc", + "tags": { + "version": "1.0" + }, + "weight": 1 + }, + { + "kind": "MeshServiceSubset", + "name": "other-svc-2", "tags": { "version": "1.0" }, @@ -55,14 +63,14 @@ { "key": "kuma.io/service", "not": false, - "value": "backend_kuma-demo_svc_3001" + "value": "other-svc" } ], "origin": [ { "labels": {}, "mesh": "default", - "name": "the-http-route", + "name": "the-other-http-route", "type": "MeshHTTPRoute" } ] @@ -83,15 +91,7 @@ "backendRefs": [ { "kind": "MeshServiceSubset", - "name": "other-svc", - "tags": { - "version": "1.0" - }, - "weight": 1 - }, - { - "kind": "MeshServiceSubset", - "name": "other-svc-2", + "name": "backend_kuma-demo_svc_3001", "tags": { "version": "1.0" }, @@ -106,14 +106,14 @@ { "key": "kuma.io/service", "not": false, - "value": "other-svc" + "value": "backend_kuma-demo_svc_3001" } ], "origin": [ { "labels": {}, "mesh": "default", - "name": "the-other-http-route", + "name": "the-http-route", "type": "MeshHTTPRoute" } ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/overriding_meshtimeout.golden.json new/kumactl-2.10.1/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/overriding_meshtimeout.golden.json --- old/kumactl-2.10.0/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/overriding_meshtimeout.golden.json 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/overriding_meshtimeout.golden.json 2025-03-27 13:32:55.000000000 +0100 @@ -187,18 +187,7 @@ "requestTimeout": "10s" } }, - "matchers": [ - { - "key": "kuma.io/service", - "not": true, - "value": "bar" - }, - { - "key": "kuma.io/service", - "not": true, - "value": "foo" - } - ], + "matchers": [], "origin": [ { "labels": {}, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/resource_rule_meshtimeout_index.golden.json new/kumactl-2.10.1/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/resource_rule_meshtimeout_index.golden.json --- old/kumactl-2.10.0/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/resource_rule_meshtimeout_index.golden.json 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/api-server/testdata/resources/inspect/dataplanes/_rules/resource_rule_meshtimeout_index.golden.json 2025-03-27 13:32:55.000000000 +0100 @@ -46,17 +46,17 @@ "toRules": [ { "conf": { - "connectionTimeout": "7s", - "idleTimeout": "7s", + "connectionTimeout": "5s", + "idleTimeout": "5s", "http": { - "requestTimeout": "7s" + "requestTimeout": "5s" } }, "matchers": [ { "key": "kuma.io/service", "not": false, - "value": "backend-4" + "value": "" } ], "origin": [ @@ -70,17 +70,17 @@ }, { "conf": { - "connectionTimeout": "5s", - "idleTimeout": "5s", + "connectionTimeout": "7s", + "idleTimeout": "7s", "http": { - "requestTimeout": "5s" + "requestTimeout": "7s" } }, "matchers": [ { "key": "kuma.io/service", "not": false, - "value": "" + "value": "backend-4" } ], "origin": [ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/plugins/policies/core/matchers/egress.go new/kumactl-2.10.1/pkg/plugins/policies/core/matchers/egress.go --- old/kumactl-2.10.0/pkg/plugins/policies/core/matchers/egress.go 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/plugins/policies/core/matchers/egress.go 2025-03-27 13:32:55.000000000 +0100 @@ -190,7 +190,7 @@ } } - rules, err := core_rules.BuildRules(toList) + rules, err := core_rules.BuildRules(toList, false) if err != nil { return core_rules.FromRules{}, err } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.golden.yaml new/kumactl-2.10.1/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.golden.yaml --- old/kumactl-2.10.0/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.golden.yaml 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.golden.yaml 2025-03-27 13:32:55.000000000 +0100 @@ -8,7 +8,7 @@ - creationTime: "0001-01-01T00:00:00Z" mesh: mesh-1 modificationTime: "0001-01-01T00:00:00Z" - name: mtp-2 + name: mtp-3 type: MeshTimeout - creationTime: "0001-01-01T00:00:00Z" mesh: mesh-1 @@ -25,12 +25,12 @@ - BackendRefOriginIndex: {} Conf: http: - requestTimeout: 3s + requestTimeout: 2s Origin: - creationTime: "0001-01-01T00:00:00Z" mesh: mesh-1 modificationTime: "0001-01-01T00:00:00Z" - name: mtp-2 + name: mtp-3 type: MeshTimeout Subset: - Key: __rule-matches-hash__ @@ -39,37 +39,3 @@ - Key: kuma.io/service Not: false Value: test-server -- BackendRefOriginIndex: {} - Conf: - http: - requestTimeout: 3s - Origin: - - creationTime: "0001-01-01T00:00:00Z" - mesh: mesh-1 - modificationTime: "0001-01-01T00:00:00Z" - name: mtp-2 - type: MeshTimeout - Subset: - - Key: __rule-matches-hash__ - Not: false - Value: JNNc6//C3P17nUsOJm5f4kqG+U3v8pXhS0od9C3+oss= - - Key: kuma.io/service - Not: true - Value: test-server -- BackendRefOriginIndex: {} - Conf: - http: - requestTimeout: 3s - Origin: - - creationTime: "0001-01-01T00:00:00Z" - mesh: mesh-1 - modificationTime: "0001-01-01T00:00:00Z" - name: mtp-2 - type: MeshTimeout - Subset: - - Key: __rule-matches-hash__ - Not: true - Value: JNNc6//C3P17nUsOJm5f4kqG+U3v8pXhS0od9C3+oss= - - Key: kuma.io/service - Not: true - Value: test-server diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.policies.yaml new/kumactl-2.10.1/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.policies.yaml --- old/kumactl-2.10.0/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.policies.yaml 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/plugins/policies/core/matchers/testdata/matchedpolicies/torules/03.policies.yaml 2025-03-27 13:32:55.000000000 +0100 @@ -43,3 +43,16 @@ default: http: requestTimeout: 3s +type: MeshTimeout +mesh: mesh-1 +name: mtp-3 +spec: + targetRef: + kind: Mesh + to: + - targetRef: + kind: MeshService + name: test-server + default: + http: + requestTimeout: 2s diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/plugins/policies/core/rules/rules.go new/kumactl-2.10.1/pkg/plugins/policies/core/rules/rules.go --- old/kumactl-2.10.0/pkg/plugins/policies/core/rules/rules.go 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/plugins/policies/core/rules/rules.go 2025-03-27 13:32:55.000000000 +0100 @@ -200,7 +200,7 @@ } fromList = append(fromList, BuildPolicyItemsWithMeta(policyWithFrom.GetFromList(), p.GetMeta(), policyWithFrom.GetTargetRef())...) } - rules, err := BuildRules(fromList) + rules, err := BuildRules(fromList, true) if err != nil { return FromRules{}, err } @@ -224,7 +224,7 @@ return ToRules{}, err } - rules, err := BuildRules(toList) + rules, err := BuildRules(toList, false) if err != nil { return ToRules{}, err } @@ -392,7 +392,7 @@ items = append(items, item) } - rules, err := BuildRules(items) + rules, err := BuildRules(items, false) if err != nil { return SingleItemRules{}, err } @@ -403,9 +403,11 @@ // BuildRules creates a list of rules with negations sorted by the number of positive tags. // If rules with negative tags are filtered out then the order becomes 'most specific to less specific'. // Filtering out of negative rules could be useful for XDS generators that don't have a way to configure negations. +// In case of `to` policies we don't need to check negations since only possible value for `to` is either Mesh +// which has empty subset or kuma.io/service. // // See the detailed algorithm description in docs/madr/decisions/007-mesh-traffic-permission.md -func BuildRules(list []PolicyItemWithMeta) (Rules, error) { +func BuildRules(list []PolicyItemWithMeta, withNegations bool) (Rules, error) { rules := Rules{} oldKindsItems := []PolicyItemWithMeta{} for _, item := range list { @@ -417,6 +419,7 @@ return rules, nil } + uniqueKeys := map[string]struct{}{} // 1. Convert list of rules into the list of subsets var subsets []subsetutils.Subset for _, item := range oldKindsItems { @@ -424,9 +427,36 @@ if err != nil { return nil, err } + for _, tag := range ss { + uniqueKeys[tag.Key] = struct{}{} + } subsets = append(subsets, ss) } + // we don't need to generate all permutations when there is no negations + // and we have only 0 or one tag, in other cases we need to generate. + // in case of `to` policies it can happen when using top target ref MeshGateway, + // for policy MeshHTTPRoute. + if !withNegations && len(uniqueKeys) <= 1 { + // deduplicate subsets + subsets = subsetutils.Deduplicate(subsets) + + for _, ss := range subsets { + if r, err := createRule(ss, oldKindsItems); err != nil { + return nil, err + } else { + rules = append(rules, r...) + } + } + + sort.SliceStable(rules, func(i, j int) bool { + // resource with more tags should be first + return len(rules[i].Subset) > len(rules[j].Subset) + }) + + return rules, nil + } + // 2. Create a graph where nodes are subsets and edge exists between 2 subsets only if there is an intersection g := simple.NewUndirectedGraph() @@ -477,39 +507,12 @@ if ss == nil { break } - // 5. For each combination determine a configuration - confs := []interface{}{} - var relevant []PolicyItemWithMeta - for i := 0; i < len(oldKindsItems); i++ { - item := oldKindsItems[i] - itemSubset, err := asSubset(item.GetTargetRef()) - if err != nil { - return nil, err - } - if itemSubset.IsSubset(ss) { - confs = append(confs, item.GetDefault()) - relevant = append(relevant, item) - } - } - if len(relevant) > 0 { - merged, err := merge.Confs(confs) - if err != nil { - return nil, err - } - ruleOrigins, originIndex := common.Origins(relevant, false) - resourceMetas := make([]core_model.ResourceMeta, 0, len(ruleOrigins)) - for _, o := range ruleOrigins { - resourceMetas = append(resourceMetas, o.Resource) - } - for _, mergedRule := range merged { - rules = append(rules, &Rule{ - Subset: ss, - Conf: mergedRule, - Origin: resourceMetas, - BackendRefOriginIndex: originIndex, - }) - } + // 5. For each combination determine a configuration + if r, err := createRule(ss, oldKindsItems); err != nil { + return nil, err + } else { + rules = append(rules, r...) } } } @@ -520,6 +523,45 @@ return rules, nil } + +func createRule(ss subsetutils.Subset, items []PolicyItemWithMeta) ([]*Rule, error) { + rules := []*Rule{} + confs := []interface{}{} + var relevant []PolicyItemWithMeta + for i := 0; i < len(items); i++ { + item := items[i] + itemSubset, err := asSubset(item.GetTargetRef()) + if err != nil { + return nil, err + } + if itemSubset.IsSubset(ss) { + confs = append(confs, item.GetDefault()) + relevant = append(relevant, item) + } + } + + if len(relevant) > 0 { + merged, err := merge.Confs(confs) + if err != nil { + return nil, err + } + ruleOrigins, originIndex := common.Origins(relevant, false) + resourceMetas := make([]core_model.ResourceMeta, 0, len(ruleOrigins)) + for _, o := range ruleOrigins { + resourceMetas = append(resourceMetas, o.Resource) + } + for _, mergedRule := range merged { + rules = append(rules, &Rule{ + Subset: ss, + Conf: mergedRule, + Origin: resourceMetas, + BackendRefOriginIndex: originIndex, + }) + } + } + + return rules, nil +} func sortComponents(components [][]graph.Node) { for _, c := range components { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/plugins/policies/core/rules/subsetutils/subset.go new/kumactl-2.10.1/pkg/plugins/policies/core/rules/subsetutils/subset.go --- old/kumactl-2.10.0/pkg/plugins/policies/core/rules/subsetutils/subset.go 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/plugins/policies/core/rules/subsetutils/subset.go 2025-03-27 13:32:55.000000000 +0100 @@ -2,6 +2,8 @@ import ( "maps" + "sort" + "strings" mesh_proto "github.com/kumahq/kuma/api/mesh/v1alpha1" util_maps "github.com/kumahq/kuma/pkg/util/maps" @@ -251,6 +253,18 @@ return pos } +func (ss Subset) Sorted() { + sort.SliceStable(ss, func(i, j int) bool { + if ss[i].Key != ss[j].Key { + return ss[i].Key < ss[j].Key + } + if ss[i].Value != ss[j].Value { + return ss[i].Value < ss[j].Value + } + return !ss[i].Not && ss[j].Not + }) +} + func (ss Subset) IndexOfPositive() int { for i, t := range ss { if !t.Not { @@ -310,10 +324,8 @@ // If tags are contradicted (same keys have different positive value) then the function // returns nil. func (c *SubsetIter) simplified() Subset { - result := Subset{} - - ssByKey := map[string]Subset{} - keyOrder := []string{} + ssByKey := make(map[string]Subset, len(c.current)) + keyOrder := make([]string, 0, len(c.current)) for _, t := range c.current { if _, ok := ssByKey[t.Key]; !ok { keyOrder = append(keyOrder, t.Key) @@ -321,6 +333,7 @@ ssByKey[t.Key] = append(ssByKey[t.Key], Tag{Key: t.Key, Value: t.Value, Not: t.Not}) } + result := make(Subset, 0, len(c.current)) for _, key := range keyOrder { ss := ssByKey[key] positive := ss.NumPositive() @@ -337,3 +350,43 @@ return result } + +// Deduplicate returns a new slice of subsetutils.Subset with duplicates removed. +func Deduplicate(subsets []Subset) []Subset { + seen := make(map[string]struct{}) + result := make([]Subset, 0, len(subsets)) + + for _, s := range subsets { + key := canonicalSubset(s) + if _, exists := seen[key]; !exists { + seen[key] = struct{}{} + result = append(result, s) + } + } + return result +} + +// canonicalSubset returns a canonical string representation for a subset. +// It assumes that a subset is a slice of subsetutils.Tag with fields Key, Value, and Not. +func canonicalSubset(s Subset) string { + if len(s) == 0 { + return "" + } + s.Sorted() + var sb strings.Builder + for i, t := range s { + if i > 0 { + sb.WriteByte('|') // Separator + } + sb.WriteString(t.Key) + sb.WriteByte(':') + sb.WriteString(t.Value) + sb.WriteByte(':') + if t.Not { + sb.WriteByte('1') + } else { + sb.WriteByte('0') + } + } + return sb.String() +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/plugins/policies/core/rules/testdata/rules/to/meshtimeout.golden.yaml new/kumactl-2.10.1/pkg/plugins/policies/core/rules/testdata/rules/to/meshtimeout.golden.yaml --- old/kumactl-2.10.0/pkg/plugins/policies/core/rules/testdata/rules/to/meshtimeout.golden.yaml 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/plugins/policies/core/rules/testdata/rules/to/meshtimeout.golden.yaml 2025-03-27 13:32:55.000000000 +0100 @@ -54,10 +54,4 @@ modificationTime: "0001-01-01T00:00:00Z" name: default type: MeshTimeout - Subset: - - Key: kuma.io/service - Not: true - Value: bar - - Key: kuma.io/service - Not: true - Value: foo + Subset: [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/pkg/plugins/policies/core/rules/testdata/rules/to/single-to.golden.yaml new/kumactl-2.10.1/pkg/plugins/policies/core/rules/testdata/rules/to/single-to.golden.yaml --- old/kumactl-2.10.0/pkg/plugins/policies/core/rules/testdata/rules/to/single-to.golden.yaml 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/pkg/plugins/policies/core/rules/testdata/rules/to/single-to.golden.yaml 2025-03-27 13:32:55.000000000 +0100 @@ -29,7 +29,4 @@ modificationTime: "0001-01-01T00:00:00Z" name: retry-1 type: MeshRetry - Subset: - - Key: kuma.io/service - Not: true - Value: backend + Subset: [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/kumactl-2.10.0/tools/ci/update-vulnerable-dependencies/update-vulnerable-dependencies.sh new/kumactl-2.10.1/tools/ci/update-vulnerable-dependencies/update-vulnerable-dependencies.sh --- old/kumactl-2.10.0/tools/ci/update-vulnerable-dependencies/update-vulnerable-dependencies.sh 2025-03-17 12:36:40.000000000 +0100 +++ new/kumactl-2.10.1/tools/ci/update-vulnerable-dependencies/update-vulnerable-dependencies.sh 2025-03-27 13:32:55.000000000 +0100 @@ -37,7 +37,7 @@ if [[ "$package" == "stdlib" ]]; then go mod edit -go="$fixVersion" else - go get -u "$package"@v"$fixVersion" + go get "$package"@v"$fixVersion" fi fi done ++++++ kumactl.obsinfo ++++++ --- /var/tmp/diff_new_pack.Mw7ZPS/_old 2025-03-28 09:38:02.462643092 +0100 +++ /var/tmp/diff_new_pack.Mw7ZPS/_new 2025-03-28 09:38:02.466643257 +0100 @@ -1,5 +1,5 @@ name: kumactl -version: 2.10.0 -mtime: 1742211400 -commit: fed2256136e694d2a5deedb2490d382ee280fbbe +version: 2.10.1 +mtime: 1743078775 +commit: de16dff4b64312df4e1c112be993806311953614 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/kumactl/vendor.tar.gz /work/SRC/openSUSE:Factory/.kumactl.new.2696/vendor.tar.gz differ: char 5, line 1