Skip to content

Commit

Permalink
refactor: refine orderedResourcesGenerator
Browse files Browse the repository at this point in the history
  • Loading branch information
elliotxx committed Aug 23, 2023
1 parent 13e746e commit 69b6954
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,63 +63,66 @@ func (g *orderedResourcesGenerator) Generate(spec *models.Spec) error {
if spec.Resources == nil {
spec.Resources = make(models.Resources, 0)
}

for i := 0; i < len(spec.Resources); i++ {
// Continue if the resource is not a kubernetes resource.
if spec.Resources[i].Type != runtime.Kubernetes {
continue
}
curResource := &spec.Resources[i]
curKind := resourceKind(curResource)
dependKinds := g.findDependKinds(curKind)
injectAllDependsOn(curResource, dependKinds, spec.Resources)

// Inject dependsOn of the resource.
r := (*resource)(&spec.Resources[i])
r.injectDependsOn(g.orderedKinds, spec.Resources)
}

return nil
}

// resourceKind returns the kind of the given resource.
func resourceKind(r *models.Resource) string {
type resource models.Resource

// kubernetesKind returns the kubernetes kind of the given resource.
func (r resource) kubernetesKind() string {
u := &unstructured.Unstructured{}
u.SetUnstructuredContent(r.Attributes)
return u.GetKind()
}

// injectAllDependsOn injects all dependsOn relationships for the given resource and dependent kinds.
func injectAllDependsOn(curResource *models.Resource, dependKinds []string, rs []models.Resource) {
for _, dependKind := range dependKinds {
dependResources := findDependResources(dependKind, rs)
injectDependsOn(curResource, dependResources)
// injectDependsOn injects all dependsOn relationships for the given resource and dependent kinds.
func (r *resource) injectDependsOn(orderedKinds []string, rs []models.Resource) {
kinds := r.findDependKinds(orderedKinds)
for _, kind := range kinds {
drs := findDependResources(kind, rs)
r.appendDependsOn(drs)
}
}

// injectDependsOn injects dependsOn relationships for the given resource and dependent resources.
func injectDependsOn(res *models.Resource, dependResources []*models.Resource) {
dependsOn := make([]string, 0, len(dependResources))
for i := 0; i < len(dependResources); i++ {
dependsOn = append(dependsOn, dependResources[i].ID)
// appendDependsOn injects dependsOn relationships for the given resource and dependent resources.
func (r *resource) appendDependsOn(dependResources []*models.Resource) {
for _, dr := range dependResources {
r.DependsOn = append(r.DependsOn, dr.ID)
}
if len(dependsOn) > 0 {
res.DependsOn = append(res.DependsOn, dependsOn...)
}

// findDependKinds returns the dependent resource kinds for the specified kind.
func (r *resource) findDependKinds(orderedKinds []string) []string {
curKind := r.kubernetesKind()
dependKinds := make([]string, 0)
for _, previousKind := range orderedKinds {
if curKind == previousKind {
break
}
dependKinds = append(dependKinds, previousKind)
}
return dependKinds
}

// findDependResources returns the dependent resources of the specified kind.
func findDependResources(dependKind string, rs []models.Resource) []*models.Resource {
var dependResources []*models.Resource
for i := 0; i < len(rs); i++ {
if resourceKind(&rs[i]) == dependKind {
if resource(rs[i]).kubernetesKind() == dependKind {
dependResources = append(dependResources, &rs[i])
}
}
return dependResources
}

// findDependKinds returns the dependent resource kinds for the specified kind.
func (g *orderedResourcesGenerator) findDependKinds(curKind string) []string {
dependKinds := make([]string, 0)
for _, previousKind := range g.orderedKinds {
if curKind == previousKind {
break
}
dependKinds = append(dependKinds, previousKind)
}
return dependKinds
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,15 @@ func TestOrderedResourcesGenerator_Generate(t *testing.T) {
}

func TestResourceKind(t *testing.T) {
resource := &models.Resource{
r := &resource{
Type: runtime.Kubernetes,
Attributes: map[string]interface{}{
"kind": "Deployment",
},
}

expected := "Deployment"
actual := resourceKind(resource)
actual := r.kubernetesKind()

assert.Equal(t, expected, actual)
}
Expand All @@ -122,16 +122,18 @@ func TestInjectAllDependsOn(t *testing.T) {
dependKinds := []string{"Namespace"}

expected := []string{"v1:Namespace:foo"}
actual := []models.Resource(spec.Resources)[0]
injectAllDependsOn(&actual, dependKinds, spec.Resources)
actual := resource([]models.Resource(spec.Resources)[0])
actual.injectDependsOn(dependKinds, spec.Resources)

assert.Equal(t, expected, actual.DependsOn)
}

func TestFindDependKinds(t *testing.T) {
curKind := "Deployment"
g := &orderedResourcesGenerator{
orderedKinds: defaultOrderedKinds,
r := &resource{
Type: runtime.Kubernetes,
Attributes: map[string]interface{}{
"kind": "Deployment",
},
}

expected := []string{
Expand All @@ -154,7 +156,7 @@ func TestFindDependKinds(t *testing.T) {
"PersistentVolume",
"PersistentVolumeClaim",
}
actual := g.findDependKinds(curKind)
actual := r.findDependKinds(defaultOrderedKinds)

assert.Equal(t, expected, actual)
}
Expand Down

0 comments on commit 69b6954

Please sign in to comment.