Skip to content
Open

Dev #25

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions common/global/statefulset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package global

/*
@auth: Meersburg
@source: 云原生运维圈
@website: https://www.kubesre.com/
@time: 2024/2/02
*/
import "time"

type StatefulSetData struct {
Name string `json:"name"`
Namespace string `json:"namespace"`
CreationTimestamp time.Time `json:"creationTimestamp"`
Replicas int32 `json:"replicas"`
ReadyReplicas int32 `json:"readyReplicas"`
CurrentReplicas int32 `json:"currentReplicas"`
}

type StatusfulSetsResp struct {
Items []StatefulSetData `json:"items"`
Total int `json:"total"`
}
119 changes: 119 additions & 0 deletions controllers/kubernetes/statefulset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package kubernetes

/*
@auth: Meersburg
@source: 云原生运维圈
@website: https://www.kubesre.com/
@time: 2024/2/02
*/
import (
"genbu/common/global"
sk "genbu/service/kubernetes"
"github.com/gin-gonic/gin"
)

// yaml方式创建statefulSet
func CreateStatefulSetYaml(ctx *gin.Context) {
cid := ctx.Param("cid")
parms := new(struct {
Content string `json:"content" form:"content"`
})
err := ctx.ShouldBind(&parms)
if err != nil {
global.TPLogger.Error("添加参数校验失败", err)
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
err = sk.NewK8sInterface().CreateStatefulSetYaml(cid, parms.Content)
if err != nil {
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
global.ReturnContext(ctx).Successful("success", "statefulSet服务创建成功")
}

// yaml方式更新statefulSet
func UpdateStatefulSetYaml(ctx *gin.Context) {
cid := ctx.Param("cid")
parms := new(struct {
Content string `json:"content" form:"content"`
})
err := ctx.ShouldBind(&parms)
if err != nil {
global.TPLogger.Error("添加参数校验失败", err)
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
err = sk.NewK8sInterface().UpdateStatefulSetYaml(cid, parms.Content)
if err != nil {
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
global.ReturnContext(ctx).Successful("success", "statefulSet服务更新成功")
}

// statefulset列表
func ListstatefulSet(ctx *gin.Context) {
cid := ctx.Param("cid")
parms := new(struct {
Namespace string `form:"namespace"`
FilterName string `form:"name"`
Limit int `form:"limit"`
Page int `form:"page"`
})
err := ctx.ShouldBindQuery(&parms)
if err != nil {
global.TPLogger.Error("添加参数校验失败", err)
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
statefulsetList, err := sk.NewK8sInterface().GetStatefulSetList(cid, parms.Namespace, parms.FilterName, parms.Limit, parms.Page)
if err != nil {
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
global.ReturnContext(ctx).Successful("success", statefulsetList)
}

// statefulSet详情
func DetailStatefulSet(ctx *gin.Context) {
cid := ctx.Param("cid")
parms := new(struct {
Name string `form:"name"`
Namespace string `form:"namespace"`
})
err := ctx.ShouldBindQuery(&parms)
if err != nil {
global.TPLogger.Error("添加参数校验失败", err)
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
statefulSet, err := sk.NewK8sInterface().GetStatefulSetDetail(cid, parms.Name, parms.Namespace)
if err != nil {
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
global.ReturnContext(ctx).Successful("success", statefulSet)

}

// 删除statefulSet
func DelectStatefulSet(ctx *gin.Context) {
cid := ctx.Param("cid")
parms := new(struct {
Name string `form:"name"`
Namespace string `form:"namespace"`
})
err := ctx.ShouldBindQuery(&parms)
if err != nil {
global.TPLogger.Error("添加参数校验失败", err)
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
err = sk.NewK8sInterface().DeleteStatefulSet(cid, parms.Name, parms.Namespace)
if err != nil {
global.ReturnContext(ctx).Failed("failed", err.Error())
return
}
global.ReturnContext(ctx).Successful("success", "删除statefulSet成功")
}
26 changes: 26 additions & 0 deletions routers/kubernetes/statefulset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package kubernetes

/*
@auth: Meersburg
@source: 云原生运维圈
@website: https://www.kubesre.com/
@time: 2024/2/02
*/
import (
"genbu/controllers/kubernetes"
"genbu/middles"
"github.com/gin-gonic/gin"
)

func InitStatefulSetRouters(r *gin.RouterGroup) gin.IRoutes {
r = r.Group("/kubernetes/:cid")
{
r.GET("/statefulset/listStatefulSet", kubernetes.ListstatefulSet)
r.GET("/statefulset/getStatefulSetDetail", kubernetes.DetailStatefulSet)
r.POST("/statefulset/deleteStatefulSet", kubernetes.DelectStatefulSet)
r.POST("/statefulset/createStatefulSetYaml", kubernetes.CreateStatefulSetYaml)
r.POST("/statefulset/updateStatefulSetYaml", kubernetes.UpdateStatefulSetYaml)
r.Use(middles.K8sClientCache())
}
return r
}
4 changes: 2 additions & 2 deletions routers/routers.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@ import (
"genbu/routers/base"
"genbu/routers/kubernetes"
system "genbu/routers/system"
"time"

"github.com/gin-gonic/gin"
"time"
)

func BaseRouters() *gin.Engine {
Expand Down Expand Up @@ -69,6 +68,7 @@ func BaseRouters() *gin.Engine {
kubernetes.InitConfigRouters(PrivateGroup)
kubernetes.InitNodeRouters(PrivateGroup)
kubernetes.InitSecretRouters(PrivateGroup)
kubernetes.InitStatefulSetRouters(PrivateGroup)
}
r.NoRoute(func(ctx *gin.Context) {
global.ReturnContext(ctx).Failed("fail", "该接口未开放")
Expand Down
30 changes: 30 additions & 0 deletions routers/v1/k8s.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
@auth: AnRuo
@source: 云原生运维圈
@website: https://www.kubesre.com/
@time: 2024/1/9
*/

package v1

import (
"genbu/controllers/k8s"
"genbu/middles"
jwt "github.com/appleboy/gin-jwt/v2"
"github.com/gin-gonic/gin"
)

func InitK8sRouters(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) gin.IRoutes {
{
r.Use(authMiddleware.MiddlewareFunc())
r.POST("/k8s/cluster/addCluster", k8s.AddK8sCluster)
r.GET("/k8s/cluster/listCluster", k8s.ListK8sCluster)
r.POST("/k8s/cluster/deleteCluster", k8s.DeleteK8sCluster)
r.POST("/k8s/cluster/updateCluster", k8s.UpdateK8sCluster)
r.POST("/k8s/cluster/refreshCluster", k8s.RefreshK8sCluster)
r.Use(middles.K8sClientCache())
r.GET("/k8s/cluster/:cid/node/listNode", k8s.GetK8sClusterNodeList)
r.GET("/k8s/cluster/:cid/statefulset/listStatefulSet", k8s.ListstatefulSet)
}
return r
}
9 changes: 9 additions & 0 deletions service/kubernetes/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
package kubernetes

import (
"genbu/common/global"
"genbu/models/kubernetes"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
)
Expand All @@ -33,6 +35,13 @@ type InterfaceK8s interface {
DeleteK8sSecret(cid, NameSpace string, ConfigMapName []map[string]string) error
DeleteK8sSecrets(cid, NameSpace string) error
UpdateK8sSecret(cid, NameSpace, SecretName, Text string) (*v1.Secret, error)
CreateStatefulSetYaml(cid, content string) (err error)
UpdateStatefulSetYaml(cid, content string) (err error)
GetStatefulSetList(cid, namespace, filterName string, limit, page int) (statefulSetsResp *global.StatusfulSetsResp, err error)
GetStatefulSetDetail(cid, name, namespace string) (statefulSet *appsv1.StatefulSet, err error)
DeleteStatefulSet(cid, name, namespace string) (err error)
StatefulSetToCells(std []global.StatefulSetData) []DataCell
StatefulSetFromCells(cells []DataCell) []global.StatefulSetData
}

type k8sCluster struct{}
Expand Down
11 changes: 11 additions & 0 deletions service/kubernetes/sortFilter.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package kubernetes

import (
"genbu/common/global"
corev1 "k8s.io/api/core/v1"
"sort"
"strings"
Expand Down Expand Up @@ -155,6 +156,16 @@ func FromCells(cells []DataCell) []corev1.Pod {
return pods
}

// statefulSet资源格式化
type statefulSetCell global.StatefulSetData

func (s statefulSetCell) GetCreation() time.Time {
return s.CreationTimestamp
}
func (s statefulSetCell) GetName() string {
return s.Name
}

// node
type nodeCell corev1.Node

Expand Down
Loading