Skip to content

Commit

Permalink
Merge pull request #66 from linkernetworks/hwchiu/VX-152
Browse files Browse the repository at this point in the history
Create/Delete the storageClass when we create/delete the storage
  • Loading branch information
Hung-Wei Chiu authored Jul 6, 2018
2 parents d7e2263 + 7945b09 commit 158cdf7
Show file tree
Hide file tree
Showing 9 changed files with 172 additions and 15 deletions.
17 changes: 17 additions & 0 deletions deploy/kubernetes/auth/clusterrole.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
12 changes: 12 additions & 0 deletions deploy/kubernetes/auth/clusterrolebinding.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
4 changes: 4 additions & 0 deletions deploy/kubernetes/auth/nfs-provisioner.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
13 changes: 7 additions & 6 deletions src/entity/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@ const (
)

type Storage struct {
ID bson.ObjectId `bson:"_id,omitempty" json:"id"`
Type StorageType `bson:"type" json:"type"`
Name string `bson:"name" json:"name"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
NFS *NFSStorage `bson:"nfs,omitempty" json:"nfs,omitempty"`
Fake *FakeStorage `bson:"fake,omitempty" json:"fake,omitempty"` //FakeStorage, for restful testing.
ID bson.ObjectId `bson:"_id,omitempty" json:"id"`
Type StorageType `bson:"type" json:"type"`
Name string `bson:"name" json:"name"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
StorageClassName string `bson:"storageClassName" json:"storageClassName"`
NFS *NFSStorage `bson:"nfs,omitempty" json:"nfs,omitempty"`
Fake *FakeStorage `bson:"fake,omitempty" json:"fake,omitempty"` //FakeStorage, for restful testing.
}

//GetCollection - get model mongo collection name.
Expand Down
19 changes: 19 additions & 0 deletions src/kubernetes/storageclass.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package kubernetes

