Skip to content

Commit

Permalink
feat: remove column restriction
Browse files Browse the repository at this point in the history
  • Loading branch information
adityathebe committed Jan 27, 2025
1 parent 33ee0d3 commit dd4b5c5
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 67 deletions.
10 changes: 7 additions & 3 deletions query/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"github.com/flanksource/duty/types"
"github.com/google/uuid"
"github.com/pkg/errors"
"github.com/samber/lo"
"github.com/timberio/go-datemath"
"gorm.io/gorm"

Expand Down Expand Up @@ -100,7 +99,7 @@ type QueryModel struct {
var ConfigQueryModel = QueryModel{
Table: "configs",
Columns: []string{
"name", "source", "type", "status", "health", "external_id", "config_class",
"name", "source", "type", "status", "agent_id", "health", "external_id", "config_class",
},
JSONColumns: []string{"labels", "tags", "config", "properties"},
HasTags: true,
Expand Down Expand Up @@ -266,9 +265,14 @@ func (qm QueryModel) Apply(ctx context.Context, q types.QueryField, tx *gorm.DB)
tx = JSONPathMapper(ctx, tx, column, q.Op, strings.TrimPrefix(originalField, column+"."), val)
q.Field = column
}

if strings.HasPrefix(q.Field, fmt.Sprintf("%s.", column)) {
tx = JSONPathMapper(ctx, tx, column, q.Op, strings.TrimPrefix(q.Field, column+"."), val)
q.Field = column
}
}

