diff --git a/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize/generic_services_test.go b/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize/generic_services_test.go new file mode 100644 index 00000000000..34959d8a5e8 --- /dev/null +++ b/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize/generic_services_test.go @@ -0,0 +1,34 @@ +package kustomize_test + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + kust "sigs.k8s.io/kubebuilder/v4/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize" +) + +var _ = Describe("Generic Services", func() { + It("should place non-webhook, non-metrics services into the 'services' group", func() { + + // 1. Create a fake Service + service := &unstructured.Unstructured{} + service.SetKind("Service") + service.SetAPIVersion("v1") + service.SetName("my-alert-service") // does NOT contain 'metrics' or 'webhook' + + // 2. Put it inside ParsedResources + parsed := &kust.ParsedResources{ + Services: []*unstructured.Unstructured{service}, + } + + // 3. Run the ResourceOrganizer + organizer := kust.NewResourceOrganizer(parsed) + groups := organizer.OrganizeByFunction() + + // 4. Expect it inside the "services" group + Expect(groups).To(HaveKey("services")) + Expect(groups["services"]).To(HaveLen(1)) + Expect(groups["services"][0].GetName()).To(Equal("my-alert-service")) + }) +}) diff --git a/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize/resource_organizer.go b/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize/resource_organizer.go index 6dff347829b..849b55b38ef 100644 --- a/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize/resource_organizer.go +++ b/pkg/plugins/optional/helm/v2alpha/scaffolds/internal/kustomize/resource_organizer.go @@ -83,6 +83,12 @@ func (o *ResourceOrganizer) OrganizeByFunction() map[string][]*unstructured.Unst groups["other"] = o.resources.Other } + // Generic Services - Services that are neither webhook nor metrics + genericServices := o.collectGenericServices() + if len(genericServices) > 0 { + groups["services"] = genericServices + } + return groups } @@ -150,6 +156,18 @@ func (o *ResourceOrganizer) collectMetricsResources() []*unstructured.Unstructur return metricsResources } +// collectGenericServices gathers all other service resources +func (o *ResourceOrganizer) collectGenericServices() []*unstructured.Unstructured { + var generic []*unstructured.Unstructured + + for _, service := range o.resources.Services { + if o.isGenericService(service) { + generic = append(generic, service) + } + } + return generic +} + // collectPrometheusResources gathers prometheus related resources func (o *ResourceOrganizer) collectPrometheusResources() []*unstructured.Unstructured { var prometheusResources []*unstructured.Unstructured @@ -171,3 +189,9 @@ func (o *ResourceOrganizer) isMetricsService(service *unstructured.Unstructured) serviceName := service.GetName() return strings.Contains(serviceName, "metrics") } + +// isGenericService determines if a service is a generic service to +// include all remaining Services that are not webhook or metrics +func (o *ResourceOrganizer) isGenericService(service *unstructured.Unstructured) bool { + return !o.isWebhookService(service) && !o.isMetricsService(service) +}