Skip to content

Commit

Permalink
Merge pull request #21 from linkernetworks/hwchiu/VX-119
Browse files Browse the repository at this point in the history
The restful handler of storageprovider
  • Loading branch information
Hung-Wei Chiu authored Jun 23, 2018
2 parents 688eac1 + 3151129 commit c9b7c7a
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 0 deletions.
29 changes: 29 additions & 0 deletions src/entity/storage_provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package entity

import (
"time"

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

const (
StorageProviderCollectionName string = "storage_provider"
)

type NFSStorageProvider struct {
IP string `bson:"ip" json:"ip"`
PATH string `bson:"path" json:"path"`
}

type StorageProvider struct {
ID bson.ObjectId `bson:"_id,omitempty" json:"id"`
Type string `bson:"type" json:"type"`
DisplayName string `bson:"displayName" json:"displayName"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
NFSStorageProvider
}

//GetCollection - get model mongo collection name.
func (m StorageProvider) GetCollection() string {
return StorageProviderCollectionName
}
47 changes: 47 additions & 0 deletions src/server/handler_storage_provider.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package server

import (
"fmt"

"github.com/linkernetworks/logger"
"github.com/linkernetworks/utils/timeutils"
"github.com/linkernetworks/vortex/src/entity"
response "github.com/linkernetworks/vortex/src/net/http"
"github.com/linkernetworks/vortex/src/web"
mgo "gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
)

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

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

session := sp.Mongo.NewSession()
session.C(entity.StorageProviderCollectionName).EnsureIndex(mgo.Index{
Key: []string{"displayName"},
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.StorageProviderCollectionName, &storageProvider); err != nil {
if mgo.IsDup(err) {
response.Conflict(req.Request, resp.ResponseWriter, fmt.Errorf("Storage Provider Name: %s already existed", storageProvider.DisplayName))
} else {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
}
return
}

resp.WriteEntity(ActionResponse{
Error: false,
Message: "Create success",
})
}
65 changes: 65 additions & 0 deletions src/server/handler_storage_provider_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package server

import (
"encoding/json"
"net/http"
"net/http/httptest"
"strings"
"testing"

"github.com/docker/docker/pkg/namesgenerator"
restful "github.com/emicklei/go-restful"
"github.com/linkernetworks/vortex/src/config"
"github.com/linkernetworks/vortex/src/entity"
"github.com/linkernetworks/vortex/src/serviceprovider"
"github.com/stretchr/testify/assert"
)

func TestCreateStorageProvider(t *testing.T) {
cf := config.MustRead("../../config/testing.json")
sp := serviceprovider.New(cf)

//Testing parameter
tName := namesgenerator.GetRandomName(0)
tType := "nfs"
tIP := "1.2.3.4"
tPath := "/exports"
storageProvider := entity.StorageProvider{
Type: tType,
DisplayName: tName,
NFSStorageProvider: entity.NFSStorageProvider{
IP: tIP,
PATH: tPath,
},
}
session := sp.Mongo.NewSession()

bodyBytes, err := json.MarshalIndent(storageProvider, "", " ")
assert.NoError(t, err)

bodyReader := strings.NewReader(string(bodyBytes))
httpRequest, err := http.NewRequest("POST", "http://localhost:7890/v1/storageprovider", bodyReader)
assert.NoError(t, err)

httpRequest.Header.Add("Content-Type", "application/json")
httpWriter := httptest.NewRecorder()
wc := restful.NewContainer()
service := newStorageProviderService(sp)
wc.Add(service)
wc.Dispatch(httpWriter, httpRequest)
assertResponseCode(t, http.StatusOK, httpWriter)
//Empty data
//We use the new write but empty input
httpWriter = httptest.NewRecorder()
wc.Dispatch(httpWriter, httpRequest)
assertResponseCode(t, http.StatusBadRequest, httpWriter)
//Create again and it should fail since the name exist
bodyReader = strings.NewReader(string(bodyBytes))
httpRequest, err = http.NewRequest("POST", "http://localhost:7890/v1/storageprovider", bodyReader)
assert.NoError(t, err)
httpRequest.Header.Add("Content-Type", "application/json")
httpWriter = httptest.NewRecorder()
wc.Dispatch(httpWriter, httpRequest)
assertResponseCode(t, http.StatusConflict, httpWriter)
defer session.Remove(entity.StorageProviderCollectionName, "displayName", tName)
}
8 changes: 8 additions & 0 deletions src/server/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ func (a *App) AppRoute() *mux.Router {

container.Add(newVersionService(a.ServiceProvider))
container.Add(newNetworkService(a.ServiceProvider))
container.Add(newStorageProviderService(a.ServiceProvider))

router.PathPrefix("/v1/").Handler(container)
return router
Expand All @@ -38,3 +39,10 @@ func newNetworkService(sp *serviceprovider.Container) *restful.WebService {
webService.Route(webService.DELETE("/{id}").To(handler.RESTfulServiceHandler(sp, DeleteNetworkHandler)))
return webService
}

func newStorageProviderService(sp *serviceprovider.Container) *restful.WebService {
webService := new(restful.WebService)
webService.Path("/v1/storageprovider").Consumes(restful.MIME_JSON, restful.MIME_JSON).Produces(restful.MIME_JSON, restful.MIME_JSON)
webService.Route(webService.POST("/").To(handler.RESTfulServiceHandler(sp, CreateStorageProvider)))
return webService
}
6 changes: 6 additions & 0 deletions vendor/vendor.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@
"revision": "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e",
"revisionTime": "2018-03-08T23:13:08Z"
},
{
"checksumSHA1": "mgmkUpfdKCjiPfSjUXE7Tg2HvBw=",
"path": "github.com/docker/docker/pkg/namesgenerator",
"revision": "af626ba08a4e11b0e140e7512ac2740b09833c29",
"revisionTime": "2018-06-22T02:08:08Z"
},
{
"checksumSHA1": "wPbKObbGzS/43nrskRaJVFVEW/A=",
"path": "github.com/ema/qdisc",
Expand Down

0 comments on commit c9b7c7a

Please sign in to comment.