Skip to content

Commit

Permalink
Merge pull request #60 from linkernetworks/hwchiu/VX-120
Browse files Browse the repository at this point in the history
Refactor the storage to support multiple type.

Former-commit-id: e2b3d4eba6df59dc1cdac3cfd86886c3a94606f4 [formerly eff9da7]
Former-commit-id: 0909f1887eef2607b7a546134493f10327e141f6
  • Loading branch information
Hung-Wei Chiu authored Jul 5, 2018
2 parents 964e2b8 + 919136d commit 8311ae2
Show file tree
Hide file tree
Showing 19 changed files with 769 additions and 272 deletions.
4 changes: 2 additions & 2 deletions src/entity/network_fake.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package entity

type FakeNetwork struct {
FakeParameter string `bson:"bridgeName" json:"bridgeName"`
IWantFail bool `bson:"iWantFail" json:"iWantFail"`
FakeParameter string
IWantFail bool
}
32 changes: 32 additions & 0 deletions src/entity/storage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package entity

import (
"time"

"gopkg.in/mgo.v2/bson"
)

type StorageType string

const (
NFSStorageType = "nfs"
FakeStorageType = "fake"
)

const (
StorageCollectionName string = "storage"
)

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" json:"nfs"`
Fake FakeStorage `json:"fake"` //FakeNetwork, for restful testing.
}

//GetCollection - get model mongo collection name.
func (m Storage) GetCollection() string {
return StorageCollectionName
}
6 changes: 6 additions & 0 deletions src/entity/storage_fake.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package entity

type FakeStorage struct {
FakeParameter string
IWantFail bool
}
6 changes: 6 additions & 0 deletions src/entity/storage_nfs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package entity

type NFSStorage struct {
IP string `bson:"ip" json:"ip"`
PATH string `bson:"path" json:"path"`
}
29 changes: 0 additions & 29 deletions src/entity/storage_provider.go

This file was deleted.

15 changes: 15 additions & 0 deletions src/kubernetes/deployment.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package kubernetes

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

//Get the external IP address of node
func (kc *KubeCtl) CreateDeployment(deployment *appsv1.Deployment) (*appsv1.Deployment, error) {
return kc.Clientset.AppsV1().Deployments(kc.Namespace).Create(deployment)
}

func (kc *KubeCtl) GetDeployment(name string) (*appsv1.Deployment, error) {
return kc.Clientset.AppsV1().Deployments(kc.Namespace).Get(name, metav1.GetOptions{})
}
59 changes: 59 additions & 0 deletions src/kubernetes/deployment_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package kubernetes

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

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

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

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

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

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

func (suite *KubeCtlDeploymentTestSuite) TearDownSuite() {}
func (suite *KubeCtlDeploymentTestSuite) TestCreateDeployment() {

var replicas int32
replicas = 3
name := namesgenerator.GetRandomName(0)
deployment := appsv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: name,
},
Spec: appsv1.DeploymentSpec{
Replicas: &replicas,
},
Status: appsv1.DeploymentStatus{},
}
ret, err := suite.kubectl.CreateDeployment(&deployment)
suite.NoError(err)
suite.NotNil(ret)

deploy, err := suite.kubectl.GetDeployment(name)
suite.NoError(err)
suite.NotNil(deploy)
suite.Equal(replicas, *deploy.Spec.Replicas)
}

func TestDeploymentTestSuite(t *testing.T) {
suite.Run(t, new(KubeCtlDeploymentTestSuite))
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/linkernetworks/vortex/src/entity"
response "github.com/linkernetworks/vortex/src/net/http"
"github.com/linkernetworks/vortex/src/net/http/query"
"github.com/linkernetworks/vortex/src/storageprovider"
"github.com/linkernetworks/vortex/src/web"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
Expand All @@ -18,25 +19,42 @@ import (
func createStorage(ctx *web.Context) {
sp, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response

storageProvider := entity.Storage{}
if err := req.ReadEntity(&storageProvider); err != nil {
storage := entity.Storage{}
if err := req.ReadEntity(&storage); err != nil {
logger.Error(err)
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

session := sp.Mongo.NewSession()
session.C(entity.StorageCollectionName).EnsureIndex(mgo.Index{
Key: []string{"displayName"},
Key: []string{"name"},
Unique: true,
})
defer session.Close()
// Check whether this displayname has been used
storageProvider.ID = bson.NewObjectId()
storageProvider.CreatedAt = timeutils.Now()
if err := session.Insert(entity.StorageCollectionName, &storageProvider); err != nil {

storageProvider, err := storageprovider.GetStorageProvider(&storage)
if err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

if err := storageProvider.ValidateBeforeCreating(sp, storage); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

if err := storageProvider.CreateStorage(sp, storage); err != nil {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
}

storage.ID = bson.NewObjectId()
storage.CreatedAt = timeutils.Now()
if err := session.Insert(entity.StorageCollectionName, &storage); err != nil {
if mgo.IsDup(err) {
response.Conflict(req.Request, resp.ResponseWriter, fmt.Errorf("Storage Provider Name: %s already existed", storageProvider.DisplayName))
response.Conflict(req.Request, resp.ResponseWriter, fmt.Errorf("Storage Provider Name: %s already existed", storage.Name))
} else {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
}
Expand Down Expand Up @@ -98,12 +116,34 @@ func listStorage(ctx *web.Context) {
}

func deleteStorage(ctx *web.Context) {
as, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response
sp, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response

id := req.PathParameter("id")

session := as.Mongo.NewSession()
session := sp.Mongo.NewSession()
defer session.Close()
c := session.C(entity.StorageCollectionName)

var storage entity.Storage
if err := c.FindId(bson.ObjectIdHex(id)).One(&storage); err != nil {
if err == mgo.ErrNotFound {
response.NotFound(req.Request, resp.ResponseWriter, err)
} else {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
}
return
}

storageProvider, err := storageprovider.GetStorageProvider(&storage)
if err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

if err := storageProvider.DeleteStorage(sp, storage); err != nil {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
}

if err := session.Remove(entity.StorageCollectionName, "_id", bson.ObjectIdHex(id)); err != nil {
if mgo.ErrNotFound == err {
Expand Down
Loading

0 comments on commit 8311ae2

Please sign in to comment.