Skip to content

Commit

Permalink
MachineOSImage API
Browse files Browse the repository at this point in the history
machineOSBuild and Image are meant to represent the two components of an on cluster build, making this commit the
user-facing API for on cluster builds. MOSBuilds comprise of the actual processes of kicking off an monitoring a build. A build also contains user options like the push/pull spec for reg>
is the result of a build. the Image objects are intended to be trackable and easily related to an MCP. The goal here is to remove much of the
split state reporting for on cluster builds and consolidate where the user sets config options.

Signed-off-by: Charlie Doern <cdoern@redhat.com>
  • Loading branch information
cdoern committed Feb 28, 2024
1 parent 0793e91 commit d2a9a8f
Show file tree
Hide file tree
Showing 10 changed files with 1,049 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
include.release.openshift.io/ibm-cloud-managed: "true"
include.release.openshift.io/self-managed-high-availability: "true"
include.release.openshift.io/single-node-developer: "true"
release.openshift.io/feature-set: CustomNoUpgrade
labels:
openshift.io/operator-managed: ""
name: machineosimages.machineconfiguration.openshift.io
spec:
group: machineconfiguration.openshift.io
names:
kind: MachineOSImage
plural: machineosimages
singular: machineosimage
scope: Cluster
versions:
- additionalPrinterColumns:
- jsonPath: .status.conditions[?(@.type=="RolledOut")].status
name: RolledOut
type: string
- jsonPath: .status.conditions[?(@.type=="RolloutPending")].status
name: RolloutPending
type: string
- jsonPath: .status.conditions[?(@.type=="RolloutFailed")].status
name: RolloutFailed
type: string
- jsonPath: .status.Age
name: Age
type: string
name: v1alpha1
schema:
openAPIV3Schema:
description: 'MachineOSImage describes an image build for a MachineConfigPool Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.'
type: object
required:
- spec
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:
description: spec describes the machineosimage spec
type: object
required:
- baseImage
- imagePullSpec
- machineConfigPool
properties:
baseImage:
description: baseImage is the base OS image that this object was built from
type: string
imagePullSpec:
description: imagePullSpec contains the final pull spec of the built image
type: string
machineConfig:
description: machineConfig is a reference to the MC that was used to build this image.
type: object
required:
- name
properties:
name:
description: name is the name of the referenced object.
type: string
machineConfigPool:
description: machineConfigPool contains the MCP that the image has been rolled out to
type: object
required:
- name
properties:
name:
description: name is the name of the referenced object.
type: string
status:
description: status describes the machineosimage status
type: object
required:
- buildTime
- conditions
- imageUsage
- rolloutStatus
properties:
buildTime:
description: age is how long the image has existed
type: string
conditions:
description: conditions contains status conditions related to the image.
type: array
items:
description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
- message
- reason
- status
- type
properties:
lastTransitionTime:
description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
type: string
format: date-time
message:
description: message is a human readable message indicating details about the transition. This may be an empty string.
type: string
maxLength: 32768
observedGeneration:
description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.
type: integer
format: int64
minimum: 0
reason:
description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.
type: string
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
status:
description: status of the condition, one of True, False, Unknown.
type: string
enum:
- "True"
- "False"
- Unknown
type:
description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
type: string
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])$
imageUsage:
description: imageUsage describes how recently this image has been used. Once this gets to Rotten, the image can be garbage collected
type: object
required:
- usage
properties:
usage:
type: string
observedGeneration:
description: observedGeneration represents the generation observed by the controller.
type: integer
format: int64
rolloutStatus:
description: rolloutStatus represents how the image is progressing in its rollout after being built
type: string
served: true
storage: true
subresources:
status: {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
include.release.openshift.io/ibm-cloud-managed: "true"
include.release.openshift.io/self-managed-high-availability: "true"
include.release.openshift.io/single-node-developer: "true"
release.openshift.io/feature-set: TechPreviewNoUpgrade
labels:
openshift.io/operator-managed: ""
name: machineosimages.machineconfiguration.openshift.io
spec:
group: machineconfiguration.openshift.io
names:
kind: MachineOSImage
plural: machineosimages
singular: machineosimage
scope: Cluster
versions:
- additionalPrinterColumns:
- jsonPath: .status.conditions[?(@.type=="RolledOut")].status
name: RolledOut
type: string
- jsonPath: .status.conditions[?(@.type=="RolloutPending")].status
name: RolloutPending
type: string
- jsonPath: .status.conditions[?(@.type=="RolloutFailed")].status
name: RolloutFailed
type: string
- jsonPath: .status.Age
name: Age
type: string
name: v1alpha1
schema:
openAPIV3Schema:
description: 'MachineOSImage describes an image build for a MachineConfigPool Compatibility level 4: No compatibility is provided, the API can change at any point for any reason. These capabilities should not be used by applications needing long term support.'
type: object
required:
- spec
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:
description: spec describes the machineosimage spec
type: object
required:
- baseImage
- imagePullSpec
- machineConfigPool
properties:
baseImage:
description: baseImage is the base OS image that this object was built from
type: string
imagePullSpec:
description: imagePullSpec contains the final pull spec of the built image
type: string
machineConfig:
description: machineConfig is a reference to the MC that was used to build this image.
type: object
required:
- name
properties:
name:
description: name is the name of the referenced object.
type: string
machineConfigPool:
description: machineConfigPool contains the MCP that the image has been rolled out to
type: object
required:
- name
properties:
name:
description: name is the name of the referenced object.
type: string
status:
description: status describes the machineosimage status
type: object
required:
- buildTime
- conditions
- imageUsage
- rolloutStatus
properties:
buildTime:
description: age is how long the image has existed
type: string
conditions:
description: conditions contains status conditions related to the image.
type: array
items:
description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
- message
- reason
- status
- type
properties:
lastTransitionTime:
description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable.
type: string
format: date-time
message:
description: message is a human readable message indicating details about the transition. This may be an empty string.
type: string
maxLength: 32768
observedGeneration:
description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance.
type: integer
format: int64
minimum: 0
reason:
description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty.
type: string
maxLength: 1024
minLength: 1
pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
status:
description: status of the condition, one of True, False, Unknown.
type: string
enum:
- "True"
- "False"
- Unknown
type:
description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
type: string
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])$
imageUsage:
description: imageUsage describes how recently this image has been used. Once this gets to Rotten, the image can be garbage collected
type: object
required:
- usage
properties:
usage:
type: string
observedGeneration:
description: observedGeneration represents the generation observed by the controller.
type: integer
format: int64
rolloutStatus:
description: rolloutStatus represents how the image is progressing in its rollout after being built
type: string
served: true
storage: true
subresources:
status: {}
22 changes: 22 additions & 0 deletions machineconfiguration/v1alpha1/custom.machineosimage.testsuite.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this
name: "[Custom] MachineOSImage"
crd: 0000_80_machineosimage-CustomNoUpgrade.crd.yaml
tests:
onCreate:
- name: Should be able to create a minimal MachineOSImage
initial: |
apiVersion: machineconfiguration.openshift.io/v1alpha1
kind: MachineOSImage
metadata:
name: foobar
spec:
imagePullSpec: randomregistry.io/img:latest
machineConfigPool: worker
expected: |
apiVersion: machineconfiguration.openshift.io/v1alpha1
kind: MachineOSImage
metadata:
name: foobar
spec:
imagePullSpec: randomregistry.io/img:latest
machineConfigPool: worker
2 changes: 2 additions & 0 deletions machineconfiguration/v1alpha1/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(GroupVersion,
&MachineConfigNode{},
&MachineConfigNodeList{},
&MachineOSImage{},
&MachineOSImageList{},
)
metav1.AddToGroupVersion(scheme, GroupVersion)
return nil
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
apiVersion: apiextensions.k8s.io/v1 # Hack because controller-gen complains if we don't have this
name: "[TechPreview] MachineOSImage"
crd: 0000_80_machineosimage-TechPreviewNoUpgrade.crd.yaml
tests:
onCreate:
- name: Should be able to create a minimal MachineOSImage
initial: |
apiVersion: machineconfiguration.openshift.io/v1alpha1
kind: MachineOSImage
metadata:
name: foobar
spec:
imagePullSpec: randomregistry.io/img:latest
machineConfigPool: worker
expected: |
apiVersion: machineconfiguration.openshift.io/v1alpha1
kind: MachineOSImage
metadata:
name: foobar
spec:
imagePullSpec: randomregistry.io/img:latest
machineConfigPool: worker

0 comments on commit d2a9a8f

Please sign in to comment.