mirror of
https://github.com/cozystack/cozystack.git
synced 2026-11-09 05:25:14 +09:00
This change is extracted from - https://github.com/cozystack/cozystack/pull/1641 and reworked to work standalone ## What this PR does This PR extracts changes from the https://github.com/cozystack/cozystack/pull/1641. It adds application metadata labels to HelmReleases and updates the filtering mechanism to use labels instead of chart/sourceRef matching. Changes: - Add three application metadata labels (`apps.cozystack.io/application.kind`, `apps.cozystack.io/application.group`, `apps.cozystack.io/application.name`) when creating/updating HelmRelease via Cozystack-API - Replace `shouldIncludeHelmRelease` filtering with label-based filtering in Get, List, and Update methods - Always add kind and group label requirements in List for precise filtering - Update CozystackResourceDefinitionController to watch only HelmReleases with `cozystack.io/ui=true` label - Update LineageControllerWebhook to extract metadata directly from HelmRelease labels instead of using chart mapping configuration - Add functionality to update HelmRelease chart from CozystackResourceDefinition using label selectors ### Release note ```release-note [registry] Add application labels and update filtering mechanism to use label-based filtering instead of chart/sourceRef matching ``` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added application metadata labels (kind, group, name) and exported label keys for HelmRelease identification. * New reconciler keeps HelmRelease charts in sync with application CRDs. * **Refactor** * Mapping, listing and selection moved to label-driven logic; reconciliation responsibilities split so core reconciler focuses on restart/debounce while a separate reconciler updates HelmReleases. * **Chores** * Migration script to backfill application labels on existing HelmReleases. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
74 lines
2.1 KiB
Go
74 lines
2.1 KiB
Go
package lineagecontrollerwebhook
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
cozyv1alpha1 "github.com/cozystack/cozystack/api/v1alpha1"
|
|
helmv2 "github.com/fluxcd/helm-controller/api/v2"
|
|
)
|
|
|
|
type appRef struct {
|
|
group string
|
|
kind string
|
|
}
|
|
|
|
type runtimeConfig struct {
|
|
appCRDMap map[appRef]*cozyv1alpha1.CozystackResourceDefinition
|
|
}
|
|
|
|
func (l *LineageControllerWebhook) initConfig() {
|
|
l.initOnce.Do(func() {
|
|
if l.config.Load() == nil {
|
|
l.config.Store(&runtimeConfig{
|
|
appCRDMap: make(map[appRef]*cozyv1alpha1.CozystackResourceDefinition),
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
// getApplicationLabel safely extracts an application label from HelmRelease
|
|
func getApplicationLabel(hr *helmv2.HelmRelease, key string) (string, error) {
|
|
if hr.Labels == nil {
|
|
return "", fmt.Errorf("cannot map helm release %s/%s to dynamic app: labels are nil", hr.Namespace, hr.Name)
|
|
}
|
|
val, ok := hr.Labels[key]
|
|
if !ok {
|
|
return "", fmt.Errorf("cannot map helm release %s/%s to dynamic app: missing %s label", hr.Namespace, hr.Name, key)
|
|
}
|
|
return val, nil
|
|
}
|
|
|
|
func (l *LineageControllerWebhook) Map(hr *helmv2.HelmRelease) (string, string, string, error) {
|
|
// Extract application metadata from labels
|
|
appKind, err := getApplicationLabel(hr, "apps.cozystack.io/application.kind")
|
|
if err != nil {
|
|
return "", "", "", err
|
|
}
|
|
|
|
appGroup, err := getApplicationLabel(hr, "apps.cozystack.io/application.group")
|
|
if err != nil {
|
|
return "", "", "", err
|
|
}
|
|
|
|
appName, err := getApplicationLabel(hr, "apps.cozystack.io/application.name")
|
|
if err != nil {
|
|
return "", "", "", err
|
|
}
|
|
|
|
// Construct API version from group
|
|
apiVersion := fmt.Sprintf("%s/v1alpha1", appGroup)
|
|
|
|
// Extract prefix from HelmRelease name by removing the application name
|
|
// HelmRelease name format: <prefix><application-name>
|
|
prefix := strings.TrimSuffix(hr.Name, appName)
|
|
|
|
// Validate the derived prefix
|
|
// This ensures correctness when appName appears multiple times in hr.Name
|
|
if prefix+appName != hr.Name {
|
|
return "", "", "", fmt.Errorf("cannot derive prefix from helm release %s/%s: name does not end with application name %s", hr.Namespace, hr.Name, appName)
|
|
}
|
|
|
|
return apiVersion, appKind, prefix, nil
|
|
}
|