From 69b69542a46906d29372634b8d6132da04ac1bff Mon Sep 17 00:00:00 2001 From: elliotxx <951376975@qq.com> Date: Wed, 23 Aug 2023 12:18:17 +0800 Subject: [PATCH] refactor: refine orderedResourcesGenerator --- .../generator/ordered_resources_generator.go | 65 ++++++++++--------- .../ordered_resources_generator_test.go | 18 ++--- 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/pkg/generator/appconfiguration/generator/ordered_resources_generator.go b/pkg/generator/appconfiguration/generator/ordered_resources_generator.go index 418bdee0..b6291a3e 100644 --- a/pkg/generator/appconfiguration/generator/ordered_resources_generator.go +++ b/pkg/generator/appconfiguration/generator/ordered_resources_generator.go @@ -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 -} diff --git a/pkg/generator/appconfiguration/generator/ordered_resources_generator_test.go b/pkg/generator/appconfiguration/generator/ordered_resources_generator_test.go index 6bbd94cf..084b7a5d 100644 --- a/pkg/generator/appconfiguration/generator/ordered_resources_generator_test.go +++ b/pkg/generator/appconfiguration/generator/ordered_resources_generator_test.go @@ -104,7 +104,7 @@ 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", @@ -112,7 +112,7 @@ func TestResourceKind(t *testing.T) { } expected := "Deployment" - actual := resourceKind(resource) + actual := r.kubernetesKind() assert.Equal(t, expected, actual) } @@ -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{ @@ -154,7 +156,7 @@ func TestFindDependKinds(t *testing.T) { "PersistentVolume", "PersistentVolumeClaim", } - actual := g.findDependKinds(curKind) + actual := r.findDependKinds(defaultOrderedKinds) assert.Equal(t, expected, actual) }