diff --git a/apis/common/types.go b/apis/common/types.go
index 44542d15895..32c5fce4e80 100644
--- a/apis/common/types.go
+++ b/apis/common/types.go
@@ -70,6 +70,26 @@ type Status struct {
Conditions []metav1.Condition `json:"conditions,omitempty"`
}
+// ComponentRelease represents the detailed status of a component release.
+// +kubebuilder:object:generate=true
+type ComponentRelease struct {
+ // +required
+ // +kubebuilder:validation:Required
+ Name string `json:"name"`
+ Version string `json:"version,omitempty"`
+ RepoURL string `json:"repoUrl,omitempty"`
+}
+
+// ComponentReleaseStatus tracks the list of component releases, including their name, version, and repository URL.
+// +kubebuilder:object:generate=true
+type ComponentReleaseStatus struct {
+ // +patchMergeKey=name
+ // +patchStrategy=merge
+ // +listType=map
+ // +listMapKey=name
+ Releases []ComponentRelease `json:"releases,omitempty"`
+}
+
type WithStatus interface {
GetStatus() *Status
}
@@ -78,6 +98,11 @@ type WithDevFlags interface {
GetDevFlags() *DevFlags
}
+type WithReleases interface {
+ GetReleaseStatus() *[]ComponentRelease
+ SetReleaseStatus(status []ComponentRelease)
+}
+
type PlatformObject interface {
client.Object
WithStatus
diff --git a/apis/common/zz_generated.deepcopy.go b/apis/common/zz_generated.deepcopy.go
index b55b115b354..26c86918c4c 100644
--- a/apis/common/zz_generated.deepcopy.go
+++ b/apis/common/zz_generated.deepcopy.go
@@ -24,6 +24,41 @@ import (
"k8s.io/apimachinery/pkg/apis/meta/v1"
)
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ComponentRelease) DeepCopyInto(out *ComponentRelease) {
+ *out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentRelease.
+func (in *ComponentRelease) DeepCopy() *ComponentRelease {
+ if in == nil {
+ return nil
+ }
+ out := new(ComponentRelease)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ComponentReleaseStatus) DeepCopyInto(out *ComponentReleaseStatus) {
+ *out = *in
+ if in.Releases != nil {
+ in, out := &in.Releases, &out.Releases
+ *out = make([]ComponentRelease, len(*in))
+ copy(*out, *in)
+ }
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentReleaseStatus.
+func (in *ComponentReleaseStatus) DeepCopy() *ComponentReleaseStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(ComponentReleaseStatus)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DevFlags) DeepCopyInto(out *DevFlags) {
*out = *in
diff --git a/apis/components/v1alpha1/codeflare_types.go b/apis/components/v1alpha1/codeflare_types.go
index 9152db29fd0..115458bf58e 100644
--- a/apis/components/v1alpha1/codeflare_types.go
+++ b/apis/components/v1alpha1/codeflare_types.go
@@ -30,6 +30,7 @@ const (
// CodeFlareCommonStatus defines the shared observed state of CodeFlare
type CodeFlareCommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// CodeFlareStatus defines the observed state of CodeFlare
@@ -70,6 +71,12 @@ func (c *CodeFlare) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *CodeFlare) GetReleaseStatus() *[]common.ComponentRelease { return &c.Status.Releases }
+
+func (c *CodeFlare) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
func init() {
SchemeBuilder.Register(&CodeFlare{}, &CodeFlareList{})
}
diff --git a/apis/components/v1alpha1/datasciencepipelines_types.go b/apis/components/v1alpha1/datasciencepipelines_types.go
index da10f02cc8c..573d589296e 100644
--- a/apis/components/v1alpha1/datasciencepipelines_types.go
+++ b/apis/components/v1alpha1/datasciencepipelines_types.go
@@ -55,6 +55,7 @@ type DataSciencePipelinesCommonSpec struct {
// DataSciencePipelinesCommonStatus defines the shared observed state of DataSciencePipelines
type DataSciencePipelinesCommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// DataSciencePipelinesStatus defines the observed state of DataSciencePipelines
@@ -71,6 +72,14 @@ func (c *DataSciencePipelines) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *DataSciencePipelines) GetReleaseStatus() *[]common.ComponentRelease {
+ return &c.Status.Releases
+}
+
+func (c *DataSciencePipelines) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// +kubebuilder:object:root=true
// DataSciencePipelinesList contains a list of DataSciencePipelines
diff --git a/apis/components/v1alpha1/kserve_types.go b/apis/components/v1alpha1/kserve_types.go
index b69d88aed83..e34e0d42494 100644
--- a/apis/components/v1alpha1/kserve_types.go
+++ b/apis/components/v1alpha1/kserve_types.go
@@ -76,7 +76,8 @@ type KserveSpec struct {
type KserveCommonStatus struct {
// DefaultDeploymentMode is the value of the defaultDeploymentMode field
// as read from the "deploy" JSON in the inferenceservice-config ConfigMap
- DefaultDeploymentMode string `json:"defaultDeploymentMode,omitempty"`
+ DefaultDeploymentMode string `json:"defaultDeploymentMode,omitempty"`
+ common.ComponentReleaseStatus `json:",inline"`
}
// KserveStatus defines the observed state of Kserve
@@ -109,6 +110,14 @@ func (c *Kserve) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *Kserve) GetReleaseStatus() *[]common.ComponentRelease {
+ return &c.Status.Releases
+}
+
+func (c *Kserve) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// +kubebuilder:object:root=true
// KserveList contains a list of Kserve
diff --git a/apis/components/v1alpha1/kueue_types.go b/apis/components/v1alpha1/kueue_types.go
index e0be9ff57ac..293847f8d4a 100644
--- a/apis/components/v1alpha1/kueue_types.go
+++ b/apis/components/v1alpha1/kueue_types.go
@@ -57,6 +57,7 @@ type KueueCommonSpec struct {
// KueueCommonStatus defines the shared observed state of Kueue
type KueueCommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// KueueStatus defines the observed state of Kueue
@@ -80,10 +81,17 @@ func init() {
func (c *Kueue) GetDevFlags() *common.DevFlags {
return c.Spec.DevFlags
}
+
func (c *Kueue) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *Kueue) GetReleaseStatus() *[]common.ComponentRelease { return &c.Status.Releases }
+
+func (c *Kueue) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// DSCKueue contains all the configuration exposed in DSC instance for Kueue component
type DSCKueue struct {
common.ManagementSpec `json:",inline"`
diff --git a/apis/components/v1alpha1/modelmeshserving_types.go b/apis/components/v1alpha1/modelmeshserving_types.go
index e28649a417c..3a4b36ce7c1 100644
--- a/apis/components/v1alpha1/modelmeshserving_types.go
+++ b/apis/components/v1alpha1/modelmeshserving_types.go
@@ -57,6 +57,7 @@ type ModelMeshServingCommonSpec struct {
// ModelMeshServingCommonStatus defines the shared observed state of ModelMeshServing
type ModelMeshServingCommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// ModelMeshServingStatus defines the observed state of ModelMeshServing
@@ -80,10 +81,19 @@ func init() {
func (c *ModelMeshServing) GetDevFlags() *common.DevFlags {
return c.Spec.DevFlags
}
+
func (c *ModelMeshServing) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *ModelMeshServing) GetReleaseStatus() *[]common.ComponentRelease {
+ return &c.Status.Releases
+}
+
+func (c *ModelMeshServing) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// DSCModelMeshServing contains all the configuration exposed in DSC instance for ModelMeshServing component
type DSCModelMeshServing struct {
common.ManagementSpec `json:",inline"`
diff --git a/apis/components/v1alpha1/modelregistry_types.go b/apis/components/v1alpha1/modelregistry_types.go
index 0d653b7d355..e7d6850ed44 100644
--- a/apis/components/v1alpha1/modelregistry_types.go
+++ b/apis/components/v1alpha1/modelregistry_types.go
@@ -50,7 +50,8 @@ type ModelRegistrySpec struct {
// ModelRegistryCommonStatus defines the shared observed state of ModelRegistry
type ModelRegistryCommonStatus struct {
- RegistriesNamespace string `json:"registriesNamespace,omitempty"`
+ RegistriesNamespace string `json:"registriesNamespace,omitempty"`
+ common.ComponentReleaseStatus `json:",inline"`
}
// ModelRegistryStatus defines the observed state of ModelRegistry
@@ -83,6 +84,14 @@ func (c *ModelRegistry) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *ModelRegistry) GetReleaseStatus() *[]common.ComponentRelease {
+ return &c.Status.Releases
+}
+
+func (c *ModelRegistry) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// +kubebuilder:object:root=true
// ModelRegistryList contains a list of ModelRegistry
diff --git a/apis/components/v1alpha1/ray_types.go b/apis/components/v1alpha1/ray_types.go
index a51c29e3cd4..5ade60220eb 100644
--- a/apis/components/v1alpha1/ray_types.go
+++ b/apis/components/v1alpha1/ray_types.go
@@ -57,6 +57,7 @@ type RayCommonSpec struct {
// RayCommonStatus defines the shared observed state of Ray
type RayCommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// RayStatus defines the observed state of Ray
@@ -80,10 +81,17 @@ func init() {
func (c *Ray) GetDevFlags() *common.DevFlags {
return c.Spec.DevFlags
}
+
func (c *Ray) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *Ray) GetReleaseStatus() *[]common.ComponentRelease { return &c.Status.Releases }
+
+func (c *Ray) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// DSCRay contains all the configuration exposed in DSC instance for Ray component
type DSCRay struct {
common.ManagementSpec `json:",inline"`
diff --git a/apis/components/v1alpha1/trainingoperator_types.go b/apis/components/v1alpha1/trainingoperator_types.go
index 2d76ca78e6e..fad8d455034 100644
--- a/apis/components/v1alpha1/trainingoperator_types.go
+++ b/apis/components/v1alpha1/trainingoperator_types.go
@@ -57,6 +57,7 @@ type TrainingOperatorCommonSpec struct {
// TrainingOperatorCommonStatus defines the shared observed state of TrainingOperator
type TrainingOperatorCommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// TrainingOperatorStatus defines the observed state of TrainingOperator
@@ -80,10 +81,19 @@ func init() {
func (c *TrainingOperator) GetDevFlags() *common.DevFlags {
return c.Spec.DevFlags
}
+
func (c *TrainingOperator) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *TrainingOperator) GetReleaseStatus() *[]common.ComponentRelease {
+ return &c.Status.Releases
+}
+
+func (c *TrainingOperator) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// DSCTrainingOperator contains all the configuration exposed in DSC instance for TrainingOperator component
type DSCTrainingOperator struct {
common.ManagementSpec `json:",inline"`
diff --git a/apis/components/v1alpha1/trustyai_types.go b/apis/components/v1alpha1/trustyai_types.go
index 9ac2652fcc1..20819c7606b 100644
--- a/apis/components/v1alpha1/trustyai_types.go
+++ b/apis/components/v1alpha1/trustyai_types.go
@@ -57,6 +57,7 @@ type TrustyAICommonSpec struct {
// TrustyAICommonStatus defines the shared observed state of TrustyAI
type TrustyAICommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// TrustyAIStatus defines the observed state of TrustyAI
@@ -80,10 +81,17 @@ func init() {
func (c *TrustyAI) GetDevFlags() *common.DevFlags {
return c.Spec.DevFlags
}
+
func (c *TrustyAI) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *TrustyAI) GetReleaseStatus() *[]common.ComponentRelease { return &c.Status.Releases }
+
+func (c *TrustyAI) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// DSCTrustyAI contains all the configuration exposed in DSC instance for TrustyAI component
type DSCTrustyAI struct {
common.ManagementSpec `json:",inline"`
diff --git a/apis/components/v1alpha1/workbenches_types.go b/apis/components/v1alpha1/workbenches_types.go
index 4ea01ce7bbc..f1a831ef6be 100644
--- a/apis/components/v1alpha1/workbenches_types.go
+++ b/apis/components/v1alpha1/workbenches_types.go
@@ -44,6 +44,7 @@ type WorkbenchesSpec struct {
// WorkbenchesCommonStatus defines the shared observed state of Workbenches
type WorkbenchesCommonStatus struct {
+ common.ComponentReleaseStatus `json:",inline"`
}
// WorkbenchesStatus defines the observed state of Workbenches
@@ -76,6 +77,12 @@ func (c *Workbenches) GetStatus() *common.Status {
return &c.Status.Status
}
+func (c *Workbenches) GetReleaseStatus() *[]common.ComponentRelease { return &c.Status.Releases }
+
+func (c *Workbenches) SetReleaseStatus(releases []common.ComponentRelease) {
+ c.Status.Releases = releases
+}
+
// +kubebuilder:object:root=true
// WorkbenchesList contains a list of Workbenches
diff --git a/apis/components/v1alpha1/zz_generated.deepcopy.go b/apis/components/v1alpha1/zz_generated.deepcopy.go
index 9de0b610abc..32a274a76f6 100644
--- a/apis/components/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/components/v1alpha1/zz_generated.deepcopy.go
@@ -70,6 +70,7 @@ func (in *CodeFlareCommonSpec) DeepCopy() *CodeFlareCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CodeFlareCommonStatus) DeepCopyInto(out *CodeFlareCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CodeFlareCommonStatus.
@@ -134,7 +135,7 @@ func (in *CodeFlareSpec) DeepCopy() *CodeFlareSpec {
func (in *CodeFlareStatus) DeepCopyInto(out *CodeFlareStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.CodeFlareCommonStatus = in.CodeFlareCommonStatus
+ in.CodeFlareCommonStatus.DeepCopyInto(&out.CodeFlareCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CodeFlareStatus.
@@ -171,7 +172,7 @@ func (in *DSCCodeFlareStatus) DeepCopyInto(out *DSCCodeFlareStatus) {
if in.CodeFlareCommonStatus != nil {
in, out := &in.CodeFlareCommonStatus, &out.CodeFlareCommonStatus
*out = new(CodeFlareCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -247,7 +248,7 @@ func (in *DSCDataSciencePipelinesStatus) DeepCopyInto(out *DSCDataSciencePipelin
if in.DataSciencePipelinesCommonStatus != nil {
in, out := &in.DataSciencePipelinesCommonStatus, &out.DataSciencePipelinesCommonStatus
*out = new(DataSciencePipelinesCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -285,7 +286,7 @@ func (in *DSCKserveStatus) DeepCopyInto(out *DSCKserveStatus) {
if in.KserveCommonStatus != nil {
in, out := &in.KserveCommonStatus, &out.KserveCommonStatus
*out = new(KserveCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -323,7 +324,7 @@ func (in *DSCKueueStatus) DeepCopyInto(out *DSCKueueStatus) {
if in.KueueCommonStatus != nil {
in, out := &in.KueueCommonStatus, &out.KueueCommonStatus
*out = new(KueueCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -361,7 +362,7 @@ func (in *DSCModelMeshServingStatus) DeepCopyInto(out *DSCModelMeshServingStatus
if in.ModelMeshServingCommonStatus != nil {
in, out := &in.ModelMeshServingCommonStatus, &out.ModelMeshServingCommonStatus
*out = new(ModelMeshServingCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -399,7 +400,7 @@ func (in *DSCModelRegistryStatus) DeepCopyInto(out *DSCModelRegistryStatus) {
if in.ModelRegistryCommonStatus != nil {
in, out := &in.ModelRegistryCommonStatus, &out.ModelRegistryCommonStatus
*out = new(ModelRegistryCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -437,7 +438,7 @@ func (in *DSCRayStatus) DeepCopyInto(out *DSCRayStatus) {
if in.RayCommonStatus != nil {
in, out := &in.RayCommonStatus, &out.RayCommonStatus
*out = new(RayCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -475,7 +476,7 @@ func (in *DSCTrainingOperatorStatus) DeepCopyInto(out *DSCTrainingOperatorStatus
if in.TrainingOperatorCommonStatus != nil {
in, out := &in.TrainingOperatorCommonStatus, &out.TrainingOperatorCommonStatus
*out = new(TrainingOperatorCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -513,7 +514,7 @@ func (in *DSCTrustyAIStatus) DeepCopyInto(out *DSCTrustyAIStatus) {
if in.TrustyAICommonStatus != nil {
in, out := &in.TrustyAICommonStatus, &out.TrustyAICommonStatus
*out = new(TrustyAICommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -551,7 +552,7 @@ func (in *DSCWorkbenchesStatus) DeepCopyInto(out *DSCWorkbenchesStatus) {
if in.WorkbenchesCommonStatus != nil {
in, out := &in.WorkbenchesCommonStatus, &out.WorkbenchesCommonStatus
*out = new(WorkbenchesCommonStatus)
- **out = **in
+ (*in).DeepCopyInto(*out)
}
}
@@ -734,6 +735,7 @@ func (in *DataSciencePipelinesCommonSpec) DeepCopy() *DataSciencePipelinesCommon
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *DataSciencePipelinesCommonStatus) DeepCopyInto(out *DataSciencePipelinesCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataSciencePipelinesCommonStatus.
@@ -798,7 +800,7 @@ func (in *DataSciencePipelinesSpec) DeepCopy() *DataSciencePipelinesSpec {
func (in *DataSciencePipelinesStatus) DeepCopyInto(out *DataSciencePipelinesStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.DataSciencePipelinesCommonStatus = in.DataSciencePipelinesCommonStatus
+ in.DataSciencePipelinesCommonStatus.DeepCopyInto(&out.DataSciencePipelinesCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DataSciencePipelinesStatus.
@@ -859,6 +861,7 @@ func (in *KserveCommonSpec) DeepCopy() *KserveCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *KserveCommonStatus) DeepCopyInto(out *KserveCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KserveCommonStatus.
@@ -923,7 +926,7 @@ func (in *KserveSpec) DeepCopy() *KserveSpec {
func (in *KserveStatus) DeepCopyInto(out *KserveStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.KserveCommonStatus = in.KserveCommonStatus
+ in.KserveCommonStatus.DeepCopyInto(&out.KserveCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KserveStatus.
@@ -982,6 +985,7 @@ func (in *KueueCommonSpec) DeepCopy() *KueueCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *KueueCommonStatus) DeepCopyInto(out *KueueCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KueueCommonStatus.
@@ -1046,7 +1050,7 @@ func (in *KueueSpec) DeepCopy() *KueueSpec {
func (in *KueueStatus) DeepCopyInto(out *KueueStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.KueueCommonStatus = in.KueueCommonStatus
+ in.KueueCommonStatus.DeepCopyInto(&out.KueueCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KueueStatus.
@@ -1238,6 +1242,7 @@ func (in *ModelMeshServingCommonSpec) DeepCopy() *ModelMeshServingCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ModelMeshServingCommonStatus) DeepCopyInto(out *ModelMeshServingCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelMeshServingCommonStatus.
@@ -1302,7 +1307,7 @@ func (in *ModelMeshServingSpec) DeepCopy() *ModelMeshServingSpec {
func (in *ModelMeshServingStatus) DeepCopyInto(out *ModelMeshServingStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.ModelMeshServingCommonStatus = in.ModelMeshServingCommonStatus
+ in.ModelMeshServingCommonStatus.DeepCopyInto(&out.ModelMeshServingCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelMeshServingStatus.
@@ -1361,6 +1366,7 @@ func (in *ModelRegistryCommonSpec) DeepCopy() *ModelRegistryCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *ModelRegistryCommonStatus) DeepCopyInto(out *ModelRegistryCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelRegistryCommonStatus.
@@ -1425,7 +1431,7 @@ func (in *ModelRegistrySpec) DeepCopy() *ModelRegistrySpec {
func (in *ModelRegistryStatus) DeepCopyInto(out *ModelRegistryStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.ModelRegistryCommonStatus = in.ModelRegistryCommonStatus
+ in.ModelRegistryCommonStatus.DeepCopyInto(&out.ModelRegistryCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelRegistryStatus.
@@ -1499,6 +1505,7 @@ func (in *RayCommonSpec) DeepCopy() *RayCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *RayCommonStatus) DeepCopyInto(out *RayCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RayCommonStatus.
@@ -1563,7 +1570,7 @@ func (in *RaySpec) DeepCopy() *RaySpec {
func (in *RayStatus) DeepCopyInto(out *RayStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.RayCommonStatus = in.RayCommonStatus
+ in.RayCommonStatus.DeepCopyInto(&out.RayCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RayStatus.
@@ -1622,6 +1629,7 @@ func (in *TrainingOperatorCommonSpec) DeepCopy() *TrainingOperatorCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TrainingOperatorCommonStatus) DeepCopyInto(out *TrainingOperatorCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrainingOperatorCommonStatus.
@@ -1686,7 +1694,7 @@ func (in *TrainingOperatorSpec) DeepCopy() *TrainingOperatorSpec {
func (in *TrainingOperatorStatus) DeepCopyInto(out *TrainingOperatorStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.TrainingOperatorCommonStatus = in.TrainingOperatorCommonStatus
+ in.TrainingOperatorCommonStatus.DeepCopyInto(&out.TrainingOperatorCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrainingOperatorStatus.
@@ -1745,6 +1753,7 @@ func (in *TrustyAICommonSpec) DeepCopy() *TrustyAICommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *TrustyAICommonStatus) DeepCopyInto(out *TrustyAICommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrustyAICommonStatus.
@@ -1809,7 +1818,7 @@ func (in *TrustyAISpec) DeepCopy() *TrustyAISpec {
func (in *TrustyAIStatus) DeepCopyInto(out *TrustyAIStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.TrustyAICommonStatus = in.TrustyAICommonStatus
+ in.TrustyAICommonStatus.DeepCopyInto(&out.TrustyAICommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TrustyAIStatus.
@@ -1868,6 +1877,7 @@ func (in *WorkbenchesCommonSpec) DeepCopy() *WorkbenchesCommonSpec {
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *WorkbenchesCommonStatus) DeepCopyInto(out *WorkbenchesCommonStatus) {
*out = *in
+ in.ComponentReleaseStatus.DeepCopyInto(&out.ComponentReleaseStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkbenchesCommonStatus.
@@ -1932,7 +1942,7 @@ func (in *WorkbenchesSpec) DeepCopy() *WorkbenchesSpec {
func (in *WorkbenchesStatus) DeepCopyInto(out *WorkbenchesStatus) {
*out = *in
in.Status.DeepCopyInto(&out.Status)
- out.WorkbenchesCommonStatus = in.WorkbenchesCommonStatus
+ in.WorkbenchesCommonStatus.DeepCopyInto(&out.WorkbenchesCommonStatus)
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkbenchesStatus.
diff --git a/bundle/manifests/components.platform.opendatahub.io_codeflares.yaml b/bundle/manifests/components.platform.opendatahub.io_codeflares.yaml
index caec1b33965..7995ead3d6b 100644
--- a/bundle/manifests/components.platform.opendatahub.io_codeflares.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_codeflares.yaml
@@ -141,6 +141,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_datasciencepipelines.yaml b/bundle/manifests/components.platform.opendatahub.io_datasciencepipelines.yaml
index 458b38f5e52..06183b22cd1 100644
--- a/bundle/manifests/components.platform.opendatahub.io_datasciencepipelines.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_datasciencepipelines.yaml
@@ -144,6 +144,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_kserves.yaml b/bundle/manifests/components.platform.opendatahub.io_kserves.yaml
index 92ac4530345..64318eeb43b 100644
--- a/bundle/manifests/components.platform.opendatahub.io_kserves.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_kserves.yaml
@@ -226,6 +226,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_kueues.yaml b/bundle/manifests/components.platform.opendatahub.io_kueues.yaml
index 87ada19027e..da3eb090038 100644
--- a/bundle/manifests/components.platform.opendatahub.io_kueues.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_kueues.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_modelmeshservings.yaml b/bundle/manifests/components.platform.opendatahub.io_modelmeshservings.yaml
index a9be9f4a080..70f710d90d0 100644
--- a/bundle/manifests/components.platform.opendatahub.io_modelmeshservings.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_modelmeshservings.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_modelregistries.yaml b/bundle/manifests/components.platform.opendatahub.io_modelregistries.yaml
index d23f767edc4..47623b5ff19 100644
--- a/bundle/manifests/components.platform.opendatahub.io_modelregistries.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_modelregistries.yaml
@@ -151,6 +151,24 @@ spec:
type: string
registriesNamespace:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_rays.yaml b/bundle/manifests/components.platform.opendatahub.io_rays.yaml
index e1073bed74b..8d750669660 100644
--- a/bundle/manifests/components.platform.opendatahub.io_rays.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_rays.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_trainingoperators.yaml b/bundle/manifests/components.platform.opendatahub.io_trainingoperators.yaml
index 7dc395ac2b1..0a688a7f32b 100644
--- a/bundle/manifests/components.platform.opendatahub.io_trainingoperators.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_trainingoperators.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_trustyais.yaml b/bundle/manifests/components.platform.opendatahub.io_trustyais.yaml
index 522954961fe..b2f0a9be3d2 100644
--- a/bundle/manifests/components.platform.opendatahub.io_trustyais.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_trustyais.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/components.platform.opendatahub.io_workbenches.yaml b/bundle/manifests/components.platform.opendatahub.io_workbenches.yaml
index d75be60e4af..dbc84e062e7 100644
--- a/bundle/manifests/components.platform.opendatahub.io_workbenches.yaml
+++ b/bundle/manifests/components.platform.opendatahub.io_workbenches.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/bundle/manifests/datasciencecluster.opendatahub.io_datascienceclusters.yaml b/bundle/manifests/datasciencecluster.opendatahub.io_datascienceclusters.yaml
index 7ec8e179cd6..912fe825755 100644
--- a/bundle/manifests/datasciencecluster.opendatahub.io_datascienceclusters.yaml
+++ b/bundle/manifests/datasciencecluster.opendatahub.io_datascienceclusters.yaml
@@ -676,6 +676,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
dashboard:
description: Dashboard component status.
@@ -714,6 +732,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
kserve:
description: Kserve component status.
@@ -737,6 +773,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
kueue:
description: Kueue component status.
@@ -755,6 +809,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
modelmeshserving:
description: ModelMeshServing component status.
@@ -773,6 +845,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
modelregistry:
description: ModelRegistry component status.
@@ -793,6 +883,24 @@ spec:
type: string
registriesNamespace:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
ray:
description: Ray component status.
@@ -811,6 +919,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
trainingoperator:
description: Training Operator component status.
@@ -829,6 +955,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
trustyai:
description: TrustyAI component status.
@@ -847,6 +991,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
workbenches:
description: Workbenches component status.
@@ -865,6 +1027,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
conditions:
diff --git a/bundle/manifests/opendatahub-operator.clusterserviceversion.yaml b/bundle/manifests/opendatahub-operator.clusterserviceversion.yaml
index 5f3c140ba66..a7928ab96f4 100644
--- a/bundle/manifests/opendatahub-operator.clusterserviceversion.yaml
+++ b/bundle/manifests/opendatahub-operator.clusterserviceversion.yaml
@@ -1302,7 +1302,7 @@ spec:
value: /opt/manifests
- name: ODH_PLATFORM_TYPE
value: OpenDataHub
- image: REPLACE_IMAGE:latest
+ image: quay.io/ugiordan/opendatahub-operator:v2.18.0-versions-mapping
imagePullPolicy: Always
livenessProbe:
httpGet:
diff --git a/config/crd/bases/components.platform.opendatahub.io_codeflares.yaml b/config/crd/bases/components.platform.opendatahub.io_codeflares.yaml
index 999e5ccfdd4..0f2db738a8a 100644
--- a/config/crd/bases/components.platform.opendatahub.io_codeflares.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_codeflares.yaml
@@ -141,6 +141,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_datasciencepipelines.yaml b/config/crd/bases/components.platform.opendatahub.io_datasciencepipelines.yaml
index 495d178bb28..6d1cdfdd595 100644
--- a/config/crd/bases/components.platform.opendatahub.io_datasciencepipelines.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_datasciencepipelines.yaml
@@ -144,6 +144,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_kserves.yaml b/config/crd/bases/components.platform.opendatahub.io_kserves.yaml
index c64e35fe0ee..0fc7868d935 100644
--- a/config/crd/bases/components.platform.opendatahub.io_kserves.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_kserves.yaml
@@ -226,6 +226,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_kueues.yaml b/config/crd/bases/components.platform.opendatahub.io_kueues.yaml
index 1232c4dcadb..f08bb145c78 100644
--- a/config/crd/bases/components.platform.opendatahub.io_kueues.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_kueues.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_modelmeshservings.yaml b/config/crd/bases/components.platform.opendatahub.io_modelmeshservings.yaml
index 8a8b82f876f..4f32879a4eb 100644
--- a/config/crd/bases/components.platform.opendatahub.io_modelmeshservings.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_modelmeshservings.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_modelregistries.yaml b/config/crd/bases/components.platform.opendatahub.io_modelregistries.yaml
index 8f538fe5810..6af9651e65d 100644
--- a/config/crd/bases/components.platform.opendatahub.io_modelregistries.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_modelregistries.yaml
@@ -151,6 +151,24 @@ spec:
type: string
registriesNamespace:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_rays.yaml b/config/crd/bases/components.platform.opendatahub.io_rays.yaml
index 92f3b3c62c3..87800e47be3 100644
--- a/config/crd/bases/components.platform.opendatahub.io_rays.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_rays.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_trainingoperators.yaml b/config/crd/bases/components.platform.opendatahub.io_trainingoperators.yaml
index 82b7262849b..0f20c208900 100644
--- a/config/crd/bases/components.platform.opendatahub.io_trainingoperators.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_trainingoperators.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_trustyais.yaml b/config/crd/bases/components.platform.opendatahub.io_trustyais.yaml
index 10f42dfb24e..e82b0fd5f11 100644
--- a/config/crd/bases/components.platform.opendatahub.io_trustyais.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_trustyais.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/components.platform.opendatahub.io_workbenches.yaml b/config/crd/bases/components.platform.opendatahub.io_workbenches.yaml
index e928970082d..077400bcf35 100644
--- a/config/crd/bases/components.platform.opendatahub.io_workbenches.yaml
+++ b/config/crd/bases/components.platform.opendatahub.io_workbenches.yaml
@@ -142,6 +142,24 @@ spec:
type: integer
phase:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status of
+ a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
x-kubernetes-validations:
diff --git a/config/crd/bases/datasciencecluster.opendatahub.io_datascienceclusters.yaml b/config/crd/bases/datasciencecluster.opendatahub.io_datascienceclusters.yaml
index 6a1c89dea45..4e500a73b0c 100644
--- a/config/crd/bases/datasciencecluster.opendatahub.io_datascienceclusters.yaml
+++ b/config/crd/bases/datasciencecluster.opendatahub.io_datascienceclusters.yaml
@@ -676,6 +676,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
dashboard:
description: Dashboard component status.
@@ -714,6 +732,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
kserve:
description: Kserve component status.
@@ -737,6 +773,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
kueue:
description: Kueue component status.
@@ -755,6 +809,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
modelmeshserving:
description: ModelMeshServing component status.
@@ -773,6 +845,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
modelregistry:
description: ModelRegistry component status.
@@ -793,6 +883,24 @@ spec:
type: string
registriesNamespace:
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
ray:
description: Ray component status.
@@ -811,6 +919,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
trainingoperator:
description: Training Operator component status.
@@ -829,6 +955,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
trustyai:
description: TrustyAI component status.
@@ -847,6 +991,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
workbenches:
description: Workbenches component status.
@@ -865,6 +1027,24 @@ spec:
- Removed
pattern: ^(Managed|Unmanaged|Force|Removed)$
type: string
+ releases:
+ items:
+ description: ComponentRelease represents the detailed status
+ of a component release.
+ properties:
+ name:
+ type: string
+ repoUrl:
+ type: string
+ version:
+ type: string
+ required:
+ - name
+ type: object
+ type: array
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
type: object
type: object
conditions:
diff --git a/controllers/components/codeflare/codeflare_controller.go b/controllers/components/codeflare/codeflare_controller.go
index f46f5effac6..6969db01d3a 100644
--- a/controllers/components/codeflare/codeflare_controller.go
+++ b/controllers/components/codeflare/codeflare_controller.go
@@ -30,6 +30,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
@@ -67,6 +68,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
// Add CodeFlare-specific actions
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
kustomize.WithLabel(labels.ODH.Component(LegacyComponentName), labels.True),
diff --git a/controllers/components/datasciencepipelines/datasciencepipelines_controller.go b/controllers/components/datasciencepipelines/datasciencepipelines_controller.go
index 12db851377b..e3a426ba3ad 100644
--- a/controllers/components/datasciencepipelines/datasciencepipelines_controller.go
+++ b/controllers/components/datasciencepipelines/datasciencepipelines_controller.go
@@ -31,6 +31,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
@@ -64,6 +65,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
WithAction(checkPreConditions).
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
kustomize.WithLabel(labels.ODH.Component(LegacyComponentName), labels.True),
diff --git a/controllers/components/kserve/kserve_controller.go b/controllers/components/kserve/kserve_controller.go
index 7f4df4bdad7..4202b4599cb 100644
--- a/controllers/components/kserve/kserve_controller.go
+++ b/controllers/components/kserve/kserve_controller.go
@@ -38,6 +38,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates"
@@ -151,6 +152,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
WithAction(checkPreConditions).
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(removeLegacyFeatureTrackerOwnerRef).
WithAction(configureServerless).
WithAction(configureServiceMesh).
diff --git a/controllers/components/kueue/kueue_controller.go b/controllers/components/kueue/kueue_controller.go
index d9ec73c56de..5566fef2e72 100644
--- a/controllers/components/kueue/kueue_controller.go
+++ b/controllers/components/kueue/kueue_controller.go
@@ -35,6 +35,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
@@ -76,6 +77,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
// Add Kueue-specific actions
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
kustomize.WithLabel(labels.ODH.Component(LegacyComponentName), labels.True),
diff --git a/controllers/components/modelmeshserving/modelmeshserving_controller.go b/controllers/components/modelmeshserving/modelmeshserving_controller.go
index 04fd1686cde..516f7466319 100644
--- a/controllers/components/modelmeshserving/modelmeshserving_controller.go
+++ b/controllers/components/modelmeshserving/modelmeshserving_controller.go
@@ -34,6 +34,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/clusterrole"
@@ -85,6 +86,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
// Add ModelMeshServing specific actions
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
kustomize.WithLabel(labels.ODH.Component(LegacyComponentName), labels.True),
diff --git a/controllers/components/modelregistry/modelregistry_controller.go b/controllers/components/modelregistry/modelregistry_controller.go
index 800ef932028..9ae46c52ee8 100644
--- a/controllers/components/modelregistry/modelregistry_controller.go
+++ b/controllers/components/modelregistry/modelregistry_controller.go
@@ -34,6 +34,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/template"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
@@ -82,6 +83,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
// actions
WithAction(checkPreConditions).
WithAction(initialize).
+ WithAction(releases.NewAction()).
WithAction(configureDependencies).
WithAction(template.NewAction(
template.WithCache(),
diff --git a/controllers/components/ray/ray_controller.go b/controllers/components/ray/ray_controller.go
index adc4ad65271..48eca16ad83 100644
--- a/controllers/components/ray/ray_controller.go
+++ b/controllers/components/ray/ray_controller.go
@@ -30,6 +30,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
@@ -60,6 +61,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
// Add Ray-specific actions
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
kustomize.WithLabel(labels.ODH.Component(LegacyComponentName), labels.True),
diff --git a/controllers/components/trainingoperator/trainingoperator_controller.go b/controllers/components/trainingoperator/trainingoperator_controller.go
index 096ef8a5198..6e5ceecfd10 100644
--- a/controllers/components/trainingoperator/trainingoperator_controller.go
+++ b/controllers/components/trainingoperator/trainingoperator_controller.go
@@ -30,6 +30,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
@@ -57,6 +58,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
// Add TrainingOperator-specific actions
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
kustomize.WithLabel(labels.ODH.Component(LegacyComponentName), labels.True),
diff --git a/controllers/components/trustyai/trustyai_controller.go b/controllers/components/trustyai/trustyai_controller.go
index e77bdd151de..32147fc9993 100644
--- a/controllers/components/trustyai/trustyai_controller.go
+++ b/controllers/components/trustyai/trustyai_controller.go
@@ -29,6 +29,7 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
@@ -58,6 +59,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
// Add TrustyAI-specific actions
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction()).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
kustomize.WithLabel(labels.ODH.Component(LegacyComponentName), labels.True),
diff --git a/controllers/components/workbenches/workbenches_controller.go b/controllers/components/workbenches/workbenches_controller.go
index 0a790c2ab81..f63238893bc 100644
--- a/controllers/components/workbenches/workbenches_controller.go
+++ b/controllers/components/workbenches/workbenches_controller.go
@@ -18,6 +18,7 @@ package workbenches
import (
"context"
+ "path"
admissionregistrationv1 "k8s.io/api/admissionregistration/v1"
appsv1 "k8s.io/api/apps/v1"
@@ -30,11 +31,13 @@ import (
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/gc"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/render/kustomize"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/updatestatus"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/handlers"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/component"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/predicates/resources"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/reconciler"
+ odhdeploy "github.com/opendatahub-io/opendatahub-operator/v2/pkg/deploy"
"github.com/opendatahub-io/opendatahub-operator/v2/pkg/metadata/labels"
)
@@ -60,6 +63,9 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl.
).
WithAction(initialize).
WithAction(devFlags).
+ WithAction(releases.NewAction(
+ releases.WithMetadataFilePath(
+ path.Join(odhdeploy.DefaultManifestPath, ComponentName, kfNotebookControllerPath, releases.ComponentMetadataFilename)))).
WithAction(configureDependencies).
WithAction(kustomize.NewAction(
kustomize.WithCache(),
diff --git a/docs/api-overview.md b/docs/api-overview.md
index b791e5b9788..ec668448a76 100644
--- a/docs/api-overview.md
+++ b/docs/api-overview.md
@@ -90,6 +90,9 @@ _Appears in:_
- [CodeFlareStatus](#codeflarestatus)
- [DSCCodeFlareStatus](#dsccodeflarestatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### CodeFlareList
@@ -144,6 +147,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### DSCCodeFlare
@@ -675,6 +679,9 @@ _Appears in:_
- [DSCDataSciencePipelinesStatus](#dscdatasciencepipelinesstatus)
- [DataSciencePipelinesStatus](#datasciencepipelinesstatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### DataSciencePipelinesList
@@ -729,6 +736,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### DefaultDeploymentMode
@@ -808,6 +816,7 @@ _Appears in:_
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `defaultDeploymentMode` _string_ | DefaultDeploymentMode is the value of the defaultDeploymentMode field
as read from the "deploy" JSON in the inferenceservice-config ConfigMap | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### KserveList
@@ -866,6 +875,7 @@ _Appears in:_
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
| `defaultDeploymentMode` _string_ | DefaultDeploymentMode is the value of the defaultDeploymentMode field
as read from the "deploy" JSON in the inferenceservice-config ConfigMap | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### Kueue
@@ -919,6 +929,9 @@ _Appears in:_
- [DSCKueueStatus](#dsckueuestatus)
- [KueueStatus](#kueuestatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### KueueList
@@ -973,6 +986,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### ModelController
@@ -1138,6 +1152,9 @@ _Appears in:_
- [DSCModelMeshServingStatus](#dscmodelmeshservingstatus)
- [ModelMeshServingStatus](#modelmeshservingstatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### ModelMeshServingList
@@ -1192,6 +1209,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### ModelRegistry
@@ -1249,6 +1267,7 @@ _Appears in:_
| Field | Description | Default | Validation |
| --- | --- | --- | --- |
| `registriesNamespace` _string_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### ModelRegistryList
@@ -1305,6 +1324,7 @@ _Appears in:_
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
| `registriesNamespace` _string_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### NimSpec
@@ -1377,6 +1397,9 @@ _Appears in:_
- [DSCRayStatus](#dscraystatus)
- [RayStatus](#raystatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### RayList
@@ -1431,6 +1454,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### TrainingOperator
@@ -1484,6 +1508,9 @@ _Appears in:_
- [DSCTrainingOperatorStatus](#dsctrainingoperatorstatus)
- [TrainingOperatorStatus](#trainingoperatorstatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### TrainingOperatorList
@@ -1538,6 +1565,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### TrustyAI
@@ -1591,6 +1619,9 @@ _Appears in:_
- [DSCTrustyAIStatus](#dsctrustyaistatus)
- [TrustyAIStatus](#trustyaistatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### TrustyAIList
@@ -1645,6 +1676,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### Workbenches
@@ -1698,6 +1730,9 @@ _Appears in:_
- [DSCWorkbenchesStatus](#dscworkbenchesstatus)
- [WorkbenchesStatus](#workbenchesstatus)
+| Field | Description | Default | Validation |
+| --- | --- | --- | --- |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
#### WorkbenchesList
@@ -1752,6 +1787,7 @@ _Appears in:_
| `phase` _string_ | | | |
| `observedGeneration` _integer_ | | | |
| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | |
+| `releases` _[ComponentRelease](#componentrelease) array_ | | | |
diff --git a/pkg/controller/actions/status/releases/action_fetch_releases_status.go b/pkg/controller/actions/status/releases/action_fetch_releases_status.go
new file mode 100644
index 00000000000..d4a7f84ab58
--- /dev/null
+++ b/pkg/controller/actions/status/releases/action_fetch_releases_status.go
@@ -0,0 +1,151 @@
+package releases
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ logf "sigs.k8s.io/controller-runtime/pkg/log"
+
+ "github.com/opendatahub-io/opendatahub-operator/v2/apis/common"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/types"
+ odhdeploy "github.com/opendatahub-io/opendatahub-operator/v2/pkg/deploy"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/resources"
+)
+
+const (
+ ComponentMetadataFilename = "component_metadata.yaml"
+)
+
+type Action struct {
+ metadataFilePath string
+ componentReleaseStatus []common.ComponentRelease
+}
+
+// WithMetadataFilePath is an ActionOpts function that sets a custom metadata file path.
+func WithMetadataFilePath(filePath string) ActionOpts {
+ return func(a *Action) {
+ a.metadataFilePath = filePath
+ }
+}
+
+// WithComponentReleaseStatus allows setting a custom ComponentRelease for the action.
+// This is mostly for testing purposes to simulate cached or pre-existing release statuses.
+// In production scenarios, the action should fetch the current release status from the source rather than being manually set.
+func WithComponentReleaseStatus(status []common.ComponentRelease) ActionOpts {
+ return func(a *Action) {
+ a.componentReleaseStatus = status
+ }
+}
+
+type ActionOpts func(*Action)
+
+// run is responsible for executing the logic of reconciling and processing component releases.
+//
+// This function performs the following:
+// 1. Verifies that the resource instance implements the `WithReleases` interface.
+// 2. If the release status is not already cached, it calls the `render` method to fetch the releases from the metadata file.
+// 3. Updates the release status on the resource instance with the processed release information.
+//
+// Parameters:
+// - ctx: The context for managing deadlines and cancellations during the reconciliation process.
+// - rr: The `ReconciliationRequest` containing the resource instance that needs to be reconciled.
+//
+// Returns:
+// - An error if the reconciliation fails at any step. This could occur if the resource doesn't implement the required interface
+// or if the metadata file cannot be read or processed.
+func (a *Action) run(ctx context.Context, rr *types.ReconciliationRequest) error {
+ // Ensure the resource implements the WithReleases interface
+ obj, ok := rr.Instance.(common.WithReleases)
+ if !ok {
+ return fmt.Errorf("resource instance %v is not a WithReleases", rr.Instance)
+ }
+
+ // If the release status is empty, or if the DevFlags.Manifests is set, render the release information.
+ // This ensures that releases are either reprocessed or fetched from the manifests specified in DevFlags.
+ if len(a.componentReleaseStatus) == 0 || resources.InstanceHasDevFlags(rr.Instance) {
+ releases, err := a.render(ctx, rr)
+ if err != nil {
+ return err
+ }
+ a.componentReleaseStatus = releases
+ }
+
+ // Update the release status in the resource
+ obj.SetReleaseStatus(a.componentReleaseStatus)
+
+ return nil
+}
+
+// render reads and processes the component releases from the metadata file.
+//
+// This function performs the following:
+// 1. Reads the component metadata YAML file (either from a custom or default path).
+// 2. Parses the YAML file and extracts the release metadata (name, version, repo URL).
+// 3. Returns a slice of `ComponentRelease` containing the processed release information.
+//
+// Parameters:
+// - rr: The `ReconciliationRequest` containing the resource instance. This is used to determine the metadata file path.
+//
+// Returns:
+// - A slice of `common.ComponentRelease`, representing the parsed release information from the metadata file.
+// - An error if there is an issue with reading the file, unmarshalling the YAML, or processing the release data.
+func (a *Action) render(ctx context.Context, rr *types.ReconciliationRequest) ([]common.ComponentRelease, error) {
+ log := logf.FromContext(ctx)
+
+ // Determine the metadata file path
+ var metadataPath string
+ if a.metadataFilePath != "" {
+ metadataPath = a.metadataFilePath
+ } else {
+ // Build the path to the component metadata file
+ controllerName := strings.ToLower(rr.Instance.GetObjectKind().GroupVersionKind().Kind)
+ metadataPath = filepath.Join(odhdeploy.DefaultManifestPath, controllerName, ComponentMetadataFilename)
+ }
+
+ // Read the YAML file
+ yamlData, err := os.ReadFile(metadataPath)
+ if err != nil {
+ if os.IsNotExist(err) {
+ // Log a message indicating the file doesn't exist but do not return an error
+ // Log this as a warning, as it's not necessarily a failure if the file is absent
+ log.V(3).Info("Metadata file not found, proceeding with empty releases", "metadataFilePath", metadataPath)
+ // Return an empty slice of releases instead of an error
+ return nil, nil
+ }
+ return nil, fmt.Errorf("error reading metadata file: %w", err)
+ }
+
+ // Unmarshal YAML into defined struct
+ var componentMeta common.ComponentReleaseStatus
+ if err := json.Unmarshal(yamlData, &componentMeta); err != nil {
+ return nil, fmt.Errorf("error unmarshaling YAML: %w", err)
+ }
+
+ // Parse and populate releases
+ componentReleasesStatus := make([]common.ComponentRelease, 0, len(componentMeta.Releases))
+ for _, release := range componentMeta.Releases {
+ componentVersion := strings.TrimSpace(release.Version)
+ componentReleasesStatus = append(componentReleasesStatus, common.ComponentRelease{
+ Name: release.Name,
+ Version: componentVersion,
+ RepoURL: release.RepoURL,
+ })
+ }
+
+ return componentReleasesStatus, nil
+}
+
+func NewAction(opts ...ActionOpts) actions.Fn {
+ action := Action{}
+
+ for _, opt := range opts {
+ opt(&action)
+ }
+
+ return action.run
+}
diff --git a/pkg/controller/actions/status/releases/action_fetch_releases_status_test.go b/pkg/controller/actions/status/releases/action_fetch_releases_status_test.go
new file mode 100644
index 00000000000..b274ea06f8a
--- /dev/null
+++ b/pkg/controller/actions/status/releases/action_fetch_releases_status_test.go
@@ -0,0 +1,210 @@
+package releases_test
+
+import (
+ "context"
+ "os"
+ "path/filepath"
+ "testing"
+
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+ "github.com/opendatahub-io/opendatahub-operator/v2/apis/common"
+ componentApi "github.com/opendatahub-io/opendatahub-operator/v2/apis/components/v1alpha1"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/actions/status/releases"
+ "github.com/opendatahub-io/opendatahub-operator/v2/pkg/controller/types"
+
+ . "github.com/onsi/ginkgo/v2"
+ . "github.com/onsi/gomega"
+)
+
+func TestFetchReleasesStatusAction(t *testing.T) {
+ t.Helper()
+
+ g := NewWithT(t)
+ ctx := context.Background()
+
+ // Root directory for temporary test files
+ tempDir := filepath.Join(os.TempDir(), "releases_test")
+
+ // Clean up created files after each test
+ AfterEach(func() {
+ // Remove the temporary test files
+ err := os.RemoveAll(tempDir)
+ Expect(err).NotTo(HaveOccurred())
+ })
+
+ // Define a test cases
+ tests := []struct {
+ name string
+ metadataFilePath string
+ metadataContent string
+ expectedReleases int
+ expectedError bool
+ devFlagsEnabled bool
+ providedStatus []common.ComponentRelease // Provided ReleaseStatus for testing cache behavior
+ }{
+ {
+ name: "should successfully render releases from valid YAML",
+ metadataFilePath: filepath.Join(tempDir, "valid_file.yaml"),
+ metadataContent: `
+releases:
+ - name: Kubeflow Pipelines
+ version: 2.2.0
+ repoUrl: https://github.com/kubeflow/kfp-tekton
+ - name: Another Component
+ version: 1.3.1
+ repoUrl: https://example.com/repo
+`,
+ expectedReleases: 2,
+ expectedError: false,
+ },
+ {
+ name: "should handle empty metadata file and return empty releases",
+ metadataFilePath: filepath.Join(tempDir, "empty_file.yaml"),
+ metadataContent: "",
+ expectedReleases: 0,
+ expectedError: false,
+ },
+ {
+ name: "should fail if YAML is invalid and return empty releases",
+ metadataFilePath: filepath.Join(tempDir, "invalid_file.yaml"),
+ metadataContent: `
+releases:
+ - name: Kubeflow Pipelines
+ versionNumber: 2.2.0
+ repoUrl: https://github.com/kubeflow/kfp-tekton
+`,
+ expectedReleases: 0,
+ expectedError: true,
+ },
+ {
+ name: "should handle empty metadata file path gracefully",
+ metadataFilePath: "",
+ metadataContent: "",
+ expectedReleases: 0,
+ expectedError: false,
+ },
+ {
+ name: "should not re-render releases if cached",
+ metadataFilePath: filepath.Join(tempDir, "cached_file.yaml"),
+ metadataContent: `
+releases:
+ - name: Kubeflow Pipelines
+ version: 2.2.0
+ repoUrl: https://github.com/kubeflow/kfp-tekton
+`,
+ expectedReleases: 1,
+ expectedError: false,
+ providedStatus: []common.ComponentRelease{
+ { // Simulating cached status
+ Name: "Kubeflow Pipelines",
+ Version: "0.0.0",
+ RepoURL: "https://github.com/kubeflow/kfp-tekton",
+ },
+ },
+ },
+ {
+ name: "should re-render releases if DevFlags are enabled",
+ metadataFilePath: filepath.Join(tempDir, "dev_flags_enabled_file.yaml"),
+ metadataContent: `
+releases:
+ - name: Kubeflow Pipelines
+ version: 2.2.0
+ repoUrl: https://github.com/kubeflow/kfp-tekton
+`,
+ expectedReleases: 1,
+ expectedError: false,
+ devFlagsEnabled: true,
+ providedStatus: []common.ComponentRelease{
+ { // Simulating cached status
+ Name: "Kubeflow Pipelines",
+ Version: "0.0.0",
+ RepoURL: "https://github.com/kubeflow/kfp-tekton",
+ },
+ },
+ },
+ }
+
+ // Iterate through all test cases
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ // Create the mock metadata file if needed
+ if tt.metadataContent != "" && tt.metadataFilePath != "" {
+ // Ensure the directory exists
+ err := os.MkdirAll(filepath.Dir(tt.metadataFilePath), 0755)
+ if err != nil {
+ t.Fatalf("failed to create directories: %v", err)
+ }
+
+ // Write the test metadata content to the mock file
+ err = os.WriteFile(tt.metadataFilePath, []byte(tt.metadataContent), 0600)
+ if err != nil {
+ t.Fatalf("failed to write file: %v", err)
+ }
+ }
+
+ // Mocking DevFlags if enabled (if DevFlagsEnabled is true, simulate dev flags)
+ devFlagsSpec := common.DevFlagsSpec{}
+ if tt.devFlagsEnabled {
+ devFlagsSpec.DevFlags = &common.DevFlags{
+ Manifests: []common.ManifestsConfig{{URI: "github.com/kubeflow/kfp-tekton"}},
+ }
+ }
+
+ // Create the ReconciliationRequest and set a dummy resource instance
+ rr := types.ReconciliationRequest{
+ Instance: &componentApi.DataSciencePipelines{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "mock-instance",
+ },
+
+ // Mocking DevFlags if enabled (if DevFlagsEnabled is true, simulate dev flags)
+ Spec: componentApi.DataSciencePipelinesSpec{
+ DataSciencePipelinesCommonSpec: componentApi.DataSciencePipelinesCommonSpec{
+ DevFlagsSpec: devFlagsSpec,
+ },
+ },
+ },
+ }
+
+ // Check the number of componentReleases set on the instance
+ withReleasesInstance, ok := rr.Instance.(common.WithReleases)
+ if !ok {
+ t.Fatalf("Instance does not implement WithReleases")
+ }
+
+ // Set up the action with the custom metadata file path and provided status
+ action := releases.NewAction(
+ releases.WithMetadataFilePath(tt.metadataFilePath),
+ releases.WithComponentReleaseStatus(tt.providedStatus), // Use WithComponentReleaseStatus to set the provided status
+ )
+
+ // Run the render action
+ err := action(ctx, &rr)
+
+ // Validate results
+ if tt.expectedError {
+ g.Expect(err).To(HaveOccurred())
+ } else {
+ g.Expect(err).NotTo(HaveOccurred())
+ }
+
+ // Get release status after action
+ finalReleases := withReleasesInstance.GetReleaseStatus()
+
+ // Verify that the status is updated based on the caching and DevFlags
+ if tt.providedStatus != nil {
+ if tt.devFlagsEnabled {
+ // DevFlags are enabled, expect re-render (new version)
+ g.Expect(*finalReleases).NotTo(Equal(tt.providedStatus))
+ } else {
+ // Cache is available, no DevFlags, expect no re-render (cached version)
+ g.Expect(*finalReleases).To(Equal(tt.providedStatus))
+ }
+ }
+
+ // Validate the expected release count after action
+ g.Expect(*finalReleases).To(HaveLen(tt.expectedReleases))
+ })
+ }
+}
diff --git a/pkg/resources/resources.go b/pkg/resources/resources.go
index 72ddd91622d..05b3d1354a3 100644
--- a/pkg/resources/resources.go
+++ b/pkg/resources/resources.go
@@ -323,6 +323,16 @@ func HasDevFlags(in common.WithDevFlags) bool {
return df != nil && len(df.Manifests) != 0
}
+// InstanceHasDevFlags checks if the given PlatformObject implements the WithDevFlags interface
+// and if it has any DevFlags set. If the object does not implement WithDevFlags, it returns false.
+// This function helps ensure that only objects with the WithDevFlags interface are processed for DevFlags.
+func InstanceHasDevFlags(in common.PlatformObject) bool {
+ if obj, ok := in.(common.WithDevFlags); ok {
+ return HasDevFlags(obj)
+ }
+ return false
+}
+
func NamespacedNameFromObject(obj client.Object) types.NamespacedName {
return types.NamespacedName{
Namespace: obj.GetNamespace(),
diff --git a/tests/e2e/codeflare_test.go b/tests/e2e/codeflare_test.go
index 26781260463..ce3f8e47eeb 100644
--- a/tests/e2e/codeflare_test.go
+++ b/tests/e2e/codeflare_test.go
@@ -22,6 +22,7 @@ func codeflareTestSuite(t *testing.T) {
t.Run("Validate operands have OwnerReferences", componentCtx.ValidateOperandsOwnerReferences)
t.Run("Validate update operand resources", componentCtx.ValidateUpdateDeploymentsResources)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type CodeFlareTestCtx struct {
diff --git a/tests/e2e/components_test.go b/tests/e2e/components_test.go
index c7f37290d1a..4077b55c810 100644
--- a/tests/e2e/components_test.go
+++ b/tests/e2e/components_test.go
@@ -260,6 +260,46 @@ func (c *ComponentTestCtx) ValidateCRDReinstated(t *testing.T, name string) {
)
}
+// Validate releases for any component in the DataScienceCluster.
+func (c *ComponentTestCtx) ValidateComponentReleases(t *testing.T) {
+ t.Helper()
+
+ g := c.NewWithT(t)
+
+ componentName := strings.ToLower(c.GVK.Kind)
+
+ // Transform the DataScienceCluster to set the management state of the component
+ g.Update(
+ gvk.DataScienceCluster,
+ c.DSCName,
+ testf.Transform(
+ `.spec.components.%s.managementState = "%s"`, componentName, operatorv1.Managed,
+ ),
+ ).Eventually().Should(
+ jq.Match(`.spec.components.%s.managementState == "%s"`, componentName, operatorv1.Managed),
+ )
+
+ // Check if the releases field contains multiple releases for the component
+ g.List(gvk.DataScienceCluster).Eventually().Should(And(
+ HaveLen(1),
+ HaveEach(
+ // Check releases for the component itself
+ jq.Match(`.status.components.%s.releases | length > 0`, componentName),
+ ),
+ ))
+
+ // Validate each release's fields (name, version, repoUrl) using HaveEach
+ g.List(gvk.DataScienceCluster).Eventually().Should(And(
+ HaveLen(1),
+ HaveEach(And(
+ // Check that each release has the required fields (name, version, repoUrl)
+ jq.Match(`.status.components.%s.releases[].name != ""`, componentName),
+ jq.Match(`.status.components.%s.releases[].version != ""`, componentName),
+ jq.Match(`.status.components.%s.releases[].repoUrl != ""`, componentName)),
+ ),
+ ))
+}
+
func (c *ComponentTestCtx) GetDSC() (*dscv1.DataScienceCluster, error) {
obj := dscv1.DataScienceCluster{}
diff --git a/tests/e2e/datasciencepipelines_test.go b/tests/e2e/datasciencepipelines_test.go
index b00f41e8133..5da02b82a73 100644
--- a/tests/e2e/datasciencepipelines_test.go
+++ b/tests/e2e/datasciencepipelines_test.go
@@ -22,6 +22,7 @@ func dataSciencePipelinesTestSuite(t *testing.T) {
t.Run("Validate operands have OwnerReferences", componentCtx.ValidateOperandsOwnerReferences)
t.Run("Validate update operand resources", componentCtx.ValidateUpdateDeploymentsResources)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type DataSciencePipelinesTestCtx struct {
diff --git a/tests/e2e/kserve_test.go b/tests/e2e/kserve_test.go
index aa12f85a4d1..3fec9048f9d 100644
--- a/tests/e2e/kserve_test.go
+++ b/tests/e2e/kserve_test.go
@@ -47,6 +47,7 @@ func kserveTestSuite(t *testing.T) {
t.Run("Validate default certs", componentCtx.validateDefaultCertsAvailable)
t.Run("Validate update operand resources", componentCtx.ValidateUpdateDeploymentsResources)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type KserveTestCtx struct {
diff --git a/tests/e2e/kueue_test.go b/tests/e2e/kueue_test.go
index 4fb42093059..1cddd874a64 100644
--- a/tests/e2e/kueue_test.go
+++ b/tests/e2e/kueue_test.go
@@ -32,6 +32,7 @@ func kueueTestSuite(t *testing.T) {
t.Run("Validate Kueue Dynamically create VAP and VAPB", componentCtx.validateKueueVAPReady)
t.Run("Validate CRDs reinstated", componentCtx.validateCRDReinstated)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type KueueTestCtx struct {
diff --git a/tests/e2e/modelmeshserving_test.go b/tests/e2e/modelmeshserving_test.go
index 005db8ff03a..7a723f3b1cd 100644
--- a/tests/e2e/modelmeshserving_test.go
+++ b/tests/e2e/modelmeshserving_test.go
@@ -29,6 +29,7 @@ func modelMeshServingTestSuite(t *testing.T) {
t.Run("Validate operands have OwnerReferences", componentCtx.ValidateOperandsOwnerReferences)
t.Run("Validate update operand resources", componentCtx.ValidateUpdateDeploymentsResources)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type ModelMeshServingTestCtx struct {
diff --git a/tests/e2e/modelregistry_test.go b/tests/e2e/modelregistry_test.go
index 413226ef94a..e5241e70819 100644
--- a/tests/e2e/modelregistry_test.go
+++ b/tests/e2e/modelregistry_test.go
@@ -48,6 +48,7 @@ func modelRegistryTestSuite(t *testing.T) {
t.Run("Validate ServiceMeshMember", componentCtx.validateModelRegistryServiceMeshMember)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
func (c *ModelRegistryTestCtx) validateSpec(t *testing.T) {
diff --git a/tests/e2e/ray_test.go b/tests/e2e/ray_test.go
index d56b0309c61..f666d6f25c7 100644
--- a/tests/e2e/ray_test.go
+++ b/tests/e2e/ray_test.go
@@ -22,6 +22,7 @@ func rayTestSuite(t *testing.T) {
t.Run("Validate operands have OwnerReferences", componentCtx.ValidateOperandsOwnerReferences)
t.Run("Validate update operand resources", componentCtx.ValidateUpdateDeploymentsResources)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type RayTestCtx struct {
diff --git a/tests/e2e/trainingoperator_test.go b/tests/e2e/trainingoperator_test.go
index d1b4eca9367..823db746e5f 100644
--- a/tests/e2e/trainingoperator_test.go
+++ b/tests/e2e/trainingoperator_test.go
@@ -22,6 +22,7 @@ func trainingOperatorTestSuite(t *testing.T) {
t.Run("Validate operands have OwnerReferences", componentCtx.ValidateOperandsOwnerReferences)
t.Run("Validate update operand resources", componentCtx.ValidateUpdateDeploymentsResources)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type TrainingOperatorTestCtx struct {
diff --git a/tests/e2e/trustyai_test.go b/tests/e2e/trustyai_test.go
index 7d9b4d9094f..2ddb58ec83b 100644
--- a/tests/e2e/trustyai_test.go
+++ b/tests/e2e/trustyai_test.go
@@ -22,6 +22,7 @@ func trustyAITestSuite(t *testing.T) {
t.Run("Validate operands have OwnerReferences", componentCtx.ValidateOperandsOwnerReferences)
t.Run("Validate update operand resources", componentCtx.ValidateUpdateDeploymentsResources)
t.Run("Validate component disabled", componentCtx.ValidateComponentDisabled)
+ t.Run("Validate component releases", componentCtx.ValidateComponentReleases)
}
type TrustyAITestCtx struct {