diff --git a/api/v1alpha1/bundle_types.go b/api/v1alpha1/bundle_types.go index d09db9ab..93374f2c 100644 --- a/api/v1alpha1/bundle_types.go +++ b/api/v1alpha1/bundle_types.go @@ -162,6 +162,7 @@ type BundleStatus struct { //+kubebuilder:printcolumn:name=Age,type=date,JSONPath=`.metadata.creationTimestamp` //+kubebuilder:printcolumn:name=Provisioner,type=string,JSONPath=`.spec.provisionerClassName`,priority=1 //+kubebuilder:printcolumn:name=Resolved Source,type=string,JSONPath=`.status.resolvedSource`,priority=1 +// +kubebuilder:storageversion // Bundle is the Schema for the bundles API type Bundle struct { diff --git a/api/v1alpha1/bundledeployment_types.go b/api/v1alpha1/bundledeployment_types.go index ea393cd8..33e04745 100644 --- a/api/v1alpha1/bundledeployment_types.go +++ b/api/v1alpha1/bundledeployment_types.go @@ -80,6 +80,7 @@ type BundleDeploymentStatus struct { //+kubebuilder:printcolumn:name=Provisioner,type=string,JSONPath=`.spec.provisionerClassName`,priority=1 // BundleDeployment is the Schema for the bundledeployments API +// +kubebuilder:storageversion type BundleDeployment struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` diff --git a/api/v1alpha2/bundledeployment_types.go b/api/v1alpha2/bundledeployment_types.go new file mode 100644 index 00000000..89f10a73 --- /dev/null +++ b/api/v1alpha2/bundledeployment_types.go @@ -0,0 +1,92 @@ +/* +Copyright 2023. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha2 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:resource:scope=Cluster,shortName={"bd","bds"} + +// BundleDeployment is the Schema for the bundledeployments API +type BundleDeployment struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec BundleDeploymentSpec `json:"spec"` + Status BundleDeploymentStatus `json:"status,omitempty"` +} + +// BundleDeploymentSpec defines the desired state of BundleDeployment +type BundleDeploymentSpec struct { + // Sources configures how to pull the bundle content. + + // +kubebuilder:validation:Required + // +kubebuilder:validation:MinItems:=1 + Sources []BundleDeplopymentSource `json:"sources"` + + // Format refers to the bundle type which is being passed through + // the bundle deployment API. + + // +kubebuilder:validation:Required + // +kubebuilder:validation:Enum=plain;helm;registry + Format FormatType `json:"format"` + + // Paused is used to configure whether we want the + // bundle deployment to reconcile, or remain in the + // last observed state. + + // +kubebuilder:default:=false + // +optional + Paused bool `json:"paused,omitempty"` + + // DefaultNamespace refers to the namespace where + // namespace-scoped objects would be created if not + // explicitely set within the bundle. + + // +optional + DefaultNamespace string `json:"defaultnamespace,omitempty"` +} + +// FormatType refers to the allowed bundle formats that +// are being accepted in the APIs. +type FormatType string + +// For more details on how each format looks like, +// refer: https://github.com/operator-framework/rukpak/tree/main/docs/bundles. +const ( + FormatPlain = "plain" + FormatRegistryV1 = "registry" + FormatHelm = "helm" +) + +// BundleDeploymentStatus defines the observed state of BundleDeployment +type BundleDeploymentStatus struct { + Conditions []metav1.Condition `json:"conditions,omitempty"` + ObservedGeneration int64 `json:"observedGeneration,omitempty"` +} + +// +kubebuilder:object:root=true + +// BundleDeploymentList contains a list of BundleDeployment +type BundleDeploymentList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []BundleDeployment `json:"items"` +} diff --git a/api/v1alpha2/groupversion_info.go b/api/v1alpha2/groupversion_info.go new file mode 100644 index 00000000..acd57d72 --- /dev/null +++ b/api/v1alpha2/groupversion_info.go @@ -0,0 +1,36 @@ +/* +Copyright 2023. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Package v1alpha1 contains API Schema definitions for the core v1alpha1 API group +// +kubebuilder:object:generate=true +// +groupName=core.rukpak.io +package v1alpha2 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "core.rukpak.io", Version: "v1alpha2"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/api/v1alpha2/source_types.go b/api/v1alpha2/source_types.go new file mode 100644 index 00000000..bc0c50f9 --- /dev/null +++ b/api/v1alpha2/source_types.go @@ -0,0 +1,118 @@ +/* +Copyright 2023. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha2 + +import ( + corev1 "k8s.io/api/core/v1" +) + +// BundleDeploymentSource configures the sources +// from where the bundle content needs to be +// downloaded, and the location to unpack it. +type BundleDeplopymentSource struct { + // Kind of source being passed + + // +kubebuilder:validation:type=string + Kind SourceKind `json:"kind"` + + // Image is the bundle image that backs the content of this bundle. + Image *ImageSource `json:"image,omitempty"` + + // Git is the git repository that backs the content of this Bundle. + Git *GitSource `json:"git,omitempty"` + + // HTTP is the remote location that backs the content of this Bundle. + HTTP *HTTPSource `json:"http,omitempty"` + + // Relative location to place the fetched artifacts + // +optional + Destination string `json:"destination,omitempty"` +} + +// SourceKind refers to the kind of source being +// used to unpack contents. +type SourceKind string + +const ( + SourceTypeImage SourceKind = "image" + SourceTypeGit SourceKind = "git" + SourceTypeHTTP SourceKind = "http" +) + +type ImageSource struct { + // Ref contains the reference to a container image containing Bundle contents. + Ref string `json:"ref"` + // Auth configures the authentication method if necessary. + Auth Authentication `json:"auth,omitempty"` +} + +type GitSource struct { + // Repository is a URL link to the git repository containing the bundle. + // Repository is required and the URL should be parsable by a standard git tool. + Repository string `json:"repository"` + + // Directory refers to the location of the bundle within the git repository. + // Directory is optional and if not set defaults to `manifests`. + + // +kubebuilder:default:=manifests + Directory string `json:"directory,omitempty"` + + // Ref configures the git source to clone a specific branch, tag, or commit + // from the specified repo. Ref is required, and exactly one field within Ref + // is required. Setting more than one field or zero fields will result in an + // error. + Ref GitRef `json:"ref"` + + // Auth configures the authentication method if necessary. + Auth Authentication `json:"auth,omitempty"` +} + +type GitRef struct { + // Branch refers to the branch to checkout from the repository. + // The Branch should contain the bundle manifests in the specified directory. + Branch string `json:"branch,omitempty"` + + // Tag refers to the tag to checkout from the repository. + // The Tag should contain the bundle manifests in the specified directory. + Tag string `json:"tag,omitempty"` + + // Commit refers to the commit to checkout from the repository. + // The Commit should contain the bundle manifests in the specified directory. + Commit string `json:"commit,omitempty"` +} + +type Authentication struct { + // Secret contains reference to the secret that has authorization information and is in the namespace that the provisioner is deployed. + // The secret is expected to contain `data.username` and `data.password` for the username and password, respectively for http(s) scheme. + // Refer to https://kubernetes.io/docs/concepts/configuration/secret/#basic-authentication-secret + // For the ssh authorization of the GitSource, the secret is expected to contain `data.ssh-privatekey` and `data.ssh-knownhosts` for the ssh privatekey and the host entry in the known_hosts file respectively. + // Refer to https://kubernetes.io/docs/concepts/configuration/secret/#ssh-authentication-secrets + Secret corev1.LocalObjectReference `json:"secret,omitempty"` + + // InsecureSkipVerify controls whether a client verifies the server's certificate chain and host name. If InsecureSkipVerify + // is true, the clone operation will accept any certificate presented by the server and any host name in that + // certificate. In this mode, TLS is susceptible to machine-in-the-middle attacks unless custom verification is + // used. This should be used only for testing. + InsecureSkipVerify bool `json:"insecureSkipVerify,omitempty"` +} +type HTTPSource struct { + // URL is where the bundle contents is. + URL string `json:"url"` + + // Auth configures the authentication method if necessary. + Auth Authentication `json:"auth,omitempty"` +} diff --git a/api/v1alpha2/zz_generated.deepcopy.go b/api/v1alpha2/zz_generated.deepcopy.go new file mode 100644 index 00000000..95b0cc4f --- /dev/null +++ b/api/v1alpha2/zz_generated.deepcopy.go @@ -0,0 +1,240 @@ +//go:build !ignore_autogenerated +// +build !ignore_autogenerated + +/* + + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by controller-gen. DO NOT EDIT. + +package v1alpha2 + +import ( + "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Authentication) DeepCopyInto(out *Authentication) { + *out = *in + out.Secret = in.Secret +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Authentication. +func (in *Authentication) DeepCopy() *Authentication { + if in == nil { + return nil + } + out := new(Authentication) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BundleDeplopymentSource) DeepCopyInto(out *BundleDeplopymentSource) { + *out = *in + if in.Image != nil { + in, out := &in.Image, &out.Image + *out = new(ImageSource) + **out = **in + } + if in.Git != nil { + in, out := &in.Git, &out.Git + *out = new(GitSource) + **out = **in + } + if in.HTTP != nil { + in, out := &in.HTTP, &out.HTTP + *out = new(HTTPSource) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleDeplopymentSource. +func (in *BundleDeplopymentSource) DeepCopy() *BundleDeplopymentSource { + if in == nil { + return nil + } + out := new(BundleDeplopymentSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BundleDeployment) DeepCopyInto(out *BundleDeployment) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleDeployment. +func (in *BundleDeployment) DeepCopy() *BundleDeployment { + if in == nil { + return nil + } + out := new(BundleDeployment) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BundleDeployment) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BundleDeploymentList) DeepCopyInto(out *BundleDeploymentList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]BundleDeployment, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleDeploymentList. +func (in *BundleDeploymentList) DeepCopy() *BundleDeploymentList { + if in == nil { + return nil + } + out := new(BundleDeploymentList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *BundleDeploymentList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BundleDeploymentSpec) DeepCopyInto(out *BundleDeploymentSpec) { + *out = *in + if in.Sources != nil { + in, out := &in.Sources, &out.Sources + *out = make([]BundleDeplopymentSource, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleDeploymentSpec. +func (in *BundleDeploymentSpec) DeepCopy() *BundleDeploymentSpec { + if in == nil { + return nil + } + out := new(BundleDeploymentSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *BundleDeploymentStatus) DeepCopyInto(out *BundleDeploymentStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new BundleDeploymentStatus. +func (in *BundleDeploymentStatus) DeepCopy() *BundleDeploymentStatus { + if in == nil { + return nil + } + out := new(BundleDeploymentStatus) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GitRef) DeepCopyInto(out *GitRef) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitRef. +func (in *GitRef) DeepCopy() *GitRef { + if in == nil { + return nil + } + out := new(GitRef) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GitSource) DeepCopyInto(out *GitSource) { + *out = *in + out.Ref = in.Ref + out.Auth = in.Auth +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GitSource. +func (in *GitSource) DeepCopy() *GitSource { + if in == nil { + return nil + } + out := new(GitSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *HTTPSource) DeepCopyInto(out *HTTPSource) { + *out = *in + out.Auth = in.Auth +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new HTTPSource. +func (in *HTTPSource) DeepCopy() *HTTPSource { + if in == nil { + return nil + } + out := new(HTTPSource) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ImageSource) DeepCopyInto(out *ImageSource) { + *out = *in + out.Auth = in.Auth +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ImageSource. +func (in *ImageSource) DeepCopy() *ImageSource { + if in == nil { + return nil + } + out := new(ImageSource) + in.DeepCopyInto(out) + return out +} diff --git a/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml b/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml index f604455b..4b0b3193 100644 --- a/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml +++ b/manifests/base/apis/crds/core.rukpak.io_bundledeployments.yaml @@ -376,3 +376,302 @@ spec: storage: true subresources: status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: BundleDeployment is the Schema for the bundledeployments 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: + description: BundleDeploymentSpec defines the desired state of BundleDeployment + properties: + defaultnamespace: + type: string + format: + description: FormatType refers to the allowed bundle formats that + are being accepted in the APIs. + enum: + - plain + - helm + - registry + type: string + paused: + default: false + type: boolean + sources: + items: + description: BundleDeploymentSource configures the sources from + where the bundle content needs to be downloaded, and the location + to unpack it. + properties: + destination: + description: Relative location to place the fetched artifacts + type: string + git: + description: Git is the git repository that backs the content + of this Bundle. + properties: + auth: + description: Auth configures the authentication method if + necessary. + properties: + insecureSkipVerify: + description: InsecureSkipVerify controls whether a client + verifies the server's certificate chain and host name. + If InsecureSkipVerify is true, the clone operation + will accept any certificate presented by the server + and any host name in that certificate. In this mode, + TLS is susceptible to machine-in-the-middle attacks + unless custom verification is used. This should be + used only for testing. + type: boolean + secret: + description: Secret contains reference to the secret + that has authorization information and is in the namespace + that the provisioner is deployed. The secret is expected + to contain `data.username` and `data.password` for + the username and password, respectively for http(s) + scheme. Refer to https://kubernetes.io/docs/concepts/configuration/secret/#basic-authentication-secret + For the ssh authorization of the GitSource, the secret + is expected to contain `data.ssh-privatekey` and `data.ssh-knownhosts` + for the ssh privatekey and the host entry in the known_hosts + file respectively. Refer to https://kubernetes.io/docs/concepts/configuration/secret/#ssh-authentication-secrets + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + type: object + x-kubernetes-map-type: atomic + type: object + directory: + default: manifests + type: string + ref: + description: Ref configures the git source to clone a specific + branch, tag, or commit from the specified repo. Ref is + required, and exactly one field within Ref is required. + Setting more than one field or zero fields will result + in an error. + properties: + branch: + description: Branch refers to the branch to checkout + from the repository. The Branch should contain the + bundle manifests in the specified directory. + type: string + commit: + description: Commit refers to the commit to checkout + from the repository. The Commit should contain the + bundle manifests in the specified directory. + type: string + tag: + description: Tag refers to the tag to checkout from + the repository. The Tag should contain the bundle + manifests in the specified directory. + type: string + type: object + repository: + description: Repository is a URL link to the git repository + containing the bundle. Repository is required and the + URL should be parsable by a standard git tool. + type: string + required: + - ref + - repository + type: object + http: + description: HTTP is the remote location that backs the content + of this Bundle. + properties: + auth: + description: Auth configures the authentication method if + necessary. + properties: + insecureSkipVerify: + description: InsecureSkipVerify controls whether a client + verifies the server's certificate chain and host name. + If InsecureSkipVerify is true, the clone operation + will accept any certificate presented by the server + and any host name in that certificate. In this mode, + TLS is susceptible to machine-in-the-middle attacks + unless custom verification is used. This should be + used only for testing. + type: boolean + secret: + description: Secret contains reference to the secret + that has authorization information and is in the namespace + that the provisioner is deployed. The secret is expected + to contain `data.username` and `data.password` for + the username and password, respectively for http(s) + scheme. Refer to https://kubernetes.io/docs/concepts/configuration/secret/#basic-authentication-secret + For the ssh authorization of the GitSource, the secret + is expected to contain `data.ssh-privatekey` and `data.ssh-knownhosts` + for the ssh privatekey and the host entry in the known_hosts + file respectively. Refer to https://kubernetes.io/docs/concepts/configuration/secret/#ssh-authentication-secrets + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + type: object + x-kubernetes-map-type: atomic + type: object + url: + description: URL is where the bundle contents is. + type: string + required: + - url + type: object + image: + description: Image is the bundle image that backs the content + of this bundle. + properties: + auth: + description: Auth configures the authentication method if + necessary. + properties: + insecureSkipVerify: + description: InsecureSkipVerify controls whether a client + verifies the server's certificate chain and host name. + If InsecureSkipVerify is true, the clone operation + will accept any certificate presented by the server + and any host name in that certificate. In this mode, + TLS is susceptible to machine-in-the-middle attacks + unless custom verification is used. This should be + used only for testing. + type: boolean + secret: + description: Secret contains reference to the secret + that has authorization information and is in the namespace + that the provisioner is deployed. The secret is expected + to contain `data.username` and `data.password` for + the username and password, respectively for http(s) + scheme. Refer to https://kubernetes.io/docs/concepts/configuration/secret/#basic-authentication-secret + For the ssh authorization of the GitSource, the secret + is expected to contain `data.ssh-privatekey` and `data.ssh-knownhosts` + for the ssh privatekey and the host entry in the known_hosts + file respectively. Refer to https://kubernetes.io/docs/concepts/configuration/secret/#ssh-authentication-secrets + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names + TODO: Add other useful fields. apiVersion, kind, + uid?' + type: string + type: object + x-kubernetes-map-type: atomic + type: object + ref: + description: Ref contains the reference to a container image + containing Bundle contents. + type: string + required: + - ref + type: object + kind: + description: SourceKind refers to the kind of source being used + to unpack contents. + type: string + required: + - kind + type: object + minItems: 1 + type: array + required: + - format + - sources + type: object + status: + description: BundleDeploymentStatus defines the observed state of BundleDeployment + properties: + conditions: + 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 }" + 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. + format: date-time + type: string + message: + description: message is a human readable message indicating + details about the transition. This may be an empty string. + maxLength: 32768 + type: string + 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. + format: int64 + minimum: 0 + type: integer + 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. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + 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. + --- 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) + 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: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + observedGeneration: + format: int64 + type: integer + type: object + required: + - spec + type: object + served: true + storage: false + subresources: + status: {}