diff --git a/apis/components/v1/modelcontroller_types.go b/apis/components/v1/modelcontroller_types.go index 14e0a6cb4ae..933d41b5542 100644 --- a/apis/components/v1/modelcontroller_types.go +++ b/apis/components/v1/modelcontroller_types.go @@ -37,6 +37,7 @@ const ( // +kubebuilder:validation:XValidation:rule="self.metadata.name == 'default-modelcontroller'",message="ModelController name must be default-modelcontroller" // +kubebuilder:printcolumn:name="Ready",type=string,JSONPath=`.status.conditions[?(@.type=="Ready")].status`,description="Ready" // +kubebuilder:printcolumn:name="Reason",type=string,JSONPath=`.status.conditions[?(@.type=="Ready")].reason`,description="Reason" +// +kubebuilder:printcolumn:name="URI",type=string,JSONPath=`.status.URI`,description="devFlag's URI used to download" // ModelController is the Schema for the modelcontroller API, it is a shared component between kserve and modelmeshserving type ModelController struct { @@ -49,14 +50,28 @@ type ModelController struct { // ModelControllerSpec defines the desired state of ModelController type ModelControllerSpec struct { + //ModelMeshServing DSCModelMeshServing `json:"modelMeshServing,omitempty"` + Kserve *ModelControllerKerveSpec `json:"kserve,omitempty"` + ModelMeshServing *ModelControllerMMSpec `json:"modelMeshServing,omitempty"` +} + +// a mini version of the DSCKserve only keep devflags and management spec +type ModelControllerKerveSpec struct { + ManagementState operatorv1.ManagementState `json:"managementState,omitempty"` + common.DevFlagsSpec `json:",inline"` +} + +// a mini version of the DSCModelMeshServing only keep devflags and management spec +type ModelControllerMMSpec struct { + ManagementState operatorv1.ManagementState `json:"managementState,omitempty"` common.DevFlagsSpec `json:",inline"` - ModelMeshServing operatorv1.ManagementState `json:"modelMeshServing,omitempty"` - Kserve operatorv1.ManagementState `json:"kserve,omitempty"` } // ModelControllerStatus defines the observed state of ModelController type ModelControllerStatus struct { common.Status `json:",inline"` + // devflag's URI + URI string `json:"URI,omitempty"` } // +kubebuilder:object:root=true diff --git a/apis/components/v1/zz_generated.deepcopy.go b/apis/components/v1/zz_generated.deepcopy.go index 57ed1c4910c..f9e16c866d0 100644 --- a/apis/components/v1/zz_generated.deepcopy.go +++ b/apis/components/v1/zz_generated.deepcopy.go @@ -789,6 +789,22 @@ func (in *ModelController) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ModelControllerKerveSpec) DeepCopyInto(out *ModelControllerKerveSpec) { + *out = *in + in.DevFlagsSpec.DeepCopyInto(&out.DevFlagsSpec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelControllerKerveSpec. +func (in *ModelControllerKerveSpec) DeepCopy() *ModelControllerKerveSpec { + if in == nil { + return nil + } + out := new(ModelControllerKerveSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ModelControllerList) DeepCopyInto(out *ModelControllerList) { *out = *in @@ -822,11 +838,36 @@ func (in *ModelControllerList) DeepCopyObject() runtime.Object { } // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *ModelControllerSpec) DeepCopyInto(out *ModelControllerSpec) { +func (in *ModelControllerMMSpec) DeepCopyInto(out *ModelControllerMMSpec) { *out = *in in.DevFlagsSpec.DeepCopyInto(&out.DevFlagsSpec) } +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelControllerMMSpec. +func (in *ModelControllerMMSpec) DeepCopy() *ModelControllerMMSpec { + if in == nil { + return nil + } + out := new(ModelControllerMMSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ModelControllerSpec) DeepCopyInto(out *ModelControllerSpec) { + *out = *in + if in.Kserve != nil { + in, out := &in.Kserve, &out.Kserve + *out = new(ModelControllerKerveSpec) + (*in).DeepCopyInto(*out) + } + if in.ModelMeshServing != nil { + in, out := &in.ModelMeshServing, &out.ModelMeshServing + *out = new(ModelControllerMMSpec) + (*in).DeepCopyInto(*out) + } +} + // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelControllerSpec. func (in *ModelControllerSpec) DeepCopy() *ModelControllerSpec { if in == nil { diff --git a/bundle/manifests/components.opendatahub.io_modelcontrollers.yaml b/bundle/manifests/components.opendatahub.io_modelcontrollers.yaml index 443f728fa4a..c8e6d9cf2bd 100644 --- a/bundle/manifests/components.opendatahub.io_modelcontrollers.yaml +++ b/bundle/manifests/components.opendatahub.io_modelcontrollers.yaml @@ -23,6 +23,10 @@ spec: jsonPath: .status.conditions[?(@.type=="Ready")].reason name: Reason type: string + - description: devFlag's URI used to download + jsonPath: .status.URI + name: URI + type: string name: v1 schema: openAPIV3Schema: @@ -49,42 +53,84 @@ spec: spec: description: ModelControllerSpec defines the desired state of ModelController properties: - devFlags: - description: Add developer fields + kserve: + description: ModelMeshServing DSCModelMeshServing `json:"modelMeshServing,omitempty"` properties: - manifests: - description: List of custom manifests for the given component - items: - properties: - contextDir: - default: manifests - description: contextDir is the relative path to the folder - containing manifests in a repository, default value "manifests" - type: string - sourcePath: - default: "" - description: 'sourcePath is the subpath within contextDir - where kustomize builds start. Examples include any sub-folder - or path: `base`, `overlays/dev`, `default`, `odh` etc.' - type: string - uri: - default: "" - description: uri is the URI point to a git repo with tag/branch. - e.g. https://github.com/org/repo/tarball/ - type: string - type: object - type: array + devFlags: + description: Add developer fields + properties: + manifests: + description: List of custom manifests for the given component + items: + properties: + contextDir: + default: manifests + description: contextDir is the relative path to the + folder containing manifests in a repository, default + value "manifests" + type: string + sourcePath: + default: "" + description: 'sourcePath is the subpath within contextDir + where kustomize builds start. Examples include any + sub-folder or path: `base`, `overlays/dev`, `default`, + `odh` etc.' + type: string + uri: + default: "" + description: uri is the URI point to a git repo with + tag/branch. e.g. https://github.com/org/repo/tarball/ + type: string + type: object + type: array + type: object + managementState: + pattern: ^(Managed|Unmanaged|Force|Removed)$ + type: string type: object - kserve: - pattern: ^(Managed|Unmanaged|Force|Removed)$ - type: string modelMeshServing: - pattern: ^(Managed|Unmanaged|Force|Removed)$ - type: string + description: a mini version of the DSCModelMeshServing only keep devflags + and management spec + properties: + devFlags: + description: Add developer fields + properties: + manifests: + description: List of custom manifests for the given component + items: + properties: + contextDir: + default: manifests + description: contextDir is the relative path to the + folder containing manifests in a repository, default + value "manifests" + type: string + sourcePath: + default: "" + description: 'sourcePath is the subpath within contextDir + where kustomize builds start. Examples include any + sub-folder or path: `base`, `overlays/dev`, `default`, + `odh` etc.' + type: string + uri: + default: "" + description: uri is the URI point to a git repo with + tag/branch. e.g. https://github.com/org/repo/tarball/ + type: string + type: object + type: array + type: object + managementState: + pattern: ^(Managed|Unmanaged|Force|Removed)$ + type: string + type: object type: object status: description: ModelControllerStatus defines the observed state of ModelController properties: + URI: + description: devflag's URI + type: string conditions: items: description: Condition contains details for one aspect of the current diff --git a/config/crd/bases/components.opendatahub.io_modelcontrollers.yaml b/config/crd/bases/components.opendatahub.io_modelcontrollers.yaml index f0f22e08eac..e3509094163 100644 --- a/config/crd/bases/components.opendatahub.io_modelcontrollers.yaml +++ b/config/crd/bases/components.opendatahub.io_modelcontrollers.yaml @@ -23,6 +23,10 @@ spec: jsonPath: .status.conditions[?(@.type=="Ready")].reason name: Reason type: string + - description: devFlag's URI used to download + jsonPath: .status.URI + name: URI + type: string name: v1 schema: openAPIV3Schema: @@ -49,42 +53,84 @@ spec: spec: description: ModelControllerSpec defines the desired state of ModelController properties: - devFlags: - description: Add developer fields + kserve: + description: ModelMeshServing DSCModelMeshServing `json:"modelMeshServing,omitempty"` properties: - manifests: - description: List of custom manifests for the given component - items: - properties: - contextDir: - default: manifests - description: contextDir is the relative path to the folder - containing manifests in a repository, default value "manifests" - type: string - sourcePath: - default: "" - description: 'sourcePath is the subpath within contextDir - where kustomize builds start. Examples include any sub-folder - or path: `base`, `overlays/dev`, `default`, `odh` etc.' - type: string - uri: - default: "" - description: uri is the URI point to a git repo with tag/branch. - e.g. https://github.com/org/repo/tarball/ - type: string - type: object - type: array + devFlags: + description: Add developer fields + properties: + manifests: + description: List of custom manifests for the given component + items: + properties: + contextDir: + default: manifests + description: contextDir is the relative path to the + folder containing manifests in a repository, default + value "manifests" + type: string + sourcePath: + default: "" + description: 'sourcePath is the subpath within contextDir + where kustomize builds start. Examples include any + sub-folder or path: `base`, `overlays/dev`, `default`, + `odh` etc.' + type: string + uri: + default: "" + description: uri is the URI point to a git repo with + tag/branch. e.g. https://github.com/org/repo/tarball/ + type: string + type: object + type: array + type: object + managementState: + pattern: ^(Managed|Unmanaged|Force|Removed)$ + type: string type: object - kserve: - pattern: ^(Managed|Unmanaged|Force|Removed)$ - type: string modelMeshServing: - pattern: ^(Managed|Unmanaged|Force|Removed)$ - type: string + description: a mini version of the DSCModelMeshServing only keep devflags + and management spec + properties: + devFlags: + description: Add developer fields + properties: + manifests: + description: List of custom manifests for the given component + items: + properties: + contextDir: + default: manifests + description: contextDir is the relative path to the + folder containing manifests in a repository, default + value "manifests" + type: string + sourcePath: + default: "" + description: 'sourcePath is the subpath within contextDir + where kustomize builds start. Examples include any + sub-folder or path: `base`, `overlays/dev`, `default`, + `odh` etc.' + type: string + uri: + default: "" + description: uri is the URI point to a git repo with + tag/branch. e.g. https://github.com/org/repo/tarball/ + type: string + type: object + type: array + type: object + managementState: + pattern: ^(Managed|Unmanaged|Force|Removed)$ + type: string + type: object type: object status: description: ModelControllerStatus defines the observed state of ModelController properties: + URI: + description: devflag's URI + type: string conditions: items: description: Condition contains details for one aspect of the current diff --git a/controllers/components/kserve/kserve_controller_actions.go b/controllers/components/kserve/kserve_controller_actions.go index e549b85b99e..5453011efdf 100644 --- a/controllers/components/kserve/kserve_controller_actions.go +++ b/controllers/components/kserve/kserve_controller_actions.go @@ -276,14 +276,16 @@ func patchOwnerReference(ctx context.Context, rr *odhtypes.ReconciliationRequest } return odherrors.NewStopError("failed to get ModelController CR: %v", err) } - for _, owners := range mc.GetOwnerReferences() { - if owners.UID == k.GetUID() { + + owners := []metav1.OwnerReference{} + for _, o := range mc.GetOwnerReferences() { + if o.UID == k.GetUID() { return nil // kserve already as owner to modelcontroller, early exit } + if o.Kind != componentsv1.KserveKind { // TODO: a workaround to ensure no old UID exist, this should be moved into finalizer later + owners = append(owners, o) + } } - - owners := []metav1.OwnerReference{} - owners = append(owners, mc.GetOwnerReferences()...) // keep the existing ones owners = append(owners, metav1.OwnerReference{ Kind: componentsv1.KserveKind, APIVersion: componentsv1.GroupVersion.String(), diff --git a/controllers/components/modelcontroller/modelcontroller.go b/controllers/components/modelcontroller/modelcontroller.go index e478100358b..0e8142f0b1f 100644 --- a/controllers/components/modelcontroller/modelcontroller.go +++ b/controllers/components/modelcontroller/modelcontroller.go @@ -40,6 +40,17 @@ func (s *componentHandler) NewCRObject(dsc *dscv1.DataScienceCluster) client.Obj mcAnnotations := make(map[string]string) mcAnnotations[annotations.ManagementStateAnnotation] = string(s.GetManagementState(dsc)) + // extra logic to set the management .spec.component.managementState, to not leave blank {} + kState := operatorv1.Removed + if dsc.Spec.Components.Kserve.ManagementState == operatorv1.Managed { + kState = operatorv1.Managed + } + + mState := operatorv1.Removed + if dsc.Spec.Components.ModelMeshServing.ManagementState == operatorv1.Managed { + mState = operatorv1.Managed + } + return client.Object(&componentsv1.ModelController{ TypeMeta: metav1.TypeMeta{ Kind: componentsv1.ModelControllerKind, @@ -50,8 +61,17 @@ func (s *componentHandler) NewCRObject(dsc *dscv1.DataScienceCluster) client.Obj Annotations: mcAnnotations, }, Spec: componentsv1.ModelControllerSpec{ - ModelMeshServing: dsc.Spec.Components.ModelMeshServing.ManagementState, - Kserve: dsc.Spec.Components.Kserve.ManagementState, + // ModelMeshServing: &componentsv1.DSCModelMeshServing { + // dsc.Spec.Components.ModelMeshServing, + // }, + ModelMeshServing: &componentsv1.ModelControllerMMSpec{ + ManagementState: mState, + DevFlagsSpec: dsc.Spec.Components.ModelMeshServing.DevFlagsSpec, + }, + Kserve: &componentsv1.ModelControllerKerveSpec{ + ManagementState: kState, + DevFlagsSpec: dsc.Spec.Components.Kserve.DevFlagsSpec, + }, }, }) } diff --git a/controllers/components/modelcontroller/modelcontroller_actions.go b/controllers/components/modelcontroller/modelcontroller_actions.go index 1aa4063a733..7dee79952dc 100644 --- a/controllers/components/modelcontroller/modelcontroller_actions.go +++ b/controllers/components/modelcontroller/modelcontroller_actions.go @@ -42,8 +42,9 @@ func initialize(ctx context.Context, rr *odhtypes.ReconciliationRequest) error { return nil } +// download devflag from kserve or modelmeshserving. func devFlags(ctx context.Context, rr *odhtypes.ReconciliationRequest) error { - _, ok := rr.Instance.(*componentsv1.ModelController) + mc, ok := rr.Instance.(*componentsv1.ModelController) if !ok { return fmt.Errorf("resource instance %v is not a componentsv1.ModelController)", rr.Instance) } @@ -53,12 +54,14 @@ func devFlags(ctx context.Context, rr *odhtypes.ReconciliationRequest) error { // Get ModelMeshServing if it is enabled and has devlfags mm := rr.DSC.Spec.Components.ModelMeshServing if mm.ManagementSpec.ManagementState != operatorv1.Managed || mm.DevFlags == nil || len(mm.DevFlags.Manifests) == 0 { + // no need devflag, no need update status.uri return nil } - for _, subcomponent := range rr.DSC.Spec.Components.ModelMeshServing.DevFlags.Manifests { + for _, subcomponent := range mc.Spec.ModelMeshServing.DevFlags.Manifests { if strings.Contains(subcomponent.URI, ComponentName) { - // Download odh-model-controller + // update .status.uri and download odh-model-controller + mc.Status.URI = subcomponent.URI if err := odhdeploy.DownloadManifests(ctx, ComponentName, subcomponent); err != nil { return err } @@ -71,9 +74,10 @@ func devFlags(ctx context.Context, rr *odhtypes.ReconciliationRequest) error { return nil } - for _, subcomponent := range rr.DSC.Spec.Components.Kserve.DevFlags.Manifests { + for _, subcomponent := range mc.Spec.Kserve.DevFlags.Manifests { if strings.Contains(subcomponent.URI, ComponentName) { - // Download odh-model-controller + // update .status.uri and download odh-model-controller + mc.Status.URI = subcomponent.URI if err := odhdeploy.DownloadManifests(ctx, ComponentName, subcomponent); err != nil { return err } diff --git a/controllers/components/modelcontroller/modelcontroller_controller.go b/controllers/components/modelcontroller/modelcontroller_controller.go index efece1e7df2..898e253f0b0 100644 --- a/controllers/components/modelcontroller/modelcontroller_controller.go +++ b/controllers/components/modelcontroller/modelcontroller_controller.go @@ -69,7 +69,7 @@ func (s *componentHandler) NewComponentReconciler(ctx context.Context, mgr ctrl. Watches(&extv1.CustomResourceDefinition{}). // call ForLabel() + new predicates // Add ModelController specific actions WithAction(initialize). - WithAction(devFlags). // devFlags triggerd by changes in DSC kserve and ModelMeshServing + WithAction(devFlags). // devFlags triggerd by changes in DSC kserve and ModelMeshServing, also update .status.devflagurl WithAction(security.NewUpdatePodSecurityRoleBindingAction(serviceAccounts)). WithAction(kustomize.NewAction( kustomize.WithCache(), diff --git a/controllers/components/modelmeshserving/modelmeshserving_actions.go b/controllers/components/modelmeshserving/modelmeshserving_actions.go index 0d61ffd2a4d..aa6063c9c13 100644 --- a/controllers/components/modelmeshserving/modelmeshserving_actions.go +++ b/controllers/components/modelmeshserving/modelmeshserving_actions.go @@ -93,6 +93,7 @@ func patchOwnerReference(ctx context.Context, rr *odhtypes.ReconciliationRequest } return odherrors.NewStopError("failed to get ModelController CR: %v", err) } + l.Info("Get WEN CR", "ModelController", mc) for _, owners := range mc.GetOwnerReferences() { if owners.UID == mm.GetUID() { return nil // modelmesh already as owner to modelcontroller, early exit @@ -100,7 +101,14 @@ func patchOwnerReference(ctx context.Context, rr *odhtypes.ReconciliationRequest } owners := []metav1.OwnerReference{} - owners = append(owners, mc.GetOwnerReferences()...) // keep the existing ones + for _, o := range mc.GetOwnerReferences() { + if o.UID == mm.GetUID() { + return nil // same modelmesh already as owner to modelcontroller, early exit + } + if o.Kind != componentsv1.ModelMeshServingKind { // TODO: a workaround to ensure no old UID exist, this should be moved into finalizer later + owners = append(owners, o) + } + } owners = append(owners, metav1.OwnerReference{ Kind: componentsv1.ModelMeshServingKind, APIVersion: componentsv1.GroupVersion.String(), diff --git a/controllers/datasciencecluster/datasciencecluster_controller.go b/controllers/datasciencecluster/datasciencecluster_controller.go index aefe84a1baf..f0e7a132656 100644 --- a/controllers/datasciencecluster/datasciencecluster_controller.go +++ b/controllers/datasciencecluster/datasciencecluster_controller.go @@ -291,7 +291,10 @@ func (r *DataScienceClusterReconciler) ReconcileComponent( if saved.Status.InstalledComponents == nil { saved.Status.InstalledComponents = make(map[string]bool) } - saved.Status.InstalledComponents[componentName] = enabled + // only set non-modelcontroller component into DSC .status.InstalledComponents map + if componentName != componentsv1.ModelControllerComponentName { + saved.Status.InstalledComponents[componentName] = enabled + } if enabled { status.SetComponentCondition(&saved.Status.Conditions, componentName, status.ReconcileCompleted, "Component reconciled successfully", corev1.ConditionTrue) } else { diff --git a/docs/api-overview.md b/docs/api-overview.md index d5f618109d6..381aa13e758 100644 --- a/docs/api-overview.md +++ b/docs/api-overview.md @@ -758,6 +758,23 @@ _Appears in:_ | `status` _[ModelControllerStatus](#modelcontrollerstatus)_ | | | | +#### ModelControllerKerveSpec + + + +a mini version of the DSCKserve only keep devflags and management spec + + + +_Appears in:_ +- [ModelControllerSpec](#modelcontrollerspec) + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `managementState` _[ManagementState](#managementstate)_ | | | | +| `devFlags` _[DevFlags](#devflags)_ | Add developer fields | | | + + #### ModelControllerList @@ -778,6 +795,23 @@ ModelControllerList contains a list of ModelController | `items` _[ModelController](#modelcontroller) array_ | | | | +#### ModelControllerMMSpec + + + +a mini version of the DSCModelMeshServing only keep devflags and management spec + + + +_Appears in:_ +- [ModelControllerSpec](#modelcontrollerspec) + +| Field | Description | Default | Validation | +| --- | --- | --- | --- | +| `managementState` _[ManagementState](#managementstate)_ | | | | +| `devFlags` _[DevFlags](#devflags)_ | Add developer fields | | | + + #### ModelControllerSpec @@ -791,9 +825,8 @@ _Appears in:_ | Field | Description | Default | Validation | | --- | --- | --- | --- | -| `devFlags` _[DevFlags](#devflags)_ | Add developer fields | | | -| `modelMeshServing` _[ManagementState](#managementstate)_ | | | | -| `kserve` _[ManagementState](#managementstate)_ | | | | +| `kserve` _[ModelControllerKerveSpec](#modelcontrollerkervespec)_ | ModelMeshServing DSCModelMeshServing `json:"modelMeshServing,omitempty"` | | | +| `modelMeshServing` _[ModelControllerMMSpec](#modelcontrollermmspec)_ | | | | #### ModelControllerStatus @@ -812,6 +845,7 @@ _Appears in:_ | `phase` _string_ | | | | | `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | | | `observedGeneration` _integer_ | | | | +| `URI` _string_ | devflag's URI | | | #### ModelMeshServing @@ -1381,11 +1415,6 @@ _Appears in:_ -<<<<<<< HEAD -======= - - ->>>>>>> 5f29f321 (feat: add support for modelmeshserving as component) @@ -1407,119 +1436,6 @@ _Appears in:_ | `manifests` _[ManifestsConfig](#manifestsconfig) array_ | List of custom manifests for the given component | | | -<<<<<<< HEAD -======= -#### DevFlagsSpec - - - -DevFlagsSpec struct defines the component's dev flags configuration. - - - -_Appears in:_ -- [CodeFlareCommonSpec](#codeflarecommonspec) -- [CodeFlareSpec](#codeflarespec) -- [Component](#component) -- [DSCCodeFlare](#dsccodeflare) -- [DSCDashboard](#dscdashboard) -- [DSCDataSciencePipelines](#dscdatasciencepipelines) -- [DSCKserve](#dsckserve) -- [DSCKueue](#dsckueue) -- [DSCModelMeshServing](#dscmodelmeshserving) -- [DSCModelRegistry](#dscmodelregistry) -- [DSCRay](#dscray) -- [DSCTrainingOperator](#dsctrainingoperator) -- [DSCTrustyAI](#dsctrustyai) -- [DSCWorkbenches](#dscworkbenches) -- [DashboardCommonSpec](#dashboardcommonspec) -- [DashboardSpec](#dashboardspec) -- [DataSciencePipelinesCommonSpec](#datasciencepipelinescommonspec) -- [DataSciencePipelinesSpec](#datasciencepipelinesspec) -- [KserveCommonSpec](#kservecommonspec) -- [KserveSpec](#kservespec) -- [KueueCommonSpec](#kueuecommonspec) -- [KueueSpec](#kueuespec) -- [ModelControllerSpec](#modelcontrollerspec) -- [ModelMeshServingCommonSpec](#modelmeshservingcommonspec) -- [ModelMeshServingSpec](#modelmeshservingspec) -- [ModelRegistryCommonSpec](#modelregistrycommonspec) -- [ModelRegistrySpec](#modelregistryspec) -- [RayCommonSpec](#raycommonspec) -- [RaySpec](#rayspec) -- [TrainingOperatorCommonSpec](#trainingoperatorcommonspec) -- [TrainingOperatorSpec](#trainingoperatorspec) -- [TrustyAICommonSpec](#trustyaicommonspec) -- [TrustyAISpec](#trustyaispec) -- [WorkbenchesCommonSpec](#workbenchescommonspec) -- [WorkbenchesSpec](#workbenchesspec) - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `devFlags` _[DevFlags](#devflags)_ | Add developer fields | | | - - -#### ManagementSpec - - - -ManagementSpec struct defines the component's management configuration. - - - -_Appears in:_ -- [Component](#component) -- [DSCCodeFlare](#dsccodeflare) -- [DSCDashboard](#dscdashboard) -- [DSCDataSciencePipelines](#dscdatasciencepipelines) -- [DSCKserve](#dsckserve) -- [DSCKueue](#dsckueue) -- [DSCModelMeshServing](#dscmodelmeshserving) -- [DSCModelRegistry](#dscmodelregistry) -- [DSCRay](#dscray) -- [DSCTrainingOperator](#dsctrainingoperator) -- [DSCTrustyAI](#dsctrustyai) -- [DSCWorkbenches](#dscworkbenches) - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `managementState` _[ManagementState](#managementstate)_ | Set to one of the following values:

- "Managed" : the operator is actively managing the component and trying to keep it active.
It will only upgrade the component if it is safe to do so

- "Removed" : the operator is actively managing the component and will not install it,
or if it is installed, the operator will try to remove it | | Enum: [Managed Removed]
| - - - - -#### Status - - - - - - - -_Appears in:_ -- [CodeFlareStatus](#codeflarestatus) -- [DashboardStatus](#dashboardstatus) -- [DataSciencePipelinesStatus](#datasciencepipelinesstatus) -- [KserveStatus](#kservestatus) -- [KueueStatus](#kueuestatus) -- [ModelControllerStatus](#modelcontrollerstatus) -- [ModelMeshServingStatus](#modelmeshservingstatus) -- [ModelRegistryStatus](#modelregistrystatus) -- [RayStatus](#raystatus) -- [TrainingOperatorStatus](#trainingoperatorstatus) -- [TrustyAIStatus](#trustyaistatus) -- [WorkbenchesStatus](#workbenchesstatus) - -| Field | Description | Default | Validation | -| --- | --- | --- | --- | -| `phase` _string_ | | | | -| `conditions` _[Condition](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/#condition-v1-meta) array_ | | | | -| `observedGeneration` _integer_ | | | | - - - - ->>>>>>> 5f29f321 (feat: add support for modelmeshserving as component)