-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #76 from linkernetworks/alex/addPodHandler
Add pod handler
- Loading branch information
Showing
7 changed files
with
502 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
Oops, something went wrong.