diff --git a/class/defaults.yml b/class/defaults.yml index 96d8404..0e14645 100644 --- a/class/defaults.yml +++ b/class/defaults.yml @@ -38,6 +38,14 @@ parameters: labels: {} name: syn-kubevirt-cna + hostpath_provisioner: + enabled: true + version: v0.18.0 + namespace: + annotations: {} + labels: {} + name: syn-kubevirt-hostpath + hostpath: {} quota: {} scale: {} @@ -46,7 +54,7 @@ parameters: kubevirt: {} importer: {} network_addons: {} - hostpath: {} + hostpath_provisioner: {} quota: {} scale: {} diff --git a/class/kubevirt-operator.yml b/class/kubevirt-operator.yml index 3ae8ba6..84375a4 100644 --- a/class/kubevirt-operator.yml +++ b/class/kubevirt-operator.yml @@ -1,23 +1,34 @@ parameters: kapitan: dependencies: + # --- kubevirt - type: https source: https://github.com/kubevirt/kubevirt/releases/download/${kubevirt_operator:operators:kubevirt:version}/kubevirt-operator.yaml output_path: ${_base_directory}/manifests/kubevirt-${kubevirt_operator:operators:kubevirt:version}/kubevirt-operator.yaml + # --- containerized data importer - type: https source: https://github.com/kubevirt/containerized-data-importer/releases/download/${kubevirt_operator:operators:importer:version}/cdi-operator.yaml output_path: ${_base_directory}/manifests/cdi-${kubevirt_operator:operators:importer:version}/cdi-operator.yaml + # --- cluster network addons - type: https source: https://github.com/kubevirt/cluster-network-addons-operator/releases/download/${kubevirt_operator:operators:network_addons:version}/operator.yaml output_path: ${_base_directory}/manifests/cna-${kubevirt_operator:operators:network_addons:version}/operator.yaml - type: https source: https://github.com/kubevirt/cluster-network-addons-operator/releases/download/${kubevirt_operator:operators:network_addons:version}/network-addons-config.crd.yaml output_path: ${_base_directory}/manifests/cna-${kubevirt_operator:operators:network_addons:version}/crd.yaml + # --- hostpath provisioner + - type: https + source: https://github.com/kubevirt/hostpath-provisioner-operator/releases/download/${kubevirt_operator:operators:hostpath_provisioner:version}/operator.yaml + output_path: ${_base_directory}/manifests/hpp-${kubevirt_operator:operators:hostpath_provisioner:version}/operator.yaml compile: - input_paths: - ${_base_directory}/component/app.jsonnet input_type: jsonnet output_path: apps/ + - input_paths: + - ${_base_directory}/component/main.jsonnet + input_type: jsonnet + output_path: kubevirt-operator/ - input_paths: - ${_base_directory}/component/importer.jsonnet input_type: jsonnet diff --git a/component/app.jsonnet b/component/app.jsonnet index a1f06e1..7d04667 100644 --- a/component/app.jsonnet +++ b/component/app.jsonnet @@ -55,4 +55,16 @@ local app = argocd.App('kubevirt-operator', params.kubevirt.namespace.name); }, }, }, + [if helper.isEnabled('hostpath_provisioner') then 'kubevirt-hpp']: app { + spec+: { + source: { + path: 'manifests/kubevirt-operator/40_hostpath_provisioner', + }, + syncPolicy+: { + syncOptions+: [ + 'ServerSideApply=true', + ], + }, + }, + }, } diff --git a/component/helper.libsonnet b/component/helper.libsonnet index bf8a6aa..3deb63c 100644 --- a/component/helper.libsonnet +++ b/component/helper.libsonnet @@ -38,6 +38,29 @@ local patchManifests(path, namespace) = std.map( manifests('kubevirt-operator/manifests/' + path) ); +// Instances +local _instanceObj = { + data_importer: { + apiVersion: 'cdi.kubevirt.io/v1beta1', + kind: 'CDI', + }, + hostpath_provisioner: { + apiVersion: 'hostpathprovisioner.kubevirt.io/v1beta1', + kind: 'HostPathProvisioner', + }, +}; +local instance(component, namespace, config={}) = _instanceObj[component] { + metadata+: { + labels: { + 'app.kubernetes.io/managed-by': 'commodore', + 'app.kubernetes.io/name': 'instance', + 'app.kubernetes.io/instance': component, + }, + namespace: namespace, + }, + spec: if std.length(config) > 0 then config else std.get(params.config, component, {}), +}; + // Component local componentEnabled(component) = if component == 'hyperconverged' then @@ -48,5 +71,6 @@ local componentEnabled(component) = { load: patchManifests, + instance: instance, isEnabled: componentEnabled, } diff --git a/component/main.jsonnet b/component/main.jsonnet new file mode 100644 index 0000000..7c16d17 --- /dev/null +++ b/component/main.jsonnet @@ -0,0 +1,36 @@ +// main template for kubevirt-operator +local com = import 'lib/commodore.libjsonnet'; +local kap = import 'lib/kapitan.libjsonnet'; +local kube = import 'lib/kube.libjsonnet'; + +local helper = import 'helper.libsonnet'; + +// The hiera parameters for the component +local inv = kap.inventory(); +local params = inv.parameters.kubevirt_operator; +local isOpenshift = std.startsWith(inv.parameters.facts.distribution, 'openshift'); + +// Namespace +// local namespace = kube.Namespace(params.namespace.name) { +// metadata+: { +// annotations+: params.namespace.annotations, +// labels+: { +// // Configure the namespaces so that the OCP4 cluster-monitoring +// // Prometheus can find the servicemonitors and rules. +// [if isOpenshift then 'openshift.io/cluster-monitoring']: 'true', +// } + com.makeMergeable(params.namespace.labels), +// }, +// }; + +// Instance + +// Define outputs below +{ + [if helper.isEnabled('hostpath_provisioner') then '40_hostpath_provisioner/10_bundle']: helper.load('hpp-%s/operator.yaml' % params.operators.hostpath_provisioner.version, params.operators.hostpath_provisioner.namespace.name), + [if std.length(params.config.hostpath_provisioner) > 0 then '40_hostpath_provisioner/20_instance']: helper.instance('hostpath_provisioner', params.operators.hostpath_provisioner.namespace.name), +} +// if helper.isEnabled('importer') then { +// '20_importer/00_namespace': namespace, +// '20_importer/10_bundle': helper.load('cdi-%s/cdi-operator.yaml' % operator.version, operator.namespace.name), +// [if std.length(config) > 0 then '20_importer/20_instance']: instance, +// } else {} diff --git a/tests/golden/defaults/kubevirt-operator/apps/kubevirt-hpp.yaml b/tests/golden/defaults/kubevirt-operator/apps/kubevirt-hpp.yaml new file mode 100644 index 0000000..8d883db --- /dev/null +++ b/tests/golden/defaults/kubevirt-operator/apps/kubevirt-hpp.yaml @@ -0,0 +1,6 @@ +spec: + source: + path: manifests/kubevirt-operator/40_hostpath_provisioner + syncPolicy: + syncOptions: + - ServerSideApply=true diff --git a/tests/golden/defaults/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/10_bundle.yaml b/tests/golden/defaults/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/10_bundle.yaml new file mode 100644 index 0000000..f1a816a --- /dev/null +++ b/tests/golden/defaults/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/10_bundle.yaml @@ -0,0 +1,2021 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator +rules: + - apiGroups: + - '' + resources: + - persistentvolumes + verbs: + - '*' + - apiGroups: + - '' + resources: + - persistentvolumeclaims + verbs: + - get + - list + - watch + - create + - update + - apiGroups: + - '' + resources: + - events + verbs: + - get + - list + - watch + - create + - patch + - update + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + resources: + - clusterrolebindings + verbs: + - update + - delete + - apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterrolebindings + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterroles + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + resources: + - clusterroles + verbs: + - update + - delete + - apiGroups: + - apps + resourceNames: + - hostpath-provisioner-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - hostpathprovisioner.kubevirt.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - security.openshift.io + resources: + - securitycontextconstraints + verbs: + - list + - get + - watch + - create + - apiGroups: + - security.openshift.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-csi + resources: + - securitycontextconstraints + verbs: + - delete + - update + - apiGroups: + - config.openshift.io + resources: + - apiservers + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - list + - get + - watch + - apiGroups: + - '' + resources: + - nodes + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - csinodes + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - csidrivers + verbs: + - list + - create + - get + - watch + - apiGroups: + - storage.k8s.io + resourceNames: + - kubevirt.io.hostpath-provisioner + resources: + - csidrivers + verbs: + - delete + - update + - apiGroups: + - storage.k8s.io + resources: + - volumeattachments + verbs: + - get + - list + - watch + - patch + - apiGroups: + - storage.k8s.io + resources: + - volumeattachments/status + verbs: + - patch + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshotclasses + verbs: + - get + - list + - watch + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshots + verbs: + - get + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshotcontents + verbs: + - create + - get + - list + - watch + - update + - delete + - patch + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshotcontents/status + verbs: + - update + - patch + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +rules: + - apiGroups: + - apps + resources: + - daemonsets + verbs: + - list + - get + - watch + - create + - apiGroups: + - apps + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-csi + resources: + - daemonsets + verbs: + - delete + - update + - apiGroups: + - apps + resources: + - deployments + verbs: + - list + - get + - watch + - create + - delete + - update + - apiGroups: + - '' + resources: + - endpoints + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - services + verbs: + - get + - list + - watch + - create + - apiGroups: + - '' + resourceNames: + - hpp-prometheus-metrics + resources: + - services + verbs: + - update + - delete + - apiGroups: + - '' + resources: + - configmaps + verbs: + - create + - get + - apiGroups: + - '' + resourceNames: + - hostpath-provisioner-operator-lock + resources: + - configmaps + verbs: + - update + - apiGroups: + - '' + resources: + - serviceaccounts + verbs: + - list + - get + - create + - watch + - apiGroups: + - '' + resourceNames: + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + resources: + - serviceaccounts + verbs: + - update + - delete + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - '*' + - apiGroups: + - storage.k8s.io + resources: + - csistoragecapacities + verbs: + - '*' + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + - prometheusrules + verbs: + - list + - get + - watch + - create + - delete + - update + - patch + - apiGroups: + - rbac.authorization.k8s.io + resources: + - rolebindings + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + - hostpath-provisioner-monitoring + resources: + - rolebindings + verbs: + - update + - delete + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + - hostpath-provisioner-monitoring + resources: + - roles + verbs: + - update + - delete + - apiGroups: + - batch + resources: + - jobs + verbs: + - create + - delete + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: hostpath-provisioner-operator +subjects: + - kind: ServiceAccount + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: hostpath-provisioner-operator +subjects: + - kind: ServiceAccount + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.13.0 + labels: {} + name: hostpathprovisioners.hostpathprovisioner.kubevirt.io +spec: + group: hostpathprovisioner.kubevirt.io + names: + kind: HostPathProvisioner + listKind: HostPathProvisionerList + plural: hostpathprovisioners + singular: hostpathprovisioner + scope: Cluster + versions: + - name: v1beta1 + schema: + openAPIV3Schema: + description: HostPathProvisioner is the Schema for the hostpathprovisioners + 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: HostPathProvisionerSpec defines the desired state of HostPathProvisioner + properties: + featureGates: + description: FeatureGates are a list of specific enabled feature + gates + items: + type: string + type: array + x-kubernetes-list-type: set + imagePullPolicy: + description: ImagePullPolicy is the container pull policy for the + host path provisioner containers + type: string + pathConfig: + description: PathConfig describes the location and layout of PV + storage on nodes. Deprecated + properties: + path: + description: Path The path the directories for the PVs are created + under + type: string + useNamingPrefix: + description: UseNamingPrefix Use the name of the PVC requesting + the PV as part of the directory created + type: boolean + type: object + storagePools: + description: StoragePools are a list of storage pools + items: + description: StoragePool defines how and where hostpath provisioner + can use storage to create volumes. + properties: + name: + description: Name specifies an identifier that is used in + the storage class arguments to identify the source to use. + type: string + path: + description: path the path to use on the host, this is a required + field + type: string + pvcTemplate: + description: PVCTemplate is the template of the PVC to create + as the source volume + properties: + accessModes: + description: 'accessModes contains the desired access + modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + dataSource: + description: 'dataSource field can be used to specify + either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) + * An existing PVC (PersistentVolumeClaim) If the provisioner + or an external controller can support the specified + data source, it will create a new volume based on the + contents of the specified data source. When the AnyVolumeDataSource + feature gate is enabled, dataSource contents will be + copied to dataSourceRef, and dataSourceRef contents + will be copied to dataSource when dataSourceRef.namespace + is not specified. If the namespace is specified, then + dataSourceRef will not be copied to dataSource.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: 'dataSourceRef specifies the object from + which to populate the volume with data, if a non-empty + volume is desired. This may be any object from a non-empty + API group (non core object) or a PersistentVolumeClaim + object. When this field is specified, volume binding + will only succeed if the type of the specified object + matches some installed volume populator or dynamic provisioner. + This field will replace the functionality of the dataSource + field and as such if both fields are non-empty, they + must have the same value. For backwards compatibility, + when namespace isn''t specified in dataSourceRef, both + fields (dataSource and dataSourceRef) will be set to + the same value automatically if one of them is empty + and the other is non-empty. When namespace is specified + in dataSourceRef, dataSource isn''t set to the same + value and must be empty. There are three important differences + between dataSource and dataSourceRef: * While dataSource + only allows two specific types of objects, dataSourceRef + allows any non-core object, as well as PersistentVolumeClaim + objects. * While dataSource ignores disallowed values + (dropping them), dataSourceRef preserves all values, + and generates an error if a disallowed value is specified. + * While dataSource only allows local objects, dataSourceRef + allows objects in any namespaces. (Beta) Using this + field requires the AnyVolumeDataSource feature gate + to be enabled. (Alpha) Using the namespace field of + dataSourceRef requires the CrossNamespaceVolumeDataSource + feature gate to be enabled.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + namespace: + description: Namespace is the namespace of resource + being referenced Note that when a namespace is specified, + a gateway.networking.k8s.io/ReferenceGrant object + is required in the referent namespace to allow that + namespace's owner to accept the reference. See the + ReferenceGrant documentation for details. (Alpha) + This field requires the CrossNamespaceVolumeDataSource + feature gate to be enabled. + type: string + required: + - kind + - name + type: object + resources: + description: 'resources represents the minimum resources + the volume should have. If RecoverVolumeExpansionFailure + feature is enabled users are allowed to specify resource + requirements that are lower than previous value but + must still be higher than capacity recorded in the status + field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + properties: + claims: + description: "Claims lists the names of resources,\ + \ defined in spec.resourceClaims, that are used\ + \ by this container. \n This is an alpha field and\ + \ requires enabling the DynamicResourceAllocation\ + \ feature gate. \n 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 + 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 + selector: + description: selector is a label query over volumes to + consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values + array must be non-empty. If the operator is + Exists or DoesNotExist, the values array must + be empty. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field + is "key", the operator is "In", and the values array + contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: 'storageClassName is the name of the StorageClass + required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is + required by the claim. Value of Filesystem is implied + when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference to the + PersistentVolume backing this claim. + type: string + type: object + required: + - name + - path + type: object + type: array + x-kubernetes-list-type: atomic + workload: + description: Restrict on which nodes HPP workload pods will be scheduled + properties: + affinity: + description: affinity enables pod affinity/anti-affinity placement + expanding the types of constraints that can be expressed with + nodeSelector. affinity is going to be applied to the relevant + kind of pods in parallel with nodeSelector See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for + the pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a + no-op). A null preferred scheduling term matches + no objects (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated + with the corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range + 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to an + update), the system may or may not try to eventually + evict the pod from its node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. + co-locate this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the + corresponding podAffinityTerm; the node(s) with the + highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of + namespaces that the term applies to. The + term is applied to the union of the namespaces + selected by this field and the ones listed + in the namespaces field. null selector and + null or empty namespaces list means "this + pod's namespace". An empty selector ({}) + matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static + list of namespace names that the term applies + to. The term is applied to the union of + the namespaces listed in this field and + the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector + means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces + field. null selector and null or empty namespaces + list means "this pod's namespace". An empty + selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. + The term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. null or empty namespaces + list and null namespaceSelector means "this + pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules + (e.g. avoid putting this pod in the same node, zone, etc. + as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the greatest + sum of weights, i.e. for each node that meets all + of the scheduling requirements (resource request, + requiredDuringScheduling anti-affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if the + node has pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of + namespaces that the term applies to. The + term is applied to the union of the namespaces + selected by this field and the ones listed + in the namespaces field. null selector and + null or empty namespaces list means "this + pod's namespace". An empty selector ({}) + matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static + list of namespace names that the term applies + to. The term is applied to the union of + the namespaces listed in this field and + the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector + means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the anti-affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces + field. null selector and null or empty namespaces + list means "this pod's namespace". An empty + selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. + The term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. null or empty namespaces + list and null namespaceSelector means "this + pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + nodeSelector: + additionalProperties: + type: string + description: 'nodeSelector is the node selector applied to the + relevant kind of pods It specifies a map of key-value pairs: + for the pod to be eligible to run on a node, the node must + have each of the indicated key-value pairs as labels (it can + have additional labels as well). See https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector' + type: object + tolerations: + description: tolerations is a list of tolerations applied to + the relevant kind of pods See https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + for more info. These are additional tolerations other than + default ones. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints of + a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array + type: object + type: object + status: + description: HostPathProvisionerStatus defines the observed state of + HostPathProvisioner + properties: + conditions: + description: Conditions contains the current conditions observed + by the operator + items: + description: Condition represents the state of the operator's + reconciliation functionality. + properties: + lastHeartbeatTime: + format: date-time + type: string + lastTransitionTime: + format: date-time + type: string + message: + type: string + reason: + type: string + status: + type: string + type: + description: ConditionType is the state of the operator's + reconciliation functionality. + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + observedVersion: + description: ObservedVersion The observed version of the HostPathProvisioner + deployment + type: string + operatorVersion: + description: OperatorVersion The version of the HostPathProvisioner + Operator + type: string + storagePoolStatuses: + items: + description: StoragePoolStatus is the status of the named storage + pool + properties: + claimStatuses: + description: The status of all the claims. + items: + description: ClaimStatus defines the storage claim status + for each PVC in a storage pool + properties: + name: + description: Name of the PersistentVolumeClaim + type: string + status: + description: Status of the PersistentVolumeClaim + properties: + accessModes: + description: 'accessModes contains the actual access + modes the volume backing the PVC has. More info: + https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a + resource that it does not recognizes, then it + should ignore that update and let other controllers + handle it. + type: string + description: "allocatedResourceStatuses stores status\ + \ of resource being resized for the given PVC.\ + \ Key names follow standard Kubernetes label syntax.\ + \ Valid values are either: * Un-prefixed keys:\ + \ - storage - the capacity of the volume. * Custom\ + \ resources must use implementation-defined prefixed\ + \ names such as \"example.com/my-custom-resource\"\ + \ Apart from above values - keys that are unprefixed\ + \ or have kubernetes.io prefix are considered\ + \ reserved and hence may not be used. \n ClaimResourceStatus\ + \ can be in any of following states: - ControllerResizeInProgress:\ + \ State set when resize controller starts resizing\ + \ the volume in control-plane. - ControllerResizeFailed:\ + \ State set when resize has failed in resize controller\ + \ with a terminal error. - NodeResizePending:\ + \ State set when resize controller has finished\ + \ resizing the volume but further resizing of\ + \ volume is needed on the node. - NodeResizeInProgress:\ + \ State set when kubelet starts resizing the volume.\ + \ - NodeResizeFailed: State set when resizing\ + \ has failed in kubelet with a terminal error.\ + \ Transient errors don't set NodeResizeFailed.\ + \ For example: if expanding a PVC for more capacity\ + \ - this field can be one of the following states:\ + \ - pvc.status.allocatedResourceStatus['storage']\ + \ = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"NodeResizeFailed\" When this field is not\ + \ set, it means that no resize operation is in\ + \ progress for the given PVC. \n A controller\ + \ that receives PVC update with previously unknown\ + \ resourceName or ClaimResourceStatus should ignore\ + \ the update for the purpose it was designed.\ + \ For example - a controller that only is responsible\ + \ for resizing capacity of the volume, should\ + \ ignore PVC updates that change other valid resources\ + \ associated with PVC. \n This is an alpha field\ + \ and requires enabling RecoverVolumeExpansionFailure\ + \ feature." + type: object + x-kubernetes-map-type: granular + allocatedResources: + 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: "allocatedResources tracks the resources\ + \ allocated to a PVC including its capacity. Key\ + \ names follow standard Kubernetes label syntax.\ + \ Valid values are either: * Un-prefixed keys:\ + \ - storage - the capacity of the volume. * Custom\ + \ resources must use implementation-defined prefixed\ + \ names such as \"example.com/my-custom-resource\"\ + \ Apart from above values - keys that are unprefixed\ + \ or have kubernetes.io prefix are considered\ + \ reserved and hence may not be used. \n Capacity\ + \ reported here may be larger than the actual\ + \ capacity when a volume expansion operation is\ + \ requested. For storage quota, the larger value\ + \ from allocatedResources and PVC.spec.resources\ + \ is used. If allocatedResources is not set, PVC.spec.resources\ + \ alone is used for quota calculation. If a volume\ + \ expansion capacity request is lowered, allocatedResources\ + \ is only lowered if there are no expansion operations\ + \ in progress and if the actual volume capacity\ + \ is equal or lower than the requested capacity.\ + \ \n A controller that receives PVC update with\ + \ previously unknown resourceName should ignore\ + \ the update for the purpose it was designed.\ + \ For example - a controller that only is responsible\ + \ for resizing capacity of the volume, should\ + \ ignore PVC updates that change other valid resources\ + \ associated with PVC. \n This is an alpha field\ + \ and requires enabling RecoverVolumeExpansionFailure\ + \ feature." + type: object + capacity: + 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: capacity represents the actual resources + of the underlying volume. + type: object + conditions: + description: conditions is the current Condition + of persistent volume claim. If underlying persistent + volume is being resized then the Condition will + be set to 'ResizeStarted'. + items: + description: PersistentVolumeClaimCondition contains + details about state of pvc + properties: + lastProbeTime: + description: lastProbeTime is the time we + probed the condition. + format: date-time + type: string + lastTransitionTime: + description: lastTransitionTime is the time + the condition transitioned from one status + to another. + format: date-time + type: string + message: + description: message is the human-readable + message indicating details about last transition. + type: string + reason: + description: reason is a unique, this should + be a short, machine understandable string + that gives the reason for condition's last + transition. If it reports "ResizeStarted" + that means the underlying persistent volume + is being resized. + type: string + status: + type: string + type: + description: PersistentVolumeClaimConditionType + is a valid value of PersistentVolumeClaimCondition.Type + type: string + required: + - status + - type + type: object + type: array + phase: + description: phase represents the current phase + of PersistentVolumeClaim. + type: string + type: object + required: + - name + - status + type: object + type: array + x-kubernetes-list-type: atomic + currentReady: + description: CurrentReady is the number of currently ready + replicasets. + type: integer + desiredReady: + description: DesiredReady is the number of desired ready replicasets. + type: integer + name: + description: Name is the name of the storage pool + type: string + phase: + description: StoragePoolPhase indicates which phase the storage + pool is in. + type: string + required: + - name + - phase + type: object + type: array + x-kubernetes-list-type: atomic + targetVersion: + description: TargetVersion The targeted version of the HostPathProvisioner + deployment + type: string + type: object + type: object + served: true + storage: true +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/managed-by: commodore + prometheus.hostpathprovisioner.kubevirt.io: 'true' + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +spec: + replicas: 1 + selector: + matchLabels: + name: hostpath-provisioner-operator + template: + metadata: + labels: + name: hostpath-provisioner-operator + prometheus.hostpathprovisioner.kubevirt.io: 'true' + spec: + containers: + - command: + - hostpath-provisioner-operator + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: INSTALLER_PART_OF_LABEL + valueFrom: + fieldRef: + fieldPath: metadata.labels['app.kubernetes.io/part-of'] + - name: INSTALLER_VERSION_LABEL + valueFrom: + fieldRef: + fieldPath: metadata.labels['app.kubernetes.io/version'] + - name: OPERATOR_NAME + value: hostpath-provisioner-operator + - name: OPERATOR_IMAGE + value: quay.io/kubevirt/hostpath-provisioner-operator:v0.18.0 + - name: PROVISIONER_IMAGE + value: quay.io/kubevirt/hostpath-provisioner:v0.18.0 + - name: CSI_PROVISIONER_IMAGE + value: quay.io/kubevirt/hostpath-csi-driver:v0.18.0 + - name: NODE_DRIVER_REG_IMAGE + value: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.2.0 + - name: LIVENESS_PROBE_IMAGE + value: registry.k8s.io/sig-storage/livenessprobe:v2.3.0 + - name: CSI_SNAPSHOT_IMAGE + value: registry.k8s.io/sig-storage/csi-snapshotter:v4.2.1 + - name: CSI_SIG_STORAGE_PROVISIONER_IMAGE + value: registry.k8s.io/sig-storage/csi-provisioner:v3.4.1 + - name: VERBOSITY + value: '3' + - name: MONITORING_NAMESPACE + value: '' + image: quay.io/kubevirt/hostpath-provisioner-operator:v0.18.0 + imagePullPolicy: Always + livenessProbe: + failureThreshold: 1 + httpGet: + path: /livez + port: 6060 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 5 + name: hostpath-provisioner-operator + ports: + - containerPort: 8080 + name: metrics + protocol: TCP + readinessProbe: + failureThreshold: 1 + httpGet: + path: /readyz + port: 6060 + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 5 + resources: + requests: + cpu: 10m + memory: 150Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: apiservice-cert + serviceAccountName: hostpath-provisioner-operator + volumes: + - name: apiservice-cert + secret: + defaultMode: 420 + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + secretName: hostpath-provisioner-operator-webhook-service-cert diff --git a/tests/golden/withtypes/kubevirt-operator/apps/kubevirt-hpp.yaml b/tests/golden/withtypes/kubevirt-operator/apps/kubevirt-hpp.yaml new file mode 100644 index 0000000..8d883db --- /dev/null +++ b/tests/golden/withtypes/kubevirt-operator/apps/kubevirt-hpp.yaml @@ -0,0 +1,6 @@ +spec: + source: + path: manifests/kubevirt-operator/40_hostpath_provisioner + syncPolicy: + syncOptions: + - ServerSideApply=true diff --git a/tests/golden/withtypes/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/10_bundle.yaml b/tests/golden/withtypes/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/10_bundle.yaml new file mode 100644 index 0000000..f1a816a --- /dev/null +++ b/tests/golden/withtypes/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/10_bundle.yaml @@ -0,0 +1,2021 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator +rules: + - apiGroups: + - '' + resources: + - persistentvolumes + verbs: + - '*' + - apiGroups: + - '' + resources: + - persistentvolumeclaims + verbs: + - get + - list + - watch + - create + - update + - apiGroups: + - '' + resources: + - events + verbs: + - get + - list + - watch + - create + - patch + - update + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + resources: + - clusterrolebindings + verbs: + - update + - delete + - apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterrolebindings + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resources: + - clusterroles + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + resources: + - clusterroles + verbs: + - update + - delete + - apiGroups: + - apps + resourceNames: + - hostpath-provisioner-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - hostpathprovisioner.kubevirt.io + resources: + - '*' + verbs: + - '*' + - apiGroups: + - security.openshift.io + resources: + - securitycontextconstraints + verbs: + - list + - get + - watch + - create + - apiGroups: + - security.openshift.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-csi + resources: + - securitycontextconstraints + verbs: + - delete + - update + - apiGroups: + - config.openshift.io + resources: + - apiservers + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - list + - get + - watch + - apiGroups: + - '' + resources: + - nodes + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - csinodes + verbs: + - get + - list + - watch + - apiGroups: + - storage.k8s.io + resources: + - csidrivers + verbs: + - list + - create + - get + - watch + - apiGroups: + - storage.k8s.io + resourceNames: + - kubevirt.io.hostpath-provisioner + resources: + - csidrivers + verbs: + - delete + - update + - apiGroups: + - storage.k8s.io + resources: + - volumeattachments + verbs: + - get + - list + - watch + - patch + - apiGroups: + - storage.k8s.io + resources: + - volumeattachments/status + verbs: + - patch + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshotclasses + verbs: + - get + - list + - watch + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshots + verbs: + - get + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshotcontents + verbs: + - create + - get + - list + - watch + - update + - delete + - patch + - apiGroups: + - snapshot.storage.k8s.io + resources: + - volumesnapshotcontents/status + verbs: + - update + - patch + - apiGroups: + - '' + resources: + - pods + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +rules: + - apiGroups: + - apps + resources: + - daemonsets + verbs: + - list + - get + - watch + - create + - apiGroups: + - apps + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-csi + resources: + - daemonsets + verbs: + - delete + - update + - apiGroups: + - apps + resources: + - deployments + verbs: + - list + - get + - watch + - create + - delete + - update + - apiGroups: + - '' + resources: + - endpoints + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - services + verbs: + - get + - list + - watch + - create + - apiGroups: + - '' + resourceNames: + - hpp-prometheus-metrics + resources: + - services + verbs: + - update + - delete + - apiGroups: + - '' + resources: + - configmaps + verbs: + - create + - get + - apiGroups: + - '' + resourceNames: + - hostpath-provisioner-operator-lock + resources: + - configmaps + verbs: + - update + - apiGroups: + - '' + resources: + - serviceaccounts + verbs: + - list + - get + - create + - watch + - apiGroups: + - '' + resourceNames: + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + resources: + - serviceaccounts + verbs: + - update + - delete + - apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - '*' + - apiGroups: + - storage.k8s.io + resources: + - csistoragecapacities + verbs: + - '*' + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + - prometheusrules + verbs: + - list + - get + - watch + - create + - delete + - update + - patch + - apiGroups: + - rbac.authorization.k8s.io + resources: + - rolebindings + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resources: + - roles + verbs: + - list + - get + - watch + - create + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + - hostpath-provisioner-monitoring + resources: + - rolebindings + verbs: + - update + - delete + - apiGroups: + - rbac.authorization.k8s.io + resourceNames: + - hostpath-provisioner + - hostpath-provisioner-admin + - hostpath-provisioner-admin-csi + - hostpath-provisioner-monitoring + resources: + - roles + verbs: + - update + - delete + - apiGroups: + - batch + resources: + - jobs + verbs: + - create + - delete + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: hostpath-provisioner-operator +subjects: + - kind: ServiceAccount + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/managed-by: commodore + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: hostpath-provisioner-operator +subjects: + - kind: ServiceAccount + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.13.0 + labels: {} + name: hostpathprovisioners.hostpathprovisioner.kubevirt.io +spec: + group: hostpathprovisioner.kubevirt.io + names: + kind: HostPathProvisioner + listKind: HostPathProvisionerList + plural: hostpathprovisioners + singular: hostpathprovisioner + scope: Cluster + versions: + - name: v1beta1 + schema: + openAPIV3Schema: + description: HostPathProvisioner is the Schema for the hostpathprovisioners + 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: HostPathProvisionerSpec defines the desired state of HostPathProvisioner + properties: + featureGates: + description: FeatureGates are a list of specific enabled feature + gates + items: + type: string + type: array + x-kubernetes-list-type: set + imagePullPolicy: + description: ImagePullPolicy is the container pull policy for the + host path provisioner containers + type: string + pathConfig: + description: PathConfig describes the location and layout of PV + storage on nodes. Deprecated + properties: + path: + description: Path The path the directories for the PVs are created + under + type: string + useNamingPrefix: + description: UseNamingPrefix Use the name of the PVC requesting + the PV as part of the directory created + type: boolean + type: object + storagePools: + description: StoragePools are a list of storage pools + items: + description: StoragePool defines how and where hostpath provisioner + can use storage to create volumes. + properties: + name: + description: Name specifies an identifier that is used in + the storage class arguments to identify the source to use. + type: string + path: + description: path the path to use on the host, this is a required + field + type: string + pvcTemplate: + description: PVCTemplate is the template of the PVC to create + as the source volume + properties: + accessModes: + description: 'accessModes contains the desired access + modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + dataSource: + description: 'dataSource field can be used to specify + either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) + * An existing PVC (PersistentVolumeClaim) If the provisioner + or an external controller can support the specified + data source, it will create a new volume based on the + contents of the specified data source. When the AnyVolumeDataSource + feature gate is enabled, dataSource contents will be + copied to dataSourceRef, and dataSourceRef contents + will be copied to dataSource when dataSourceRef.namespace + is not specified. If the namespace is specified, then + dataSourceRef will not be copied to dataSource.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + description: 'dataSourceRef specifies the object from + which to populate the volume with data, if a non-empty + volume is desired. This may be any object from a non-empty + API group (non core object) or a PersistentVolumeClaim + object. When this field is specified, volume binding + will only succeed if the type of the specified object + matches some installed volume populator or dynamic provisioner. + This field will replace the functionality of the dataSource + field and as such if both fields are non-empty, they + must have the same value. For backwards compatibility, + when namespace isn''t specified in dataSourceRef, both + fields (dataSource and dataSourceRef) will be set to + the same value automatically if one of them is empty + and the other is non-empty. When namespace is specified + in dataSourceRef, dataSource isn''t set to the same + value and must be empty. There are three important differences + between dataSource and dataSourceRef: * While dataSource + only allows two specific types of objects, dataSourceRef + allows any non-core object, as well as PersistentVolumeClaim + objects. * While dataSource ignores disallowed values + (dropping them), dataSourceRef preserves all values, + and generates an error if a disallowed value is specified. + * While dataSource only allows local objects, dataSourceRef + allows objects in any namespaces. (Beta) Using this + field requires the AnyVolumeDataSource feature gate + to be enabled. (Alpha) Using the namespace field of + dataSourceRef requires the CrossNamespaceVolumeDataSource + feature gate to be enabled.' + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + namespace: + description: Namespace is the namespace of resource + being referenced Note that when a namespace is specified, + a gateway.networking.k8s.io/ReferenceGrant object + is required in the referent namespace to allow that + namespace's owner to accept the reference. See the + ReferenceGrant documentation for details. (Alpha) + This field requires the CrossNamespaceVolumeDataSource + feature gate to be enabled. + type: string + required: + - kind + - name + type: object + resources: + description: 'resources represents the minimum resources + the volume should have. If RecoverVolumeExpansionFailure + feature is enabled users are allowed to specify resource + requirements that are lower than previous value but + must still be higher than capacity recorded in the status + field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + properties: + claims: + description: "Claims lists the names of resources,\ + \ defined in spec.resourceClaims, that are used\ + \ by this container. \n This is an alpha field and\ + \ requires enabling the DynamicResourceAllocation\ + \ feature gate. \n 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 + 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 + selector: + description: selector is a label query over volumes to + consider for binding. + properties: + matchExpressions: + description: matchExpressions is a list of label selector + requirements. The requirements are ANDed. + items: + description: A label selector requirement is a selector + that contains values, a key, and an operator that + relates the key and values. + properties: + key: + description: key is the label key that the selector + applies to. + type: string + operator: + description: operator represents a key's relationship + to a set of values. Valid operators are In, + NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. + If the operator is In or NotIn, the values + array must be non-empty. If the operator is + Exists or DoesNotExist, the values array must + be empty. This array is replaced during a + strategic merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} pairs. + A single {key,value} in the matchLabels map is equivalent + to an element of matchExpressions, whose key field + is "key", the operator is "In", and the values array + contains only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + description: 'storageClassName is the name of the StorageClass + required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is + required by the claim. Value of Filesystem is implied + when not included in claim spec. + type: string + volumeName: + description: volumeName is the binding reference to the + PersistentVolume backing this claim. + type: string + type: object + required: + - name + - path + type: object + type: array + x-kubernetes-list-type: atomic + workload: + description: Restrict on which nodes HPP workload pods will be scheduled + properties: + affinity: + description: affinity enables pod affinity/anti-affinity placement + expanding the types of constraints that can be expressed with + nodeSelector. affinity is going to be applied to the relevant + kind of pods in parallel with nodeSelector See https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for + the pod. + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node matches the corresponding matchExpressions; + the node(s) with the highest sum are the most preferred. + items: + description: An empty preferred scheduling term matches + all objects with implicit weight 0 (i.e. it's a + no-op). A null preferred scheduling term matches + no objects (i.e. is also a no-op). + properties: + preference: + description: A node selector term, associated + with the corresponding weight. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + weight: + description: Weight associated with matching the + corresponding nodeSelectorTerm, in the range + 1-100. + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to an + update), the system may or may not try to eventually + evict the pod from its node. + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. + The terms are ORed. + items: + description: A null or empty node selector term + matches no objects. The requirements of them + are ANDed. The TopologySelectorTerm type implements + a subset of the NodeSelectorTerm. + properties: + matchExpressions: + description: A list of node selector requirements + by node's labels. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchFields: + description: A list of node selector requirements + by node's fields. + items: + description: A node selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: The label key that the + selector applies to. + type: string + operator: + description: Represents a key's relationship + to a set of values. Valid operators + are In, NotIn, Exists, DoesNotExist. + Gt, and Lt. + type: string + values: + description: An array of string values. + If the operator is In or NotIn, the + values array must be non-empty. If + the operator is Exists or DoesNotExist, + the values array must be empty. If + the operator is Gt or Lt, the values + array must have a single element, + which will be interpreted as an integer. + This array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + type: object + x-kubernetes-map-type: atomic + type: array + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + description: Describes pod affinity scheduling rules (e.g. + co-locate this pod in the same node, zone, etc. as some + other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the affinity expressions specified + by this field, but it may choose a node that violates + one or more of the expressions. The node that is most + preferred is the one with the greatest sum of weights, + i.e. for each node that meets all of the scheduling + requirements (resource request, requiredDuringScheduling + affinity expressions, etc.), compute a sum by iterating + through the elements of this field and adding "weight" + to the sum if the node has pods which matches the + corresponding podAffinityTerm; the node(s) with the + highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of + namespaces that the term applies to. The + term is applied to the union of the namespaces + selected by this field and the ones listed + in the namespaces field. null selector and + null or empty namespaces list means "this + pod's namespace". An empty selector ({}) + matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static + list of namespace names that the term applies + to. The term is applied to the union of + the namespaces listed in this field and + the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector + means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces + field. null selector and null or empty namespaces + list means "this pod's namespace". An empty + selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. + The term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. null or empty namespaces + list and null namespaceSelector means "this + pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules + (e.g. avoid putting this pod in the same node, zone, etc. + as some other pod(s)). + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods + to nodes that satisfy the anti-affinity expressions + specified by this field, but it may choose a node + that violates one or more of the expressions. The + node that is most preferred is the one with the greatest + sum of weights, i.e. for each node that meets all + of the scheduling requirements (resource request, + requiredDuringScheduling anti-affinity expressions, + etc.), compute a sum by iterating through the elements + of this field and adding "weight" to the sum if the + node has pods which matches the corresponding podAffinityTerm; + the node(s) with the highest sum are the most preferred. + items: + description: The weights of all of the matched WeightedPodAffinityTerm + fields are added per-node to find the most preferred + node(s) + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated + with the corresponding weight. + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of + namespaces that the term applies to. The + term is applied to the union of the namespaces + selected by this field and the ones listed + in the namespaces field. null selector and + null or empty namespaces list means "this + pod's namespace". An empty selector ({}) + matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list + of label selector requirements. The + requirements are ANDed. + items: + description: A label selector requirement + is a selector that contains values, + a key, and an operator that relates + the key and values. + properties: + key: + description: key is the label key + that the selector applies to. + type: string + operator: + description: operator represents + a key's relationship to a set + of values. Valid operators are + In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array + of string values. If the operator + is In or NotIn, the values array + must be non-empty. If the operator + is Exists or DoesNotExist, the + values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator + is "In", and the values array contains + only "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static + list of namespace names that the term applies + to. The term is applied to the union of + the namespaces listed in this field and + the ones selected by namespaceSelector. + null or empty namespaces list and null namespaceSelector + means "this pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located + (affinity) or not co-located (anti-affinity) + with the pods matching the labelSelector + in the specified namespaces, where co-located + is defined as running on a node whose value + of the label with key topologyKey matches + that of any node on which any of the selected + pods is running. Empty topologyKey is not + allowed. + type: string + required: + - topologyKey + type: object + weight: + description: weight associated with matching the + corresponding podAffinityTerm, in the range + 1-100. + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified + by this field are not met at scheduling time, the + pod will not be scheduled onto the node. If the anti-affinity + requirements specified by this field cease to be met + at some point during pod execution (e.g. due to a + pod label update), the system may or may not try to + eventually evict the pod from its node. When there + are multiple elements, the lists of nodes corresponding + to each podAffinityTerm are intersected, i.e. all + terms must be satisfied. + items: + description: Defines a set of pods (namely those matching + the labelSelector relative to the given namespace(s)) + that this pod should be co-located (affinity) or + not co-located (anti-affinity) with, where co-located + is defined as running on a node whose value of the + label with key matches that of any + node on which a pod of the set of pods is running + properties: + labelSelector: + description: A label query over a set of resources, + in this case pods. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaceSelector: + description: A label query over the set of namespaces + that the term applies to. The term is applied + to the union of the namespaces selected by this + field and the ones listed in the namespaces + field. null selector and null or empty namespaces + list means "this pod's namespace". An empty + selector ({}) matches all namespaces. + properties: + matchExpressions: + description: matchExpressions is a list of + label selector requirements. The requirements + are ANDed. + items: + description: A label selector requirement + is a selector that contains values, a + key, and an operator that relates the + key and values. + properties: + key: + description: key is the label key that + the selector applies to. + type: string + operator: + description: operator represents a key's + relationship to a set of values. Valid + operators are In, NotIn, Exists and + DoesNotExist. + type: string + values: + description: values is an array of string + values. If the operator is In or NotIn, + the values array must be non-empty. + If the operator is Exists or DoesNotExist, + the values array must be empty. This + array is replaced during a strategic + merge patch. + items: + type: string + type: array + required: + - key + - operator + type: object + type: array + matchLabels: + additionalProperties: + type: string + description: matchLabels is a map of {key,value} + pairs. A single {key,value} in the matchLabels + map is equivalent to an element of matchExpressions, + whose key field is "key", the operator is + "In", and the values array contains only + "value". The requirements are ANDed. + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + description: namespaces specifies a static list + of namespace names that the term applies to. + The term is applied to the union of the namespaces + listed in this field and the ones selected by + namespaceSelector. null or empty namespaces + list and null namespaceSelector means "this + pod's namespace". + items: + type: string + type: array + topologyKey: + description: This pod should be co-located (affinity) + or not co-located (anti-affinity) with the pods + matching the labelSelector in the specified + namespaces, where co-located is defined as running + on a node whose value of the label with key + topologyKey matches that of any node on which + any of the selected pods is running. Empty topologyKey + is not allowed. + type: string + required: + - topologyKey + type: object + type: array + type: object + type: object + nodeSelector: + additionalProperties: + type: string + description: 'nodeSelector is the node selector applied to the + relevant kind of pods It specifies a map of key-value pairs: + for the pod to be eligible to run on a node, the node must + have each of the indicated key-value pairs as labels (it can + have additional labels as well). See https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#nodeselector' + type: object + tolerations: + description: tolerations is a list of tolerations applied to + the relevant kind of pods See https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + for more info. These are additional tolerations other than + default ones. + items: + description: The pod this Toleration is attached to tolerates + any taint that matches the triple using + the matching operator . + properties: + effect: + description: Effect indicates the taint effect to match. + Empty means match all taint effects. When specified, + allowed values are NoSchedule, PreferNoSchedule and + NoExecute. + type: string + key: + description: Key is the taint key that the toleration + applies to. Empty means match all taint keys. If the + key is empty, operator must be Exists; this combination + means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship + to the value. Valid operators are Exists and Equal. + Defaults to Equal. Exists is equivalent to wildcard + for value, so that a pod can tolerate all taints of + a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of + time the toleration (which must be of effect NoExecute, + otherwise this field is ignored) tolerates the taint. + By default, it is not set, which means tolerate the + taint forever (do not evict). Zero and negative values + will be treated as 0 (evict immediately) by the system. + format: int64 + type: integer + value: + description: Value is the taint value the toleration matches + to. If the operator is Exists, the value should be empty, + otherwise just a regular string. + type: string + type: object + type: array + type: object + type: object + status: + description: HostPathProvisionerStatus defines the observed state of + HostPathProvisioner + properties: + conditions: + description: Conditions contains the current conditions observed + by the operator + items: + description: Condition represents the state of the operator's + reconciliation functionality. + properties: + lastHeartbeatTime: + format: date-time + type: string + lastTransitionTime: + format: date-time + type: string + message: + type: string + reason: + type: string + status: + type: string + type: + description: ConditionType is the state of the operator's + reconciliation functionality. + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-type: atomic + observedVersion: + description: ObservedVersion The observed version of the HostPathProvisioner + deployment + type: string + operatorVersion: + description: OperatorVersion The version of the HostPathProvisioner + Operator + type: string + storagePoolStatuses: + items: + description: StoragePoolStatus is the status of the named storage + pool + properties: + claimStatuses: + description: The status of all the claims. + items: + description: ClaimStatus defines the storage claim status + for each PVC in a storage pool + properties: + name: + description: Name of the PersistentVolumeClaim + type: string + status: + description: Status of the PersistentVolumeClaim + properties: + accessModes: + description: 'accessModes contains the actual access + modes the volume backing the PVC has. More info: + https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + items: + type: string + type: array + allocatedResourceStatuses: + additionalProperties: + description: When a controller receives persistentvolume + claim update with ClaimResourceStatus for a + resource that it does not recognizes, then it + should ignore that update and let other controllers + handle it. + type: string + description: "allocatedResourceStatuses stores status\ + \ of resource being resized for the given PVC.\ + \ Key names follow standard Kubernetes label syntax.\ + \ Valid values are either: * Un-prefixed keys:\ + \ - storage - the capacity of the volume. * Custom\ + \ resources must use implementation-defined prefixed\ + \ names such as \"example.com/my-custom-resource\"\ + \ Apart from above values - keys that are unprefixed\ + \ or have kubernetes.io prefix are considered\ + \ reserved and hence may not be used. \n ClaimResourceStatus\ + \ can be in any of following states: - ControllerResizeInProgress:\ + \ State set when resize controller starts resizing\ + \ the volume in control-plane. - ControllerResizeFailed:\ + \ State set when resize has failed in resize controller\ + \ with a terminal error. - NodeResizePending:\ + \ State set when resize controller has finished\ + \ resizing the volume but further resizing of\ + \ volume is needed on the node. - NodeResizeInProgress:\ + \ State set when kubelet starts resizing the volume.\ + \ - NodeResizeFailed: State set when resizing\ + \ has failed in kubelet with a terminal error.\ + \ Transient errors don't set NodeResizeFailed.\ + \ For example: if expanding a PVC for more capacity\ + \ - this field can be one of the following states:\ + \ - pvc.status.allocatedResourceStatus['storage']\ + \ = \"ControllerResizeInProgress\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"ControllerResizeFailed\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"NodeResizePending\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"NodeResizeInProgress\" - pvc.status.allocatedResourceStatus['storage']\ + \ = \"NodeResizeFailed\" When this field is not\ + \ set, it means that no resize operation is in\ + \ progress for the given PVC. \n A controller\ + \ that receives PVC update with previously unknown\ + \ resourceName or ClaimResourceStatus should ignore\ + \ the update for the purpose it was designed.\ + \ For example - a controller that only is responsible\ + \ for resizing capacity of the volume, should\ + \ ignore PVC updates that change other valid resources\ + \ associated with PVC. \n This is an alpha field\ + \ and requires enabling RecoverVolumeExpansionFailure\ + \ feature." + type: object + x-kubernetes-map-type: granular + allocatedResources: + 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: "allocatedResources tracks the resources\ + \ allocated to a PVC including its capacity. Key\ + \ names follow standard Kubernetes label syntax.\ + \ Valid values are either: * Un-prefixed keys:\ + \ - storage - the capacity of the volume. * Custom\ + \ resources must use implementation-defined prefixed\ + \ names such as \"example.com/my-custom-resource\"\ + \ Apart from above values - keys that are unprefixed\ + \ or have kubernetes.io prefix are considered\ + \ reserved and hence may not be used. \n Capacity\ + \ reported here may be larger than the actual\ + \ capacity when a volume expansion operation is\ + \ requested. For storage quota, the larger value\ + \ from allocatedResources and PVC.spec.resources\ + \ is used. If allocatedResources is not set, PVC.spec.resources\ + \ alone is used for quota calculation. If a volume\ + \ expansion capacity request is lowered, allocatedResources\ + \ is only lowered if there are no expansion operations\ + \ in progress and if the actual volume capacity\ + \ is equal or lower than the requested capacity.\ + \ \n A controller that receives PVC update with\ + \ previously unknown resourceName should ignore\ + \ the update for the purpose it was designed.\ + \ For example - a controller that only is responsible\ + \ for resizing capacity of the volume, should\ + \ ignore PVC updates that change other valid resources\ + \ associated with PVC. \n This is an alpha field\ + \ and requires enabling RecoverVolumeExpansionFailure\ + \ feature." + type: object + capacity: + 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: capacity represents the actual resources + of the underlying volume. + type: object + conditions: + description: conditions is the current Condition + of persistent volume claim. If underlying persistent + volume is being resized then the Condition will + be set to 'ResizeStarted'. + items: + description: PersistentVolumeClaimCondition contains + details about state of pvc + properties: + lastProbeTime: + description: lastProbeTime is the time we + probed the condition. + format: date-time + type: string + lastTransitionTime: + description: lastTransitionTime is the time + the condition transitioned from one status + to another. + format: date-time + type: string + message: + description: message is the human-readable + message indicating details about last transition. + type: string + reason: + description: reason is a unique, this should + be a short, machine understandable string + that gives the reason for condition's last + transition. If it reports "ResizeStarted" + that means the underlying persistent volume + is being resized. + type: string + status: + type: string + type: + description: PersistentVolumeClaimConditionType + is a valid value of PersistentVolumeClaimCondition.Type + type: string + required: + - status + - type + type: object + type: array + phase: + description: phase represents the current phase + of PersistentVolumeClaim. + type: string + type: object + required: + - name + - status + type: object + type: array + x-kubernetes-list-type: atomic + currentReady: + description: CurrentReady is the number of currently ready + replicasets. + type: integer + desiredReady: + description: DesiredReady is the number of desired ready replicasets. + type: integer + name: + description: Name is the name of the storage pool + type: string + phase: + description: StoragePoolPhase indicates which phase the storage + pool is in. + type: string + required: + - name + - phase + type: object + type: array + x-kubernetes-list-type: atomic + targetVersion: + description: TargetVersion The targeted version of the HostPathProvisioner + deployment + type: string + type: object + type: object + served: true + storage: true +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/managed-by: commodore + prometheus.hostpathprovisioner.kubevirt.io: 'true' + name: hostpath-provisioner-operator + namespace: syn-kubevirt-hostpath +spec: + replicas: 1 + selector: + matchLabels: + name: hostpath-provisioner-operator + template: + metadata: + labels: + name: hostpath-provisioner-operator + prometheus.hostpathprovisioner.kubevirt.io: 'true' + spec: + containers: + - command: + - hostpath-provisioner-operator + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: INSTALLER_PART_OF_LABEL + valueFrom: + fieldRef: + fieldPath: metadata.labels['app.kubernetes.io/part-of'] + - name: INSTALLER_VERSION_LABEL + valueFrom: + fieldRef: + fieldPath: metadata.labels['app.kubernetes.io/version'] + - name: OPERATOR_NAME + value: hostpath-provisioner-operator + - name: OPERATOR_IMAGE + value: quay.io/kubevirt/hostpath-provisioner-operator:v0.18.0 + - name: PROVISIONER_IMAGE + value: quay.io/kubevirt/hostpath-provisioner:v0.18.0 + - name: CSI_PROVISIONER_IMAGE + value: quay.io/kubevirt/hostpath-csi-driver:v0.18.0 + - name: NODE_DRIVER_REG_IMAGE + value: registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.2.0 + - name: LIVENESS_PROBE_IMAGE + value: registry.k8s.io/sig-storage/livenessprobe:v2.3.0 + - name: CSI_SNAPSHOT_IMAGE + value: registry.k8s.io/sig-storage/csi-snapshotter:v4.2.1 + - name: CSI_SIG_STORAGE_PROVISIONER_IMAGE + value: registry.k8s.io/sig-storage/csi-provisioner:v3.4.1 + - name: VERBOSITY + value: '3' + - name: MONITORING_NAMESPACE + value: '' + image: quay.io/kubevirt/hostpath-provisioner-operator:v0.18.0 + imagePullPolicy: Always + livenessProbe: + failureThreshold: 1 + httpGet: + path: /livez + port: 6060 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 5 + name: hostpath-provisioner-operator + ports: + - containerPort: 8080 + name: metrics + protocol: TCP + readinessProbe: + failureThreshold: 1 + httpGet: + path: /readyz + port: 6060 + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 5 + resources: + requests: + cpu: 10m + memory: 150Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + runAsNonRoot: true + seccompProfile: + type: RuntimeDefault + volumeMounts: + - mountPath: /tmp/k8s-webhook-server/serving-certs + name: apiservice-cert + serviceAccountName: hostpath-provisioner-operator + volumes: + - name: apiservice-cert + secret: + defaultMode: 420 + items: + - key: tls.crt + path: tls.crt + - key: tls.key + path: tls.key + secretName: hostpath-provisioner-operator-webhook-service-cert diff --git a/tests/golden/withtypes/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/20_instance.yaml b/tests/golden/withtypes/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/20_instance.yaml new file mode 100644 index 0000000..a38ffb5 --- /dev/null +++ b/tests/golden/withtypes/kubevirt-operator/kubevirt-operator/40_hostpath_provisioner/20_instance.yaml @@ -0,0 +1,12 @@ +apiVersion: hostpathprovisioner.kubevirt.io/v1beta1 +kind: HostPathProvisioner +metadata: + labels: + app.kubernetes.io/instance: hostpath_provisioner + app.kubernetes.io/managed-by: commodore + app.kubernetes.io/name: instance + namespace: syn-kubevirt-hostpath +spec: + storagePools: + - name: local + path: /var/hpvolumes diff --git a/tests/withtypes.yml b/tests/withtypes.yml index 45e677f..ceaa1b4 100644 --- a/tests/withtypes.yml +++ b/tests/withtypes.yml @@ -33,6 +33,11 @@ parameters: multusDynamicNetworks: {} linuxBridge: {} + hostpath_provisioner: + storagePools: + - name: "local" + path: "/var/hpvolumes" + cluster: types: xsmall: