From ef2bb97172cfbc10689c32466c3b89ad11a6f75b Mon Sep 17 00:00:00 2001 From: Shubham Bajpai Date: Wed, 31 Mar 2021 14:30:28 +0530 Subject: [PATCH] chore(k8s): bump crd version to v1 (#559) - bump crd version to v1 - refactored tests to use v1 api extensions - moved crd generation to generate-manifest script - added create crd step in integration test Signed-off-by: shubham --- Makefile | 15 +- build/generate-manifests.sh | 17 +- changelogs/unreleased/559-shubham14bajpai | 1 + deploy/crds/openebs.io_blockdeviceclaims.yaml | 180 +++++++ .../openebs.io_blockdeviceclaims_crd.yaml | 166 ------- deploy/crds/openebs.io_blockdevices.yaml | 277 +++++++++++ deploy/crds/openebs.io_blockdevices_crd.yaml | 263 ---------- .../crds/openebs_v1alpha1_blockdevice_cr.yaml | 2 +- .../openebs_v1alpha1_blockdeviceclaim_cr.yaml | 2 +- deploy/helm/charts/Chart.yaml | 2 +- deploy/helm/charts/crds/blockdevice.yaml | 437 +++++++++-------- deploy/helm/charts/crds/blockdeviceclaim.yaml | 305 ++++++------ deploy/ndm-operator.yaml | 462 +++++++++++++++++- deploy/yamls/namespace.yaml | 1 + deploy/yamls/node-disk-operator.yaml | 2 + integration_tests/k8s/k8sapi.go | 10 +- integration_tests/k8s/k8sgen.go | 12 +- .../sanity/ndm_integration_test.go | 7 +- 18 files changed, 1350 insertions(+), 811 deletions(-) create mode 100644 changelogs/unreleased/559-shubham14bajpai create mode 100644 deploy/crds/openebs.io_blockdeviceclaims.yaml delete mode 100644 deploy/crds/openebs.io_blockdeviceclaims_crd.yaml create mode 100644 deploy/crds/openebs.io_blockdevices.yaml delete mode 100644 deploy/crds/openebs.io_blockdevices_crd.yaml diff --git a/Makefile b/Makefile index 13fd8e577..165fd82e3 100644 --- a/Makefile +++ b/Makefile @@ -159,7 +159,12 @@ vet: fmt: find . -type f -name "*.go" | grep -v "./vendor/*" | xargs gofmt -s -w -l -manifests: + +.PHONY: controller-gen +controller-gen: + TMP_DIR=$(shell mktemp -d) && cd $$TMP_DIR && go mod init tmp && go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.4.0 && rm -rf $$TMP_DIR; + +manifests: controller-gen @echo "+ Generating NDM manifest" $(PWD)/build/generate-manifests.sh @@ -288,13 +293,9 @@ push: DIMAGE=${IMAGE_ORG}/node-disk-operator-${XC_ARCH} ./build/push; DIMAGE=${IMAGE_ORG}/node-disk-exporter-${XC_ARCH} ./build/push; -.PHONY: crds -crds: - touch build/Dockerfile - # Install the binary from https://github.com/operator-framework/operator-sdk/releases/tag/v0.17.0 - operator-sdk-v0.17.0-x86_64-linux-gnu generate crds - rm build/Dockerfile + #----------------------------------------------------------------------------- # Target: docker.buildx.ndm docker.buildx.ndo docker.buildx.exporter #----------------------------------------------------------------------------- + include Makefile.buildx.mk diff --git a/build/generate-manifests.sh b/build/generate-manifests.sh index 336405ebf..635b12d2d 100755 --- a/build/generate-manifests.sh +++ b/build/generate-manifests.sh @@ -15,17 +15,32 @@ set -e +## find or download controller-gen +CONTROLLER_GEN=$(which controller-gen) + +if [ "$CONTROLLER_GEN" = "" ] +then + echo "ERROR: failed to get controller-gen, Please run make bootstrap to install it"; + exit 1; +fi + +$CONTROLLER_GEN crd:trivialVersions=false,preserveUnknownFields=false paths=./pkg/apis/... output:crd:artifacts:config=deploy/crds + ## create the operator file using all the yamls echo "# This manifest is autogenerated via 'make manifests' command. # Do the modification to the yamls in deploy/yamls/ directory # and then run 'make manifests' command -# This manifest deploys the OpenEBS NDM components with associated RBAC rules. +# This manifest deploys the OpenEBS NDM components with associated RBAC rules and crds. " > deploy/ndm-operator.yaml # create the ndm-operator.yaml manifest { + # Add crd creation to the Operator yaml + cat deploy/crds/openebs.io_blockdevices.yaml + cat deploy/crds/openebs.io_blockdeviceclaims.yaml + # Add namespace creation to the Operator yaml cat deploy/yamls/namespace.yaml diff --git a/changelogs/unreleased/559-shubham14bajpai b/changelogs/unreleased/559-shubham14bajpai new file mode 100644 index 000000000..aea8fdb46 --- /dev/null +++ b/changelogs/unreleased/559-shubham14bajpai @@ -0,0 +1 @@ +updated the apiextension version to v1 and moved the installation of crds from operator deployment to the operator yaml diff --git a/deploy/crds/openebs.io_blockdeviceclaims.yaml b/deploy/crds/openebs.io_blockdeviceclaims.yaml new file mode 100644 index 000000000..d145b1bd0 --- /dev/null +++ b/deploy/crds/openebs.io_blockdeviceclaims.yaml @@ -0,0 +1,180 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.0 + creationTimestamp: null + name: blockdeviceclaims.openebs.io +spec: + group: openebs.io + names: + kind: BlockDeviceClaim + listKind: BlockDeviceClaimList + plural: blockdeviceclaims + shortNames: + - bdc + singular: blockdeviceclaim + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.blockDeviceName + name: BlockDeviceName + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: BlockDeviceClaim is the Schema for the BlockDeviceClaim CR + 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: DeviceClaimSpec defines the request details for a BlockDevice + properties: + blockDeviceName: + description: BlockDeviceName is the reference to the block-device + backing this claim + type: string + blockDeviceNodeAttributes: + description: BlockDeviceNodeAttributes is the attributes on the node + from which a BD should be selected for this claim. It can include + nodename, failure domain etc. + properties: + hostName: + description: HostName represents the hostname of the Kubernetes + node resource where the BD should be present + type: string + nodeName: + description: NodeName represents the name of the Kubernetes node + resource where the BD should be present + type: string + type: object + deviceClaimDetails: + description: Details of the device to be claimed + properties: + allowPartition: + description: AllowPartition represents whether to claim a full + block device or a device that is a partition + type: boolean + blockVolumeMode: + description: 'BlockVolumeMode represents whether to claim a device + in Block mode or Filesystem mode. These are use cases of BlockVolumeMode: + 1) Not specified: VolumeMode check will not be effective 2) + VolumeModeBlock: BD should not have any filesystem or mountpoint + 3) VolumeModeFileSystem: BD should have a filesystem and mountpoint. + If DeviceFormat is specified then the format should match + with the FSType in BD' + type: string + formatType: + description: Format of the device required, eg:ext4, xfs + type: string + type: object + deviceType: + description: DeviceType represents the type of drive like SSD, HDD + etc., + nullable: true + type: string + hostName: + description: Node name from where blockdevice has to be claimed. To + be deprecated. Use NodeAttributes.HostName instead + type: string + resources: + description: Resources will help with placing claims on Capacity, + IOPS + properties: + 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 resources required. + eg: if storage resource of 10G is requested minimum capacity + of 10G should be available TODO for validating' + type: object + required: + - requests + type: object + selector: + description: Selector is used to find block devices to be considered + for claiming + 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 + type: object + status: + description: DeviceClaimStatus defines the observed state of BlockDeviceClaim + properties: + phase: + description: Phase represents the current phase of the claim + type: string + required: + - phase + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/deploy/crds/openebs.io_blockdeviceclaims_crd.yaml b/deploy/crds/openebs.io_blockdeviceclaims_crd.yaml deleted file mode 100644 index a1f48e723..000000000 --- a/deploy/crds/openebs.io_blockdeviceclaims_crd.yaml +++ /dev/null @@ -1,166 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: blockdeviceclaims.openebs.io -spec: - additionalPrinterColumns: - - JSONPath: .spec.blockDeviceName - name: BlockDeviceName - type: string - - JSONPath: .status.phase - name: Phase - type: string - - JSONPath: .metadata.creationTimestamp - name: Age - type: date - group: openebs.io - names: - kind: BlockDeviceClaim - listKind: BlockDeviceClaimList - plural: blockdeviceclaims - shortNames: - - bdc - singular: blockdeviceclaim - scope: Namespaced - subresources: {} - validation: - openAPIV3Schema: - description: BlockDeviceClaim is the Schema for the BlockDeviceClaim CR - 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: DeviceClaimSpec defines the request details for a BlockDevice - properties: - blockDeviceName: - description: BlockDeviceName is the reference to the block-device backing - this claim - type: string - blockDeviceNodeAttributes: - description: BlockDeviceNodeAttributes is the attributes on the node - from which a BD should be selected for this claim. It can include - nodename, failure domain etc. - properties: - hostName: - description: HostName represents the hostname of the Kubernetes - node resource where the BD should be present - type: string - nodeName: - description: NodeName represents the name of the Kubernetes node - resource where the BD should be present - type: string - type: object - deviceClaimDetails: - description: Details of the device to be claimed - properties: - allowPartition: - description: AllowPartition represents whether to claim a full block - device or a device that is a partition - type: boolean - blockVolumeMode: - description: 'BlockVolumeMode represents whether to claim a device - in Block mode or Filesystem mode. These are use cases of BlockVolumeMode: - 1) Not specified: VolumeMode check will not be effective 2) VolumeModeBlock: - BD should not have any filesystem or mountpoint 3) VolumeModeFileSystem: - BD should have a filesystem and mountpoint. If DeviceFormat is specified - then the format should match with the FSType in BD' - type: string - formatType: - description: Format of the device required, eg:ext4, xfs - type: string - type: object - deviceType: - description: DeviceType represents the type of drive like SSD, HDD etc., - nullable: true - type: string - hostName: - description: Node name from where blockdevice has to be claimed. To - be deprecated. Use NodeAttributes.HostName instead - type: string - resources: - description: Resources will help with placing claims on Capacity, IOPS - properties: - 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 resources required. - eg: if storage resource of 10G is requested minimum capacity of - 10G should be available TODO for validating' - type: object - required: - - requests - type: object - selector: - description: Selector is used to find block devices to be considered - for claiming - 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 - type: object - status: - description: DeviceClaimStatus defines the observed state of BlockDeviceClaim - properties: - phase: - description: Phase represents the current phase of the claim - type: string - required: - - phase - type: object - type: object - version: v1alpha1 - versions: - - name: v1alpha1 - served: true - storage: true diff --git a/deploy/crds/openebs.io_blockdevices.yaml b/deploy/crds/openebs.io_blockdevices.yaml new file mode 100644 index 000000000..80edb20d0 --- /dev/null +++ b/deploy/crds/openebs.io_blockdevices.yaml @@ -0,0 +1,277 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.0 + creationTimestamp: null + name: blockdevices.openebs.io +spec: + group: openebs.io + names: + kind: BlockDevice + listKind: BlockDeviceList + plural: blockdevices + shortNames: + - bd + singular: blockdevice + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.nodeAttributes.nodeName + name: NodeName + type: string + - jsonPath: .spec.path + name: Path + priority: 1 + type: string + - jsonPath: .spec.filesystem.fsType + name: FSType + priority: 1 + type: string + - jsonPath: .spec.capacity.storage + name: Size + type: string + - jsonPath: .status.claimState + name: ClaimState + type: string + - jsonPath: .status.state + name: Status + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: BlockDevice is the Schema used to represent a BlockDevice CR + 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: DeviceSpec defines the properties and runtime status of a + BlockDevice + properties: + aggregateDevice: + description: AggregateDevice was intended to store the hierachical + information in cases of LVM. However this is currently not implemented + and may need to be re-looked into for better design. To be deprecated + type: string + capacity: + description: Capacity + properties: + logicalSectorSize: + description: LogicalSectorSize is blockdevice logical-sector size + in bytes + format: int32 + type: integer + physicalSectorSize: + description: PhysicalSectorSize is blockdevice physical-Sector + size in bytes + format: int32 + type: integer + storage: + description: Storage is the blockdevice capacity in bytes + format: int64 + type: integer + required: + - storage + type: object + claimRef: + description: ClaimRef is the reference to the BDC which has claimed + this BD + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + details: + description: Details contain static attributes of BD like model,serial, + and so forth + properties: + compliance: + description: Compliance is standards/specifications version implemented + by device firmware such as SPC-1, SPC-2, etc + type: string + deviceType: + description: DeviceType represents the type of device like sparse, + disk, partition, lvm, crypt + enum: + - disk + - partition + - sparse + - loop + - lvm + - crypt + - dm + - mpath + type: string + driveType: + description: DriveType is the type of backing drive, HDD/SSD + enum: + - HDD + - SSD + - Unknown + - "" + type: string + firmwareRevision: + description: FirmwareRevision is the disk firmware revision + type: string + hardwareSectorSize: + description: HardwareSectorSize is the hardware sector size in + bytes + format: int32 + type: integer + logicalBlockSize: + description: LogicalBlockSize is the logical block size in bytes + reported by /sys/class/block/sda/queue/logical_block_size + format: int32 + type: integer + model: + description: Model is model of disk + type: string + physicalBlockSize: + description: PhysicalBlockSize is the physical block size in bytes + reported by /sys/class/block/sda/queue/physical_block_size + format: int32 + type: integer + serial: + description: Serial is serial number of disk + type: string + vendor: + description: Vendor is vendor of disk + type: string + type: object + devlinks: + description: DevLinks contains soft links of a block device like /dev/by-id/... + /dev/by-uuid/... + items: + description: DeviceDevLink holds the mapping between type and links + like by-id type or by-path type link + properties: + kind: + description: Kind is the type of link like by-id or by-path. + enum: + - by-id + - by-path + type: string + links: + description: Links are the soft links + items: + type: string + type: array + type: object + type: array + filesystem: + description: FileSystem contains mountpoint and filesystem type + properties: + fsType: + description: Type represents the FileSystem type of the block + device + type: string + mountPoint: + description: MountPoint represents the mountpoint of the block + device. + type: string + type: object + nodeAttributes: + description: NodeAttributes has the details of the node on which BD + is attached + properties: + nodeName: + description: NodeName is the name of the Kubernetes node resource + on which the device is attached + type: string + type: object + parentDevice: + description: "ParentDevice was intended to store the UUID of the parent + Block Device as is the case for partitioned block devices. \n For + example: /dev/sda is the parent for /dev/sda1 To be deprecated" + type: string + partitioned: + description: Partitioned represents if BlockDevice has partitions + or not (Yes/No) Currently always default to No. To be deprecated + enum: + - "Yes" + - "No" + type: string + path: + description: Path contain devpath (e.g. /dev/sdb) + type: string + required: + - capacity + - devlinks + - nodeAttributes + - path + type: object + status: + description: DeviceStatus defines the observed state of BlockDevice + properties: + claimState: + description: ClaimState represents the claim state of the block device + enum: + - Claimed + - Unclaimed + - Released + type: string + state: + description: State is the current state of the blockdevice (Active/Inactive/Unknown) + enum: + - Active + - Inactive + - Unknown + type: string + required: + - claimState + - state + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/deploy/crds/openebs.io_blockdevices_crd.yaml b/deploy/crds/openebs.io_blockdevices_crd.yaml deleted file mode 100644 index 793b04bcb..000000000 --- a/deploy/crds/openebs.io_blockdevices_crd.yaml +++ /dev/null @@ -1,263 +0,0 @@ -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: blockdevices.openebs.io -spec: - additionalPrinterColumns: - - JSONPath: .spec.nodeAttributes.nodeName - name: NodeName - type: string - - JSONPath: .spec.path - name: Path - priority: 1 - type: string - - JSONPath: .spec.filesystem.fsType - name: FSType - priority: 1 - type: string - - JSONPath: .spec.capacity.storage - name: Size - type: string - - JSONPath: .status.claimState - name: ClaimState - type: string - - JSONPath: .status.state - name: Status - type: string - - JSONPath: .metadata.creationTimestamp - name: Age - type: date - group: openebs.io - names: - kind: BlockDevice - listKind: BlockDeviceList - plural: blockdevices - shortNames: - - bd - singular: blockdevice - scope: Namespaced - subresources: {} - validation: - openAPIV3Schema: - description: BlockDevice is the Schema used to represent a BlockDevice CR - 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: DeviceSpec defines the properties and runtime status of a BlockDevice - properties: - aggregateDevice: - description: AggregateDevice was intended to store the hierachical information - in cases of LVM. However this is currently not implemented and may - need to be re-looked into for better design. To be deprecated - type: string - capacity: - description: Capacity - properties: - logicalSectorSize: - description: LogicalSectorSize is blockdevice logical-sector size - in bytes - format: int32 - type: integer - physicalSectorSize: - description: PhysicalSectorSize is blockdevice physical-Sector size - in bytes - format: int32 - type: integer - storage: - description: Storage is the blockdevice capacity in bytes - format: int64 - type: integer - required: - - storage - type: object - claimRef: - description: ClaimRef is the reference to the BDC which has claimed - this BD - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an - entire object, this string should contain a valid JSON/Go field - access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part of an object. - TODO: this design is not final and this field is subject to change - in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is - made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - details: - description: Details contain static attributes of BD like model,serial, - and so forth - properties: - compliance: - description: Compliance is standards/specifications version implemented - by device firmware such as SPC-1, SPC-2, etc - type: string - deviceType: - description: DeviceType represents the type of device like sparse, - disk, partition, lvm, crypt - enum: - - disk - - partition - - sparse - - loop - - lvm - - crypt - - dm - - mpath - type: string - driveType: - description: DriveType is the type of backing drive, HDD/SSD - enum: - - HDD - - SSD - - Unknown - - "" - type: string - firmwareRevision: - description: FirmwareRevision is the disk firmware revision - type: string - hardwareSectorSize: - description: HardwareSectorSize is the hardware sector size in bytes - format: int32 - type: integer - logicalBlockSize: - description: LogicalBlockSize is the logical block size in bytes - reported by /sys/class/block/sda/queue/logical_block_size - format: int32 - type: integer - model: - description: Model is model of disk - type: string - physicalBlockSize: - description: PhysicalBlockSize is the physical block size in bytes - reported by /sys/class/block/sda/queue/physical_block_size - format: int32 - type: integer - serial: - description: Serial is serial number of disk - type: string - vendor: - description: Vendor is vendor of disk - type: string - type: object - devlinks: - description: DevLinks contains soft links of a block device like /dev/by-id/... - /dev/by-uuid/... - items: - description: DeviceDevLink holds the mapping between type and links - like by-id type or by-path type link - properties: - kind: - description: Kind is the type of link like by-id or by-path. - enum: - - by-id - - by-path - type: string - links: - description: Links are the soft links - items: - type: string - type: array - type: object - type: array - filesystem: - description: FileSystem contains mountpoint and filesystem type - properties: - fsType: - description: Type represents the FileSystem type of the block device - type: string - mountPoint: - description: MountPoint represents the mountpoint of the block device. - type: string - type: object - nodeAttributes: - description: NodeAttributes has the details of the node on which BD - is attached - properties: - nodeName: - description: NodeName is the name of the Kubernetes node resource - on which the device is attached - type: string - type: object - parentDevice: - description: "ParentDevice was intended to store the UUID of the parent - Block Device as is the case for partitioned block devices. \n For - example: /dev/sda is the parent for /dev/sda1 To be deprecated" - type: string - partitioned: - description: Partitioned represents if BlockDevice has partitions or - not (Yes/No) Currently always default to No. To be deprecated - enum: - - "Yes" - - "No" - type: string - path: - description: Path contain devpath (e.g. /dev/sdb) - type: string - required: - - capacity - - devlinks - - nodeAttributes - - path - type: object - status: - description: DeviceStatus defines the observed state of BlockDevice - properties: - claimState: - description: ClaimState represents the claim state of the block device - enum: - - Claimed - - Unclaimed - - Released - type: string - state: - description: State is the current state of the blockdevice (Active/Inactive/Unknown) - enum: - - Active - - Inactive - - Unknown - type: string - required: - - claimState - - state - type: object - type: object - version: v1alpha1 - versions: - - name: v1alpha1 - served: true - storage: true diff --git a/deploy/crds/openebs_v1alpha1_blockdevice_cr.yaml b/deploy/crds/openebs_v1alpha1_blockdevice_cr.yaml index 0d2309147..9d9260e7b 100644 --- a/deploy/crds/openebs_v1alpha1_blockdevice_cr.yaml +++ b/deploy/crds/openebs_v1alpha1_blockdevice_cr.yaml @@ -1,4 +1,4 @@ -apiVersion: openebs.io/v1alpha1 +apiVersion: openebs.io/v1 kind: BlockDevice metadata: name: example-blockdevice diff --git a/deploy/crds/openebs_v1alpha1_blockdeviceclaim_cr.yaml b/deploy/crds/openebs_v1alpha1_blockdeviceclaim_cr.yaml index 9bd9ce27e..b94d54804 100644 --- a/deploy/crds/openebs_v1alpha1_blockdeviceclaim_cr.yaml +++ b/deploy/crds/openebs_v1alpha1_blockdeviceclaim_cr.yaml @@ -1,4 +1,4 @@ -apiVersion: openebs.io/v1alpha1 +apiVersion: openebs.io/v1 kind: BlockDeviceClaim metadata: name: example-blockdeviceclaim diff --git a/deploy/helm/charts/Chart.yaml b/deploy/helm/charts/Chart.yaml index 5397747df..5af028d16 100644 --- a/deploy/helm/charts/Chart.yaml +++ b/deploy/helm/charts/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: openebs-ndm description: Helm chart for OpenEBS Node Disk Manager - a Kubernetes native storage device management solution. For instructions on how to install, refer to https://openebs.github.io/node-disk-manager/. -version: 1.3.0 +version: 1.3.1 appVersion: 1.3.0 icon: https://raw.githubusercontent.com/cncf/artwork/master/projects/openebs/icon/color/openebs-icon-color.png home: http://www.openebs.io/ diff --git a/deploy/helm/charts/crds/blockdevice.yaml b/deploy/helm/charts/crds/blockdevice.yaml index cefb64e95..8e17d1d7a 100644 --- a/deploy/helm/charts/crds/blockdevice.yaml +++ b/deploy/helm/charts/crds/blockdevice.yaml @@ -1,135 +1,141 @@ -apiVersion: apiextensions.k8s.io/v1beta1 +--- +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.0 + creationTimestamp: null name: blockdevices.openebs.io spec: - additionalPrinterColumns: - - JSONPath: .spec.nodeAttributes.nodeName + group: openebs.io + names: + kind: BlockDevice + listKind: BlockDeviceList + plural: blockdevices + shortNames: + - bd + singular: blockdevice + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.nodeAttributes.nodeName name: NodeName type: string - - JSONPath: .spec.path + - jsonPath: .spec.path name: Path priority: 1 type: string - - JSONPath: .spec.filesystem.fsType + - jsonPath: .spec.filesystem.fsType name: FSType priority: 1 type: string - - JSONPath: .spec.capacity.storage + - jsonPath: .spec.capacity.storage name: Size type: string - - JSONPath: .status.claimState + - jsonPath: .status.claimState name: ClaimState type: string - - JSONPath: .status.state + - jsonPath: .status.state name: Status type: string - - JSONPath: .metadata.creationTimestamp + - jsonPath: .metadata.creationTimestamp name: Age type: date - group: openebs.io - names: - kind: BlockDevice - listKind: BlockDeviceList - plural: blockdevices - shortNames: - - bd - singular: blockdevice - scope: Namespaced - subresources: {} - validation: - openAPIV3Schema: - description: BlockDevice is the Schema used to represent a BlockDevice CR - 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: DeviceSpec defines the properties and runtime status of a BlockDevice - properties: - aggregateDevice: - description: AggregateDevice was intended to store the hierachical information - in cases of LVM. However this is currently not implemented and may - need to be re-looked into for better design. To be deprecated - type: string - capacity: - description: Capacity - properties: - logicalSectorSize: - description: LogicalSectorSize is blockdevice logical-sector size - in bytes - format: int32 - type: integer - physicalSectorSize: - description: PhysicalSectorSize is blockdevice physical-Sector size - in bytes - format: int32 - type: integer - storage: - description: Storage is the blockdevice capacity in bytes - format: int64 - type: integer - required: + name: v1alpha1 + schema: + openAPIV3Schema: + description: BlockDevice is the Schema used to represent a BlockDevice CR + 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: DeviceSpec defines the properties and runtime status of a + BlockDevice + properties: + aggregateDevice: + description: AggregateDevice was intended to store the hierachical + information in cases of LVM. However this is currently not implemented + and may need to be re-looked into for better design. To be deprecated + type: string + capacity: + description: Capacity + properties: + logicalSectorSize: + description: LogicalSectorSize is blockdevice logical-sector size + in bytes + format: int32 + type: integer + physicalSectorSize: + description: PhysicalSectorSize is blockdevice physical-Sector + size in bytes + format: int32 + type: integer + storage: + description: Storage is the blockdevice capacity in bytes + format: int64 + type: integer + required: - storage - type: object - claimRef: - description: ClaimRef is the reference to the BDC which has claimed - this BD - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an - entire object, this string should contain a valid JSON/Go field - access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part of an object. - TODO: this design is not final and this field is subject to change - in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is - made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - details: - description: Details contain static attributes of BD like model,serial, - and so forth - properties: - compliance: - description: Compliance is standards/specifications version implemented - by device firmware such as SPC-1, SPC-2, etc - type: string - deviceType: - description: DeviceType represents the type of device like sparse, - disk, partition, lvm, crypt - enum: + type: object + claimRef: + description: ClaimRef is the reference to the BDC which has claimed + this BD + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + details: + description: Details contain static attributes of BD like model,serial, + and so forth + properties: + compliance: + description: Compliance is standards/specifications version implemented + by device firmware such as SPC-1, SPC-2, etc + type: string + deviceType: + description: DeviceType represents the type of device like sparse, + disk, partition, lvm, crypt + enum: - disk - partition - sparse @@ -138,126 +144,133 @@ spec: - crypt - dm - mpath - type: string - driveType: - description: DriveType is the type of backing drive, HDD/SSD - enum: + type: string + driveType: + description: DriveType is the type of backing drive, HDD/SSD + enum: - HDD - SSD - Unknown - "" - type: string - firmwareRevision: - description: FirmwareRevision is the disk firmware revision - type: string - hardwareSectorSize: - description: HardwareSectorSize is the hardware sector size in bytes - format: int32 - type: integer - logicalBlockSize: - description: LogicalBlockSize is the logical block size in bytes - reported by /sys/class/block/sda/queue/logical_block_size - format: int32 - type: integer - model: - description: Model is model of disk - type: string - physicalBlockSize: - description: PhysicalBlockSize is the physical block size in bytes - reported by /sys/class/block/sda/queue/physical_block_size - format: int32 - type: integer - serial: - description: Serial is serial number of disk - type: string - vendor: - description: Vendor is vendor of disk - type: string - type: object - devlinks: - description: DevLinks contains soft links of a block device like /dev/by-id/... - /dev/by-uuid/... - items: - description: DeviceDevLink holds the mapping between type and links - like by-id type or by-path type link - properties: - kind: - description: Kind is the type of link like by-id or by-path. - enum: + type: string + firmwareRevision: + description: FirmwareRevision is the disk firmware revision + type: string + hardwareSectorSize: + description: HardwareSectorSize is the hardware sector size in + bytes + format: int32 + type: integer + logicalBlockSize: + description: LogicalBlockSize is the logical block size in bytes + reported by /sys/class/block/sda/queue/logical_block_size + format: int32 + type: integer + model: + description: Model is model of disk + type: string + physicalBlockSize: + description: PhysicalBlockSize is the physical block size in bytes + reported by /sys/class/block/sda/queue/physical_block_size + format: int32 + type: integer + serial: + description: Serial is serial number of disk + type: string + vendor: + description: Vendor is vendor of disk + type: string + type: object + devlinks: + description: DevLinks contains soft links of a block device like /dev/by-id/... + /dev/by-uuid/... + items: + description: DeviceDevLink holds the mapping between type and links + like by-id type or by-path type link + properties: + kind: + description: Kind is the type of link like by-id or by-path. + enum: - by-id - by-path - type: string - links: - description: Links are the soft links - items: type: string - type: array + links: + description: Links are the soft links + items: + type: string + type: array + type: object + type: array + filesystem: + description: FileSystem contains mountpoint and filesystem type + properties: + fsType: + description: Type represents the FileSystem type of the block + device + type: string + mountPoint: + description: MountPoint represents the mountpoint of the block + device. + type: string + type: object + nodeAttributes: + description: NodeAttributes has the details of the node on which BD + is attached + properties: + nodeName: + description: NodeName is the name of the Kubernetes node resource + on which the device is attached + type: string type: object - type: array - filesystem: - description: FileSystem contains mountpoint and filesystem type - properties: - fsType: - description: Type represents the FileSystem type of the block device - type: string - mountPoint: - description: MountPoint represents the mountpoint of the block device. - type: string - type: object - nodeAttributes: - description: NodeAttributes has the details of the node on which BD - is attached - properties: - nodeName: - description: NodeName is the name of the Kubernetes node resource - on which the device is attached - type: string - type: object - parentDevice: - description: "ParentDevice was intended to store the UUID of the parent - Block Device as is the case for partitioned block devices. \n For - example: /dev/sda is the parent for /dev/sda1 To be deprecated" - type: string - partitioned: - description: Partitioned represents if BlockDevice has partitions or - not (Yes/No) Currently always default to No. To be deprecated - enum: + parentDevice: + description: "ParentDevice was intended to store the UUID of the parent + Block Device as is the case for partitioned block devices. \n For + example: /dev/sda is the parent for /dev/sda1 To be deprecated" + type: string + partitioned: + description: Partitioned represents if BlockDevice has partitions + or not (Yes/No) Currently always default to No. To be deprecated + enum: - "Yes" - "No" - type: string - path: - description: Path contain devpath (e.g. /dev/sdb) - type: string - required: + type: string + path: + description: Path contain devpath (e.g. /dev/sdb) + type: string + required: - capacity - devlinks - nodeAttributes - path - type: object - status: - description: DeviceStatus defines the observed state of BlockDevice - properties: - claimState: - description: ClaimState represents the claim state of the block device - enum: + type: object + status: + description: DeviceStatus defines the observed state of BlockDevice + properties: + claimState: + description: ClaimState represents the claim state of the block device + enum: - Claimed - Unclaimed - Released - type: string - state: - description: State is the current state of the blockdevice (Active/Inactive/Unknown) - enum: + type: string + state: + description: State is the current state of the blockdevice (Active/Inactive/Unknown) + enum: - Active - Inactive - Unknown - type: string - required: + type: string + required: - claimState - state - type: object - type: object - version: v1alpha1 - versions: - - name: v1alpha1 - served: true - storage: true + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/deploy/helm/charts/crds/blockdeviceclaim.yaml b/deploy/helm/charts/crds/blockdeviceclaim.yaml index e3b3f5136..f32d794dc 100644 --- a/deploy/helm/charts/crds/blockdeviceclaim.yaml +++ b/deploy/helm/charts/crds/blockdeviceclaim.yaml @@ -1,166 +1,179 @@ -apiVersion: apiextensions.k8s.io/v1beta1 +--- +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.0 + creationTimestamp: null name: blockdeviceclaims.openebs.io spec: - additionalPrinterColumns: - - JSONPath: .spec.blockDeviceName - name: BlockDeviceName - type: string - - JSONPath: .status.phase - name: Phase - type: string - - JSONPath: .metadata.creationTimestamp - name: Age - type: date group: openebs.io names: kind: BlockDeviceClaim listKind: BlockDeviceClaimList plural: blockdeviceclaims shortNames: - - bdc + - bdc singular: blockdeviceclaim scope: Namespaced - subresources: {} - validation: - openAPIV3Schema: - description: BlockDeviceClaim is the Schema for the BlockDeviceClaim CR - 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: DeviceClaimSpec defines the request details for a BlockDevice - properties: - blockDeviceName: - description: BlockDeviceName is the reference to the block-device backing - this claim - type: string - blockDeviceNodeAttributes: - description: BlockDeviceNodeAttributes is the attributes on the node - from which a BD should be selected for this claim. It can include - nodename, failure domain etc. - properties: - hostName: - description: HostName represents the hostname of the Kubernetes - node resource where the BD should be present - type: string - nodeName: - description: NodeName represents the name of the Kubernetes node - resource where the BD should be present - type: string - type: object - deviceClaimDetails: - description: Details of the device to be claimed - properties: - allowPartition: - description: AllowPartition represents whether to claim a full block - device or a device that is a partition - type: boolean - blockVolumeMode: - description: 'BlockVolumeMode represents whether to claim a device - in Block mode or Filesystem mode. These are use cases of BlockVolumeMode: - 1) Not specified: VolumeMode check will not be effective 2) VolumeModeBlock: - BD should not have any filesystem or mountpoint 3) VolumeModeFileSystem: - BD should have a filesystem and mountpoint. If DeviceFormat is specified - then the format should match with the FSType in BD' - type: string - formatType: - description: Format of the device required, eg:ext4, xfs - type: string - type: object - deviceType: - description: DeviceType represents the type of drive like SSD, HDD etc., - nullable: true - type: string - hostName: - description: Node name from where blockdevice has to be claimed. To - be deprecated. Use NodeAttributes.HostName instead - type: string - resources: - description: Resources will help with placing claims on Capacity, IOPS - properties: - requests: - additionalProperties: - anyOf: + versions: + - additionalPrinterColumns: + - jsonPath: .spec.blockDeviceName + name: BlockDeviceName + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: BlockDeviceClaim is the Schema for the BlockDeviceClaim CR + 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: DeviceClaimSpec defines the request details for a BlockDevice + properties: + blockDeviceName: + description: BlockDeviceName is the reference to the block-device + backing this claim + type: string + blockDeviceNodeAttributes: + description: BlockDeviceNodeAttributes is the attributes on the node + from which a BD should be selected for this claim. It can include + nodename, failure domain etc. + properties: + hostName: + description: HostName represents the hostname of the Kubernetes + node resource where the BD should be present + type: string + nodeName: + description: NodeName represents the name of the Kubernetes node + resource where the BD should be present + type: string + type: object + deviceClaimDetails: + description: Details of the device to be claimed + properties: + allowPartition: + description: AllowPartition represents whether to claim a full + block device or a device that is a partition + type: boolean + blockVolumeMode: + description: 'BlockVolumeMode represents whether to claim a device + in Block mode or Filesystem mode. These are use cases of BlockVolumeMode: + 1) Not specified: VolumeMode check will not be effective 2) + VolumeModeBlock: BD should not have any filesystem or mountpoint + 3) VolumeModeFileSystem: BD should have a filesystem and mountpoint. + If DeviceFormat is specified then the format should match + with the FSType in BD' + type: string + formatType: + description: Format of the device required, eg:ext4, xfs + type: string + type: object + deviceType: + description: DeviceType represents the type of drive like SSD, HDD + etc., + nullable: true + type: string + hostName: + description: Node name from where blockdevice has to be claimed. To + be deprecated. Use NodeAttributes.HostName instead + type: string + resources: + description: Resources will help with placing claims on Capacity, + IOPS + properties: + 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 resources required. - eg: if storage resource of 10G is requested minimum capacity of - 10G should be available TODO for validating' - type: object - required: + 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 resources required. + eg: if storage resource of 10G is requested minimum capacity + of 10G should be available TODO for validating' + type: object + required: - requests - type: object - selector: - description: Selector is used to find block devices to be considered - for claiming - 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: object + selector: + description: Selector is used to find block devices to be considered + for claiming + 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 - type: array - required: + 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: 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 - type: object - status: - description: DeviceClaimStatus defines the observed state of BlockDeviceClaim - properties: - phase: - description: Phase represents the current phase of the claim - type: string - required: + type: object + type: object + status: + description: DeviceClaimStatus defines the observed state of BlockDeviceClaim + properties: + phase: + description: Phase represents the current phase of the claim + type: string + required: - phase - type: object - type: object - version: v1alpha1 - versions: - - name: v1alpha1 - served: true - storage: true + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/deploy/ndm-operator.yaml b/deploy/ndm-operator.yaml index 124d9207b..a429ae4b2 100644 --- a/deploy/ndm-operator.yaml +++ b/deploy/ndm-operator.yaml @@ -2,8 +2,466 @@ # Do the modification to the yamls in deploy/yamls/ directory # and then run 'make manifests' command -# This manifest deploys the OpenEBS NDM components with associated RBAC rules. +# This manifest deploys the OpenEBS NDM components with associated RBAC rules and crds. + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.0 + creationTimestamp: null + name: blockdevices.openebs.io +spec: + group: openebs.io + names: + kind: BlockDevice + listKind: BlockDeviceList + plural: blockdevices + shortNames: + - bd + singular: blockdevice + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.nodeAttributes.nodeName + name: NodeName + type: string + - jsonPath: .spec.path + name: Path + priority: 1 + type: string + - jsonPath: .spec.filesystem.fsType + name: FSType + priority: 1 + type: string + - jsonPath: .spec.capacity.storage + name: Size + type: string + - jsonPath: .status.claimState + name: ClaimState + type: string + - jsonPath: .status.state + name: Status + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: BlockDevice is the Schema used to represent a BlockDevice CR + 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: DeviceSpec defines the properties and runtime status of a + BlockDevice + properties: + aggregateDevice: + description: AggregateDevice was intended to store the hierachical + information in cases of LVM. However this is currently not implemented + and may need to be re-looked into for better design. To be deprecated + type: string + capacity: + description: Capacity + properties: + logicalSectorSize: + description: LogicalSectorSize is blockdevice logical-sector size + in bytes + format: int32 + type: integer + physicalSectorSize: + description: PhysicalSectorSize is blockdevice physical-Sector + size in bytes + format: int32 + type: integer + storage: + description: Storage is the blockdevice capacity in bytes + format: int64 + type: integer + required: + - storage + type: object + claimRef: + description: ClaimRef is the reference to the BDC which has claimed + this BD + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of + an entire object, this string should contain a valid JSON/Go + field access statement, such as desiredState.manifest.containers[2]. + For example, if the object reference is to a container within + a pod, this would take on a value like: "spec.containers{name}" + (where "name" refers to the name of the container that triggered + the event) or if no container name is specified "spec.containers[2]" + (container with index 2 in this pod). This syntax is chosen + only to have some well-defined way of referencing a part of + an object. TODO: this design is not final and this field is + subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference + is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + type: object + details: + description: Details contain static attributes of BD like model,serial, + and so forth + properties: + compliance: + description: Compliance is standards/specifications version implemented + by device firmware such as SPC-1, SPC-2, etc + type: string + deviceType: + description: DeviceType represents the type of device like sparse, + disk, partition, lvm, crypt + enum: + - disk + - partition + - sparse + - loop + - lvm + - crypt + - dm + - mpath + type: string + driveType: + description: DriveType is the type of backing drive, HDD/SSD + enum: + - HDD + - SSD + - Unknown + - "" + type: string + firmwareRevision: + description: FirmwareRevision is the disk firmware revision + type: string + hardwareSectorSize: + description: HardwareSectorSize is the hardware sector size in + bytes + format: int32 + type: integer + logicalBlockSize: + description: LogicalBlockSize is the logical block size in bytes + reported by /sys/class/block/sda/queue/logical_block_size + format: int32 + type: integer + model: + description: Model is model of disk + type: string + physicalBlockSize: + description: PhysicalBlockSize is the physical block size in bytes + reported by /sys/class/block/sda/queue/physical_block_size + format: int32 + type: integer + serial: + description: Serial is serial number of disk + type: string + vendor: + description: Vendor is vendor of disk + type: string + type: object + devlinks: + description: DevLinks contains soft links of a block device like /dev/by-id/... + /dev/by-uuid/... + items: + description: DeviceDevLink holds the mapping between type and links + like by-id type or by-path type link + properties: + kind: + description: Kind is the type of link like by-id or by-path. + enum: + - by-id + - by-path + type: string + links: + description: Links are the soft links + items: + type: string + type: array + type: object + type: array + filesystem: + description: FileSystem contains mountpoint and filesystem type + properties: + fsType: + description: Type represents the FileSystem type of the block + device + type: string + mountPoint: + description: MountPoint represents the mountpoint of the block + device. + type: string + type: object + nodeAttributes: + description: NodeAttributes has the details of the node on which BD + is attached + properties: + nodeName: + description: NodeName is the name of the Kubernetes node resource + on which the device is attached + type: string + type: object + parentDevice: + description: "ParentDevice was intended to store the UUID of the parent + Block Device as is the case for partitioned block devices. \n For + example: /dev/sda is the parent for /dev/sda1 To be deprecated" + type: string + partitioned: + description: Partitioned represents if BlockDevice has partitions + or not (Yes/No) Currently always default to No. To be deprecated + enum: + - "Yes" + - "No" + type: string + path: + description: Path contain devpath (e.g. /dev/sdb) + type: string + required: + - capacity + - devlinks + - nodeAttributes + - path + type: object + status: + description: DeviceStatus defines the observed state of BlockDevice + properties: + claimState: + description: ClaimState represents the claim state of the block device + enum: + - Claimed + - Unclaimed + - Released + type: string + state: + description: State is the current state of the blockdevice (Active/Inactive/Unknown) + enum: + - Active + - Inactive + - Unknown + type: string + required: + - claimState + - state + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.0 + creationTimestamp: null + name: blockdeviceclaims.openebs.io +spec: + group: openebs.io + names: + kind: BlockDeviceClaim + listKind: BlockDeviceClaimList + plural: blockdeviceclaims + shortNames: + - bdc + singular: blockdeviceclaim + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.blockDeviceName + name: BlockDeviceName + type: string + - jsonPath: .status.phase + name: Phase + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: BlockDeviceClaim is the Schema for the BlockDeviceClaim CR + 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: DeviceClaimSpec defines the request details for a BlockDevice + properties: + blockDeviceName: + description: BlockDeviceName is the reference to the block-device + backing this claim + type: string + blockDeviceNodeAttributes: + description: BlockDeviceNodeAttributes is the attributes on the node + from which a BD should be selected for this claim. It can include + nodename, failure domain etc. + properties: + hostName: + description: HostName represents the hostname of the Kubernetes + node resource where the BD should be present + type: string + nodeName: + description: NodeName represents the name of the Kubernetes node + resource where the BD should be present + type: string + type: object + deviceClaimDetails: + description: Details of the device to be claimed + properties: + allowPartition: + description: AllowPartition represents whether to claim a full + block device or a device that is a partition + type: boolean + blockVolumeMode: + description: 'BlockVolumeMode represents whether to claim a device + in Block mode or Filesystem mode. These are use cases of BlockVolumeMode: + 1) Not specified: VolumeMode check will not be effective 2) + VolumeModeBlock: BD should not have any filesystem or mountpoint + 3) VolumeModeFileSystem: BD should have a filesystem and mountpoint. + If DeviceFormat is specified then the format should match + with the FSType in BD' + type: string + formatType: + description: Format of the device required, eg:ext4, xfs + type: string + type: object + deviceType: + description: DeviceType represents the type of drive like SSD, HDD + etc., + nullable: true + type: string + hostName: + description: Node name from where blockdevice has to be claimed. To + be deprecated. Use NodeAttributes.HostName instead + type: string + resources: + description: Resources will help with placing claims on Capacity, + IOPS + properties: + 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 resources required. + eg: if storage resource of 10G is requested minimum capacity + of 10G should be available TODO for validating' + type: object + required: + - requests + type: object + selector: + description: Selector is used to find block devices to be considered + for claiming + 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 + type: object + status: + description: DeviceClaimStatus defines the observed state of BlockDeviceClaim + properties: + phase: + description: Phase represents the current phase of the claim + type: string + required: + - phase + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +--- # Create the OpenEBS namespace apiVersion: v1 kind: Namespace @@ -261,6 +719,8 @@ spec: value: "node-disk-operator" - name: CLEANUP_JOB_IMAGE value: "openebs/linux-utils:ci" + - name: OPENEBS_IO_INSTALL_CRD + value: "false" # OPENEBS_IO_IMAGE_PULL_SECRETS environment variable is used to pass the image pull secrets # to the cleanup pod launched by NDM operator #- name: OPENEBS_IO_IMAGE_PULL_SECRETS diff --git a/deploy/yamls/namespace.yaml b/deploy/yamls/namespace.yaml index 99f8fb1b0..a52f84a8d 100644 --- a/deploy/yamls/namespace.yaml +++ b/deploy/yamls/namespace.yaml @@ -1,3 +1,4 @@ +--- # Create the OpenEBS namespace apiVersion: v1 kind: Namespace diff --git a/deploy/yamls/node-disk-operator.yaml b/deploy/yamls/node-disk-operator.yaml index 18ab92d41..ff347efc8 100644 --- a/deploy/yamls/node-disk-operator.yaml +++ b/deploy/yamls/node-disk-operator.yaml @@ -50,6 +50,8 @@ spec: value: "node-disk-operator" - name: CLEANUP_JOB_IMAGE value: "openebs/linux-utils:ci" + - name: OPENEBS_IO_INSTALL_CRD + value: "false" # OPENEBS_IO_IMAGE_PULL_SECRETS environment variable is used to pass the image pull secrets # to the cleanup pod launched by NDM operator #- name: OPENEBS_IO_IMAGE_PULL_SECRETS diff --git a/integration_tests/k8s/k8sapi.go b/integration_tests/k8s/k8sapi.go index 51ee772f8..71759174c 100644 --- a/integration_tests/k8s/k8sapi.go +++ b/integration_tests/k8s/k8sapi.go @@ -27,7 +27,7 @@ import ( corev1 "k8s.io/api/core/v1" v1 "k8s.io/api/core/v1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + apiextensionsV1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" @@ -212,14 +212,14 @@ func (c K8sClient) DeleteClusterRoleBinding(clusterrolebinding rbacv1beta1.Clust } // CreateCustomResourceDefinition creates a CRD -func (c K8sClient) CreateCustomResourceDefinition(customResourceDefinition apiextensionsv1beta1.CustomResourceDefinition) error { - _, err := c.APIextClient.ApiextensionsV1beta1().CustomResourceDefinitions().Create(&customResourceDefinition) +func (c K8sClient) CreateCustomResourceDefinition(customResourceDefinition apiextensionsV1.CustomResourceDefinition) error { + _, err := c.APIextClient.ApiextensionsV1().CustomResourceDefinitions().Create(&customResourceDefinition) return err } // DeleteCustomResourceDefinition deletes the CRD -func (c K8sClient) DeleteCustomResourceDefinition(customResourceDefinition apiextensionsv1beta1.CustomResourceDefinition) error { - err := c.APIextClient.ApiextensionsV1beta1().CustomResourceDefinitions().Delete(customResourceDefinition.Name, &metav1.DeleteOptions{}) +func (c K8sClient) DeleteCustomResourceDefinition(customResourceDefinition apiextensionsV1.CustomResourceDefinition) error { + err := c.APIextClient.ApiextensionsV1().CustomResourceDefinitions().Delete(customResourceDefinition.Name, &metav1.DeleteOptions{}) return err } diff --git a/integration_tests/k8s/k8sgen.go b/integration_tests/k8s/k8sgen.go index 597921f46..c9062f38a 100644 --- a/integration_tests/k8s/k8sgen.go +++ b/integration_tests/k8s/k8sgen.go @@ -20,9 +20,9 @@ import ( "github.com/ghodss/yaml" "github.com/openebs/node-disk-manager/integration_tests/utils" appsv1 "k8s.io/api/apps/v1" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" rbacv1beta1 "k8s.io/api/rbac/v1beta1" - apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + apiextensionsV1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" ) // NDMYaml is a string type that stores the path to the YAML files @@ -35,8 +35,8 @@ const ( ServiceAccountYAML NDMYaml = "../../deploy/yamls/serviceaccount.yaml" ClusterRoleYAML NDMYaml = "../../deploy/yamls/clusterrole.yaml" ClusterRoleBindingYAML NDMYaml = "../../deploy/yamls/clusterrolebinding.yaml" - BlockDeviceCRDYAML NDMYaml = "../../deploy/crds/openebs.io_blockdevices_crd.yaml" - BlockDeviceClaimCRDYAML NDMYaml = "../../deploy/crds/openebs.io_blockdeviceclaims_crd.yaml" + BlockDeviceCRDYAML NDMYaml = "../../deploy/crds/openebs.io_blockdevices.yaml" + BlockDeviceClaimCRDYAML NDMYaml = "../../deploy/crds/openebs.io_blockdeviceclaims.yaml" DaemonSetYAML NDMYaml = "../yamls/node-disk-manager.yaml" DeploymentYAML NDMYaml = "../../deploy/yamls/node-disk-operator.yaml" OpenEBSNamespaceYAML NDMYaml = "../../deploy/yamls/namespace.yaml" @@ -114,8 +114,8 @@ func GetClusterRoleBinding() (rbacv1beta1.ClusterRoleBinding, error) { // GetCustomResourceDefinition generates the CustomResourceDefinition object from the specified // YAML file -func GetCustomResourceDefinition(crdyaml NDMYaml) (apiextensionsv1beta1.CustomResourceDefinition, error) { - var customResourceDefinition apiextensionsv1beta1.CustomResourceDefinition +func GetCustomResourceDefinition(crdyaml NDMYaml) (apiextensionsV1.CustomResourceDefinition, error) { + var customResourceDefinition apiextensionsV1.CustomResourceDefinition yamlString, err := utils.GetYAMLString(string(crdyaml)) if err != nil { return customResourceDefinition, err diff --git a/integration_tests/sanity/ndm_integration_test.go b/integration_tests/sanity/ndm_integration_test.go index 7d434ad78..765c8cd87 100644 --- a/integration_tests/sanity/ndm_integration_test.go +++ b/integration_tests/sanity/ndm_integration_test.go @@ -17,10 +17,11 @@ limitations under the License. package sanity import ( + "testing" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "github.com/openebs/node-disk-manager/integration_tests/k8s" - "testing" ) func TestNDM(t *testing.T) { @@ -34,6 +35,10 @@ var _ = BeforeSuite(func() { c, err := k8s.GetClientSet() Expect(err).NotTo(HaveOccurred()) + // Create the crds + err = c.CreateNDMCRDs() + Expect(err).NotTo(HaveOccurred()) + err = c.CreateOpenEBSNamespace() Expect(err).NotTo(HaveOccurred())