From 56f9d7cb9c19f8ca66e7d58f26060e4bfe427334 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Jun 2022 15:33:53 +0800 Subject: [PATCH] [Backport release-1.4] Fix: mongoDB datastore can't list special email user(#4104) (#4148) * Add description column to vela trait and component command (#4107) Signed-off-by: Holger Protzek Signed-off-by: fengkang (cherry picked from commit 9c57ae2a15c8e7b0c23869aaf107136baef40a63) * Fix: mongoDB datastore can't list special email user(#4104) Signed-off-by: fengkang (cherry picked from commit ec07790935fb0c20d4a5e20c52023f8016430c2b) * Fix: mongoDB datastore can't list special email user(#4104) change the function name from verifyUserValue to verifyValue add test case to test kubeapi.go:87 Signed-off-by: fengkang (cherry picked from commit 4c55e0688faf7be484207d7efe9c5e8554ab67a3) * Fix: mongoDB datastore can't list special email user(#4104) change the function name from verifyUserValue to verifyValue add test case to test kubeapi.go:87 add delete test case Signed-off-by: fengkang (cherry picked from commit b2e76001c9fb912ff38245a90c071df50d82f99e) * Fix: mongoDB datastore can't list special email user(#4104) optimize the test case Signed-off-by: fengkang (cherry picked from commit a63c96fae111913ba1ac50a966bdbe8e22e890a8) * Fix: mongoDB datastore can't list special email user(#4104) optimize the test case use user change all verify timing in kubeapi Signed-off-by: fengkang (cherry picked from commit 2ede4f7b0cb3748105fba0d64677a9aa9eb87363) * Fix: mongoDB datastore can't list special email user(#4104) Signed-off-by: fengkang (cherry picked from commit 356150642f3ad95a709868a26051ad44a73fdbfe) * Fix: mongoDB datastore can't list special email user(#4104) Signed-off-by: fengkang (cherry picked from commit 48a9e55937b04fc3225ed119dddc492c265796d1) Co-authored-by: Holger Protzek <3481523+hprotzek@users.noreply.github.com> Co-authored-by: fengkang01 --- pkg/apiserver/domain/model/user.go | 17 +++------ .../datastore/kubeapi/kubeapi.go | 29 ++++++++++++-- .../datastore/kubeapi/kubeapi_test.go | 38 +++++++++++++++++++ references/cli/components.go | 4 +- references/cli/traits.go | 3 +- 5 files changed, 72 insertions(+), 19 deletions(-) diff --git a/pkg/apiserver/domain/model/user.go b/pkg/apiserver/domain/model/user.go index 81d3072ca..a44ad2806 100644 --- a/pkg/apiserver/domain/model/user.go +++ b/pkg/apiserver/domain/model/user.go @@ -18,7 +18,6 @@ package model import ( "fmt" - "strings" "time" "github.com/form3tech-oss/jwt-go" @@ -63,17 +62,17 @@ func (u *User) ShortTableName() string { // PrimaryKey return custom primary key func (u *User) PrimaryKey() string { - return verifyUserValue(u.Name) + return u.Name } // Index return custom index func (u *User) Index() map[string]string { index := make(map[string]string) if u.Name != "" { - index["name"] = verifyUserValue(u.Name) + index["name"] = u.Name } if u.Email != "" { - index["email"] = verifyUserValue(u.Email) + index["email"] = u.Email } return index } @@ -99,14 +98,14 @@ func (u *ProjectUser) ShortTableName() string { // PrimaryKey return custom primary key func (u *ProjectUser) PrimaryKey() string { - return fmt.Sprintf("%s-%s", u.ProjectName, verifyUserValue(u.Username)) + return fmt.Sprintf("%s-%s", u.ProjectName, u.Username) } // Index return custom index func (u *ProjectUser) Index() map[string]string { index := make(map[string]string) if u.Username != "" { - index["username"] = verifyUserValue(u.Username) + index["username"] = u.Username } if u.ProjectName != "" { index["projectName"] = u.ProjectName @@ -114,12 +113,6 @@ func (u *ProjectUser) Index() map[string]string { return index } -func verifyUserValue(v string) string { - s := strings.ReplaceAll(v, "@", "-") - s = strings.ReplaceAll(s, " ", "-") - return strings.ToLower(s) -} - // CustomClaims is the custom claims type CustomClaims struct { Username string `json:"username"` diff --git a/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi.go b/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi.go index 60f0260f7..41ec5a602 100644 --- a/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi.go +++ b/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi.go @@ -75,6 +75,7 @@ func generateName(entity datastore.Entity) string { // record the old ways here, it'll be migrated // name := fmt.Sprintf("veladatabase-%s-%s", entity.TableName(), entity.PrimaryKey()) name := fmt.Sprintf("%s-%s", entity.ShortTableName(), entity.PrimaryKey()) + name = verifyValue(name) return strings.ReplaceAll(name, "_", "-") } @@ -86,6 +87,9 @@ func (m *kubeapi) generateConfigMap(entity datastore.Entity) *corev1.ConfigMap { } labels["table"] = entity.TableName() labels["primaryKey"] = entity.PrimaryKey() + for k, v := range labels { + labels[k] = verifyValue(v) + } var configMap = corev1.ConfigMap{ ObjectMeta: metav1.ObjectMeta{ Name: generateName(entity), @@ -178,6 +182,9 @@ func (m *kubeapi) Put(ctx context.Context, entity datastore.Entity) error { } labels["table"] = entity.TableName() labels["primaryKey"] = entity.PrimaryKey() + for k, v := range labels { + labels[k] = verifyValue(v) + } entity.SetUpdateTime(time.Now()) var configMap corev1.ConfigMap if err := m.kubeClient.Get(ctx, types.NamespacedName{Namespace: m.namespace, Name: generateName(entity)}, &configMap); err != nil { @@ -345,7 +352,7 @@ func (m *kubeapi) List(ctx context.Context, entity datastore.Entity, op *datasto selector = selector.Add(*rq) for k, v := range entity.Index() { - rq, err := labels.NewRequirement(k, selection.Equals, []string{v}) + rq, err := labels.NewRequirement(k, selection.Equals, []string{verifyValue(v)}) if err != nil { return nil, datastore.ErrIndexInvalid } @@ -353,7 +360,11 @@ func (m *kubeapi) List(ctx context.Context, entity datastore.Entity, op *datasto } if op != nil { for _, inFilter := range op.In { - rq, err := labels.NewRequirement(inFilter.Key, selection.In, inFilter.Values) + var values []string + for _, value := range inFilter.Values { + values = append(values, verifyValue(value)) + } + rq, err := labels.NewRequirement(inFilter.Key, selection.In, values) if err != nil { log.Logger.Errorf("new list requirement failure %s", err.Error()) return nil, datastore.ErrIndexInvalid @@ -431,7 +442,7 @@ func (m *kubeapi) Count(ctx context.Context, entity datastore.Entity, filterOpti return 0, datastore.NewDBError(err) } for k, v := range entity.Index() { - rq, err := labels.NewRequirement(k, selection.Equals, []string{v}) + rq, err := labels.NewRequirement(k, selection.Equals, []string{verifyValue(v)}) if err != nil { return 0, datastore.ErrIndexInvalid } @@ -439,7 +450,11 @@ func (m *kubeapi) Count(ctx context.Context, entity datastore.Entity, filterOpti } if filterOptions != nil { for _, inFilter := range filterOptions.In { - rq, err := labels.NewRequirement(inFilter.Key, selection.In, inFilter.Values) + var values []string + for _, value := range inFilter.Values { + values = append(values, verifyValue(value)) + } + rq, err := labels.NewRequirement(inFilter.Key, selection.In, values) if err != nil { return 0, datastore.ErrIndexInvalid } @@ -473,3 +488,9 @@ func (m *kubeapi) Count(ctx context.Context, entity datastore.Entity, filterOpti } return int64(len(items)), nil } + +func verifyValue(v string) string { + s := strings.ReplaceAll(v, "@", "-") + s = strings.ReplaceAll(s, " ", "-") + return strings.ToLower(s) +} diff --git a/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi_test.go b/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi_test.go index 29df5e6dd..a604b813e 100644 --- a/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi_test.go +++ b/pkg/apiserver/infrastructure/datastore/kubeapi/kubeapi_test.go @@ -246,4 +246,42 @@ var _ = Describe("Test kubeapi datastore driver", func() { equal := cmp.Equal(err, datastore.ErrRecordNotExist, cmpopts.EquateErrors()) Expect(equal).Should(BeTrue()) }) + + It("Test verify index", func() { + var usr = model.User{Name: "can@delete", Email: "xxx@xx.com"} + err := kubeStore.Add(context.TODO(), &usr) + Expect(err).ToNot(HaveOccurred()) + + usr.Email = "change" + err = kubeStore.Put(context.TODO(), &usr) + Expect(err).ToNot(HaveOccurred()) + + err = kubeStore.Get(context.TODO(), &usr) + Expect(err).Should(BeNil()) + diff := cmp.Diff(usr.Email, "change") + Expect(diff).Should(BeEmpty()) + + list, err := kubeStore.List(context.TODO(), &usr, &datastore.ListOptions{FilterOptions: datastore.FilterOptions{In: []datastore.InQueryOption{ + { + Key: "name", + Values: []string{"can@delete"}, + }, + }}}) + Expect(err).ShouldNot(HaveOccurred()) + diff = cmp.Diff(len(list), 1) + Expect(diff).Should(BeEmpty()) + + count, err := kubeStore.Count(context.TODO(), &usr, &datastore.FilterOptions{In: []datastore.InQueryOption{ + { + Key: "name", + Values: []string{"can@delete"}, + }, + }}) + Expect(err).ShouldNot(HaveOccurred()) + Expect(count).Should(Equal(int64(1))) + + usr.Name = "can@delete" + err = kubeStore.Delete(context.TODO(), &usr) + Expect(err).ShouldNot(HaveOccurred()) + }) }) diff --git a/references/cli/components.go b/references/cli/components.go index 52f06e352..47bdabeab 100644 --- a/references/cli/components.go +++ b/references/cli/components.go @@ -226,7 +226,7 @@ func PrintInstalledCompDef(c common2.Args, io cmdutil.IOStreams, filter filterFu } table := newUITable() - table.AddRow("NAME", "DEFINITION") + table.AddRow("NAME", "DEFINITION", "DESCRIPTION") for _, cd := range list.Items { data, err := json.Marshal(cd) @@ -242,7 +242,7 @@ func PrintInstalledCompDef(c common2.Args, io cmdutil.IOStreams, filter filterFu if filter != nil && !filter(capa) { continue } - table.AddRow(capa.Name, capa.CrdName) + table.AddRow(capa.Name, capa.CrdName, capa.Description) } io.Info(table.String()) return nil diff --git a/references/cli/traits.go b/references/cli/traits.go index 1d68e7f7d..51a58c140 100644 --- a/references/cli/traits.go +++ b/references/cli/traits.go @@ -228,6 +228,7 @@ func PrintInstalledTraitDef(c common2.Args, io cmdutil.IOStreams, filter filterF table := newUITable() table.AddRow("NAME", "APPLIES-TO") + table.AddRow("NAME", "APPLIES-TO", "DESCRIPTION") for _, td := range list.Items { data, err := json.Marshal(td) @@ -243,7 +244,7 @@ func PrintInstalledTraitDef(c common2.Args, io cmdutil.IOStreams, filter filterF if filter != nil && !filter(capa) { continue } - table.AddRow(capa.Name, capa.AppliesTo) + table.AddRow(capa.Name, capa.AppliesTo, capa.Description) } io.Info(table.String()) return nil