diff --git a/charts/suse-ai-operator/crds/installaiextensions.ai-platform.suse.com.yaml b/charts/suse-ai-operator/crds/installaiextensions.ai-platform.suse.com.yaml index a37d3de..8512c72 100644 --- a/charts/suse-ai-operator/crds/installaiextensions.ai-platform.suse.com.yaml +++ b/charts/suse-ai-operator/crds/installaiextensions.ai-platform.suse.com.yaml @@ -48,8 +48,6 @@ spec: name: minLength: 1 type: string - namespace: - type: string version: minLength: 1 type: string @@ -61,11 +59,14 @@ spec: properties: name: type: string - namespace: - type: string - type: - type: string url: + description: |- + URL of the Helm repository or OCI registry. + Examples: + oci://ghcr.io/my-org/charts + https://charts.example.com + minLength: 1 + pattern: ^(oci://|https?://).+ type: string values: additionalProperties: @@ -75,7 +76,6 @@ spec: type: string required: - name - - type - url - version type: object diff --git a/suse-ai-operator/README.md b/suse-ai-operator/README.md index e9eb690..6c9293a 100644 --- a/suse-ai-operator/README.md +++ b/suse-ai-operator/README.md @@ -49,9 +49,8 @@ metadata: spec: helm: name: suse-ai-lifecycle-manager - url: "ghcr.io/suse/chart/suse-ai-lifecycle-manager" + url: "oci://ghcr.io/suse/chart/suse-ai-lifecycle-manager" version: "1.0.0" - type: "oci" extension: name: suse-ai-lifecycle-manager version: "1.0.0" diff --git a/suse-ai-operator/api/v1alpha1/installaiextension_types.go b/suse-ai-operator/api/v1alpha1/installaiextension_types.go index 310dc3f..23fa760 100644 --- a/suse-ai-operator/api/v1alpha1/installaiextension_types.go +++ b/suse-ai-operator/api/v1alpha1/installaiextension_types.go @@ -32,20 +32,18 @@ type InstallAIExtensionSpec struct { Extension ExtensionSpec `json:"extension"` } -type HelmRepoType string - -const ( - HelmRepoTypeOCI HelmRepoType = "oci" - HelmRepoTypeHTTP HelmRepoType = "http" -) - type HelmSpec struct { - Name string `json:"name"` - URL string `json:"url"` - Namespace string `json:"namespace,omitempty"` - Type HelmRepoType `json:"type"` - Version string `json:"version"` - Values map[string]apixv1.JSON `json:"values,omitempty"` + Name string `json:"name"` + // URL of the Helm repository or OCI registry. + // Examples: + // oci://ghcr.io/my-org/charts + // https://charts.example.com + // + // +kubebuilder:validation:MinLength=1 + // +kubebuilder:validation:Pattern=`^(oci://|https?://).+` + URL string `json:"url"` + Version string `json:"version"` + Values map[string]apixv1.JSON `json:"values,omitempty"` } type ExtensionSpec struct { @@ -53,9 +51,8 @@ type ExtensionSpec struct { Name string `json:"name"` // +kubebuilder:validation:MinLength=1 - Version string `json:"version"` - Namespace string `json:"namespace,omitempty"` - Metadata map[string]string `json:"metadata,omitempty"` + Version string `json:"version"` + Metadata map[string]string `json:"metadata,omitempty"` } // InstallAIExtensionStatus defines the observed state of InstallAIExtension. diff --git a/suse-ai-operator/internal/controller/installaiextension/installaiextension_controller.go b/suse-ai-operator/internal/controller/installaiextension/installaiextension_controller.go index 28d29f4..20c8e83 100644 --- a/suse-ai-operator/internal/controller/installaiextension/installaiextension_controller.go +++ b/suse-ai-operator/internal/controller/installaiextension/installaiextension_controller.go @@ -20,6 +20,8 @@ import ( "context" "fmt" + urlpkg "net/url" + "github.com/go-logr/logr" "helm.sh/helm/v3/pkg/cli" "k8s.io/apimachinery/pkg/runtime" @@ -86,10 +88,19 @@ func (r *InstallAIExtensionReconciler) Reconcile(ctx context.Context, req ctrl.R chart := "" - switch installExt.Spec.Helm.Type { - case "oci": - chart = "oci://" + installExt.Spec.Helm.URL + url := installExt.Spec.Helm.URL + + u, err := urlpkg.Parse(url) + if err != nil { + log.Error(err, "invalid helm url %q", url) + } + + switch u.Scheme { + case "oci", "https": + chart = url default: + log.Error(err, "unsupported helm url scheme: %s", u.Scheme) + return ctrl.Result{}, err } settings := cli.New() diff --git a/suse-ai-operator/samples/installaiextension.yaml b/suse-ai-operator/samples/installaiextension.yaml index b5b669a..b92e371 100644 --- a/suse-ai-operator/samples/installaiextension.yaml +++ b/suse-ai-operator/samples/installaiextension.yaml @@ -5,9 +5,8 @@ metadata: spec: helm: name: suse-ai-lifecycle-manager - url: "ghcr.io/suse/chart/suse-ai-lifecycle-manager" + url: "oci://ghcr.io/suse/chart/suse-ai-lifecycle-manager" version: "1.0.0" - type: "oci" extension: name: suse-ai-lifecycle-manager - version: "1.0.0" + version: "1.0.0" \ No newline at end of file