Skip to content

Commit

Permalink
refactor: component selector logic
Browse files Browse the repository at this point in the history
  • Loading branch information
yashmehrotra committed Jan 12, 2024
1 parent b126476 commit fa0fa85
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 21 deletions.
1 change: 1 addition & 0 deletions pkg/system_api.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
177 changes: 156 additions & 21 deletions pkg/topology/component_relationship_test.go
Original file line number Diff line number Diff line change
@@ -1,50 +1,140 @@
package topology

import (
"fmt"

"github.com/flanksource/canary-checker/pkg"
"github.com/flanksource/commons/collections/set"
"github.com/flanksource/commons/logger"
"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"}
////
// Field and label selectors are currently AND, THEY SHOULD BE OR
// WRITE TEST FOR BOTH THESE CONDITIONS
parentComponent := pkg.Component{
Name: "Component",
Selectors: []types.ResourceSelector{
{
Name: "ComponentSelector",
LabelSelector: "service=payments",
FieldSelector: "type=api",
},
},
}
parentComponent2 := pkg.Component{
Name: "Component2",
Selectors: []types.ResourceSelector{
{
FieldSelector: "type=api,agent_id=all",
},
},
}
parentComponent3 := pkg.Component{
Name: "Component3",
Selectors: []types.ResourceSelector{
{
FieldSelector: "type=api",
},
},
}
childComponent1 := pkg.Component{
Name: "Child-1",
Labels: map[string]string{"service": "payments"},
parentComponent4 := pkg.Component{
Name: "Component4",
Selectors: []types.ResourceSelector{
{
LabelSelector: "service=logistics",
},
},
}
childComponent2 := pkg.Component{
Name: "Child-2",
Labels: map[string]string{"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())

for i, c := range childrenComponents {
logger.Infof("Comp %d %s", i, c.ID)
}
})

ginkgo.It("should create component relationships", func() {
Expand All @@ -54,12 +144,56 @@ 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
for _, r := range relationships {
logger.Infof("RELATIONSHIP: %s %s", r.ComponentID, r.RelationshipID)
}

// 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())

for _, r := range relationships {
logger.Infof("RELATIONSHIP2: %s %s", r.ComponentID, r.RelationshipID)
}

// 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()
Expand All @@ -71,7 +205,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()
Expand All @@ -82,11 +216,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)
Expand Down

0 comments on commit fa0fa85

Please sign in to comment.