From b10be92ddc0bbd01093b95c823e6ba456d283cf9 Mon Sep 17 00:00:00 2001 From: Chakravarthy Nelluri Date: Tue, 21 Feb 2017 07:49:36 -0500 Subject: [PATCH] Add support for attacher/detacher interface in Flex volume --- volumes/flexvolume/lvm | 77 +++++++++++++++---- volumes/flexvolume/nfs | 120 ++++++++++++++++++++++++++++++ volumes/flexvolume/nginx-nfs.yaml | 22 ++++++ volumes/flexvolume/nginx.yaml | 2 +- 4 files changed, 204 insertions(+), 17 deletions(-) create mode 100755 volumes/flexvolume/nfs create mode 100644 volumes/flexvolume/nginx-nfs.yaml diff --git a/volumes/flexvolume/lvm b/volumes/flexvolume/lvm index 0ffea3a1..04a20778 100755 --- a/volumes/flexvolume/lvm +++ b/volumes/flexvolume/lvm @@ -19,10 +19,13 @@ usage() { err "Invalid usage. Usage: " err "\t$0 init" - err "\t$0 attach " - err "\t$0 detach " - err "\t$0 mount " - err "\t$0 unmount " + err "\t$0 attach " + err "\t$0 detach " + err "\t$0 waitforattach " + err "\t$0 mountdevice " + err "\t$0 unmountdevice " + err "\t$0 getvolumename " + err "\t$0 isattached " exit 1 } @@ -43,16 +46,23 @@ ismounted() { fi } -attach() { - VOLUMEID=$(echo $1 | jq -r '.volumeID') - SIZE=$(echo $1 | jq -r '.size') - VG=$(echo $1|jq -r '.volumegroup') +getdevice() { + VOLUMEID=$(echo ${JSON_PARAMS} | jq -r '.volumeID') + VG=$(echo ${JSON_PARAMS}|jq -r '.volumegroup') # LVM substitutes - with -- VOLUMEID=`echo $VOLUMEID|sed s/-/--/g` VG=`echo $VG|sed s/-/--/g` DMDEV="/dev/mapper/${VG}-${VOLUMEID}" + echo ${DMDEV} +} + +attach() { + JSON_PARAMS=$1 + SIZE=$(echo $1 | jq -r '.size') + + DMDEV=$(getdevice) if [ ! -b "${DMDEV}" ]; then err "{\"status\": \"Failure\", \"message\": \"Volume ${VOLUMEID} does not exist\"}" exit 1 @@ -66,7 +76,12 @@ detach() { exit 0 } -domount() { +waitforattach() { + shift + attach $* +} + +domountdevice() { MNTPATH=$1 DMDEV=$2 FSTYPE=$(echo $3|jq -r '.["kubernetes.io/fsType"]') @@ -101,8 +116,13 @@ domount() { exit 0 } -unmount() { +unmountdevice() { MNTPATH=$1 + if [ ! -d ${MNTPATH} ]; then + log "{\"status\": \"Success\"}" + exit 0 + fi + if [ $(ismounted) -eq 0 ] ; then log "{\"status\": \"Success\"}" exit 0 @@ -113,12 +133,27 @@ unmount() { err "{ \"status\": \"Failed\", \"message\": \"Failed to unmount volume at ${MNTPATH}\"}" exit 1 fi - rmdir ${MNTPATH} &> /dev/null log "{\"status\": \"Success\"}" exit 0 } +getvolumename() { + JSON_PARAMS=$1 + DMDEV=$(getdevice) + + # get lvm device UUID + UUID=`lvs -o lv_uuid --noheadings ${DMDEV} 2>/dev/null|tr -d " "` + + log "{\"status\": \"Success\", \"volumeName\":\"${UUID}\"}" + exit 0 +} + +isattached() { + log "{\"status\": \"Success\", \"attached\":true}" + exit 0 +} + op=$1 if [ "$op" = "init" ]; then @@ -139,14 +174,24 @@ case "$op" in detach) detach $* ;; - mount) - domount $* + waitforattach) + waitforattach $* ;; - unmount) - unmount $* + mountdevice) + domountdevice $* ;; + unmountdevice) + unmountdevice $* + ;; + getvolumename) + getvolumename $* + ;; + isattached) + isattached $* + ;; *) - usage + err "{ \"status\": \"Not supported\" }" + exit 1 esac exit 1 diff --git a/volumes/flexvolume/nfs b/volumes/flexvolume/nfs new file mode 100755 index 00000000..290af49d --- /dev/null +++ b/volumes/flexvolume/nfs @@ -0,0 +1,120 @@ +#!/bin/bash + +# Copyright 2015 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. + +# Notes: +# - Please install "jq" package before using this driver. +usage() { + err "Invalid usage. Usage: " + err "\t$0 init" + err "\t$0 mount " + err "\t$0 unmount " + err "\t$0 getvolumename " + exit 1 +} + +err() { + echo -ne $* 1>&2 +} + +log() { + echo -ne $* >&1 +} + +ismounted() { + MOUNT=`findmnt -n ${MNTPATH} 2>/dev/null | cut -d' ' -f1` + if [ "${MOUNT}" == "${MNTPATH}" ]; then + echo "1" + else + echo "0" + fi +} + +domount() { + MNTPATH=$1 + + NFS_SERVER=$(echo $2 | jq -r '.server') + SHARE=$(echo $2 | jq -r '.share') + + if [ $(ismounted) -eq 1 ] ; then + log "{\"status\": \"Success\"}" + exit 0 + fi + + mkdir -p ${MNTPATH} &> /dev/null + + mount -t nfs ${NFS_SERVER}:/${SHARE} ${MNTPATH} &> /dev/null + if [ $? -ne 0 ]; then + err "{ \"status\": \"Failure\", \"message\": \"Failed to mount ${NFS_SERVER}:${SHARE} at ${MNTPATH}\"}" + exit 1 + fi + log "{\"status\": \"Success\"}" + exit 0 +} + +unmount() { + MNTPATH=$1 + if [ $(ismounted) -eq 0 ] ; then + log "{\"status\": \"Success\"}" + exit 0 + fi + + umount ${MNTPATH} &> /dev/null + if [ $? -ne 0 ]; then + err "{ \"status\": \"Failed\", \"message\": \"Failed to unmount volume at ${MNTPATH}\"}" + exit 1 + fi + + log "{\"status\": \"Success\"}" + exit 0 +} + +getvolumename() { + NFS_SERVER=$(echo $1 | jq -r '.server') + SHARE=$(echo $1 | jq -r '.share') + + log "{\"status\": \"Success\", \"volumeName\": \"${NFS_SERVER}/${SHARE}\"}" + exit 0 +} + +op=$1 + +if [ "$op" = "init" ]; then + log "{\"status\": \"Success\"}" + exit 0 +fi + +if [ $# -lt 2 ]; then + usage +fi + +shift + +case "$op" in + mount) + domount $* + ;; + unmount) + unmount $* + ;; + getvolumename) + getvolumename $* + ;; + *) + err "{ \"status\": \"Not supported\" }" + exit 1 +esac + +exit 1 diff --git a/volumes/flexvolume/nginx-nfs.yaml b/volumes/flexvolume/nginx-nfs.yaml new file mode 100644 index 00000000..177c1e8f --- /dev/null +++ b/volumes/flexvolume/nginx-nfs.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +kind: Pod +metadata: + name: nginx-nfs + namespace: default +spec: + containers: + - name: nginx-nfs + image: nginx + volumeMounts: + - name: test + mountPath: /data + ports: + - containerPort: 80 + volumes: + - name: test + flexVolume: + driver: "k8s/nfs" + fsType: "nfs" + options: + server: "172.16.0.25" + share: "dws_nas_scratch" diff --git a/volumes/flexvolume/nginx.yaml b/volumes/flexvolume/nginx.yaml index 4e74905c..c7d7859c 100644 --- a/volumes/flexvolume/nginx.yaml +++ b/volumes/flexvolume/nginx.yaml @@ -2,6 +2,7 @@ apiVersion: v1 kind: Pod metadata: name: nginx + namespace: default spec: containers: - name: nginx @@ -20,4 +21,3 @@ spec: volumeID: "vol1" size: "1000m" volumegroup: "kube_vg" -