From 30d9813bdf0234f1aa7115164ce5e1be581a489b Mon Sep 17 00:00:00 2001 From: Hanna Bledai Date: Fri, 2 Oct 2020 10:41:11 +0300 Subject: [PATCH] Updated README and saved archiveOnDelete --- README.md | 20 ++++++++--- .../provisioner.go | 35 ++++++++++++++----- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 308da047..cefc39be 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,17 @@ spec: You may also want to change the PROVISIONER_NAME above from ``fuseim.pri/ifs`` to something more descriptive like ``nfs-storage``, but if you do remember to also change the PROVISIONER_NAME in the storage class definition below: +**Step 5: Deploying your storage class** + +***Paraments:*** + +| Name | Description | Default | +|------|-------------|:--------:| +| onDelete | If it exists and has a delete value, delete the directory, if it exists and has a retain value, save the directory. | will be archived with name on the share: `archived-+volume.Name` | +| archiveOnDelete | If it exists and has a false value, delete the directory. if `onDelete` exists will be ignored. | will be archived with name on the share: `archived-+volume.Name` | +| archiveOnDelete | If it exists and has a false value, delete the directory. if `onDelete` exists will be ignored. | will be archived with name on the share: `archived-+volume.Name` | +| pathPattern | Specifies a template for creating a directory path via PVC metadata's such as labels, annotations, name or namespace. To specify metadata use `${.PVC.}`: `${PVC.namespace}`| n/a | + This is `deploy/class.yaml` which defines the NFS-Client's Kubernetes Storage Class: ```yaml @@ -116,11 +127,11 @@ metadata: name: managed-nfs-storage provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME' parameters: - archiveOnDelete: "false" # When set to "false" your PVs will not be archived - # by the provisioner upon deletion of the PVC. + pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}" # waits for nfs.io/storage-path annotation, if not specified will accept as empty string. + onDelete: delete ``` -**Step 5: Finally, test your environment!** +**Step 6: Finally, test your environment!** Now we'll test your NFS provisioner. @@ -138,7 +149,7 @@ kubectl delete -f deploy/test-pod.yaml -f deploy/test-claim.yaml Now check the folder has been deleted. -**Step 6: Deploying your own PersistentVolumeClaims**. To deploy your own PVC, make sure that you have the correct `storage-class` as indicated by your `deploy/class.yaml` file. +**Step 7: Deploying your own PersistentVolumeClaims**. To deploy your own PVC, make sure that you have the correct `storage-class` as indicated by your `deploy/class.yaml` file. For example: @@ -149,6 +160,7 @@ metadata: name: test-claim annotations: volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" + nfs.io/storage-path: "test-path" # not required, depending on whether this annotation was shown in the storage class description spec: accessModes: - ReadWriteMany diff --git a/cmd/nfs-subdir-external-provisioner/provisioner.go b/cmd/nfs-subdir-external-provisioner/provisioner.go index 88be3c85..d199293c 100644 --- a/cmd/nfs-subdir-external-provisioner/provisioner.go +++ b/cmd/nfs-subdir-external-provisioner/provisioner.go @@ -23,6 +23,7 @@ import ( "os" "path/filepath" "regexp" + "strconv" "strings" "github.com/golang/glog" @@ -52,7 +53,7 @@ type pvcMetadata struct { annotations map[string]string } -var pattern = regexp.MustCompile(`{pvc\.((labels|annotations)\.(.*?)|.*?)}`) +var pattern = regexp.MustCompile(`\${\.PVC\.((labels|annotations)\.(.*?)|.*?)}`) func (meta *pvcMetadata) stringParser(str string) string { result := pattern.FindAllStringSubmatch(str, -1) @@ -148,9 +149,10 @@ func (p *nfsProvisioner) Delete(volume *v1.PersistentVolume) error { if err != nil { return err } - // Determine if the "archiveOnDelete" parameter exists. - // If it exists and has a false value, delete the directory. - // Otherwise, archive it. + + // Determine if the "onDelete" parameter exists. + // If it exists and has a delete value, delete the directory. + // If it exists and has a retain value, safe the directory. onDelete := storageClass.Parameters["onDelete"] switch onDelete { @@ -159,12 +161,27 @@ func (p *nfsProvisioner) Delete(volume *v1.PersistentVolume) error { case "retain": return nil - - default: - archivePath := filepath.Join(mountPath, "archived-"+volume.Name) - glog.V(4).Infof("archiving path %s to %s", oldPath, archivePath) - return os.Rename(oldPath, archivePath) } + + // Determine if the "archiveOnDelete" parameter exists. + // If it exists and has a false value, delete the directory. + // Otherwise, archive it. + archiveOnDelete, exists := storageClass.Parameters["archiveOnDelete"] + if exists { + if exists { + archiveBool, err := strconv.ParseBool(archiveOnDelete) + if err != nil { + return err + } + if !archiveBool { + return os.RemoveAll(oldPath) + } + } + } + + archivePath := filepath.Join(mountPath, "archived-"+volume.Name) + glog.V(4).Infof("archiving path %s to %s", oldPath, archivePath) + return os.Rename(oldPath, archivePath) } // getClassForVolume returns StorageClass