From e50bbdf5f7ecbe3dd6adc38e5927151ecfd03093 Mon Sep 17 00:00:00 2001 From: Pei Hsuan Tsai Date: Mon, 11 Jun 2018 13:56:24 +0800 Subject: [PATCH 1/4] list handler Former-commit-id: ffed8f738dc1099a194e1c2b0a57bc1dc4f357fe [formerly ebe630b8d6201c737ba30c70e5546d9ebb5a580f] Former-commit-id: 4479106f6eeb049adec0dbd6d9a93a494cc71b74 --- config/local.json | 2 +- config/testing.json | 2 +- src/net/http/query/query.go | 56 ++++++++++++++++ src/net/http/query/query_test.go | 103 +++++++++++++++++++++++++++++ src/server/handler_network.go | 79 +++++++++++++++++++++- src/server/handler_network_test.go | 48 ++++++++++++++ src/server/route.go | 4 +- 7 files changed, 289 insertions(+), 5 deletions(-) create mode 100644 src/net/http/query/query.go create mode 100644 src/net/http/query/query_test.go diff --git a/config/local.json b/config/local.json index 477ee954..f5191eba 100644 --- a/config/local.json +++ b/config/local.json @@ -14,7 +14,7 @@ } }, "mongo": { - "url": "mongodb://localhost:31717/vortex_test" + "url": "mongodb://192.168.64.14:31717/vortex_test" }, "influxdb": { "url": "http://localhost:8086", diff --git a/config/testing.json b/config/testing.json index 43b6a66d..3d2331d1 100644 --- a/config/testing.json +++ b/config/testing.json @@ -14,7 +14,7 @@ } }, "mongo": { - "url": "mongodb://localhost:31717/vortex_test" + "url": "mongodb://192.168.64.14:31717/vortex_test" }, "influxdb": { "url": "http://localhost:8086", diff --git a/src/net/http/query/query.go b/src/net/http/query/query.go new file mode 100644 index 00000000..0d16b9e8 --- /dev/null +++ b/src/net/http/query/query.go @@ -0,0 +1,56 @@ +package query + +import ( + "net/url" + "strconv" +) + +type QueryUrl struct { + Url url.Values `json:"url"` +} + +func New(url url.Values) *QueryUrl { + return &QueryUrl{ + Url: url, + } +} + +func (query *QueryUrl) Int(key string, defaultValue int) (int, error) { + values := query.Url[key] + + if len(values) == 0 { + return defaultValue, nil + } + + val, err := strconv.Atoi(values[0]) + if err != nil { + return defaultValue, err + } + + return int(val), nil +} + +func (query *QueryUrl) Int64(key string, defaultValue int64) (int64, error) { + values := query.Url[key] + + if len(values) == 0 { + return defaultValue, nil + } + + val, err := strconv.ParseInt(values[0], 10, 64) + if err != nil { + return defaultValue, err + } + + return int64(val), nil +} + +func (query *QueryUrl) Str(key string) (string, bool) { + values := query.Url[key] + + if len(values) == 0 { + return "", false + } + + return values[0], true +} diff --git a/src/net/http/query/query_test.go b/src/net/http/query/query_test.go new file mode 100644 index 00000000..dfc4ca5b --- /dev/null +++ b/src/net/http/query/query_test.go @@ -0,0 +1,103 @@ +package query + +import ( + "github.com/stretchr/testify/assert" + "net/http" + "strconv" + "testing" +) + +func TestQueryInt(t *testing.T) { + expectedInt := 123 + req, err := http.NewRequest("GET", "/test?iamint="+strconv.Itoa(expectedInt), nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, err := q.Int("iamint", 0) + assert.NoError(t, err) + assert.Equal(t, expectedInt, v) +} + +func TestQueryIntByDefault(t *testing.T) { + defaultInt := 10 + req, err := http.NewRequest("GET", "/test", nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, err := q.Int("notfound", defaultInt) + assert.NoError(t, err) + assert.Equal(t, defaultInt, v) +} + +func TestQueryIntFail(t *testing.T) { + defaultInt := 10 + req, err := http.NewRequest("GET", "/test?iamint=abc", nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, err := q.Int("iamint", defaultInt) + assert.Error(t, err) + assert.Equal(t, defaultInt, v) +} + +func TestInt64(t *testing.T) { + expectedInt := int64(42949672951) + req, err := http.NewRequest("GET", "/test?iamint="+strconv.FormatInt(expectedInt, 10), nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, err := q.Int64("iamint", 0) + assert.NoError(t, err) + assert.Equal(t, expectedInt, v) +} + +func TestInt64ByDefault(t *testing.T) { + defaultInt := int64(21474836471) + req, err := http.NewRequest("GET", "/test", nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, err := q.Int64("notfound", defaultInt) + assert.NoError(t, err) + assert.Equal(t, defaultInt, v) +} + +func TestInt64Fail(t *testing.T) { + defaultInt := int64(21474836471) + req, err := http.NewRequest("GET", "/test?iamint=abc", nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, err := q.Int64("iamint", defaultInt) + assert.Error(t, err) + assert.Equal(t, defaultInt, v) +} + +func TestStr(t *testing.T) { + expectedStr := "YoYo" + req, err := http.NewRequest("GET", "/test?Hey="+expectedStr, nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, ok := q.Str("Hey") + assert.True(t, ok) + assert.Equal(t, expectedStr, v) +} + +func TestStrByDefault(t *testing.T) { + req, err := http.NewRequest("GET", "/test", nil) + assert.NoError(t, err) + + q := New(req.URL.Query()) + + v, ok := q.Str("notfound") + assert.False(t, ok) + assert.Equal(t, "", v) +} diff --git a/src/server/handler_network.go b/src/server/handler_network.go index c19c8ee1..b0f62e59 100644 --- a/src/server/handler_network.go +++ b/src/server/handler_network.go @@ -2,10 +2,13 @@ package server import ( "fmt" + "math" "reflect" + "strconv" "bitbucket.org/linkernetworks/vortex/src/entity" response "bitbucket.org/linkernetworks/vortex/src/net/http" + "bitbucket.org/linkernetworks/vortex/src/net/http/query" "bitbucket.org/linkernetworks/vortex/src/web" "github.com/linkernetworks/logger" "github.com/linkernetworks/utils/timeutils" @@ -87,6 +90,80 @@ func CreateNetworkHandler(ctx *web.Context) { }) } +func ListNetworkHandler(ctx *web.Context) { + as, 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 { + logger.Error(err) + 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 := as.Mongo.NewSession() + defer session.Close() + + networks := []entity.Network{} + + var c = session.C(entity.NetworkCollectionName) + var q *mgo.Query + + selector := bson.M{} + q = c.Find(selector).Sort("_id").Skip((page - 1) * pageSize).Limit(pageSize) + + err = q.All(&networks) + if err != nil { + logger.Error(err) + if err == mgo.ErrNotFound { + response.NotFound(req.Request, resp.ResponseWriter, err) + return + } + response.InternalServerError(req.Request, resp.ResponseWriter, err) + return + } + + count, err := session.Count(entity.NetworkCollectionName, bson.M{}) + if err != nil { + logger.Error(err) + } + 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(networks) +} + +func GetNetworkHandler(ctx *web.Context) { + as, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response + + id := req.PathParameter("id") + + session := as.Mongo.NewSession() + defer session.Close() + c := session.C(entity.NetworkCollectionName) + + var network entity.Network + err := c.FindId(bson.ObjectIdHex(id)).One(&network) + if err != nil { + logger.Error(err) + if err == mgo.ErrNotFound { + response.NotFound(req.Request, resp.ResponseWriter, err) + return + } + response.InternalServerError(req.Request, resp.ResponseWriter, err) + return + } else { + resp.WriteEntity(network) + } +} + func DeleteNetworkHandler(ctx *web.Context) { as, req, resp := ctx.ServiceProvider, ctx.Request, ctx.Response @@ -156,8 +233,6 @@ func UpdateNetworkHandler(ctx *web.Context) { return } - logger.Infof("Noooooooooooooooooooo") - err = session.UpdateById(entity.NetworkCollectionName, network.ID, updatedNetwork) if err != nil { logger.Error(err) diff --git a/src/server/handler_network_test.go b/src/server/handler_network_test.go index c0f43719..6e9036f9 100644 --- a/src/server/handler_network_test.go +++ b/src/server/handler_network_test.go @@ -393,3 +393,51 @@ func TestWrongUpdateNetwork(t *testing.T) { wcUpdate.Dispatch(httpWriterUpdate, httpRequestUpdate) assertResponseCode(t, http.StatusBadRequest, httpWriterUpdate) } + +func TestGetNetwork(t *testing.T) { + cf := config.MustRead("../../config/testing.json") + sp := serviceprovider.New(cf) + + network := entity.Network{ + DisplayName: "OVS Bridge", + BridgeName: "obsbr1", + BridgeType: "ovs", + Node: "node1", + Interface: "eth3", + Ports: []int32{2043, 2143, 2243}, + MTU: 1500, + } + + session := sp.Mongo.NewSession() + defer session.RemoveAll(entity.NetworkCollectionName) + + bodyBytes, err := json.MarshalIndent(network, "", " ") + assert.NoError(t, err) + + bodyReader := strings.NewReader(string(bodyBytes)) + httpRequest, err := http.NewRequest("POST", "http://localhost:7890/v1/networks", bodyReader) + assert.NoError(t, err) + + httpRequest.Header.Add("Content-Type", "application/json") + httpWriter := httptest.NewRecorder() + wc := restful.NewContainer() + service := newNetworkService(sp) + wc.Add(service) + wc.Dispatch(httpWriter, httpRequest) + assertResponseCode(t, http.StatusOK, httpWriter) + + network = entity.Network{} + q := bson.M{"displayName": "OVS Bridge"} + err = session.FindOne(entity.NetworkCollectionName, q, &network) + assert.NoError(t, err) + + httpRequestGet, err := http.NewRequest("GET", "http://localhost:7890/v1/networks/"+network.ID.Hex(), nil) + assert.NoError(t, err) + + httpWriterGet := httptest.NewRecorder() + wcGet := restful.NewContainer() + serviceGet := newNetworkService(sp) + wcGet.Add(serviceGet) + wcGet.Dispatch(httpWriterGet, httpRequestGet) + assertResponseCode(t, http.StatusOK, httpWriterGet) +} diff --git a/src/server/route.go b/src/server/route.go index 7556ca32..1f471c7b 100644 --- a/src/server/route.go +++ b/src/server/route.go @@ -31,8 +31,10 @@ func newVersionService(sp *serviceprovider.Container) *restful.WebService { func newNetworkService(sp *serviceprovider.Container) *restful.WebService { webService := new(restful.WebService) webService.Path("/v1/networks").Consumes(restful.MIME_JSON, restful.MIME_JSON).Produces(restful.MIME_JSON, restful.MIME_JSON) + webService.Route(webService.GET("/").To(handler.RESTfulServiceHandler(sp, ListNetworkHandler))) + webService.Route(webService.GET("/{id}").To(handler.RESTfulServiceHandler(sp, GetNetworkHandler))) webService.Route(webService.POST("/").To(handler.RESTfulServiceHandler(sp, CreateNetworkHandler))) - webService.Route(webService.DELETE("/{id}").To(handler.RESTfulServiceHandler(sp, DeleteNetworkHandler))) webService.Route(webService.PUT("/{id}").To(handler.RESTfulServiceHandler(sp, UpdateNetworkHandler))) + webService.Route(webService.DELETE("/{id}").To(handler.RESTfulServiceHandler(sp, DeleteNetworkHandler))) return webService } From 8189f65f5be9da500cc5753b6d0b79f708b1c43c Mon Sep 17 00:00:00 2001 From: David Chang Date: Mon, 11 Jun 2018 11:17:42 +0800 Subject: [PATCH 2/4] Update 5g hosts in taipei Former-commit-id: 4594608e4a37da6c4586ae2b34965aba9aa18767 [formerly 38346da6475c662b6a1619cf8a450783619cde90] Former-commit-id: 943368f706e07c473020696f362f17217af27cc1 --- installer/Makefile | 5 +++++ installer/inventory/5g/hosts.ini | 12 +++++------- .../inventory/vagrant/group_vars/k8s-cluster.yml | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/installer/Makefile b/installer/Makefile index e745ee32..cf911285 100644 --- a/installer/Makefile +++ b/installer/Makefile @@ -41,6 +41,11 @@ scale-%: submodule --inventory=inventory/$*/hosts.ini \ kubespray/scale.yml 2>&1 | tee aurora-$(shell date +%F-%H%M%S)-scale.log +upgrade-%: submodule + ANSIBLE_HOST_KEY_CHECKING=false ansible-playbook \ + --inventory=inventory/$*/hosts.ini \ + kubespray/upgrade-cluster.yml 2>&1 | tee aurora-$(shell date +%F-%H%M%S)-upgrade.log + # Vagrant vagrant-up: diff --git a/installer/inventory/5g/hosts.ini b/installer/inventory/5g/hosts.ini index b0d271fb..099f9fd6 100644 --- a/installer/inventory/5g/hosts.ini +++ b/installer/inventory/5g/hosts.ini @@ -1,21 +1,19 @@ # ## Configure 'ip' variable to bind kubernetes services on a # ## different ip than the default iface -master ansible_ssh_host=192.168.26.10 ip=192.168.26.10 -node-1 ansible_ssh_host=192.168.26.11 ip=192.168.26.11 -node-2 ansible_ssh_host=192.168.26.12 ip=192.168.26.12 +vortex-master ansible_ssh_host=10.1.14.14 ip=10.1.14.14 +vortex-node-1 ansible_ssh_host=10.1.14.86 ip=10.1.14.86 # ## configure a bastion host if your nodes are not directly reachable # bastion ansible_host=x.x.x.x ansible_user=some_user [kube-master] -master +vortex-master [etcd] -master +vortex-master [kube-node] -node-1 -node-2 +vortex-node-1 [k8s-cluster:children] kube-master diff --git a/installer/inventory/vagrant/group_vars/k8s-cluster.yml b/installer/inventory/vagrant/group_vars/k8s-cluster.yml index 9b010ef9..645362fb 100644 --- a/installer/inventory/vagrant/group_vars/k8s-cluster.yml +++ b/installer/inventory/vagrant/group_vars/k8s-cluster.yml @@ -19,7 +19,7 @@ kube_users_dir: "{{ kube_config_dir }}/users" kube_api_anonymous_auth: true ## Change this to use another Kubernetes version, e.g. a current beta release -kube_version: v1.9.8 +kube_version: v1.10.4 # Where the binaries will be downloaded. # Note: ensure that you've enough disk space (about 1G) From 2a64861df092d825da3fa6175fc7013b8fbf8201 Mon Sep 17 00:00:00 2001 From: Pei Hsuan Tsai Date: Thu, 14 Jun 2018 17:33:37 +0800 Subject: [PATCH 3/4] modify the url of mongo Former-commit-id: 4e28855b969ac0574f3237c17fe7c79de4ace51e [formerly 58507ec5100f2554e0817f8620ec3ddedbb8879a] Former-commit-id: 691e4c8e9363609df1d9feb972083533d8876225 --- config/local.json | 2 +- config/testing.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/local.json b/config/local.json index f5191eba..477ee954 100644 --- a/config/local.json +++ b/config/local.json @@ -14,7 +14,7 @@ } }, "mongo": { - "url": "mongodb://192.168.64.14:31717/vortex_test" + "url": "mongodb://localhost:31717/vortex_test" }, "influxdb": { "url": "http://localhost:8086", diff --git a/config/testing.json b/config/testing.json index 3d2331d1..43b6a66d 100644 --- a/config/testing.json +++ b/config/testing.json @@ -14,7 +14,7 @@ } }, "mongo": { - "url": "mongodb://192.168.64.14:31717/vortex_test" + "url": "mongodb://localhost:31717/vortex_test" }, "influxdb": { "url": "http://localhost:8086", From fd7fb1b3c8bed798311e1ce30b366155229c6b3d Mon Sep 17 00:00:00 2001 From: Pei Hsuan Tsai Date: Thu, 14 Jun 2018 17:43:01 +0800 Subject: [PATCH 4/4] modify the code Former-commit-id: c981bfa213ad5b016f0ed5000640fe90f7721567 [formerly bba1ebc21782e45fd25e8c4e030e148692fe11d2] Former-commit-id: eb84c78f7c7e8213e935c93f563c4b44bdfa5406 --- src/server/handler_network.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/server/handler_network.go b/src/server/handler_network.go index b0f62e59..8f58bdca 100644 --- a/src/server/handler_network.go +++ b/src/server/handler_network.go @@ -159,9 +159,8 @@ func GetNetworkHandler(ctx *web.Context) { } response.InternalServerError(req.Request, resp.ResponseWriter, err) return - } else { - resp.WriteEntity(network) } + resp.WriteEntity(network) } func DeleteNetworkHandler(ctx *web.Context) {