--- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.18.0 kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"apiextensions.k8s.io/v1","kind":"CustomResourceDefinition","metadata":{"annotations":{"controller-gen.kubebuilder.io/version":"v0.18.0"},"name":"trainers.components.platform.opendatahub.io"},"spec":{"group":"components.platform.opendatahub.io","names":{"kind":"Trainer","listKind":"TrainerList","plural":"trainers","singular":"trainer"},"scope":"Cluster","versions":[{"additionalPrinterColumns":[{"jsonPath":".status.conditions[?(@.type=='Ready')].status","name":"Ready","type":"string"},{"jsonPath":".status.conditions[?(@.type=='Ready')].reason","name":"Reason","type":"string"},{"jsonPath":".metadata.creationTimestamp","name":"Age","type":"date"}],"name":"v1alpha1","schema":{"openAPIV3Schema":{"description":"Trainer is the Schema for the trainers API.","properties":{"apiVersion":{"description":"APIVersion defines the versioned schema of this representation of an object.\nServers should convert recognized schemas to the latest internal value, and\nmay reject unrecognized values.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources","type":"string"},"kind":{"description":"Kind is a string value representing the REST resource this object represents.\nServers may infer this from the endpoint the client submits requests to.\nCannot be updated.\nIn CamelCase.\nMore info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds","type":"string"},"metadata":{"type":"object"},"spec":{"properties":{"appNamespace":{"type":"string"},"controllers":{"items":{"properties":{"name":{"type":"string"},"resources":{"description":"ResourceRequirements describes the compute resource requirements.","properties":{"claims":{"description":"Claims lists the names of resources, defined in spec.resourceClaims,\nthat are used by this container.\n\nThis field depends on the\nDynamicResourceAllocation feature gate.\n\nThis field is immutable. It can only be set for containers.","items":{"description":"ResourceClaim references one entry in PodSpec.ResourceClaims.","properties":{"name":{"description":"Name must match the name of one entry in pod.spec.resourceClaims of\nthe Pod where this field is used. It makes that resource available\ninside a container.","type":"string"},"request":{"description":"Request is the name chosen for a request in the referenced claim.\nIf empty, everything from the claim is made available, otherwise\nonly the result of this request.","type":"string"}},"required":["name"],"type":"object"},"type":"array","x-kubernetes-list-map-keys":["name"],"x-kubernetes-list-type":"map"},"limits":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}],"pattern":"^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$","x-kubernetes-int-or-string":true},"description":"Limits describes the maximum amount of compute resources allowed.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/","type":"object"},"requests":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"string"}],"pattern":"^(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))))?$","x-kubernetes-int-or-string":true},"description":"Requests describes the minimum amount of compute resources required.\nIf Requests is omitted for a container, it defaults to Limits if that is explicitly specified,\notherwise to an implementation-defined value. Requests cannot exceed Limits.\nMore info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/","type":"object"}},"type":"object"}},"required":["name"],"type":"object"},"type":"array"},"featureGates":{"additionalProperties":{"type":"boolean"},"type":"object"}},"type":"object"},"status":{"properties":{"conditions":{"description":"Conditions is the set of condition observations for this module.","items":{"description":"Condition represents an observation of a module's state at a point in time.\nModule controllers set conditions to communicate health signals to the\norchestrator and to human operators.","properties":{"lastHeartbeatTime":{"description":"Deprecated: LastHeartbeatTime is present only for backward\ncompatibility with existing CRDs. New code should not set this field.","format":"date-time","type":"string"},"lastTransitionTime":{"description":"lastTransitionTime is the last time the condition transitioned from\none status to another.","format":"date-time","type":"string"},"message":{"description":"message is a human-readable message indicating details about the\ntransition.","type":"string"},"observedGeneration":{"description":"observedGeneration represents the .metadata.generation that the\ncondition was set based upon. If this does not match the resource's\ncurrent generation, the condition is likely stale.","format":"int64","minimum":0,"type":"integer"},"reason":{"description":"reason contains a programmatic identifier indicating the reason for\nthe condition's last transition. The value should be a CamelCase\nstring.","type":"string"},"severity":{"description":"Severity indicates whether this condition represents an error or is\npurely informational. Empty string (default) indicates error severity.","type":"string"},"status":{"description":"status of the condition, one of True, False, Unknown.","enum":["True","False","Unknown"],"type":"string"},"type":{"description":"type of condition in CamelCase or in foo.example.com/CamelCase.","maxLength":316,"pattern":"^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$","type":"string"}},"required":["status","type"],"type":"object"},"type":"array","x-kubernetes-list-type":"atomic"},"observedGeneration":{"description":"ObservedGeneration is the most recent .metadata.generation observed\nby the controller. It allows consumers to determine whether the\ncontroller has processed the latest spec changes.","format":"int64","type":"integer"},"phase":{"description":"Phase is the top-level lifecycle phase of the module.","type":"string"},"releases":{"description":"Releases is the list of deployed component releases.","items":{"description":"ComponentRelease describes a single software component's release metadata.","properties":{"name":{"description":"Name is the component name, used as the merge key in lists.","type":"string"},"repoUrl":{"description":"RepoURL is the source repository URL for this component release.","type":"string"},"version":{"description":"Version is the semantic version of the component.","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":[{"message":"Trainer must be named 'default-trainer'","rule":"self.metadata.name == 'default-trainer'"}]}},"served":true,"storage":true,"subresources":{"status":{}}}]}} creationTimestamp: "2026-07-31T10:05:36Z" generation: 1 managedFields: - apiVersion: apiextensions.k8s.io/v1 fieldsType: FieldsV1 fieldsV1: f:status: f:acceptedNames: f:kind: {} f:listKind: {} f:plural: {} f:singular: {} f:conditions: k:{"type":"Established"}: .: {} f:lastTransitionTime: {} f:message: {} f:reason: {} f:status: {} f:type: {} k:{"type":"NamesAccepted"}: .: {} f:lastTransitionTime: {} f:message: {} f:reason: {} f:status: {} f:type: {} manager: kube-apiserver operation: Update subresource: status time: "2026-07-31T10:05:36Z" - apiVersion: apiextensions.k8s.io/v1 fieldsType: FieldsV1 fieldsV1: f:metadata: f:annotations: .: {} f:controller-gen.kubebuilder.io/version: {} f:kubectl.kubernetes.io/last-applied-configuration: {} f:spec: f:conversion: .: {} f:strategy: {} f:group: {} f:names: f:kind: {} f:listKind: {} f:plural: {} f:singular: {} f:scope: {} f:versions: {} manager: kubectl-client-side-apply operation: Update time: "2026-07-31T10:05:36Z" name: trainers.components.platform.opendatahub.io resourceVersion: "12843" uid: 7319eee6-5e97-4ceb-9484-04fd44cc5605 spec: conversion: strategy: None group: components.platform.opendatahub.io names: kind: Trainer listKind: TrainerList plural: trainers singular: trainer scope: Cluster versions: - additionalPrinterColumns: - jsonPath: .status.conditions[?(@.type=='Ready')].status name: Ready type: string - jsonPath: .status.conditions[?(@.type=='Ready')].reason name: Reason type: string - jsonPath: .metadata.creationTimestamp name: Age type: date name: v1alpha1 schema: openAPIV3Schema: description: Trainer is the Schema for the trainers API. properties: apiVersion: description: |- APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources type: string kind: description: |- Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds type: string metadata: type: object spec: properties: appNamespace: type: string controllers: items: properties: name: type: string resources: description: ResourceRequirements describes the compute resource requirements. properties: claims: description: |- Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. This field depends on the DynamicResourceAllocation feature gate. This field is immutable. It can only be set for containers. items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. properties: name: description: |- Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container. type: string request: description: |- Request is the name chosen for a request in the referenced claim. If empty, everything from the claim is made available, otherwise only the result of this request. type: string required: - name type: object type: array x-kubernetes-list-map-keys: - name x-kubernetes-list-type: map limits: additionalProperties: anyOf: - type: integer - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true description: |- Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ type: object requests: additionalProperties: anyOf: - type: integer - type: string pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ x-kubernetes-int-or-string: true description: |- Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ type: object type: object required: - name type: object type: array featureGates: additionalProperties: type: boolean type: object type: object status: properties: conditions: description: Conditions is the set of condition observations for this module. items: description: |- Condition represents an observation of a module's state at a point in time. Module controllers set conditions to communicate health signals to the orchestrator and to human operators. properties: lastHeartbeatTime: description: |- Deprecated: LastHeartbeatTime is present only for backward compatibility with existing CRDs. New code should not set this field. format: date-time type: string lastTransitionTime: description: |- lastTransitionTime is the last time the condition transitioned from one status to another. format: date-time type: string message: description: |- message is a human-readable message indicating details about the transition. type: string observedGeneration: description: |- observedGeneration represents the .metadata.generation that the condition was set based upon. If this does not match the resource's current generation, the condition is likely stale. format: int64 minimum: 0 type: integer reason: description: |- reason contains a programmatic identifier indicating the reason for the condition's last transition. The value should be a CamelCase string. type: string severity: description: |- Severity indicates whether this condition represents an error or is purely informational. Empty string (default) indicates error severity. type: string status: description: status of the condition, one of True, False, Unknown. enum: - "True" - "False" - Unknown type: string type: description: type of condition in CamelCase or in foo.example.com/CamelCase. maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ type: string required: - status - type type: object type: array x-kubernetes-list-type: atomic observedGeneration: description: |- ObservedGeneration is the most recent .metadata.generation observed by the controller. It allows consumers to determine whether the controller has processed the latest spec changes. format: int64 type: integer phase: description: Phase is the top-level lifecycle phase of the module. type: string releases: description: Releases is the list of deployed component releases. items: description: ComponentRelease describes a single software component's release metadata. properties: name: description: Name is the component name, used as the merge key in lists. type: string repoUrl: description: RepoURL is the source repository URL for this component release. type: string version: description: Version is the semantic version of the component. 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: - message: Trainer must be named 'default-trainer' rule: self.metadata.name == 'default-trainer' served: true storage: true subresources: status: {} status: acceptedNames: kind: Trainer listKind: TrainerList plural: trainers singular: trainer conditions: - lastTransitionTime: "2026-07-31T10:05:36Z" message: no conflicts found reason: NoConflicts status: "True" type: NamesAccepted - lastTransitionTime: "2026-07-31T10:05:36Z" message: the initial names have been accepted reason: InitialNamesAccepted status: "True" type: Established storedVersions: - v1alpha1