Skip to content

Commit

Permalink
Merge pull request #76 from linkernetworks/alex/addPodHandler
Browse files Browse the repository at this point in the history
Add pod handler
  • Loading branch information
Hung-Wei Chiu authored Jul 10, 2018
2 parents 92d1323 + e9cc971 commit dbcd904
Show file tree
Hide file tree
Showing 7 changed files with 502 additions and 1 deletion.
29 changes: 29 additions & 0 deletions src/entity/pod.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 (
PodCollectionName string = "pods"
)

type Container struct {
Name string `bson:"name" json:"name"`
Image string `bson:"image" json:"image"`
Command []string `bson:"command" json:"command"`
}

type Pod struct {
ID bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `bson:"name" json:"name"`
Containers []Container `bson:"containers" json:"containers"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty"`
}

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

import (
"github.com/linkernetworks/vortex/src/entity"
"github.com/linkernetworks/vortex/src/serviceprovider"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func CreatePod(sp *serviceprovider.Container, pod *entity.Pod) error {
var containers []corev1.Container
for _, container := range pod.Containers {
c := corev1.Container{}
c.Name = container.Name
c.Image = container.Image
c.Command = container.Command
containers = append(containers, c)
}
p := corev1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: pod.Name,
},
Spec: corev1.PodSpec{
Containers: containers,
},
}
_, err := sp.KubeCtl.CreatePod(&p)
return err
}

func DeletePod(sp *serviceprovider.Container, podName string) error {
return sp.KubeCtl.DeletePod(podName)
}
57 changes: 57 additions & 0 deletions src/pod/pod_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package pod

import (
"github.com/linkernetworks/vortex/src/config"
"github.com/linkernetworks/vortex/src/entity"
"github.com/linkernetworks/vortex/src/serviceprovider"
"github.com/moby/moby/pkg/namesgenerator"
"github.com/stretchr/testify/suite"
"gopkg.in/mgo.v2/bson"
"math/rand"
"testing"
"time"
)

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

type PodTestSuite struct {
suite.Suite
sp *serviceprovider.Container
}

func (suite *PodTestSuite) SetupSuite() {
cf := config.MustRead("../../config/testing.json")
suite.sp = serviceprovider.NewForTesting(cf)
}

func (suite *PodTestSuite) TearDownSuite() {
}

func TestPodSuite(t *testing.T) {
suite.Run(t, new(PodTestSuite))
}

func (suite *PodTestSuite) TestCreatePod() {
containers := []entity.Container{
{
Name: namesgenerator.GetRandomName(0),
Image: "busybox",
Command: []string{"sleep", "3600"},
},
}

podName := namesgenerator.GetRandomName(0)
pod := &entity.Pod{
ID: bson.NewObjectId(),
Name: podName,
Containers: containers,
}

err := CreatePod(suite.sp, pod)
suite.NoError(err)

err = DeletePod(suite.sp, podName)
suite.NoError(err)
}
136 changes: 136 additions & 0 deletions src/server/handler_pod.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package server

import (
"fmt"
"math"
"strconv"

"github.com/linkernetworks/utils/timeutils"
"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/pod"
"github.com/linkernetworks/vortex/src/web"

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

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

p := entity.Pod{}
if err := req.ReadEntity(&p); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

session := sp.Mongo.NewSession()
session.C(entity.PodCollectionName).EnsureIndex(mgo.Index{
Key: []string{"name"},
Unique: true,
})
defer session.Close()

// Check whether this name has been used
p.ID = bson.NewObjectId()
p.CreatedAt = timeutils.Now()
if err := pod.CreatePod(sp, &p); err != nil {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
}
if err := session.Insert(entity.PodCollectionName, &p); err != nil {
if mgo.IsDup(err) {
response.Conflict(req.Request, resp.ResponseWriter, fmt.Errorf("Pod Name: %s already existed", p.Name))
} else {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
}
return
}

resp.WriteEntity(ActionResponse{
Error: false,
Message: "Create success",
})
}

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

id := req.PathParameter("id")

session := sp.Mongo.NewSession()
defer session.Close()

p := entity.Pod{}
if err := session.FindOne(entity.PodCollectionName, bson.M{"_id": bson.ObjectIdHex(id)}, &p); err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

if err := pod.DeletePod(sp, p.Name); err != nil {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
}

if err := session.Remove(entity.PodCollectionName, "_id", bson.ObjectIdHex(id)); err != nil {
if mgo.ErrNotFound == err {
response.BadRequest(req.Request, resp.ResponseWriter, err)
} else {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
}
return
}

resp.WriteEntity(ActionResponse{
Error: false,
Message: "Delete success",
})
}

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

var pageSize = 10
query := query.New(req.Request.URL.Query())

page, err := query.Int("page", 1)
if err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}
pageSize, err = query.Int("page_size", pageSize)
if err != nil {
response.BadRequest(req.Request, resp.ResponseWriter, err)
return
}

session := sp.Mongo.NewSession()
defer session.Close()

pods := []entity.Pod{}
var c = session.C(entity.PodCollectionName)
var q *mgo.Query

selector := bson.M{}
q = c.Find(selector).Sort("_id").Skip((page - 1) * pageSize).Limit(pageSize)

if err := q.All(&pods); err != nil {
if err == mgo.ErrNotFound {
response.NotFound(req.Request, resp.ResponseWriter, err)
} else {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
}
return
}

count, err := session.Count(entity.PodCollectionName, bson.M{})
if err != nil {
response.InternalServerError(req.Request, resp.ResponseWriter, err)
return
}
totalPages := int(math.Ceil(float64(count) / float64(pageSize)))
resp.AddHeader("X-Total-Count", strconv.Itoa(count))
resp.AddHeader("X-Total-Pages", strconv.Itoa(totalPages))
resp.WriteEntity(pods)
}
Loading

0 comments on commit dbcd904

Please sign in to comment.