feat(validation): adding validation for ZFSPV CR parameters (#66)

Validating few parameters for the ZFSVolume custom resource

- compression can be "on", "off", "lzjb", "gzip", "gzip-[1-9]", "zle" and "lz4"
- encryption can be "on", "off", "aes-128-ccm", "aes-192-ccm", "aes-256-ccm", "aes-128-gcm", "aes-192-gcm", and "aes-256-gcm"
- dedup can be "on" and "off"
- poolname can be string
- ownernodeid can be string
- thinprovision can be "yes" and "no"
- volumetype can be "DATASET" and "ZVOL"

Also added required fields needed to create ZFSVolume CR
- ownerNodeID
- poolname
- volumeType
- capacity


Signed-off-by: Pawan <pawan@mayadata.io>
This commit is contained in:
Pawan Prakash Sharma 2020-04-14 17:26:46 +05:30 committed by GitHub
parent fbd4812642
commit ae724ee096
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 2206 additions and 342 deletions

View file

@ -61,12 +61,16 @@ test: format
# Bootstrap downloads tools required # Bootstrap downloads tools required
# during build # during build
.PHONY: bootstrap .PHONY: bootstrap
bootstrap: bootstrap: controller-gen
@for tool in $(EXTERNAL_TOOLS) ; do \ @for tool in $(EXTERNAL_TOOLS) ; do \
echo "+ Installing $$tool" ; \ echo "+ Installing $$tool" ; \
go get -u $$tool; \ go get -u $$tool; \
done done
.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.2.8 && rm -rf $$TMP_DIR;
# SRC_PKG is the path of code files # SRC_PKG is the path of code files
SRC_PKG := github.com/openebs/zfs-localpv/pkg SRC_PKG := github.com/openebs/zfs-localpv/pkg
@ -136,7 +140,7 @@ informer:
manifests: manifests:
@echo "+ Generating zfs localPV crds" @echo "+ Generating zfs localPV crds"
$(PWD)/buildscripts/update-crd.sh $(PWD)/buildscripts/generate-manifests.sh
.PHONY: zfs-driver .PHONY: zfs-driver
zfs-driver: format zfs-driver: format

View file

@ -0,0 +1,80 @@
#!/bin/bash
# Copyright 2019 The Kubernetes Authors.
# Copyright 2020 The OpenEBS Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#set -o errexit
set -o nounset
set -o pipefail
## 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
SCRIPT_ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
$CONTROLLER_GEN crd:trivialVersions=true,preserveUnknownFields=false paths=${SCRIPT_ROOT}/pkg/apis/openebs.io/zfs/v1alpha1 output:crd:artifacts:config=deploy/yamls
## create the the crd yamls
echo '
##############################################
########### ############
########### ZFSVolume CRD ############
########### ############
##############################################
# ZFSVolume CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition' > deploy/yamls/zfsvolume-crd.yaml
cat deploy/yamls/zfs.openebs.io_zfsvolumes.yaml >> deploy/yamls/zfsvolume-crd.yaml
rm deploy/yamls/zfs.openebs.io_zfsvolumes.yaml
echo '
##############################################
########### ############
########### ZFSSnapshot CRD ############
########### ############
##############################################
# ZFSSnapshot CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition' > deploy/yamls/zfssnapshot-crd.yaml
cat deploy/yamls/zfs.openebs.io_zfssnapshots.yaml >> deploy/yamls/zfssnapshot-crd.yaml
rm deploy/yamls/zfs.openebs.io_zfssnapshots.yaml
## create the operator file using all the yamls
echo '# This manifest is autogenerated via `make manifests` command
# Do the modification to the zfs-driver.yaml in directory deploy/yamls/
# and then run `make manifests` command
# This manifest deploys the OpenEBS ZFS control plane components,
# with associated CRs & RBAC rules.
' > deploy/zfs-operator.yaml
cat deploy/yamls/namespace.yaml deploy/yamls/zfsvolume-crd.yaml deploy/yamls/zfssnapshot-crd.yaml deploy/yamls/zfs-driver.yaml >> deploy/zfs-operator.yaml
# To use your own boilerplate text use:
# --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt

View file

@ -17,7 +17,7 @@ set -e
DST_REPO="$GOPATH/src/github.com/openebs/zfs-localpv" DST_REPO="$GOPATH/src/github.com/openebs/zfs-localpv"
function checkGitDiff() { function checkGitDiff() {
if [[ `git diff --shortstat | wc -l` != 0 ]]; then echo "Some files got changed after $1";printf "\n";git diff --stat;printf "\n"; exit 1; fi if [[ `git diff --shortstat | wc -l` != 0 ]]; then echo "Some files got changed after $1";printf "\n";git diff;printf "\n"; exit 1; fi
} }
#make golint-travis #make golint-travis
@ -29,6 +29,12 @@ rc=$?; if [[ $rc != 0 ]]; then echo "make kubegen failed"; exit $rc; fi
checkGitDiff "make kubegen" checkGitDiff "make kubegen"
printf "\n" printf "\n"
echo "Running : make manifests"
make manifests
rc=$?; if [[ $rc != 0 ]]; then echo "make manifests failed"; exit $rc; fi
checkGitDiff "make manifests"
printf "\n"
./buildscripts/test-cov.sh ./buildscripts/test-cov.sh
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi

View file

@ -1,45 +0,0 @@
#!/bin/bash
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#set -o errexit
set -o nounset
set -o pipefail
## find or download controller-gen
CONTROLLER_GEN=$(which controller-gen)
if [ "$CONTROLLER_GEN" = "" ]
then
TMP_DIR=$(mktemp -d);
cd $TMP_DIR;
go mod init tmp;
go get sigs.k8s.io/controller-tools/cmd/controller-gen@v0.2.8;
rm -rf $TMP_DIR;
CONTROLLER_GEN=$(which controller-gen)
fi
if [ "$CONTROLLER_GEN" = "" ]
then
echo "ERROR: failed to get controller-gen";
exit 1;
fi
SCRIPT_ROOT=$(unset CDPATH && cd $(dirname "${BASH_SOURCE[0]}")/.. && pwd)
$CONTROLLER_GEN crd:trivialVersions=true,preserveUnknownFields=false paths=${SCRIPT_ROOT}/pkg/apis/openebs.io/zfs/v1alpha1 output:crd:artifacts:config=deploy/yamls
# To use your own boilerplate text use:
# --go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt

View file

@ -0,0 +1,14 @@
# Create the OpenEBS namespace
# This is the default namespace where the ZFS driver will create all
# its resources. If we want to change it to use a different namespace
# modify this to create the new namespace and also modify the OPENEBS_NAMESPACE
# env for the ZFS Driver's controller and agent deployments.
# please note that this should be changed while initial setup, once ZFS Driver
# is deployed with a namespace, we should never modify it as old resources will
# not be available under the new namespace and ZFS Driver looks for all the resources
# in the OPENEBS_NAMESPACE namespace passed as an env.
apiVersion: v1
kind: Namespace
metadata:
name: openebs

View file

@ -0,0 +1,917 @@
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: (devel)
api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139"
creationTimestamp: null
name: volumesnapshotclasses.snapshot.storage.k8s.io
spec:
group: snapshot.storage.k8s.io
names:
kind: VolumeSnapshotClass
listKind: VolumeSnapshotClassList
plural: volumesnapshotclasses
singular: volumesnapshotclass
scope: Cluster
#preserveUnknownFields: false # this field is supported in kubernetes 1.15+ https://v1-15.docs.kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
validation:
openAPIV3Schema:
description: VolumeSnapshotClass specifies parameters that a underlying storage
system uses when creating a volume snapshot. A specific VolumeSnapshotClass
is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses
are non-namespaced
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/api-conventions.md#resources'
type: string
deletionPolicy:
description: deletionPolicy determines whether a VolumeSnapshotContent created
through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot
is deleted. Supported values are "Retain" and "Delete". "Retain" means
that the VolumeSnapshotContent and its physical snapshot on underlying
storage system are kept. "Delete" means that the VolumeSnapshotContent
and its physical snapshot on underlying storage system are deleted. Required.
enum:
- Delete
- Retain
type: string
driver:
description: driver is the name of the storage driver that handles this
VolumeSnapshotClass. Required.
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/api-conventions.md#types-kinds'
type: string
parameters:
additionalProperties:
type: string
description: parameters is a key-value map with storage driver specific
parameters for creating snapshots. These values are opaque to Kubernetes.
type: object
required:
- deletionPolicy
- driver
type: object
version: v1beta1
versions:
- name: v1beta1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: (devel)
api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139"
creationTimestamp: null
name: volumesnapshotcontents.snapshot.storage.k8s.io
spec:
group: snapshot.storage.k8s.io
names:
kind: VolumeSnapshotContent
listKind: VolumeSnapshotContentList
plural: volumesnapshotcontents
singular: volumesnapshotcontent
scope: Cluster
subresources:
status: {}
#preserveUnknownFields: false # this field is supported in kubernetes 1.15+ https://v1-15.docs.kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
validation:
openAPIV3Schema:
description: VolumeSnapshotContent represents the actual "on-disk" snapshot
object in the underlying storage system
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/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/api-conventions.md#types-kinds'
type: string
spec:
description: spec defines properties of a VolumeSnapshotContent created
by the underlying storage system. Required.
properties:
deletionPolicy:
description: deletionPolicy determines whether this VolumeSnapshotContent
and its physical snapshot on the underlying storage system should
be deleted when its bound VolumeSnapshot is deleted. Supported values
are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent
and its physical snapshot on underlying storage system are kept. "Delete"
means that the VolumeSnapshotContent and its physical snapshot on
underlying storage system are deleted. In dynamic snapshot creation
case, this field will be filled in with the "DeletionPolicy" field
defined in the VolumeSnapshotClass the VolumeSnapshot refers to. For
pre-existing snapshots, users MUST specify this field when creating
the VolumeSnapshotContent object. Required.
enum:
- Delete
- Retain
type: string
driver:
description: driver is the name of the CSI driver used to create the
physical snapshot on the underlying storage system. This MUST be the
same as the name returned by the CSI GetPluginName() call for that
driver. Required.
type: string
source:
description: source specifies from where a snapshot will be created.
This field is immutable after creation. Required.
properties:
snapshotHandle:
description: snapshotHandle specifies the CSI "snapshot_id" of a
pre-existing snapshot on the underlying storage system. This field
is immutable.
type: string
volumeHandle:
description: volumeHandle specifies the CSI "volume_id" of the volume
from which a snapshot should be dynamically taken from. This field
is immutable.
type: string
type: object
volumeSnapshotClassName:
description: name of the VolumeSnapshotClass to which this snapshot
belongs.
type: string
volumeSnapshotRef:
description: volumeSnapshotRef specifies the VolumeSnapshot object to
which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName
field must reference to this VolumeSnapshotContent's name for the
bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent
object, name and namespace of the VolumeSnapshot object MUST be provided
for binding to happen. This field is immutable after creation. Required.
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/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/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
required:
- deletionPolicy
- driver
- source
- volumeSnapshotRef
type: object
status:
description: status represents the current information of a snapshot.
properties:
creationTime:
description: creationTime is the timestamp when the point-in-time snapshot
is taken by the underlying storage system. In dynamic snapshot creation
case, this field will be filled in with the "creation_time" value
returned from CSI "CreateSnapshotRequest" gRPC call. For a pre-existing
snapshot, this field will be filled with the "creation_time" value
returned from the CSI "ListSnapshots" gRPC call if the driver supports
it. If not specified, it indicates the creation time is unknown. The
format of this field is a Unix nanoseconds time encoded as an int64.
On Unix, the command `date +%s%N` returns the current time in nanoseconds
since 1970-01-01 00:00:00 UTC.
format: int64
type: integer
error:
description: error is the latest observed error during snapshot creation,
if any.
properties:
message:
description: 'message is a string detailing the encountered error
during snapshot creation if specified. NOTE: message may be logged,
and it should not contain sensitive information.'
type: string
time:
description: time is the timestamp when the error was encountered.
format: date-time
type: string
type: object
readyToUse:
description: readyToUse indicates if a snapshot is ready to be used
to restore a volume. In dynamic snapshot creation case, this field
will be filled in with the "ready_to_use" value returned from CSI
"CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, this
field will be filled with the "ready_to_use" value returned from the
CSI "ListSnapshots" gRPC call if the driver supports it, otherwise,
this field will be set to "True". If not specified, it means the readiness
of a snapshot is unknown.
type: boolean
restoreSize:
description: restoreSize represents the complete size of the snapshot
in bytes. In dynamic snapshot creation case, this field will be filled
in with the "size_bytes" value returned from CSI "CreateSnapshotRequest"
gRPC call. For a pre-existing snapshot, this field will be filled
with the "size_bytes" value returned from the CSI "ListSnapshots"
gRPC call if the driver supports it. When restoring a volume from
this snapshot, the size of the volume MUST NOT be smaller than the
restoreSize if it is specified, otherwise the restoration will fail.
If not specified, it indicates that the size is unknown.
format: int64
minimum: 0
type: integer
snapshotHandle:
description: snapshotHandle is the CSI "snapshot_id" of a snapshot on
the underlying storage system. If not specified, it indicates that
dynamic snapshot creation has either failed or it is still in progress.
type: string
type: object
required:
- spec
type: object
version: v1beta1
versions:
- name: v1beta1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: (devel)
api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139"
creationTimestamp: null
name: volumesnapshots.snapshot.storage.k8s.io
spec:
group: snapshot.storage.k8s.io
names:
kind: VolumeSnapshot
listKind: VolumeSnapshotList
plural: volumesnapshots
singular: volumesnapshot
scope: Namespaced
subresources:
status: {}
#preserveUnknownFields: false # this field is supported in kubernetes 1.15+ https://v1-15.docs.kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
validation:
openAPIV3Schema:
description: VolumeSnapshot is a user's request for either creating a point-in-time
snapshot of a persistent volume, or binding to a pre-existing snapshot.
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/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/api-conventions.md#types-kinds'
type: string
spec:
description: 'spec defines the desired characteristics of a snapshot requested
by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots
Required.'
properties:
source:
description: source specifies where a snapshot will be created from.
This field is immutable after creation. Required.
properties:
persistentVolumeClaimName:
description: persistentVolumeClaimName specifies the name of the
PersistentVolumeClaim object in the same namespace as the VolumeSnapshot
object where the snapshot should be dynamically taken from. This
field is immutable.
type: string
volumeSnapshotContentName:
description: volumeSnapshotContentName specifies the name of a pre-existing
VolumeSnapshotContent object. This field is immutable.
type: string
type: object
volumeSnapshotClassName:
description: 'volumeSnapshotClassName is the name of the VolumeSnapshotClass
requested by the VolumeSnapshot. If not specified, the default snapshot
class will be used if one exists. If not specified, and there is no
default snapshot class, dynamic snapshot creation will fail. Empty
string is not allowed for this field. TODO(xiangqian): a webhook validation
on empty string. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes'
type: string
required:
- source
type: object
status:
description: 'status represents the current information of a snapshot. NOTE:
status can be modified by sources other than system controllers, and must
not be depended upon for accuracy. Controllers should only use information
from the VolumeSnapshotContent object after verifying that the binding
is accurate and complete.'
properties:
boundVolumeSnapshotContentName:
description: 'boundVolumeSnapshotContentName represents the name of
the VolumeSnapshotContent object to which the VolumeSnapshot object
is bound. If not specified, it indicates that the VolumeSnapshot object
has not been successfully bound to a VolumeSnapshotContent object
yet. NOTE: Specified boundVolumeSnapshotContentName alone does not
mean binding is valid. Controllers MUST always verify bidirectional
binding between VolumeSnapshot and VolumeSnapshotContent to
avoid possible security issues.'
type: string
creationTime:
description: creationTime is the timestamp when the point-in-time snapshot
is taken by the underlying storage system. In dynamic snapshot creation
case, this field will be filled in with the "creation_time" value
returned from CSI "CreateSnapshotRequest" gRPC call. For a pre-existing
snapshot, this field will be filled with the "creation_time" value
returned from the CSI "ListSnapshots" gRPC call if the driver supports
it. If not specified, it indicates that the creation time of the snapshot
is unknown.
format: date-time
type: string
error:
description: error is the last observed error during snapshot creation,
if any. This field could be helpful to upper level controllers(i.e.,
application controller) to decide whether they should continue on
waiting for the snapshot to be created based on the type of error
reported.
properties:
message:
description: 'message is a string detailing the encountered error
during snapshot creation if specified. NOTE: message may be logged,
and it should not contain sensitive information.'
type: string
time:
description: time is the timestamp when the error was encountered.
format: date-time
type: string
type: object
readyToUse:
description: readyToUse indicates if a snapshot is ready to be used
to restore a volume. In dynamic snapshot creation case, this field
will be filled in with the "ready_to_use" value returned from CSI
"CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, this
field will be filled with the "ready_to_use" value returned from the
CSI "ListSnapshots" gRPC call if the driver supports it, otherwise,
this field will be set to "True". If not specified, it means the readiness
of a snapshot is unknown.
type: boolean
restoreSize:
description: restoreSize represents the complete size of the snapshot
in bytes. In dynamic snapshot creation case, this field will be filled
in with the "size_bytes" value returned from CSI "CreateSnapshotRequest"
gRPC call. For a pre-existing snapshot, this field will be filled
with the "size_bytes" value returned from the CSI "ListSnapshots"
gRPC call if the driver supports it. When restoring a volume from
this snapshot, the size of the volume MUST NOT be smaller than the
restoreSize if it is specified, otherwise the restoration will fail.
If not specified, it indicates that the size is unknown.
type: string
type: object
required:
- spec
type: object
version: v1beta1
versions:
- name: v1beta1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
---
##############################################
########### ############
########### Controller plugin ############
########### ############
##############################################
kind: ServiceAccount
apiVersion: v1
metadata:
name: openebs-zfs-controller-sa
namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-provisioner-role
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["*"]
- apiGroups: [""]
resources: ["persistentvolumes", "services"]
verbs: ["get", "list", "watch", "create", "delete", "update", "patch"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
resources: ["persistentvolumeclaims/status"]
verbs: ["update", "patch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses", "csinodes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: ["coordination.k8s.io"]
resources: ["leases"]
verbs: ["get", "watch", "list", "delete", "update", "create"]
- apiGroups: ["*"]
resources: ["zfsvolumes", "zfssnapshots"]
verbs: ["*"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-provisioner-binding
subjects:
- kind: ServiceAccount
name: openebs-zfs-controller-sa
namespace: kube-system
roleRef:
kind: ClusterRole
name: openebs-zfs-provisioner-role
apiGroup: rbac.authorization.k8s.io
---
kind: StatefulSet
apiVersion: apps/v1
metadata:
name: openebs-zfs-controller
namespace: kube-system
spec:
selector:
matchLabels:
app: openebs-zfs-controller
role: openebs-zfs
serviceName: "openebs-zfs"
replicas: 1
template:
metadata:
labels:
app: openebs-zfs-controller
role: openebs-zfs
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- openebs-zfs-controller
topologyKey: "kubernetes.io/hostname"
priorityClassName: system-cluster-critical
serviceAccount: openebs-zfs-controller-sa
containers:
- name: csi-resizer
image: quay.io/k8scsi/csi-resizer:v0.4.0
args:
- "--v=5"
- "--csi-address=$(ADDRESS)"
- "--leader-election"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
imagePullPolicy: IfNotPresent
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: csi-snapshotter
image: quay.io/k8scsi/csi-snapshotter:v2.0.1
imagePullPolicy: IfNotPresent
args:
- "--csi-address=$(ADDRESS)"
- "--leader-election"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
imagePullPolicy: Always
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: snapshot-controller
image: quay.io/k8scsi/snapshot-controller:v2.0.1
args:
- "--v=5"
- "--leader-election=false"
imagePullPolicy: IfNotPresent
- name: csi-provisioner
image: quay.io/k8scsi/csi-provisioner:v1.5.0
imagePullPolicy: IfNotPresent
args:
- "--csi-address=$(ADDRESS)"
- "--v=5"
- "--feature-gates=Topology=true"
- "--strict-topology"
- "--enable-leader-election"
- "--leader-election-type=leases"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: csi-attacher
image: quay.io/k8scsi/csi-attacher:v2.0.0
imagePullPolicy: IfNotPresent
args:
- "--v=5"
- "--csi-address=$(ADDRESS)"
- "--leader-election"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: csi-cluster-driver-registrar
image: quay.io/k8scsi/csi-cluster-driver-registrar:v1.0.1
args:
- "--v=5"
- "--driver-requires-attachment=false"
- "--csi-address=$(ADDRESS)"
env:
- name: ADDRESS
value: /var/lib/csi/sockets/pluginproxy/csi.sock
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
- name: openebs-zfs-plugin
image: quay.io/openebs/zfs-driver:ci
imagePullPolicy: IfNotPresent
env:
- name: OPENEBS_CONTROLLER_DRIVER
value: controller
- name: OPENEBS_CSI_ENDPOINT
value: unix:///var/lib/csi/sockets/pluginproxy/csi.sock
- name: OPENEBS_NAMESPACE
value: openebs
- name: OPENEBS_IO_INSTALLER_TYPE
value: "zfs-operator"
- name: OPENEBS_IO_ENABLE_ANALYTICS
value: "true"
args :
- "--endpoint=$(OPENEBS_CSI_ENDPOINT)"
- "--plugin=$(OPENEBS_CONTROLLER_DRIVER)"
volumeMounts:
- name: socket-dir
mountPath: /var/lib/csi/sockets/pluginproxy/
volumes:
- name: socket-dir
emptyDir: {}
---
############################## CSI- Attacher #######################
# Attacher must be able to work with PVs, nodes and VolumeAttachments
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-attacher-role
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: ["csi.storage.k8s.io"]
resources: ["csinodeinfos"]
verbs: ["get", "list", "watch"]
- apiGroups: ["storage.k8s.io"]
resources: ["volumeattachments", "csinodes"]
verbs: ["get", "list", "watch", "update", "patch"]
- apiGroups: ["coordination.k8s.io"]
resources: ["leases"]
verbs: ["get", "watch", "list", "delete", "update", "create"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-attacher-binding
subjects:
- kind: ServiceAccount
name: openebs-zfs-controller-sa
namespace: kube-system
roleRef:
kind: ClusterRole
name: openebs-zfs-attacher-role
apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-snapshotter-role
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list"]
- apiGroups: ["snapshot.storage.k8s.io"]
resources: ["volumesnapshotclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: ["snapshot.storage.k8s.io"]
resources: ["volumesnapshotcontents"]
verbs: ["create", "get", "list", "watch", "update", "delete"]
- apiGroups: ["snapshot.storage.k8s.io"]
resources: ["volumesnapshots"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["snapshot.storage.k8s.io"]
resources: ["volumesnapshotcontents/status"]
verbs: ["update"]
- apiGroups: ["snapshot.storage.k8s.io"]
resources: ["volumesnapshots/status"]
verbs: ["update"]
- apiGroups: ["apiextensions.k8s.io"]
resources: ["customresourcedefinitions"]
verbs: ["create", "list", "watch", "delete"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-snapshotter-binding
subjects:
- kind: ServiceAccount
name: openebs-zfs-controller-sa
namespace: kube-system
roleRef:
kind: ClusterRole
name: openebs-zfs-snapshotter-role
apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-cluster-driver-registrar-role
rules:
- apiGroups: ["csi.storage.k8s.io"]
resources: ["csidrivers"]
verbs: ["create", "delete"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-cluster-driver-registrar-binding
subjects:
- kind: ServiceAccount
name: openebs-zfs-controller-sa
namespace: kube-system
roleRef:
kind: ClusterRole
name: openebs-zfs-cluster-driver-registrar-role
apiGroup: rbac.authorization.k8s.io
---
########################################
########### ############
########### Node plugin ############
########### ############
########################################
apiVersion: v1
kind: ServiceAccount
metadata:
name: openebs-zfs-node-sa
namespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-driver-registrar-role
rules:
- apiGroups: [""]
resources: ["events"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["persistentvolumes", "nodes", "services"]
verbs: ["get", "list"]
- apiGroups: ["*"]
resources: ["zfsvolumes", "zfssnapshots"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: openebs-zfs-driver-registrar-binding
subjects:
- kind: ServiceAccount
name: openebs-zfs-node-sa
namespace: kube-system
roleRef:
kind: ClusterRole
name: openebs-zfs-driver-registrar-role
apiGroup: rbac.authorization.k8s.io
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: openebs-zfs-node
namespace: kube-system
spec:
selector:
matchLabels:
app: openebs-zfs-node
template:
metadata:
labels:
app: openebs-zfs-node
role: openebs-zfs
spec:
priorityClassName: system-node-critical
serviceAccount: openebs-zfs-node-sa
hostNetwork: true
containers:
- name: csi-node-driver-registrar
image: quay.io/k8scsi/csi-node-driver-registrar:v1.2.0
args:
- "--v=5"
- "--csi-address=$(ADDRESS)"
- "--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)"
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "rm -rf /registration/zfs-localpv /registration/zfs-localpv-reg.sock"]
env:
- name: ADDRESS
value: /plugin/csi.sock
- name: DRIVER_REG_SOCK_PATH
value: /var/lib/kubelet/plugins/zfs-localpv/csi.sock
- name: KUBE_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: NODE_DRIVER
value: openebs-zfs
volumeMounts:
- name: plugin-dir
mountPath: /plugin
- name: registration-dir
mountPath: /registration
- name: openebs-zfs-plugin
securityContext:
privileged: true
capabilities:
add: ["CAP_MKNOD", "CAP_SYS_ADMIN", "SYS_ADMIN"]
allowPrivilegeEscalation: true
image: quay.io/openebs/zfs-driver:ci
imagePullPolicy: IfNotPresent
args:
- "--nodeid=$(OPENEBS_NODE_ID)"
- "--endpoint=$(OPENEBS_CSI_ENDPOINT)"
- "--plugin=$(OPENEBS_NODE_DRIVER)"
env:
- name: OPENEBS_NODE_ID
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: OPENEBS_CSI_ENDPOINT
value: unix:///plugin/csi.sock
- name: OPENEBS_NODE_DRIVER
value: agent
- name: OPENEBS_NAMESPACE
value: openebs
volumeMounts:
- name: plugin-dir
mountPath: /plugin
- name: device-dir
mountPath: /dev
- name: encr-keys
mountPath: /home/keys
- name: zfs-bin
mountPath: /sbin/zfs
- name: libzpool
mountPath: /lib/libzpool.so.2
- name: libzfscore
mountPath: /lib/libzfs_core.so.1
- name: libzfs
mountPath: /lib/libzfs.so.2
- name: libuutil
mountPath: /lib/libuutil.so.1
- name: libnvpair
mountPath: /lib/libnvpair.so.1
- name: pods-mount-dir
mountPath: /var/lib/kubelet/pods
# needed so that any mounts setup inside this container are
# propagated back to the host machine.
mountPropagation: "Bidirectional"
volumes:
- name: device-dir
hostPath:
path: /dev
type: Directory
- name: encr-keys
hostPath:
path: /home/keys
type: DirectoryOrCreate
- name: zfs-bin
hostPath:
path: /sbin/zfs
type: File
- name: libzpool
hostPath:
path: /lib/libzpool.so.2.0.0
type: File
- name: libzfscore
hostPath:
path: /lib/libzfs_core.so.1.0.0
type: File
- name: libzfs
hostPath:
path: /lib/libzfs.so.2.0.0
type: File
- name: libuutil
hostPath:
path: /lib/libuutil.so.1.0.1
type: File
- name: libnvpair
hostPath:
path: /lib/libnvpair.so.1.0.1
type: File
- name: registration-dir
hostPath:
path: /var/lib/kubelet/plugins_registry/
type: DirectoryOrCreate
- name: plugin-dir
hostPath:
path: /var/lib/kubelet/plugins/zfs-localpv/
type: DirectoryOrCreate
- name: pods-mount-dir
hostPath:
path: /var/lib/kubelet/pods
type: Directory
---

View file

@ -1,153 +0,0 @@
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.8
creationTimestamp: null
name: zfssnapshots.zfs.openebs.io
spec:
group: zfs.openebs.io
names:
kind: ZFSSnapshot
listKind: ZFSSnapshotList
plural: zfssnapshots
shortNames:
- zfssnap
singular: zfssnapshot
preserveUnknownFields: false
scope: Namespaced
validation:
openAPIV3Schema:
description: ZFSSnapshot represents a ZFS Snapshot of the zfsvolume
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/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/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: VolumeInfo contains the volume related info for all types of
volumes in ZFSVolume
properties:
capacity:
description: Capacity of the volume
minLength: 1
type: string
compression:
description: Controls the compression algorithm used for this dataset.
Compression specifies if the it should enabled on the zvol. Setting
compression to on indicates that the current default compression algorithm
should be used. The current default compression algorithm is either
lzjb or, if the lz4_compress feature is enabled, lz4. Changing this
property affects only newly-written data.
pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$
type: string
dedup:
description: Deduplication is the process for removing redundant data
at the block level, reducing the total amount of data stored. If a
file system has the dedup property enabled, duplicate data blocks
are removed synchronously. The result is that only unique data is
stored and common components are shared among files. Deduplication
can consume significant processing power (CPU) and memory as well
as generate additional disk IO. Before creating a pool with deduplication
enabled, ensure that you have planned your hardware requirements appropriately
and implemented appropriate recovery practices, such as regular backups.
As an alternative to deduplication consider using compression=lz4,
as a less resource-intensive alternative. should be enabled on the
zvol
enum:
- "on"
- "off"
type: string
encryption:
description: Enabling the encryption feature allows for the creation
of encrypted filesystems and volumes. ZFS will encrypt file and zvol
data, file attributes, ACLs, permission bits, directory listings,
FUID mappings, and userused / groupused data. ZFS will not encrypt
metadata related to the pool structure, including dataset and snapshot
names, dataset hierarchy, properties, file size, file holes, and deduplication
tables (though the deduplicated data itself is encrypted).
pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$
type: string
fsType:
description: FsType specifies filesystem type for the zfs volume/dataset
type: string
keyformat:
description: KeyFormat specifies format of the encryption key
type: string
keylocation:
description: KeyLocation is the location of key for the encryption
type: string
ownerNodeID:
minLength: 1
type: string
poolName:
description: poolName specifies the name of the pool where this volume
should be created
minLength: 1
type: string
recordsize:
description: RecordSize specifies the record size for the zfs dataset
minLength: 1
type: string
snapname:
description: SnapName specifies the name of the snapshot where this
volume should be cloned
type: string
thinProvision:
description: Thinprovision specifies if we should thin provisioned the
volume or not
enum:
- "Yes"
- "no"
type: string
volblocksize:
description: VolBlockSize specifies the block size for the zvol
minLength: 1
type: string
volumeType:
description: volumeType determines whether the volume is of type "DATASET"
or "ZVOL". if fsttype provided in the storageclass is "zfs", then
it will create a volume of type "DATASET". If "ext4", "ext3", "ext2"
or "xfs" is mentioned as fstype in the storageclass, it will create
a volume of type "ZVOL" so that it can be further formatted with the
fstype provided in the storageclass.
enum:
- ZVOL
- DATASET
type: string
required:
- capacity
- ownerNodeID
- poolName
- volumeType
type: object
status:
properties:
state:
type: string
type: object
required:
- spec
- status
type: object
version: v1alpha1
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []

View file

@ -0,0 +1,204 @@
##############################################
########### ############
########### ZFSSnapshot CRD ############
########### ############
##############################################
# ZFSSnapshot CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.8
creationTimestamp: null
name: zfssnapshots.zfs.openebs.io
spec:
group: zfs.openebs.io
names:
kind: ZFSSnapshot
listKind: ZFSSnapshotList
plural: zfssnapshots
shortNames:
- zfssnap
singular: zfssnapshot
preserveUnknownFields: false
scope: Namespaced
validation:
openAPIV3Schema:
description: ZFSSnapshot represents a ZFS Snapshot of the zfsvolume
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/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/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: VolumeInfo defines ZFS volume parameters for all modes in which
ZFS volumes can be created like - ZFS volume with filesystem, ZFS Volume
exposed as zfs or ZFS volume exposed as raw block device. Some of the
parameters can be only set during creation time (as specified in the details
of the parameter), and a few are editable. In case of Cloned volumes,
the parameters are assigned the same values as the source volume.
properties:
capacity:
description: Capacity of the volume
minLength: 1
type: string
compression:
description: 'Compression specifies the block-level compression algorithm
to be applied to the ZFS Volume. The value "on" indicates ZFS to use
the default compression algorithm. The default compression algorithm
used by ZFS will be either lzjb or, if the lz4_compress feature is
enabled, lz4. Compression property can be edited after the volume
has been created. The change will only be applied to the newly-written
data. For instance, if the Volume was created with "off" and the next
day the compression was modified to "on", the data written prior to
setting "on" will not be compressed. Default Value: off.'
pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$
type: string
dedup:
description: 'Deduplication is the process for removing redundant data
at the block level, reducing the total amount of data stored. If a
file system has the dedup property enabled, duplicate data blocks
are removed synchronously. The result is that only unique data is
stored and common components are shared among files. Deduplication
can consume significant processing power (CPU) and memory as well
as generate additional disk IO. Before creating a pool with deduplication
enabled, ensure that you have planned your hardware requirements appropriately
and implemented appropriate recovery practices, such as regular backups.
As an alternative to deduplication consider using compression=lz4,
as a less resource-intensive alternative. should be enabled on the
zvol. Dedup property can be edited after the volume has been created.
Default Value: off.'
enum:
- "on"
- "off"
type: string
encryption:
description: 'Enabling the encryption feature allows for the creation
of encrypted filesystems and volumes. ZFS will encrypt file and zvol
data, file attributes, ACLs, permission bits, directory listings,
FUID mappings, and userused / groupused data. ZFS will not encrypt
metadata related to the pool structure, including dataset and snapshot
names, dataset hierarchy, properties, file size, file holes, and deduplication
tables (though the deduplicated data itself is encrypted). Default
Value: off.'
pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$
type: string
fsType:
description: 'FsType specifies filesystem type for the zfs volume/dataset.
If FsType is provided as "zfs", then the driver will create a ZFS
dataset, formatting is not required as underlying filesystem is ZFS
anyway. If FsType is ext2, ext3, ext4 or xfs, then the driver will
create a ZVOL and format the volume accordingly. FsType can not be
modified once volume has been provisioned. Default Value: ext4.'
type: string
keyformat:
description: KeyFormat specifies format of the encryption key The supported
KeyFormats are passphrase, raw, hex.
enum:
- passphrase
- raw
- hex
type: string
keylocation:
description: KeyLocation is the location of key for the encryption
type: string
ownerNodeID:
description: OwnerNodeID is the Node ID where the ZPOOL is running which
is where the volume has been provisioned. OwnerNodeID can not be edited
after the volume has been provisioned.
minLength: 1
type: string
poolName:
description: poolName specifies the name of the pool where the volume
has been created. PoolName can not be edited after the volume has
been provisioned.
minLength: 1
type: string
recordsize:
description: 'Specifies a suggested block size for files in the file
system. The size specified must be a power of two greater than or
equal to 512 and less than or equal to 128 Kbytes. RecordSize property
can be edited after the volume has been created. Changing the file
system''s recordsize affects only files created afterward; existing
files are unaffected. Default Value: 128k.'
minLength: 1
type: string
snapname:
description: SnapName specifies the name of the snapshot where the volume
has been cloned from. Snapname can not be edited after the volume
has been provisioned.
type: string
thinProvision:
description: 'ThinProvision describes whether space reservation for
the source volume is required or not. The value "yes" indicates that
volume should be thin provisioned and "no" means thick provisioning
of the volume. If thinProvision is set to "yes" then volume can be
provisioned even if the ZPOOL does not have the enough capacity. If
thinProvision is set to "no" then volume can be provisioned only if
the ZPOOL has enough capacity and capacity required by volume can
be reserved. ThinProvision can not be modified once volume has been
provisioned. Default Value: no.'
enum:
- "yes"
- "no"
type: string
volblocksize:
description: 'VolBlockSize specifies the block size for the zvol. The
volsize can only be set to a multiple of volblocksize, and cannot
be zero. VolBlockSize can not be edited after the volume has been
provisioned. Default Value: 8k.'
minLength: 1
type: string
volumeType:
description: volumeType determines whether the volume is of type "DATASET"
or "ZVOL". If fstype provided in the storageclass is "zfs", a volume
of type dataset will be created. If "ext4", "ext3", "ext2" or "xfs"
is mentioned as fstype in the storageclass, then a volume of type
zvol will be created, which will be further formatted as the fstype
provided in the storageclass. VolumeType can not be modified once
volume has been provisioned.
enum:
- ZVOL
- DATASET
type: string
required:
- capacity
- ownerNodeID
- poolName
- volumeType
type: object
status:
properties:
state:
type: string
type: object
required:
- spec
- status
type: object
version: v1alpha1
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []

View file

@ -1,4 +1,15 @@
##############################################
########### ############
########### ZFSVolume CRD ############
########### ############
##############################################
# ZFSVolume CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition
--- ---
apiVersion: apiextensions.k8s.io/v1beta1 apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
@ -69,24 +80,31 @@ spec:
metadata: metadata:
type: object type: object
spec: spec:
description: VolumeInfo contains the volume related info for all types of description: VolumeInfo defines ZFS volume parameters for all modes in which
volumes in ZFSVolume ZFS volumes can be created like - ZFS volume with filesystem, ZFS Volume
exposed as zfs or ZFS volume exposed as raw block device. Some of the
parameters can be only set during creation time (as specified in the details
of the parameter), and a few are editable. In case of Cloned volumes,
the parameters are assigned the same values as the source volume.
properties: properties:
capacity: capacity:
description: Capacity of the volume description: Capacity of the volume
minLength: 1 minLength: 1
type: string type: string
compression: compression:
description: Controls the compression algorithm used for this dataset. description: 'Compression specifies the block-level compression algorithm
Compression specifies if the it should enabled on the zvol. Setting to be applied to the ZFS Volume. The value "on" indicates ZFS to use
compression to on indicates that the current default compression algorithm the default compression algorithm. The default compression algorithm
should be used. The current default compression algorithm is either used by ZFS will be either lzjb or, if the lz4_compress feature is
lzjb or, if the lz4_compress feature is enabled, lz4. Changing this enabled, lz4. Compression property can be edited after the volume
property affects only newly-written data. has been created. The change will only be applied to the newly-written
data. For instance, if the Volume was created with "off" and the next
day the compression was modified to "on", the data written prior to
setting "on" will not be compressed. Default Value: off.'
pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$ pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$
type: string type: string
dedup: dedup:
description: Deduplication is the process for removing redundant data description: 'Deduplication is the process for removing redundant data
at the block level, reducing the total amount of data stored. If a at the block level, reducing the total amount of data stored. If a
file system has the dedup property enabled, duplicate data blocks file system has the dedup property enabled, duplicate data blocks
are removed synchronously. The result is that only unique data is are removed synchronously. The result is that only unique data is
@ -97,64 +115,97 @@ spec:
and implemented appropriate recovery practices, such as regular backups. and implemented appropriate recovery practices, such as regular backups.
As an alternative to deduplication consider using compression=lz4, As an alternative to deduplication consider using compression=lz4,
as a less resource-intensive alternative. should be enabled on the as a less resource-intensive alternative. should be enabled on the
zvol zvol. Dedup property can be edited after the volume has been created.
Default Value: off.'
enum: enum:
- "on" - "on"
- "off" - "off"
type: string type: string
encryption: encryption:
description: Enabling the encryption feature allows for the creation description: 'Enabling the encryption feature allows for the creation
of encrypted filesystems and volumes. ZFS will encrypt file and zvol of encrypted filesystems and volumes. ZFS will encrypt file and zvol
data, file attributes, ACLs, permission bits, directory listings, data, file attributes, ACLs, permission bits, directory listings,
FUID mappings, and userused / groupused data. ZFS will not encrypt FUID mappings, and userused / groupused data. ZFS will not encrypt
metadata related to the pool structure, including dataset and snapshot metadata related to the pool structure, including dataset and snapshot
names, dataset hierarchy, properties, file size, file holes, and deduplication names, dataset hierarchy, properties, file size, file holes, and deduplication
tables (though the deduplicated data itself is encrypted). tables (though the deduplicated data itself is encrypted). Default
Value: off.'
pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$ pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$
type: string type: string
fsType: fsType:
description: FsType specifies filesystem type for the zfs volume/dataset description: 'FsType specifies filesystem type for the zfs volume/dataset.
If FsType is provided as "zfs", then the driver will create a ZFS
dataset, formatting is not required as underlying filesystem is ZFS
anyway. If FsType is ext2, ext3, ext4 or xfs, then the driver will
create a ZVOL and format the volume accordingly. FsType can not be
modified once volume has been provisioned. Default Value: ext4.'
type: string type: string
keyformat: keyformat:
description: KeyFormat specifies format of the encryption key description: KeyFormat specifies format of the encryption key The supported
KeyFormats are passphrase, raw, hex.
enum:
- passphrase
- raw
- hex
type: string type: string
keylocation: keylocation:
description: KeyLocation is the location of key for the encryption description: KeyLocation is the location of key for the encryption
type: string type: string
ownerNodeID: ownerNodeID:
description: OwnerNodeID is the Node ID where the ZPOOL is running which
is where the volume has been provisioned. OwnerNodeID can not be edited
after the volume has been provisioned.
minLength: 1 minLength: 1
type: string type: string
poolName: poolName:
description: poolName specifies the name of the pool where this volume description: poolName specifies the name of the pool where the volume
should be created has been created. PoolName can not be edited after the volume has
been provisioned.
minLength: 1 minLength: 1
type: string type: string
recordsize: recordsize:
description: RecordSize specifies the record size for the zfs dataset description: 'Specifies a suggested block size for files in the file
system. The size specified must be a power of two greater than or
equal to 512 and less than or equal to 128 Kbytes. RecordSize property
can be edited after the volume has been created. Changing the file
system''s recordsize affects only files created afterward; existing
files are unaffected. Default Value: 128k.'
minLength: 1 minLength: 1
type: string type: string
snapname: snapname:
description: SnapName specifies the name of the snapshot where this description: SnapName specifies the name of the snapshot where the volume
volume should be cloned has been cloned from. Snapname can not be edited after the volume
has been provisioned.
type: string type: string
thinProvision: thinProvision:
description: Thinprovision specifies if we should thin provisioned the description: 'ThinProvision describes whether space reservation for
volume or not the source volume is required or not. The value "yes" indicates that
volume should be thin provisioned and "no" means thick provisioning
of the volume. If thinProvision is set to "yes" then volume can be
provisioned even if the ZPOOL does not have the enough capacity. If
thinProvision is set to "no" then volume can be provisioned only if
the ZPOOL has enough capacity and capacity required by volume can
be reserved. ThinProvision can not be modified once volume has been
provisioned. Default Value: no.'
enum: enum:
- "Yes" - "yes"
- "no" - "no"
type: string type: string
volblocksize: volblocksize:
description: VolBlockSize specifies the block size for the zvol description: 'VolBlockSize specifies the block size for the zvol. The
volsize can only be set to a multiple of volblocksize, and cannot
be zero. VolBlockSize can not be edited after the volume has been
provisioned. Default Value: 8k.'
minLength: 1 minLength: 1
type: string type: string
volumeType: volumeType:
description: volumeType determines whether the volume is of type "DATASET" description: volumeType determines whether the volume is of type "DATASET"
or "ZVOL". if fsttype provided in the storageclass is "zfs", then or "ZVOL". If fstype provided in the storageclass is "zfs", a volume
it will create a volume of type "DATASET". If "ext4", "ext3", "ext2" of type dataset will be created. If "ext4", "ext3", "ext2" or "xfs"
or "xfs" is mentioned as fstype in the storageclass, it will create is mentioned as fstype in the storageclass, then a volume of type
a volume of type "ZVOL" so that it can be further formatted with the zvol will be created, which will be further formatted as the fstype
fstype provided in the storageclass. provided in the storageclass. VolumeType can not be modified once
volume has been provisioned.
enum: enum:
- ZVOL - ZVOL
- DATASET - DATASET

View file

@ -1,74 +1,461 @@
# This manifest is autogenerated via `make manifests` command
# Do the modification to the zfs-driver.yaml in directory deploy/yamls/
# and then run `make manifests` command
# This manifest deploys the OpenEBS ZFS control plane components, # This manifest deploys the OpenEBS ZFS control plane components,
# with associated CRs & RBAC rules. # with associated CRs & RBAC rules.
# Create the OpenEBS namespace # Create the OpenEBS namespace
# This is the default namespace where the ZFS driver will create all
# its resources. If we want to change it to use a different namespace
# modify this to create the new namespace and also modify the OPENEBS_NAMESPACE
# env for the ZFS Driver's controller and agent deployments.
# please note that this should be changed while initial setup, once ZFS Driver
# is deployed with a namespace, we should never modify it as old resources will
# not be available under the new namespace and ZFS Driver looks for all the resources
# in the OPENEBS_NAMESPACE namespace passed as an env.
apiVersion: v1 apiVersion: v1
kind: Namespace kind: Namespace
metadata: metadata:
name: openebs name: openebs
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
name: zfsvolumes.zfs.openebs.io
spec:
group: zfs.openebs.io
version: v1alpha1
scope: Namespaced
names:
plural: zfsvolumes
singular: zfsvolume
kind: ZFSVolume
shortNames:
- zfsvol
- zv
additionalPrinterColumns:
- JSONPath: .spec.poolName
name: ZPool
description: ZFS Pool where the volume is created
type: string
- JSONPath: .spec.ownerNodeID
name: Node
description: Node where the volume is created
type: string
- JSONPath: .spec.capacity
name: Size
description: Size of the volume
type: string
- JSONPath: .spec.volblocksize
name: volblocksize
description: volblocksize for the created zvol
type: string
- JSONPath: .spec.recordsize
name: recordsize
description: recordsize for the created zfs dataset
type: string
- JSONPath: .spec.fsType
name: Filesystem
description: filesystem created on the volume
type: string
---
############################################## ##############################################
########### ############ ########### ############
########### Snapshot CRDs ############ ########### ZFSVolume CRD ############
########### ############ ########### ############
############################################## ##############################################
# ZFSVolume CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition
---
apiVersion: apiextensions.k8s.io/v1beta1 apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.8
creationTimestamp: null
name: zfsvolumes.zfs.openebs.io
spec:
additionalPrinterColumns:
- JSONPath: .spec.poolName
description: ZFS Pool where the volume is created
name: ZPool
type: string
- JSONPath: .spec.ownerNodeID
description: Node where the volume is created
name: Node
type: string
- JSONPath: .spec.capacity
description: Size of the volume
name: Size
type: string
- JSONPath: .spec.volblocksize
description: volblocksize of volume
name: volblocksize
type: string
- JSONPath: .spec.recordsize
description: recordsize of created zfs dataset
name: recordsize
type: string
- JSONPath: .spec.fsType
description: filesystem created on the volume
name: Filesystem
type: string
- JSONPath: .status.creationTime
description: Timestamp when the volume has been created.
name: CreationTime
type: date
- JSONPath: .metadata.creationTimestamp
name: Age
type: date
group: zfs.openebs.io
names:
kind: ZFSVolume
listKind: ZFSVolumeList
plural: zfsvolumes
shortNames:
- zfsvol
- zv
singular: zfsvolume
preserveUnknownFields: false
scope: Namespaced
subresources: {}
validation:
openAPIV3Schema:
description: ZFSVolume represents a ZFS based volume
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/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/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: VolumeInfo defines ZFS volume parameters for all modes in which
ZFS volumes can be created like - ZFS volume with filesystem, ZFS Volume
exposed as zfs or ZFS volume exposed as raw block device. Some of the
parameters can be only set during creation time (as specified in the details
of the parameter), and a few are editable. In case of Cloned volumes,
the parameters are assigned the same values as the source volume.
properties:
capacity:
description: Capacity of the volume
minLength: 1
type: string
compression:
description: 'Compression specifies the block-level compression algorithm
to be applied to the ZFS Volume. The value "on" indicates ZFS to use
the default compression algorithm. The default compression algorithm
used by ZFS will be either lzjb or, if the lz4_compress feature is
enabled, lz4. Compression property can be edited after the volume
has been created. The change will only be applied to the newly-written
data. For instance, if the Volume was created with "off" and the next
day the compression was modified to "on", the data written prior to
setting "on" will not be compressed. Default Value: off.'
pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$
type: string
dedup:
description: 'Deduplication is the process for removing redundant data
at the block level, reducing the total amount of data stored. If a
file system has the dedup property enabled, duplicate data blocks
are removed synchronously. The result is that only unique data is
stored and common components are shared among files. Deduplication
can consume significant processing power (CPU) and memory as well
as generate additional disk IO. Before creating a pool with deduplication
enabled, ensure that you have planned your hardware requirements appropriately
and implemented appropriate recovery practices, such as regular backups.
As an alternative to deduplication consider using compression=lz4,
as a less resource-intensive alternative. should be enabled on the
zvol. Dedup property can be edited after the volume has been created.
Default Value: off.'
enum:
- "on"
- "off"
type: string
encryption:
description: 'Enabling the encryption feature allows for the creation
of encrypted filesystems and volumes. ZFS will encrypt file and zvol
data, file attributes, ACLs, permission bits, directory listings,
FUID mappings, and userused / groupused data. ZFS will not encrypt
metadata related to the pool structure, including dataset and snapshot
names, dataset hierarchy, properties, file size, file holes, and deduplication
tables (though the deduplicated data itself is encrypted). Default
Value: off.'
pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$
type: string
fsType:
description: 'FsType specifies filesystem type for the zfs volume/dataset.
If FsType is provided as "zfs", then the driver will create a ZFS
dataset, formatting is not required as underlying filesystem is ZFS
anyway. If FsType is ext2, ext3, ext4 or xfs, then the driver will
create a ZVOL and format the volume accordingly. FsType can not be
modified once volume has been provisioned. Default Value: ext4.'
type: string
keyformat:
description: KeyFormat specifies format of the encryption key The supported
KeyFormats are passphrase, raw, hex.
enum:
- passphrase
- raw
- hex
type: string
keylocation:
description: KeyLocation is the location of key for the encryption
type: string
ownerNodeID:
description: OwnerNodeID is the Node ID where the ZPOOL is running which
is where the volume has been provisioned. OwnerNodeID can not be edited
after the volume has been provisioned.
minLength: 1
type: string
poolName:
description: poolName specifies the name of the pool where the volume
has been created. PoolName can not be edited after the volume has
been provisioned.
minLength: 1
type: string
recordsize:
description: 'Specifies a suggested block size for files in the file
system. The size specified must be a power of two greater than or
equal to 512 and less than or equal to 128 Kbytes. RecordSize property
can be edited after the volume has been created. Changing the file
system''s recordsize affects only files created afterward; existing
files are unaffected. Default Value: 128k.'
minLength: 1
type: string
snapname:
description: SnapName specifies the name of the snapshot where the volume
has been cloned from. Snapname can not be edited after the volume
has been provisioned.
type: string
thinProvision:
description: 'ThinProvision describes whether space reservation for
the source volume is required or not. The value "yes" indicates that
volume should be thin provisioned and "no" means thick provisioning
of the volume. If thinProvision is set to "yes" then volume can be
provisioned even if the ZPOOL does not have the enough capacity. If
thinProvision is set to "no" then volume can be provisioned only if
the ZPOOL has enough capacity and capacity required by volume can
be reserved. ThinProvision can not be modified once volume has been
provisioned. Default Value: no.'
enum:
- "yes"
- "no"
type: string
volblocksize:
description: 'VolBlockSize specifies the block size for the zvol. The
volsize can only be set to a multiple of volblocksize, and cannot
be zero. VolBlockSize can not be edited after the volume has been
provisioned. Default Value: 8k.'
minLength: 1
type: string
volumeType:
description: volumeType determines whether the volume is of type "DATASET"
or "ZVOL". If fstype provided in the storageclass is "zfs", a volume
of type dataset will be created. If "ext4", "ext3", "ext2" or "xfs"
is mentioned as fstype in the storageclass, then a volume of type
zvol will be created, which will be further formatted as the fstype
provided in the storageclass. VolumeType can not be modified once
volume has been provisioned.
enum:
- ZVOL
- DATASET
type: string
required:
- capacity
- ownerNodeID
- poolName
- volumeType
type: object
required:
- spec
type: object
version: v1alpha1
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
##############################################
########### ############
########### ZFSSnapshot CRD ############
########### ############
##############################################
# ZFSSnapshot CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.8
creationTimestamp: null
name: zfssnapshots.zfs.openebs.io name: zfssnapshots.zfs.openebs.io
spec: spec:
group: zfs.openebs.io group: zfs.openebs.io
version: v1alpha1
scope: Namespaced
names: names:
plural: zfssnapshots
singular: zfssnapshot
kind: ZFSSnapshot kind: ZFSSnapshot
listKind: ZFSSnapshotList
plural: zfssnapshots
shortNames: shortNames:
- zfssnapshot
- zfssnap - zfssnap
singular: zfssnapshot
preserveUnknownFields: false
scope: Namespaced
validation:
openAPIV3Schema:
description: ZFSSnapshot represents a ZFS Snapshot of the zfsvolume
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/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/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: VolumeInfo defines ZFS volume parameters for all modes in which
ZFS volumes can be created like - ZFS volume with filesystem, ZFS Volume
exposed as zfs or ZFS volume exposed as raw block device. Some of the
parameters can be only set during creation time (as specified in the details
of the parameter), and a few are editable. In case of Cloned volumes,
the parameters are assigned the same values as the source volume.
properties:
capacity:
description: Capacity of the volume
minLength: 1
type: string
compression:
description: 'Compression specifies the block-level compression algorithm
to be applied to the ZFS Volume. The value "on" indicates ZFS to use
the default compression algorithm. The default compression algorithm
used by ZFS will be either lzjb or, if the lz4_compress feature is
enabled, lz4. Compression property can be edited after the volume
has been created. The change will only be applied to the newly-written
data. For instance, if the Volume was created with "off" and the next
day the compression was modified to "on", the data written prior to
setting "on" will not be compressed. Default Value: off.'
pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$
type: string
dedup:
description: 'Deduplication is the process for removing redundant data
at the block level, reducing the total amount of data stored. If a
file system has the dedup property enabled, duplicate data blocks
are removed synchronously. The result is that only unique data is
stored and common components are shared among files. Deduplication
can consume significant processing power (CPU) and memory as well
as generate additional disk IO. Before creating a pool with deduplication
enabled, ensure that you have planned your hardware requirements appropriately
and implemented appropriate recovery practices, such as regular backups.
As an alternative to deduplication consider using compression=lz4,
as a less resource-intensive alternative. should be enabled on the
zvol. Dedup property can be edited after the volume has been created.
Default Value: off.'
enum:
- "on"
- "off"
type: string
encryption:
description: 'Enabling the encryption feature allows for the creation
of encrypted filesystems and volumes. ZFS will encrypt file and zvol
data, file attributes, ACLs, permission bits, directory listings,
FUID mappings, and userused / groupused data. ZFS will not encrypt
metadata related to the pool structure, including dataset and snapshot
names, dataset hierarchy, properties, file size, file holes, and deduplication
tables (though the deduplicated data itself is encrypted). Default
Value: off.'
pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$
type: string
fsType:
description: 'FsType specifies filesystem type for the zfs volume/dataset.
If FsType is provided as "zfs", then the driver will create a ZFS
dataset, formatting is not required as underlying filesystem is ZFS
anyway. If FsType is ext2, ext3, ext4 or xfs, then the driver will
create a ZVOL and format the volume accordingly. FsType can not be
modified once volume has been provisioned. Default Value: ext4.'
type: string
keyformat:
description: KeyFormat specifies format of the encryption key The supported
KeyFormats are passphrase, raw, hex.
enum:
- passphrase
- raw
- hex
type: string
keylocation:
description: KeyLocation is the location of key for the encryption
type: string
ownerNodeID:
description: OwnerNodeID is the Node ID where the ZPOOL is running which
is where the volume has been provisioned. OwnerNodeID can not be edited
after the volume has been provisioned.
minLength: 1
type: string
poolName:
description: poolName specifies the name of the pool where the volume
has been created. PoolName can not be edited after the volume has
been provisioned.
minLength: 1
type: string
recordsize:
description: 'Specifies a suggested block size for files in the file
system. The size specified must be a power of two greater than or
equal to 512 and less than or equal to 128 Kbytes. RecordSize property
can be edited after the volume has been created. Changing the file
system''s recordsize affects only files created afterward; existing
files are unaffected. Default Value: 128k.'
minLength: 1
type: string
snapname:
description: SnapName specifies the name of the snapshot where the volume
has been cloned from. Snapname can not be edited after the volume
has been provisioned.
type: string
thinProvision:
description: 'ThinProvision describes whether space reservation for
the source volume is required or not. The value "yes" indicates that
volume should be thin provisioned and "no" means thick provisioning
of the volume. If thinProvision is set to "yes" then volume can be
provisioned even if the ZPOOL does not have the enough capacity. If
thinProvision is set to "no" then volume can be provisioned only if
the ZPOOL has enough capacity and capacity required by volume can
be reserved. ThinProvision can not be modified once volume has been
provisioned. Default Value: no.'
enum:
- "yes"
- "no"
type: string
volblocksize:
description: 'VolBlockSize specifies the block size for the zvol. The
volsize can only be set to a multiple of volblocksize, and cannot
be zero. VolBlockSize can not be edited after the volume has been
provisioned. Default Value: 8k.'
minLength: 1
type: string
volumeType:
description: volumeType determines whether the volume is of type "DATASET"
or "ZVOL". If fstype provided in the storageclass is "zfs", a volume
of type dataset will be created. If "ext4", "ext3", "ext2" or "xfs"
is mentioned as fstype in the storageclass, then a volume of type
zvol will be created, which will be further formatted as the fstype
provided in the storageclass. VolumeType can not be modified once
volume has been provisioned.
enum:
- ZVOL
- DATASET
type: string
required:
- capacity
- ownerNodeID
- poolName
- volumeType
type: object
status:
properties:
state:
type: string
type: object
required:
- spec
- status
type: object
version: v1alpha1
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
--- ---
apiVersion: apiextensions.k8s.io/v1beta1 apiVersion: apiextensions.k8s.io/v1beta1

View file

@ -78,46 +78,60 @@ type ZFSVolumeList struct {
Items []ZFSVolume `json:"items"` Items []ZFSVolume `json:"items"`
} }
// VolumeInfo contains the volume related info // VolumeInfo defines ZFS volume parameters for all modes in which
// for all types of volumes in ZFSVolume // ZFS volumes can be created like - ZFS volume with filesystem,
// ZFS Volume exposed as zfs or ZFS volume exposed as raw block device.
// Some of the parameters can be only set during creation time
// (as specified in the details of the parameter), and a few are editable.
// In case of Cloned volumes, the parameters are assigned the same values
// as the source volume.
type VolumeInfo struct { type VolumeInfo struct {
// OwnerNodeID is the Node ID which // OwnerNodeID is the Node ID where the ZPOOL is running which is where
// is the owner of this Volume // the volume has been provisioned.
// OwnerNodeID can not be edited after the volume has been provisioned.
// +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MinLength=1
// +kubebuilder:validation:Required // +kubebuilder:validation:Required
OwnerNodeID string `json:"ownerNodeID"` OwnerNodeID string `json:"ownerNodeID"`
// poolName specifies the name of the // poolName specifies the name of the pool where the volume has been created.
// pool where this volume should be created // PoolName can not be edited after the volume has been provisioned.
// +kubebuilder:validation:Required // +kubebuilder:validation:Required
// +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MinLength=1
PoolName string `json:"poolName"` PoolName string `json:"poolName"`
// SnapName specifies the name of the // SnapName specifies the name of the snapshot where the volume has been cloned from.
// snapshot where this volume should be cloned // Snapname can not be edited after the volume has been provisioned.
SnapName string `json:"snapname,omitempty"` SnapName string `json:"snapname,omitempty"`
// Capacity of the volume // Capacity of the volume
// +kubebuilder:validation:Required
// +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MinLength=1
Capacity string `json:"capacity"` Capacity string `json:"capacity"`
// RecordSize specifies the record size // Specifies a suggested block size for files in the file system.
// for the zfs dataset // The size specified must be a power of two greater than or equal to 512 and less than or equal to 128 Kbytes.
// RecordSize property can be edited after the volume has been created.
// Changing the file system's recordsize affects only files created afterward; existing files are unaffected.
// Default Value: 128k.
// +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MinLength=1
RecordSize string `json:"recordsize,omitempty"` RecordSize string `json:"recordsize,omitempty"`
// VolBlockSize specifies the block size for the zvol // VolBlockSize specifies the block size for the zvol.
// The volsize can only be set to a multiple of volblocksize, and cannot be zero.
// VolBlockSize can not be edited after the volume has been provisioned.
// Default Value: 8k.
// +kubebuilder:validation:MinLength=1 // +kubebuilder:validation:MinLength=1
VolBlockSize string `json:"volblocksize,omitempty"` VolBlockSize string `json:"volblocksize,omitempty"`
// Controls the compression algorithm used for this dataset. Compression // Compression specifies the block-level compression algorithm to be applied to the ZFS Volume.
// specifies if the it should enabled on the zvol. Setting compression to on // The value "on" indicates ZFS to use the default compression algorithm. The default compression
// indicates that the current default compression algorithm should be used. // algorithm used by ZFS will be either lzjb or, if the lz4_compress feature is enabled, lz4.
// The current default compression algorithm is either lzjb or, if the lz4_compress // Compression property can be edited after the volume has been created. The change will only
// feature is enabled, lz4. // be applied to the newly-written data. For instance, if the Volume was created with "off" and
// Changing this property affects only newly-written data. // the next day the compression was modified to "on", the data written prior to setting "on" will
// not be compressed.
// Default Value: off.
// +kubebuilder:validation:Pattern="^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$" // +kubebuilder:validation:Pattern="^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$"
Compression string `json:"compression,omitempty"` Compression string `json:"compression,omitempty"`
@ -129,7 +143,9 @@ type VolumeInfo struct {
// Before creating a pool with deduplication enabled, ensure that you have planned your hardware // Before creating a pool with deduplication enabled, ensure that you have planned your hardware
// requirements appropriately and implemented appropriate recovery practices, such as regular backups. // requirements appropriately and implemented appropriate recovery practices, such as regular backups.
// As an alternative to deduplication consider using compression=lz4, as a less resource-intensive alternative. // As an alternative to deduplication consider using compression=lz4, as a less resource-intensive alternative.
// should be enabled on the zvol // should be enabled on the zvol.
// Dedup property can be edited after the volume has been created.
// Default Value: off.
// +kubebuilder:validation:Enum=on;off // +kubebuilder:validation:Enum=on;off
Dedup string `json:"dedup,omitempty"` Dedup string `json:"dedup,omitempty"`
@ -140,6 +156,7 @@ type VolumeInfo struct {
// pool structure, including dataset and snapshot names, dataset hierarchy, // pool structure, including dataset and snapshot names, dataset hierarchy,
// properties, file size, file holes, and deduplication tables // properties, file size, file holes, and deduplication tables
// (though the deduplicated data itself is encrypted). // (though the deduplicated data itself is encrypted).
// Default Value: off.
// +kubebuilder:validation:Pattern="^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$" // +kubebuilder:validation:Pattern="^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$"
Encryption string `json:"encryption,omitempty"` Encryption string `json:"encryption,omitempty"`
@ -147,23 +164,37 @@ type VolumeInfo struct {
KeyLocation string `json:"keylocation,omitempty"` KeyLocation string `json:"keylocation,omitempty"`
// KeyFormat specifies format of the encryption key // KeyFormat specifies format of the encryption key
// The supported KeyFormats are passphrase, raw, hex.
// +kubebuilder:validation:Enum=passphrase;raw;hex
KeyFormat string `json:"keyformat,omitempty"` KeyFormat string `json:"keyformat,omitempty"`
// Thinprovision specifies if we should // ThinProvision describes whether space reservation for the source volume is required or not.
// thin provisioned the volume or not // The value "yes" indicates that volume should be thin provisioned and "no" means thick provisioning of the volume.
// +kubebuilder:validation:Enum=Yes;no // If thinProvision is set to "yes" then volume can be provisioned even if the ZPOOL does not
// have the enough capacity.
// If thinProvision is set to "no" then volume can be provisioned only if the ZPOOL has enough
// capacity and capacity required by volume can be reserved.
// ThinProvision can not be modified once volume has been provisioned.
// Default Value: no.
// +kubebuilder:validation:Enum=yes;no
ThinProvision string `json:"thinProvision,omitempty"` ThinProvision string `json:"thinProvision,omitempty"`
// volumeType determines whether the volume is of type "DATASET" or "ZVOL". // volumeType determines whether the volume is of type "DATASET" or "ZVOL".
// if fsttype provided in the storageclass is "zfs", then it will create a // If fstype provided in the storageclass is "zfs", a volume of type dataset will be created.
// volume of type "DATASET". If "ext4", "ext3", "ext2" or "xfs" is mentioned as fstype // If "ext4", "ext3", "ext2" or "xfs" is mentioned as fstype
// in the storageclass, it will create a volume of type "ZVOL" so that it can be // in the storageclass, then a volume of type zvol will be created, which will be
// further formatted with the fstype provided in the storageclass. // further formatted as the fstype provided in the storageclass.
// VolumeType can not be modified once volume has been provisioned.
// +kubebuilder:validation:Required // +kubebuilder:validation:Required
// +kubebuilder:validation:Enum=ZVOL;DATASET // +kubebuilder:validation:Enum=ZVOL;DATASET
VolumeType string `json:"volumeType"` VolumeType string `json:"volumeType"`
// FsType specifies filesystem type for the // FsType specifies filesystem type for the zfs volume/dataset.
// zfs volume/dataset // If FsType is provided as "zfs", then the driver will create a
// ZFS dataset, formatting is not required as underlying filesystem is ZFS anyway.
// If FsType is ext2, ext3, ext4 or xfs, then the driver will create a ZVOL and
// format the volume accordingly.
// FsType can not be modified once volume has been provisioned.
// Default Value: ext4.
FsType string `json:"fsType,omitempty"` FsType string `json:"fsType,omitempty"`
} }

View file

@ -1,68 +1,436 @@
############################################## ##############################################
########### ############ ########### ############
########### ZFSVolume CRD ############ ########### ZFSVolume CRD ############
########### ############ ########### ############
############################################## ##############################################
# ZFSVolume CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition
---
apiVersion: apiextensions.k8s.io/v1beta1 apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.8
creationTimestamp: null
name: zfsvolumes.zfs.openebs.io name: zfsvolumes.zfs.openebs.io
spec: spec:
additionalPrinterColumns:
- JSONPath: .spec.poolName
description: ZFS Pool where the volume is created
name: ZPool
type: string
- JSONPath: .spec.ownerNodeID
description: Node where the volume is created
name: Node
type: string
- JSONPath: .spec.capacity
description: Size of the volume
name: Size
type: string
- JSONPath: .spec.volblocksize
description: volblocksize of volume
name: volblocksize
type: string
- JSONPath: .spec.recordsize
description: recordsize of created zfs dataset
name: recordsize
type: string
- JSONPath: .spec.fsType
description: filesystem created on the volume
name: Filesystem
type: string
- JSONPath: .status.creationTime
description: Timestamp when the volume has been created.
name: CreationTime
type: date
- JSONPath: .metadata.creationTimestamp
name: Age
type: date
group: zfs.openebs.io group: zfs.openebs.io
version: v1alpha1
scope: Namespaced
names: names:
plural: zfsvolumes
singular: zfsvolume
kind: ZFSVolume kind: ZFSVolume
listKind: ZFSVolumeList
plural: zfsvolumes
shortNames: shortNames:
- zfsvol - zfsvol
- zv - zv
additionalPrinterColumns: singular: zfsvolume
- JSONPath: .spec.poolName preserveUnknownFields: false
name: ZPool scope: Namespaced
description: ZFS Pool where the volume is created subresources: {}
validation:
openAPIV3Schema:
description: ZFSVolume represents a ZFS based volume
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/api-conventions.md#resources'
type: string type: string
- JSONPath: .spec.ownerNodeID kind:
name: Node description: 'Kind is a string value representing the REST resource this
description: Node where the volume is created 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/api-conventions.md#types-kinds'
type: string type: string
- JSONPath: .spec.capacity metadata:
name: Size type: object
description: Size of the volume spec:
description: VolumeInfo defines ZFS volume parameters for all modes in which
ZFS volumes can be created like - ZFS volume with filesystem, ZFS Volume
exposed as zfs or ZFS volume exposed as raw block device. Some of the
parameters can be only set during creation time (as specified in the details
of the parameter), and a few are editable. In case of Cloned volumes,
the parameters are assigned the same values as the source volume.
properties:
capacity:
description: Capacity of the volume
minLength: 1
type: string type: string
- JSONPath: .spec.volblocksize compression:
name: volblocksize description: 'Compression specifies the block-level compression algorithm
description: volblocksize for the created zvol to be applied to the ZFS Volume. The value "on" indicates ZFS to use
the default compression algorithm. The default compression algorithm
used by ZFS will be either lzjb or, if the lz4_compress feature is
enabled, lz4. Compression property can be edited after the volume
has been created. The change will only be applied to the newly-written
data. For instance, if the Volume was created with "off" and the next
day the compression was modified to "on", the data written prior to
setting "on" will not be compressed. Default Value: off.'
pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$
type: string type: string
- JSONPath: .spec.recordsize dedup:
name: recordsize description: 'Deduplication is the process for removing redundant data
description: recordsize for the created zfs dataset at the block level, reducing the total amount of data stored. If a
file system has the dedup property enabled, duplicate data blocks
are removed synchronously. The result is that only unique data is
stored and common components are shared among files. Deduplication
can consume significant processing power (CPU) and memory as well
as generate additional disk IO. Before creating a pool with deduplication
enabled, ensure that you have planned your hardware requirements appropriately
and implemented appropriate recovery practices, such as regular backups.
As an alternative to deduplication consider using compression=lz4,
as a less resource-intensive alternative. should be enabled on the
zvol. Dedup property can be edited after the volume has been created.
Default Value: off.'
enum:
- "on"
- "off"
type: string type: string
- JSONPath: .spec.fsType encryption:
name: Filesystem description: 'Enabling the encryption feature allows for the creation
description: filesystem created on the volume of encrypted filesystems and volumes. ZFS will encrypt file and zvol
data, file attributes, ACLs, permission bits, directory listings,
FUID mappings, and userused / groupused data. ZFS will not encrypt
metadata related to the pool structure, including dataset and snapshot
names, dataset hierarchy, properties, file size, file holes, and deduplication
tables (though the deduplicated data itself is encrypted). Default
Value: off.'
pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$
type: string type: string
--- fsType:
description: 'FsType specifies filesystem type for the zfs volume/dataset.
If FsType is provided as "zfs", then the driver will create a ZFS
dataset, formatting is not required as underlying filesystem is ZFS
anyway. If FsType is ext2, ext3, ext4 or xfs, then the driver will
create a ZVOL and format the volume accordingly. FsType can not be
modified once volume has been provisioned. Default Value: ext4.'
type: string
keyformat:
description: KeyFormat specifies format of the encryption key The supported
KeyFormats are passphrase, raw, hex.
enum:
- passphrase
- raw
- hex
type: string
keylocation:
description: KeyLocation is the location of key for the encryption
type: string
ownerNodeID:
description: OwnerNodeID is the Node ID where the ZPOOL is running which
is where the volume has been provisioned. OwnerNodeID can not be edited
after the volume has been provisioned.
minLength: 1
type: string
poolName:
description: poolName specifies the name of the pool where the volume
has been created. PoolName can not be edited after the volume has
been provisioned.
minLength: 1
type: string
recordsize:
description: 'Specifies a suggested block size for files in the file
system. The size specified must be a power of two greater than or
equal to 512 and less than or equal to 128 Kbytes. RecordSize property
can be edited after the volume has been created. Changing the file
system''s recordsize affects only files created afterward; existing
files are unaffected. Default Value: 128k.'
minLength: 1
type: string
snapname:
description: SnapName specifies the name of the snapshot where the volume
has been cloned from. Snapname can not be edited after the volume
has been provisioned.
type: string
thinProvision:
description: 'ThinProvision describes whether space reservation for
the source volume is required or not. The value "yes" indicates that
volume should be thin provisioned and "no" means thick provisioning
of the volume. If thinProvision is set to "yes" then volume can be
provisioned even if the ZPOOL does not have the enough capacity. If
thinProvision is set to "no" then volume can be provisioned only if
the ZPOOL has enough capacity and capacity required by volume can
be reserved. ThinProvision can not be modified once volume has been
provisioned. Default Value: no.'
enum:
- "yes"
- "no"
type: string
volblocksize:
description: 'VolBlockSize specifies the block size for the zvol. The
volsize can only be set to a multiple of volblocksize, and cannot
be zero. VolBlockSize can not be edited after the volume has been
provisioned. Default Value: 8k.'
minLength: 1
type: string
volumeType:
description: volumeType determines whether the volume is of type "DATASET"
or "ZVOL". If fstype provided in the storageclass is "zfs", a volume
of type dataset will be created. If "ext4", "ext3", "ext2" or "xfs"
is mentioned as fstype in the storageclass, then a volume of type
zvol will be created, which will be further formatted as the fstype
provided in the storageclass. VolumeType can not be modified once
volume has been provisioned.
enum:
- ZVOL
- DATASET
type: string
required:
- capacity
- ownerNodeID
- poolName
- volumeType
type: object
required:
- spec
type: object
version: v1alpha1
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []
############################################## ##############################################
########### ############ ########### ############
########### Snapshot CRD ############ ########### ZFSSnapshot CRD ############
########### ############ ########### ############
############################################## ##############################################
# ZFSSnapshot CRD is autogenerated via `make manifests` command.
# Do the modification in the code and run the `make manifests` command
# to generate the CRD definition
---
apiVersion: apiextensions.k8s.io/v1beta1 apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition kind: CustomResourceDefinition
metadata: metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.2.8
creationTimestamp: null
name: zfssnapshots.zfs.openebs.io name: zfssnapshots.zfs.openebs.io
spec: spec:
group: zfs.openebs.io group: zfs.openebs.io
version: v1alpha1
scope: Namespaced
names: names:
plural: zfssnapshots
singular: zfssnapshot
kind: ZFSSnapshot kind: ZFSSnapshot
listKind: ZFSSnapshotList
plural: zfssnapshots
shortNames: shortNames:
- zfssnapshot
- zfssnap - zfssnap
--- singular: zfssnapshot
preserveUnknownFields: false
scope: Namespaced
validation:
openAPIV3Schema:
description: ZFSSnapshot represents a ZFS Snapshot of the zfsvolume
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/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/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
description: VolumeInfo defines ZFS volume parameters for all modes in which
ZFS volumes can be created like - ZFS volume with filesystem, ZFS Volume
exposed as zfs or ZFS volume exposed as raw block device. Some of the
parameters can be only set during creation time (as specified in the details
of the parameter), and a few are editable. In case of Cloned volumes,
the parameters are assigned the same values as the source volume.
properties:
capacity:
description: Capacity of the volume
minLength: 1
type: string
compression:
description: 'Compression specifies the block-level compression algorithm
to be applied to the ZFS Volume. The value "on" indicates ZFS to use
the default compression algorithm. The default compression algorithm
used by ZFS will be either lzjb or, if the lz4_compress feature is
enabled, lz4. Compression property can be edited after the volume
has been created. The change will only be applied to the newly-written
data. For instance, if the Volume was created with "off" and the next
day the compression was modified to "on", the data written prior to
setting "on" will not be compressed. Default Value: off.'
pattern: ^(on|off|lzjb|gzip|gzip-[1-9]|zle|lz4)$
type: string
dedup:
description: 'Deduplication is the process for removing redundant data
at the block level, reducing the total amount of data stored. If a
file system has the dedup property enabled, duplicate data blocks
are removed synchronously. The result is that only unique data is
stored and common components are shared among files. Deduplication
can consume significant processing power (CPU) and memory as well
as generate additional disk IO. Before creating a pool with deduplication
enabled, ensure that you have planned your hardware requirements appropriately
and implemented appropriate recovery practices, such as regular backups.
As an alternative to deduplication consider using compression=lz4,
as a less resource-intensive alternative. should be enabled on the
zvol. Dedup property can be edited after the volume has been created.
Default Value: off.'
enum:
- "on"
- "off"
type: string
encryption:
description: 'Enabling the encryption feature allows for the creation
of encrypted filesystems and volumes. ZFS will encrypt file and zvol
data, file attributes, ACLs, permission bits, directory listings,
FUID mappings, and userused / groupused data. ZFS will not encrypt
metadata related to the pool structure, including dataset and snapshot
names, dataset hierarchy, properties, file size, file holes, and deduplication
tables (though the deduplicated data itself is encrypted). Default
Value: off.'
pattern: ^(on|off|aes-128-[c,g]cm|aes-192-[c,g]cm|aes-256-[c,g]cm)$
type: string
fsType:
description: 'FsType specifies filesystem type for the zfs volume/dataset.
If FsType is provided as "zfs", then the driver will create a ZFS
dataset, formatting is not required as underlying filesystem is ZFS
anyway. If FsType is ext2, ext3, ext4 or xfs, then the driver will
create a ZVOL and format the volume accordingly. FsType can not be
modified once volume has been provisioned. Default Value: ext4.'
type: string
keyformat:
description: KeyFormat specifies format of the encryption key The supported
KeyFormats are passphrase, raw, hex.
enum:
- passphrase
- raw
- hex
type: string
keylocation:
description: KeyLocation is the location of key for the encryption
type: string
ownerNodeID:
description: OwnerNodeID is the Node ID where the ZPOOL is running which
is where the volume has been provisioned. OwnerNodeID can not be edited
after the volume has been provisioned.
minLength: 1
type: string
poolName:
description: poolName specifies the name of the pool where the volume
has been created. PoolName can not be edited after the volume has
been provisioned.
minLength: 1
type: string
recordsize:
description: 'Specifies a suggested block size for files in the file
system. The size specified must be a power of two greater than or
equal to 512 and less than or equal to 128 Kbytes. RecordSize property
can be edited after the volume has been created. Changing the file
system''s recordsize affects only files created afterward; existing
files are unaffected. Default Value: 128k.'
minLength: 1
type: string
snapname:
description: SnapName specifies the name of the snapshot where the volume
has been cloned from. Snapname can not be edited after the volume
has been provisioned.
type: string
thinProvision:
description: 'ThinProvision describes whether space reservation for
the source volume is required or not. The value "yes" indicates that
volume should be thin provisioned and "no" means thick provisioning
of the volume. If thinProvision is set to "yes" then volume can be
provisioned even if the ZPOOL does not have the enough capacity. If
thinProvision is set to "no" then volume can be provisioned only if
the ZPOOL has enough capacity and capacity required by volume can
be reserved. ThinProvision can not be modified once volume has been
provisioned. Default Value: no.'
enum:
- "yes"
- "no"
type: string
volblocksize:
description: 'VolBlockSize specifies the block size for the zvol. The
volsize can only be set to a multiple of volblocksize, and cannot
be zero. VolBlockSize can not be edited after the volume has been
provisioned. Default Value: 8k.'
minLength: 1
type: string
volumeType:
description: volumeType determines whether the volume is of type "DATASET"
or "ZVOL". If fstype provided in the storageclass is "zfs", a volume
of type dataset will be created. If "ext4", "ext3", "ext2" or "xfs"
is mentioned as fstype in the storageclass, then a volume of type
zvol will be created, which will be further formatted as the fstype
provided in the storageclass. VolumeType can not be modified once
volume has been provisioned.
enum:
- ZVOL
- DATASET
type: string
required:
- capacity
- ownerNodeID
- poolName
- volumeType
type: object
status:
properties:
state:
type: string
type: object
required:
- spec
- status
type: object
version: v1alpha1
versions:
- name: v1alpha1
served: true
storage: true
status:
acceptedNames:
kind: ""
plural: ""
conditions: []
storedVersions: []