if !slices.Contains(ignoreFieldsForClauses, q.Field) && lo.Contains(qm.Columns, q.Field) {
if !slices.Contains(ignoreFieldsForClauses, q.Field) {
if c, err := q.ToClauses(); err != nil {
return nil, nil, err
} else {
Expand Down
51 changes: 25 additions & 26 deletions query/resource_selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,11 +266,10 @@ func SetResourceSelectorClause(

requirements, _ := parsedFieldSelector.Requirements()
for _, r := range requirements {
if collections.Contains(qm.Columns, r.Key()) {
query = fieldSelectorRequirementToSQLClause(query, r)
} else {
query = propertySelectorRequirementToSQLClause(query, r)
}
query = fieldSelectorRequirementToSQLClause(query, r)

// TODO: figure out how to address properties via field selectors
// query = propertySelectorRequirementToSQLClause(query, r)
}
}

Expand Down Expand Up @@ -456,27 +455,27 @@ func fieldSelectorRequirementToSQLClause(q *gorm.DB, r labels.Requirement) *gorm
}

// propertySelectorRequirementToSQLClause to converts each selector requirement into a gorm SQL clause
func propertySelectorRequirementToSQLClause(q *gorm.DB, r labels.Requirement) *gorm.DB {
switch r.Operator() {
case selection.Equals, selection.DoubleEquals:
for val := range r.Values() {
q = q.Where("properties @> ?", types.Properties{{Name: r.Key(), Text: val}})
}
case selection.NotEquals:
for val := range r.Values() {
q = q.Where("NOT (properties @> ?)", types.Properties{{Name: r.Key(), Text: val}})
}
case selection.GreaterThan,
selection.LessThan,
selection.In,
selection.NotIn,
selection.Exists,
selection.DoesNotExist:
logger.Warnf("TODO: Implement %s for property lookup", r.Operator())
}

return q
}
// func propertySelectorRequirementToSQLClause(q *gorm.DB, r labels.Requirement) *gorm.DB {
// switch r.Operator() {
// case selection.Equals, selection.DoubleEquals:
// for val := range r.Values() {
// q = q.Where("properties @> ?", types.Properties{{Name: r.Key(), Text: val}})
// }
// case selection.NotEquals:
// for val := range r.Values() {
// q = q.Where("NOT (properties @> ?)", types.Properties{{Name: r.Key(), Text: val}})
// }
// case selection.GreaterThan,
// selection.LessThan,
// selection.In,
// selection.NotIn,
// selection.Exists,
// selection.DoesNotExist:
// logger.Warnf("TODO: Implement %s for property lookup", r.Operator())
// }

// return q
// }

// getScopeID takes either uuid or namespace/name and table to return the appropriate scope_id
func getScopeID(ctx context.Context, scope string, table string, agentID *uuid.UUID) (string, error) {
Expand Down
5 changes: 3 additions & 2 deletions tests/config_changes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,8 +238,9 @@ var _ = ginkgo.Describe("Config changes recursive", ginkgo.Ordered, func() {
})
Expect(err).To(BeNil())

Expect(response.Total).To(Equal(int64(3)))
Expect(len(response.Changes)).To(Equal(3))
Expect(response.Total).To(Equal(int64(5)))
Expect(len(response.Changes)).To(Equal(5))
Expect(response.Summary["Healthy"]).To(Equal(2))
Expect(response.Summary["Pulled"]).To(Equal(2))
Expect(response.Summary["diff"]).To(Equal(1))
})
Expand Down
69 changes: 33 additions & 36 deletions tests/query_resource_selector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,6 @@ var _ = ginkgo.Describe("SearchResourceSelectors", func() {
},
Configs: []models.ConfigItem{dummy.LogisticsDBRDS},
},
{
description: "namespace | search | prefix | configs",
query: query.SearchResourcesRequest{
Configs: []types.ResourceSelector{{Search: "namespace=mission*", Types: []string{*dummy.LogisticsDBRDS.Type}}},
},
Configs: []models.ConfigItem{dummy.LogisticsDBRDS},
},
{
description: "name prefix | components",
query: query.SearchResourcesRequest{
Expand Down Expand Up @@ -214,34 +207,34 @@ var _ = ginkgo.Describe("SearchResourceSelectors", func() {
},
Configs: []models.ConfigItem{dummy.EC2InstanceA, dummy.EC2InstanceB},
},
{
description: "field selector | Property lookup | configs",
query: query.SearchResourcesRequest{
Configs: []types.ResourceSelector{{FieldSelector: "region=us-west-2"}},
},
Configs: []models.ConfigItem{dummy.KubernetesNodeB},
},
{
description: "field selector | Property lookup Not Equals Query",
query: query.SearchResourcesRequest{
Configs: []types.ResourceSelector{{FieldSelector: "region!=us-east-1", TagSelector: "cluster=aws"}},
},
Configs: []models.ConfigItem{dummy.KubernetesNodeB},
},
{
description: "field selector | Property lookup Greater Than Query",
query: query.SearchResourcesRequest{
Configs: []types.ResourceSelector{{FieldSelector: "memory>5"}},
},
Configs: []models.ConfigItem{dummy.KubernetesNodeA, dummy.KubernetesNodeB},
},
{
description: "field selector | Property lookup Less Than Query",
query: query.SearchResourcesRequest{
Configs: []types.ResourceSelector{{FieldSelector: "memory<50"}},
},
Configs: []models.ConfigItem{dummy.KubernetesNodeB},
},
// {
// description: "field selector | Property lookup | configs",
// query: query.SearchResourcesRequest{
// Configs: []types.ResourceSelector{{FieldSelector: "region=us-west-2"}},
// },
// Configs: []models.ConfigItem{dummy.KubernetesNodeB},
// },
// {
// description: "field selector | Property lookup Not Equals Query",
// query: query.SearchResourcesRequest{
// Configs: []types.ResourceSelector{{FieldSelector: "region!=us-east-1", TagSelector: "cluster=aws"}},
// },
// Configs: []models.ConfigItem{dummy.KubernetesNodeB},
// },
// {
// description: "field selector | Property lookup Greater Than Query",
// query: query.SearchResourcesRequest{
// Configs: []types.ResourceSelector{{FieldSelector: "memory>5"}},
// },
// Configs: []models.ConfigItem{dummy.KubernetesNodeA, dummy.KubernetesNodeB},
// },
// {
// description: "field selector | Property lookup Less Than Query",
// query: query.SearchResourcesRequest{
// Configs: []types.ResourceSelector{{FieldSelector: "memory<50"}},
// },
// Configs: []models.ConfigItem{dummy.KubernetesNodeB},
// },
{
description: "field selector | IN Query",
query: query.SearchResourcesRequest{
Expand Down Expand Up @@ -278,7 +271,7 @@ var _ = ginkgo.Describe("SearchResourceSelectors", func() {
})

for _, test := range testData {
// if test.description != "field selector | Property lookup Equals Query | 2" {
// if test.description != "namespace | search | prefix | configs" {
// continue
// }

Expand Down Expand Up @@ -540,6 +533,10 @@ var _ = ginkgo.Describe("Resoure Selector with PEG", ginkgo.Ordered, func() {
}

for _, tt := range testData {
// if tt.description != "component agent query" {
// continue
// }

ginkgo.It(tt.description, func() {
f, ok := fmap[tt.resource]
Expect(ok).To(BeTrue())
Expand Down

0 comments on commit dd4b5c5

Please sign in to comment.