import (
v1 "k8s.io/api/storage/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

//Get the external IP address of node
func (kc *KubeCtl) CreateStorageClass(storageClass *v1.StorageClass) (*v1.StorageClass, error) {
return kc.Clientset.StorageV1().StorageClasses().Create(storageClass)
}

func (kc *KubeCtl) GetStorageClass(name string) (*v1.StorageClass, error) {
return kc.Clientset.StorageV1().StorageClasses().Get(name, metav1.GetOptions{})
}

func (kc *KubeCtl) DeleteStorageClass(name string) error {
return kc.Clientset.StorageV1().StorageClasses().Delete(name, &metav1.DeleteOptions{})
}
75 changes: 75 additions & 0 deletions src/kubernetes/storageclass_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package kubernetes

import (
"math/rand"
"testing"
"time"

"github.com/moby/moby/pkg/namesgenerator"
"github.com/stretchr/testify/suite"
v1 "k8s.io/api/storage/v1"

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
fakeclientset "k8s.io/client-go/kubernetes/fake"
)

type KubeCtlStorageClassTestSuite struct {
suite.Suite
kubectl *KubeCtl
fakeclient *fakeclientset.Clientset
}

func init() {
rand.Seed(time.Now().UnixNano())
}

func (suite *KubeCtlStorageClassTestSuite) SetupSuite() {
suite.fakeclient = fakeclientset.NewSimpleClientset()
namespace := "default"
suite.kubectl = New(suite.fakeclient, namespace)
}

func (suite *KubeCtlStorageClassTestSuite) TearDownSuite() {}
func (suite *KubeCtlStorageClassTestSuite) TestCreateStorageClass() {
name := namesgenerator.GetRandomName(0)
storageClass := v1.StorageClass{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Provisioner: "",
}
ret, err := suite.kubectl.CreateStorageClass(&storageClass)
suite.NoError(err)
suite.NotNil(ret)

deploy, err := suite.kubectl.GetStorageClass(name)
suite.NoError(err)
suite.NotNil(deploy)
}

func (suite *KubeCtlStorageClassTestSuite) TestDeleteStorageClass() {
name := namesgenerator.GetRandomName(0)
storageClass := v1.StorageClass{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Provisioner: "",
}
ret, err := suite.kubectl.CreateStorageClass(&storageClass)
suite.NoError(err)
suite.NotNil(ret)

deploy, err := suite.kubectl.GetStorageClass(name)
suite.NoError(err)
suite.NotNil(deploy)

err = suite.kubectl.DeleteStorageClass(name)
suite.NoError(err)
deploy, err = suite.kubectl.GetStorageClass(name)
suite.Error(err)
suite.Nil(deploy)
}

func TestStorageClassTestSuite(t *testing.T) {
suite.Run(t, new(KubeCtlStorageClassTestSuite))
}
3 changes: 0 additions & 3 deletions src/server/handler_storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package server

import (
"encoding/json"
"fmt"
"math/rand"
"net/http"
"net/http/httptest"
Expand Down Expand Up @@ -283,8 +282,6 @@ func (suite *StorageTestSuite) TestListStorage() {
suite.Equal(tc.expectSize, len(retStorages))
for i, v := range retStorages {
suite.Equal(storages[i].Name, v.Name)
fmt.Println(v.Type)
fmt.Println(storages[i].Type)
suite.Equal(storages[i].Type, v.Type)
}
})
Expand Down
30 changes: 24 additions & 6 deletions src/storageprovider/nfs.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/linkernetworks/vortex/src/serviceprovider"
appsv1 "k8s.io/api/apps/v1"
"k8s.io/api/core/v1"
storagev1 "k8s.io/api/storage/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
// "gopkg.in/mgo.v2/bson"
)
Expand Down Expand Up @@ -58,10 +59,11 @@ func getDeployment(name string, storage *entity.Storage) *appsv1.Deployment {
},
},
Spec: v1.PodSpec{
ServiceAccountName: "nfs-client-provisioner",
Containers: []v1.Container{
{
Name: name,
Image: "quay.io/kubernetes_incubator/nfs-provisioner:latest",
Image: "quay.io/external_storage/nfs-client-provisioner:latest",
ImagePullPolicy: v1.PullIfNotPresent,
Env: []v1.EnvVar{
{Name: "PROVISIONER_NAME", Value: name},
Expand All @@ -88,23 +90,39 @@ func getDeployment(name string, storage *entity.Storage) *appsv1.Deployment {
},
},
}
}

func getStorageClass(name string, provisioner string, storage *entity.Storage) *storagev1.StorageClass {
return &storagev1.StorageClass{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Provisioner: provisioner,
}
}

func (nfs NFSStorageProvider) CreateStorage(sp *serviceprovider.Container, storage *entity.Storage) error {
name := NFS_PROVISIONER_PREFIX + storage.ID.Hex()

storageClassName := NFS_STORAGECLASS_PREFIX + storage.ID.Hex()
//Create deployment
deployment := getDeployment(name, storage)
//Create storageClass
_, err := sp.KubeCtl.CreateDeployment(deployment)
storageClass := getStorageClass(storageClassName, name, storage)
storage.StorageClassName = storageClassName
if _, err := sp.KubeCtl.CreateDeployment(deployment); err != nil {
return err
}
_, err := sp.KubeCtl.CreateStorageClass(storageClass)
return err
}

func (nfs NFSStorageProvider) DeleteStorage(sp *serviceprovider.Container, storage *entity.Storage) error {
name := NFS_PROVISIONER_PREFIX + storage.ID.Hex()
deployName := NFS_PROVISIONER_PREFIX + storage.ID.Hex()
storageName := NFS_STORAGECLASS_PREFIX + storage.ID.Hex()
//Delete StorageClass

if err := sp.KubeCtl.DeleteStorageClass(storageName); err != nil {
return err
}
//Delete Deployment
return sp.KubeCtl.DeleteDeployment(name)
return sp.KubeCtl.DeleteDeployment(deployName)
}
14 changes: 14 additions & 0 deletions src/storageprovider/nfs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,20 @@ func (suite *StorageTestSuite) TestGetDeployment() {
suite.NotNil(deployment)
}

func (suite *StorageTestSuite) TestGetStorageClass() {
storage := &entity.Storage{
Type: entity.NFSStorageType,
NFS: &entity.NFSStorage{
IP: "1.2.3.4",
PATH: "/exports",
},
}

storageClass := getStorageClass(bson.NewObjectId().Hex(), bson.NewObjectId().Hex(), storage)
suite.NotNil(storageClass)

}

func (suite *StorageTestSuite) TestValidateBeforeCreating() {
storage := &entity.Storage{
Type: entity.NFSStorageType,
Expand Down

0 comments on commit 158cdf7

Please sign in to comment.