From 5970531dc84b00fdfd732b518b4483b06273b9df Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Fri, 12 Jan 2024 19:50:59 +0530 Subject: [PATCH 1/4] refactor: component selector logic --- pkg/system_api.go | 1 + pkg/topology/component_relationship_test.go | 162 +++++++++++++++++--- 2 files changed, 142 insertions(+), 21 deletions(-) diff --git a/pkg/system_api.go b/pkg/system_api.go index a0f330472..3f4887d07 100644 --- a/pkg/system_api.go +++ b/pkg/system_api.go @@ -110,6 +110,7 @@ func (components Components) Walk() Components { type Component struct { Name string `json:"name,omitempty"` ID uuid.UUID `json:"id,omitempty" gorm:"default:generate_ulid()"` //nolint + AgentID uuid.UUID `json:"agent_id,omitempty"` //nolint Text string `json:"text,omitempty"` Schedule string `json:"schedule,omitempty"` TopologyType string `json:"topology_type,omitempty"` diff --git a/pkg/topology/component_relationship_test.go b/pkg/topology/component_relationship_test.go index b381517e2..05590302e 100644 --- a/pkg/topology/component_relationship_test.go +++ b/pkg/topology/component_relationship_test.go @@ -1,49 +1,132 @@ package topology import ( + "fmt" + "github.com/flanksource/canary-checker/pkg" + "github.com/flanksource/commons/collections/set" + "github.com/flanksource/duty/models" "github.com/flanksource/duty/types" + "github.com/google/uuid" ginkgo "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) -var _ = ginkgo.Describe("Topology relationships", ginkgo.Ordered, func() { +func matchComponentsInRelationships(components pkg.Components, relationships []models.ComponentRelationship) error { + if len(components) != len(relationships) { + return fmt.Errorf("length of components & relationships should be equal") + } + + cset := set.New[string]() + for _, c := range components { + cset.Add(c.ID.String()) + } + for _, r := range relationships { + cset.Remove(r.ComponentID.String()) + } + if len(cset) != 0 { + return fmt.Errorf("mismatch in ids: %s", cset) + } + return nil +} + +var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { + agent := models.Agent{ID: uuid.New(), Name: "agent"} topology := pkg.Topology{Name: "Topology ComponentRelationship"} + parentComponent := pkg.Component{ Name: "Component", Selectors: []types.ResourceSelector{ { - Name: "ComponentSelector", LabelSelector: "service=payments", + FieldSelector: "type=api", }, }, } - childComponent1 := pkg.Component{ - Name: "Child-1", - Labels: map[string]string{"service": "payments"}, + parentComponent2 := pkg.Component{ + Name: "Component2", + Selectors: []types.ResourceSelector{ + { + FieldSelector: "type=api,agent_id=all", + }, + }, } - childComponent2 := pkg.Component{ - Name: "Child-2", - Labels: map[string]string{"service": "logistics"}, + parentComponent3 := pkg.Component{ + Name: "Component3", + Selectors: []types.ResourceSelector{ + { + FieldSelector: "type=api", + }, + }, + } + parentComponent4 := pkg.Component{ + Name: "Component4", + Selectors: []types.ResourceSelector{ + { + LabelSelector: "service=logistics", + }, + }, + } + parentComponent5 := pkg.Component{ + Name: "Component5", + Selectors: []types.ResourceSelector{ + { + FieldSelector: "agent_id=" + agent.ID.String(), + }, + }, } - childComponent3 := pkg.Component{ - Name: "Child-3", - Labels: map[string]string{"service": "payments"}, + childrenComponents := pkg.Components{ + { + Name: "Child-1", + Labels: map[string]string{"service": "payments"}, + Type: "api", + }, + { + Name: "Child-2", + Labels: map[string]string{"service": "logistics"}, + }, + { + Name: "Child-3", + Labels: map[string]string{"service": "payments"}, + Type: "api", + }, + { + Name: "Child-4", + Labels: map[string]string{"service": "payments"}, + Type: "ui", + }, + { + Name: "Child-5", + Labels: map[string]string{"service": "logistics"}, + Type: "api", + }, + { + Name: "Child-6", + AgentID: agent.ID, + Labels: map[string]string{"service": "logistics"}, + Type: "api", + }, } ginkgo.BeforeAll(func() { err := DefaultContext.DB().Create(&topology).Error Expect(err).To(BeNil()) + err = DefaultContext.DB().Create(&agent).Error + Expect(err).To(BeNil()) parentComponent.TopologyID = topology.ID + parentComponent2.TopologyID = topology.ID + parentComponent3.TopologyID = topology.ID + parentComponent4.TopologyID = topology.ID + parentComponent5.TopologyID = topology.ID ComponentRelationshipSync.Context = DefaultContext - err = DefaultContext.DB().Create(&parentComponent).Error + err = DefaultContext.DB().Create(pkg.Components{&parentComponent, &parentComponent2, &parentComponent3, &parentComponent4, &parentComponent5}).Error Expect(err).To(BeNil()) - childComponent1.TopologyID = topology.ID - childComponent2.TopologyID = topology.ID - childComponent3.TopologyID = topology.ID - err = DefaultContext.DB().Create(pkg.Components{&childComponent1, &childComponent2, &childComponent3}).Error + for _, c := range childrenComponents { + c.TopologyID = topology.ID + } + err = DefaultContext.DB().Create(childrenComponents).Error Expect(err).To(BeNil()) }) @@ -54,12 +137,48 @@ var _ = ginkgo.Describe("Topology relationships", ginkgo.Ordered, func() { relationships, err := parentComponent.GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) - // Child-1 and Child-3 should be present but not Child-2 + // Child-1 and Child-3 Expect(len(relationships)).To(Equal(2)) + Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-1"), childrenComponents.Find("Child-3")}, relationships)).To(BeNil()) + + relationships, err = parentComponent2.GetChildren(DefaultContext.DB()) + Expect(err).To(BeNil()) + + // Child-1 Child-3 Child-5 Child-6 + Expect(matchComponentsInRelationships(pkg.Components{ + childrenComponents.Find("Child-1"), childrenComponents.Find("Child-3"), + childrenComponents.Find("Child-5"), childrenComponents.Find("Child-6")}, relationships)). + To(BeNil()) + Expect(len(relationships)).To(Equal(4)) + + relationships, err = parentComponent3.GetChildren(DefaultContext.DB()) + Expect(err).To(BeNil()) + + // Child-1 Child-3 Child-5 + Expect(matchComponentsInRelationships(pkg.Components{ + childrenComponents.Find("Child-1"), childrenComponents.Find("Child-3"), + childrenComponents.Find("Child-5")}, relationships)). + To(BeNil()) + Expect(len(relationships)).To(Equal(3)) + + relationships, err = parentComponent4.GetChildren(DefaultContext.DB()) + Expect(err).To(BeNil()) + + // Child-2 Child-5 + Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-2"), childrenComponents.Find("Child-5")}, relationships)).To(BeNil()) + Expect(len(relationships)).To(Equal(2)) + + relationships, err = parentComponent5.GetChildren(DefaultContext.DB()) + Expect(err).To(BeNil()) + + // Child-6 + Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-6")}, relationships)).To(BeNil()) + Expect(len(relationships)).To(Equal(1)) + }) ginkgo.It("should handle component relationship deletions", func() { - err := DefaultContext.DB().Delete(&childComponent3).Error + err := DefaultContext.DB().Delete(&childrenComponents[2]).Error Expect(err).To(BeNil()) ComponentRelationshipSync.Run() @@ -71,7 +190,7 @@ var _ = ginkgo.Describe("Topology relationships", ginkgo.Ordered, func() { // Only child 1 should be present Expect(len(relationships)).To(Equal(1)) - err = DefaultContext.DB().Create(&childComponent3).Error + err = DefaultContext.DB().Create(&childrenComponents[2]).Error Expect(err).To(BeNil()) ComponentRelationshipSync.Run() @@ -82,11 +201,12 @@ var _ = ginkgo.Describe("Topology relationships", ginkgo.Ordered, func() { // Child-1 and Child-3 should be present but not Child-2 Expect(len(relationships)).To(Equal(2)) + }) ginkgo.It("should handle component label updates", func() { - childComponent3.Labels = map[string]string{"service": "logistics"} - err := DefaultContext.DB().Save(&childComponent3).Error + childrenComponents[2].Labels = map[string]string{"service": "logistics"} + err := DefaultContext.DB().Save(&childrenComponents[2]).Error Expect(err).To(BeNil()) ComponentRelationshipSync.Run() expectJobToPass(ComponentRelationshipSync) From 63e0657759d5302398212abb46b2198565612529 Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Sat, 13 Jan 2024 17:54:24 +0530 Subject: [PATCH 2/4] chore: add topology test for multiple resource selectors --- pkg/topology/component_relationship_test.go | 28 ++++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/pkg/topology/component_relationship_test.go b/pkg/topology/component_relationship_test.go index 05590302e..3fb338739 100644 --- a/pkg/topology/component_relationship_test.go +++ b/pkg/topology/component_relationship_test.go @@ -75,6 +75,18 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { }, }, } + parentComponent6 := pkg.Component{ + Name: "Component5", + Selectors: []types.ResourceSelector{ + { + LabelSelector: "service=payments", + FieldSelector: "type=api", + }, + { + LabelSelector: "service=logistics", + }, + }, + } childrenComponents := pkg.Components{ { Name: "Child-1", @@ -119,8 +131,9 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { parentComponent3.TopologyID = topology.ID parentComponent4.TopologyID = topology.ID parentComponent5.TopologyID = topology.ID + parentComponent6.TopologyID = topology.ID ComponentRelationshipSync.Context = DefaultContext - err = DefaultContext.DB().Create(pkg.Components{&parentComponent, &parentComponent2, &parentComponent3, &parentComponent4, &parentComponent5}).Error + err = DefaultContext.DB().Create(pkg.Components{&parentComponent, &parentComponent2, &parentComponent3, &parentComponent4, &parentComponent5, &parentComponent6}).Error Expect(err).To(BeNil()) for _, c := range childrenComponents { @@ -154,7 +167,6 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { relationships, err = parentComponent3.GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) - // Child-1 Child-3 Child-5 Expect(matchComponentsInRelationships(pkg.Components{ childrenComponents.Find("Child-1"), childrenComponents.Find("Child-3"), childrenComponents.Find("Child-5")}, relationships)). @@ -164,17 +176,25 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { relationships, err = parentComponent4.GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) - // Child-2 Child-5 Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-2"), childrenComponents.Find("Child-5")}, relationships)).To(BeNil()) Expect(len(relationships)).To(Equal(2)) relationships, err = parentComponent5.GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) - // Child-6 Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-6")}, relationships)).To(BeNil()) Expect(len(relationships)).To(Equal(1)) + relationships, err = parentComponent6.GetChildren(DefaultContext.DB()) + Expect(err).To(BeNil()) + + Expect(matchComponentsInRelationships(pkg.Components{ + childrenComponents.Find("Child-1"), childrenComponents.Find("Child-2"), + childrenComponents.Find("Child-3"), childrenComponents.Find("Child-5")}, relationships)). + To(BeNil()) + + Expect(len(relationships)).To(Equal(4)) + }) ginkgo.It("should handle component relationship deletions", func() { From 08086c42f58084b1b286ba5549c6bd5b03f1b79b Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Sat, 13 Jan 2024 18:01:53 +0530 Subject: [PATCH 3/4] chore: refactor component relationship tests --- pkg/topology/component_relationship_test.go | 113 ++++++++++---------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/pkg/topology/component_relationship_test.go b/pkg/topology/component_relationship_test.go index 3fb338739..63b6a7371 100644 --- a/pkg/topology/component_relationship_test.go +++ b/pkg/topology/component_relationship_test.go @@ -30,60 +30,62 @@ func matchComponentsInRelationships(components pkg.Components, relationships []m return nil } -var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { +var _ = ginkgo.Describe("Topology relationships", ginkgo.Ordered, func() { agent := models.Agent{ID: uuid.New(), Name: "agent"} topology := pkg.Topology{Name: "Topology ComponentRelationship"} - parentComponent := pkg.Component{ - Name: "Component", - Selectors: []types.ResourceSelector{ - { - LabelSelector: "service=payments", - FieldSelector: "type=api", + parentComponents := pkg.Components{ + { + Name: "Component", + Selectors: []types.ResourceSelector{ + { + LabelSelector: "service=payments", + FieldSelector: "type=api", + }, }, }, - } - parentComponent2 := pkg.Component{ - Name: "Component2", - Selectors: []types.ResourceSelector{ - { - FieldSelector: "type=api,agent_id=all", + { + Name: "Component2", + Selectors: []types.ResourceSelector{ + { + FieldSelector: "type=api,agent_id=all", + }, }, }, - } - parentComponent3 := pkg.Component{ - Name: "Component3", - Selectors: []types.ResourceSelector{ - { - FieldSelector: "type=api", + { + Name: "Component3", + Selectors: []types.ResourceSelector{ + { + FieldSelector: "type=api", + }, }, }, - } - parentComponent4 := pkg.Component{ - Name: "Component4", - Selectors: []types.ResourceSelector{ - { - LabelSelector: "service=logistics", + { + Name: "Component4", + Selectors: []types.ResourceSelector{ + { + LabelSelector: "service=logistics", + }, }, }, - } - parentComponent5 := pkg.Component{ - Name: "Component5", - Selectors: []types.ResourceSelector{ - { - FieldSelector: "agent_id=" + agent.ID.String(), + { + Name: "Component5", + Selectors: []types.ResourceSelector{ + { + FieldSelector: "agent_id=" + agent.ID.String(), + }, }, }, - } - parentComponent6 := pkg.Component{ - Name: "Component5", - Selectors: []types.ResourceSelector{ - { - LabelSelector: "service=payments", - FieldSelector: "type=api", - }, - { - LabelSelector: "service=logistics", + { + Name: "Component6", + Selectors: []types.ResourceSelector{ + { + LabelSelector: "service=payments", + FieldSelector: "type=api", + }, + { + LabelSelector: "service=logistics", + }, }, }, } @@ -126,14 +128,11 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { err = DefaultContext.DB().Create(&agent).Error Expect(err).To(BeNil()) - parentComponent.TopologyID = topology.ID - parentComponent2.TopologyID = topology.ID - parentComponent3.TopologyID = topology.ID - parentComponent4.TopologyID = topology.ID - parentComponent5.TopologyID = topology.ID - parentComponent6.TopologyID = topology.ID + for _, c := range parentComponents { + c.TopologyID = topology.ID + } ComponentRelationshipSync.Context = DefaultContext - err = DefaultContext.DB().Create(pkg.Components{&parentComponent, &parentComponent2, &parentComponent3, &parentComponent4, &parentComponent5, &parentComponent6}).Error + err = DefaultContext.DB().Create(parentComponents).Error Expect(err).To(BeNil()) for _, c := range childrenComponents { @@ -147,14 +146,14 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { ComponentRelationshipSync.Run() expectJobToPass(ComponentRelationshipSync) - relationships, err := parentComponent.GetChildren(DefaultContext.DB()) + relationships, err := parentComponents.Find("Component").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) // Child-1 and Child-3 Expect(len(relationships)).To(Equal(2)) Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-1"), childrenComponents.Find("Child-3")}, relationships)).To(BeNil()) - relationships, err = parentComponent2.GetChildren(DefaultContext.DB()) + relationships, err = parentComponents.Find("Component2").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) // Child-1 Child-3 Child-5 Child-6 @@ -164,7 +163,7 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { To(BeNil()) Expect(len(relationships)).To(Equal(4)) - relationships, err = parentComponent3.GetChildren(DefaultContext.DB()) + relationships, err = parentComponents.Find("Component3").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) Expect(matchComponentsInRelationships(pkg.Components{ @@ -173,19 +172,19 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { To(BeNil()) Expect(len(relationships)).To(Equal(3)) - relationships, err = parentComponent4.GetChildren(DefaultContext.DB()) + relationships, err = parentComponents.Find("Component4").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-2"), childrenComponents.Find("Child-5")}, relationships)).To(BeNil()) Expect(len(relationships)).To(Equal(2)) - relationships, err = parentComponent5.GetChildren(DefaultContext.DB()) + relationships, err = parentComponents.Find("Component5").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) Expect(matchComponentsInRelationships(pkg.Components{childrenComponents.Find("Child-6")}, relationships)).To(BeNil()) Expect(len(relationships)).To(Equal(1)) - relationships, err = parentComponent6.GetChildren(DefaultContext.DB()) + relationships, err = parentComponents.Find("Component6").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) Expect(matchComponentsInRelationships(pkg.Components{ @@ -204,7 +203,7 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { ComponentRelationshipSync.Run() expectJobToPass(ComponentRelationshipSync) - relationships, err := parentComponent.GetChildren(DefaultContext.DB()) + relationships, err := parentComponents.Find("Component").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) // Only child 1 should be present @@ -216,7 +215,7 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { ComponentRelationshipSync.Run() expectJobToPass(ComponentRelationshipSync) - relationships, err = parentComponent.GetChildren(DefaultContext.DB()) + relationships, err = parentComponents.Find("Component").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) // Child-1 and Child-3 should be present but not Child-2 @@ -231,7 +230,7 @@ var _ = ginkgo.FDescribe("Topology relationships", ginkgo.Ordered, func() { ComponentRelationshipSync.Run() expectJobToPass(ComponentRelationshipSync) - relationships, err := parentComponent.GetChildren(DefaultContext.DB()) + relationships, err := parentComponents.Find("Component").GetChildren(DefaultContext.DB()) Expect(err).To(BeNil()) // Only child 1 should be present as we updated the labels From 91aa38b641e48094fe5cb193729520d67ec43807 Mon Sep 17 00:00:00 2001 From: Yash Mehrotra Date: Sat, 13 Jan 2024 23:44:16 +0530 Subject: [PATCH 4/4] chore: bump duty --- go.mod | 2 +- go.sum | 4 ++-- hack/generate-schemas/go.mod | 2 +- hack/generate-schemas/go.sum | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 340bace6b..0375ab661 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/fergusstrange/embedded-postgres v1.25.0 github.com/flanksource/artifacts v1.0.4 github.com/flanksource/commons v1.20.0 - github.com/flanksource/duty v1.0.280 + github.com/flanksource/duty v1.0.287 github.com/flanksource/gomplate/v3 v3.21.0 github.com/flanksource/is-healthy v0.0.0-20231003215854-76c51e3a3ff7 github.com/flanksource/kommons v0.31.4 diff --git a/go.sum b/go.sum index dc591b050..c12254450 100644 --- a/go.sum +++ b/go.sum @@ -827,8 +827,8 @@ github.com/flanksource/artifacts v1.0.4 h1:KjQTwsvQ73uHqTK7o4Jwt/RW8fyxJOTJ6JLgz github.com/flanksource/artifacts v1.0.4/go.mod h1:wkbdseaTkDo4Q6k6T86vXd4Uy47M6NPCmexgHvCTDl0= github.com/flanksource/commons v1.20.0 h1:1z7FHGsCY7F7zMx4m0OlzYCUvCc1caREPp7vf1xyeCQ= github.com/flanksource/commons v1.20.0/go.mod h1:bs2nMwaTCpTQGZNtJv8KNqEVyfGjFZTGUDaAbPHB1cw= -github.com/flanksource/duty v1.0.280 h1:O02u0a09FwR3pxxR3cbRQYogypac92bL9m8iZtg86EA= -github.com/flanksource/duty v1.0.280/go.mod h1:zDVxlWxpSZjbpuBv0i9ke4vlG2elgyKjYY+656XhfPs= +github.com/flanksource/duty v1.0.287 h1:vuXyoxoTkEWh2m08d3JcaB/ZkFuTAEmLwBHQuW5e2AE= +github.com/flanksource/duty v1.0.287/go.mod h1:zDVxlWxpSZjbpuBv0i9ke4vlG2elgyKjYY+656XhfPs= github.com/flanksource/gomplate/v3 v3.20.4/go.mod h1:27BNWhzzSjDed1z8YShO6W+z6G9oZXuxfNFGd/iGSdc= github.com/flanksource/gomplate/v3 v3.21.0 h1:HbgJ7GCv2fGjjKhGBBtMmo+uA9T6pI9FVm+M/eEurOA= github.com/flanksource/gomplate/v3 v3.21.0/go.mod h1:m2WVc04GMVBOcZhtDaz/LTtrVWKejeJhFM1Jy/h9VZQ= diff --git a/hack/generate-schemas/go.mod b/hack/generate-schemas/go.mod index bd597942c..eea762bce 100644 --- a/hack/generate-schemas/go.mod +++ b/hack/generate-schemas/go.mod @@ -44,7 +44,7 @@ require ( github.com/evanphx/json-patch v5.7.0+incompatible // indirect github.com/exaring/otelpgx v0.5.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/flanksource/duty v1.0.280 // indirect + github.com/flanksource/duty v1.0.287 // indirect github.com/flanksource/is-healthy v0.0.0-20231003215854-76c51e3a3ff7 // indirect github.com/flanksource/kommons v0.31.4 // indirect github.com/flanksource/postq v1.0.0 // indirect diff --git a/hack/generate-schemas/go.sum b/hack/generate-schemas/go.sum index 5a2463538..0bcb49952 100644 --- a/hack/generate-schemas/go.sum +++ b/hack/generate-schemas/go.sum @@ -719,8 +719,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flanksource/commons v1.20.0 h1:1z7FHGsCY7F7zMx4m0OlzYCUvCc1caREPp7vf1xyeCQ= github.com/flanksource/commons v1.20.0/go.mod h1:bs2nMwaTCpTQGZNtJv8KNqEVyfGjFZTGUDaAbPHB1cw= -github.com/flanksource/duty v1.0.280 h1:O02u0a09FwR3pxxR3cbRQYogypac92bL9m8iZtg86EA= -github.com/flanksource/duty v1.0.280/go.mod h1:zDVxlWxpSZjbpuBv0i9ke4vlG2elgyKjYY+656XhfPs= +github.com/flanksource/duty v1.0.287 h1:vuXyoxoTkEWh2m08d3JcaB/ZkFuTAEmLwBHQuW5e2AE= +github.com/flanksource/duty v1.0.287/go.mod h1:zDVxlWxpSZjbpuBv0i9ke4vlG2elgyKjYY+656XhfPs= github.com/flanksource/gomplate/v3 v3.20.4/go.mod h1:27BNWhzzSjDed1z8YShO6W+z6G9oZXuxfNFGd/iGSdc= github.com/flanksource/gomplate/v3 v3.21.0 h1:HbgJ7GCv2fGjjKhGBBtMmo+uA9T6pI9FVm+M/eEurOA= github.com/flanksource/gomplate/v3 v3.21.0/go.mod h1:m2WVc04GMVBOcZhtDaz/LTtrVWKejeJhFM1Jy/h9VZQ=