Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Support Basic HPA In Frontend #207

Merged
merged 22 commits into from Jan 10, 2019
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
0964f25
backend:add basic HPA API
chengyumeng Jan 3, 2019
a3fdf9f
frontend:init HPA page
chengyumeng Jan 4, 2019
93700e9
Merge branch 'master' of github.com:Qihoo360/wayne into feature/HPA
chengyumeng Jan 4, 2019
79fec89
frontend:fix param bug and add list hpa page
chengyumeng Jan 4, 2019
cf3b356
backend:add All HPA API(k8s)
chengyumeng Jan 7, 2019
64a1830
frontend:add all frontend page
chengyumeng Jan 7, 2019
dad72d1
frontend:add k8s object class
chengyumeng Jan 7, 2019
64ec79a
frontend:add publish template base class
chengyumeng Jan 8, 2019
3e9fa09
frontend:add status page
chengyumeng Jan 8, 2019
f1f067f
backend:add template API
chengyumeng Jan 8, 2019
ea6044b
frontend:add the function of show diff of template in base class
chengyumeng Jan 8, 2019
3a5ec3e
backend:add HPA permission
chengyumeng Jan 8, 2019
75c4888
frontend: add badic i18n
chengyumeng Jan 8, 2019
37554de
Merge branch 'master' of github.com:Qihoo360/wayne into feature/HPA
chengyumeng Jan 8, 2019
dcfce33
Merge branch 'master' into feature/HPA
Jan 9, 2019
4e10fab
Merge branch 'master' into feature/HPA
Jan 9, 2019
2a615b3
Merge branch 'master' of github.com:Qihoo360/wayne into feature/HPA
chengyumeng Jan 9, 2019
eff935d
Merge branch 'feature/HPA' of github.com:chengyumeng/wayne into featu…
chengyumeng Jan 9, 2019
03a6279
frontend:fix the bug of template parse
chengyumeng Jan 9, 2019
29094e7
frontend:fix frontend code review
chengyumeng Jan 10, 2019
3818c09
backend:add update SQL
chengyumeng Jan 10, 2019
9c37ddb
frontend: remove line
chengyumeng Jan 10, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/backend/client/cache.go
Expand Up @@ -4,6 +4,7 @@ import (
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/listers/apps/v1beta1"
autoscalingv1 "k8s.io/client-go/listers/autoscaling/v1"
"k8s.io/client-go/listers/core/v1"

"github.com/Qihoo360/wayne/src/backend/client/api"
Expand Down Expand Up @@ -58,3 +59,7 @@ func (c *CacheFactory) NodeLister() v1.NodeLister {
func (c *CacheFactory) EndpointLister() v1.EndpointsLister {
return c.sharedInformerFactory.Core().V1().Endpoints().Lister()
}

func (c *CacheFactory) HPALister() autoscalingv1.HorizontalPodAutoscalerLister {
return c.sharedInformerFactory.Autoscaling().V1().HorizontalPodAutoscalers().Lister()
}
168 changes: 168 additions & 0 deletions src/backend/controllers/hpa/hpa.go
@@ -0,0 +1,168 @@
package hpa

import (
"encoding/json"

"github.com/Qihoo360/wayne/src/backend/controllers/base"
"github.com/Qihoo360/wayne/src/backend/models"
"github.com/Qihoo360/wayne/src/backend/util/logs"
)

type HPAController struct {
base.APIController
}

func (c *HPAController) URLMapping() {
c.Mapping("List", c.List)
c.Mapping("Create", c.Create)
c.Mapping("Get", c.Get)
c.Mapping("Update", c.Update)
c.Mapping("Delete", c.Delete)
c.Mapping("UpdateOrders", c.UpdateOrders)
}

func (c *HPAController) Prepare() {
// Check administration
c.APIController.Prepare()
// Check permission
perAction := ""
_, method := c.GetControllerAndAction()
switch method {
case "Get", "List":
perAction = models.PermissionRead
case "Create":
perAction = models.PermissionCreate
case "Update":
perAction = models.PermissionUpdate
case "Delete":
perAction = models.PermissionDelete
}
if perAction != "" {
c.CheckPermission(models.PermissionTypeHPA, perAction)
}
}

// @router / [get]
func (c *HPAController) List() {
param := c.BuildQueryParam()
name := c.Input().Get("name")
if name != "" {
param.Query["name__contains"] = name
}

hpas := []models.HPA{}
if c.AppId != 0 {
param.Query["App__Id"] = c.AppId
} else if !c.User.Admin {
param.Query["App__AppUsers__User__Id__exact"] = c.User.Id
perName := models.PermissionModel.MergeName(models.PermissionTypeHPA, models.PermissionRead)
param.Query["App__AppUsers__Group__Permissions__Permission__Name__contains"] = perName
param.Groupby = []string{"Id"}
}

total, err := models.GetTotal(new(models.HPA), param)
if err != nil {
logs.Error("get total count by param (%s) error. %v", param, err)
c.HandleError(err)
return
}

err = models.GetAll(new(models.HPA), &hpas, param)
if err != nil {
logs.Error("list by param (%s) error. %v", param, err)
c.HandleError(err)
return
}
for key, one := range hpas {
hpas[key].AppId = one.App.Id
}

c.Success(param.NewPage(total, hpas))
}

// @router / [post]
func (c *HPAController) Create() {
var hpa models.HPA
err := json.Unmarshal(c.Ctx.Input.RequestBody, &hpa)
if err != nil {
logs.Error("get body error. %v", err)
c.AbortBadRequestFormat("HPA")
}

hpa.User = c.User.Name
_, err = models.HPAModel.Add(&hpa)

if err != nil {
logs.Error("create error.%v", err.Error())
c.HandleError(err)
return
}
c.Success(hpa)
}

// @router /:id([0-9]+) [get]
func (c *HPAController) Get() {
id := c.GetIDFromURL()

hpa, err := models.HPAModel.GetById(int64(id))
if err != nil {
logs.Error("get by id (%d) error.%v", id, err)
c.HandleError(err)
return
}

c.Success(hpa)
}

// @router /:id([0-9]+) [put]
func (c *HPAController) Update() {
id := c.GetIDFromURL()
var hpa models.HPA
err := json.Unmarshal(c.Ctx.Input.RequestBody, &hpa)
if err != nil {
logs.Error("Invalid param body.%v", err)
c.AbortBadRequestFormat("HPA")
}

hpa.Id = int64(id)
err = models.HPAModel.UpdateById(&hpa)
if err != nil {
logs.Error("update error.%v", err)
c.HandleError(err)
return
}
c.Success(hpa)
}

// @router /updateorders [put]
func (c *HPAController) UpdateOrders() {
var hpas []*models.HPA
err := json.Unmarshal(c.Ctx.Input.RequestBody, &hpas)
if err != nil {
logs.Error("Invalid param body.%v", err)
c.AbortBadRequestFormat("HPA")
}

err = models.HPAModel.UpdateOrders(hpas)
if err != nil {
logs.Error("update orders (%v) error.%v", hpas, err)
c.HandleError(err)
return
}
c.Success(nil)
}

// @router /:id([0-9]+) [delete]
func (c *HPAController) Delete() {
id := c.GetIDFromURL()

logical := c.GetLogicalFromQuery()

err := models.HPAModel.DeleteById(int64(id), logical)
if err != nil {
logs.Error("delete %d error.%v", id, err)
c.HandleError(err)
return
}
c.Success(nil)
}
161 changes: 161 additions & 0 deletions src/backend/controllers/hpa/hpa_tpl.go
@@ -0,0 +1,161 @@
package hpa

import (
"encoding/json"
"fmt"

"github.com/Qihoo360/wayne/src/backend/controllers/base"
"github.com/Qihoo360/wayne/src/backend/models"
"github.com/Qihoo360/wayne/src/backend/util/hack"
"github.com/Qihoo360/wayne/src/backend/util/logs"

"k8s.io/api/autoscaling/v1"
)

type HPATplController struct {
base.APIController
}

func (c *HPATplController) URLMapping() {
c.Mapping("List", c.List)
c.Mapping("Create", c.Create)
c.Mapping("Get", c.Get)
//c.Mapping("Update", c.Update)
c.Mapping("Delete", c.Delete)
}

func (c *HPATplController) Prepare() {
// Check administration
c.APIController.Prepare()
// Check permission
perAction := ""
_, method := c.GetControllerAndAction()
switch method {
case "Get", "List":
perAction = models.PermissionRead
case "Create":
perAction = models.PermissionCreate
case "Update":
perAction = models.PermissionUpdate
case "Delete":
perAction = models.PermissionDelete
}
if perAction != "" {
c.CheckPermission(models.PermissionTypeStatefulset, perAction)
}
}

// @router / [get]
func (c *HPATplController) List() {
param := c.BuildQueryParam()
name := c.Input().Get("name")
if name != "" {
param.Query["name__contains"] = name
}

isOnline := c.GetIsOnlineFromQuery()

hpaId := c.Input().Get("hpaId")
if hpaId != "" {
param.Query["hpa_id"] = hpaId
}

var hpaTpls []models.HPATemplate
total, err := models.ListTemplate(&hpaTpls, param, models.TableNameHPATemplate, models.PublishTypeHPA, isOnline)
if err != nil {
logs.Error("list by param (%v) error. %v", param, err)
c.HandleError(err)
return
}
for index, tpl := range hpaTpls {
hpaTpls[index].HPAId = tpl.HPA.Id
}

c.Success(param.NewPage(total, hpaTpls))
}

// @router / [post]
func (c *HPATplController) Create() {
var hpaTpl models.HPATemplate
err := json.Unmarshal(c.Ctx.Input.RequestBody, &hpaTpl)
if err != nil {
logs.Error("get body error. %v", err)
c.AbortBadRequestFormat("HPATemplate")
}
err = validHPATemplate(hpaTpl.Template)
if err != nil {
logs.Error("valid template err %v", err)
c.AbortBadRequestFormat("KubeHPA")
}

hpaTpl.User = c.User.Name

_, err = models.HPATemplateModel.Add(&hpaTpl)
if err != nil {
logs.Error("create error.%v", err.Error())
c.HandleError(err)
return
}
c.Success(hpaTpl)
}

func validHPATemplate(hpaTplStr string) error {
hpa := v1.HorizontalPodAutoscaler{}
err := json.Unmarshal(hack.Slice(hpaTplStr), &hpa)
if err != nil {
return fmt.Errorf("hpa template format error.%v", err.Error())
}
return nil
}

// @router /:id([0-9]+) [get]
func (c *HPATplController) Get() {
id := c.GetIDFromURL()

tpl, err := models.HPATemplateModel.GetById(id)
if err != nil {
logs.Error("get template error %v", err)
c.HandleError(err)
return
}

c.Success(tpl)
}

// @router /:id([0-9]+) [put]
func (c *HPATplController) Update() {
id := c.GetIDFromURL()
var tpl models.HPATemplate
err := json.Unmarshal(c.Ctx.Input.RequestBody, &tpl)
if err != nil {
logs.Error("Invalid param body.%v", err)
c.AbortBadRequestFormat("HPATemplate")
}
if err = validHPATemplate(tpl.Template); err != nil {
logs.Error("valid template err %v", err)
c.AbortBadRequestFormat("KubeHPA")
}

tpl.Id = int64(id)
err = models.HPATemplateModel.UpdateById(&tpl)
if err != nil {
logs.Error("update error.%v", err)
c.HandleError(err)
return
}
c.Success(tpl)
}

// @router /:id([0-9]+) [delete]
func (c *HPATplController) Delete() {
id := c.GetIDFromURL()
logical := c.GetLogicalFromQuery()

err := models.HPATemplateModel.DeleteById(int64(id), logical)
if err != nil {
logs.Error("delete %d error.%v", id, err)
c.HandleError(err)
return
}
c.Success(nil)
}