From ec45e096a18b493071042b5b42343b462ec4f5d5 Mon Sep 17 00:00:00 2001 From: tangjiangbo <17600060775@163.com> Date: Wed, 17 Jan 2024 15:37:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=8E=B7=E5=8F=96statefulset=E5=88=97?= =?UTF-8?q?=E8=A1=A8=20=E6=B7=BB=E5=8A=A0=E5=88=97=E8=A1=A8=E8=B7=AF?= =?UTF-8?q?=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/k8s/statefulset.go | 27 +++++++++++++ routers/v1/k8s.go | 1 + service/k8s/interface.go | 8 +++- service/k8s/statefulset.go | 70 ++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 controllers/k8s/statefulset.go create mode 100644 service/k8s/statefulset.go diff --git a/controllers/k8s/statefulset.go b/controllers/k8s/statefulset.go new file mode 100644 index 0000000..71e598c --- /dev/null +++ b/controllers/k8s/statefulset.go @@ -0,0 +1,27 @@ +package k8s + +import ( + "genbu/common/global" + sk "genbu/service/k8s" + "github.com/gin-gonic/gin" +) + +//statefulset列表 +func ListstatefulSet(ctx *gin.Context) { + cid := ctx.Param("cid") + parms := new(struct { + namespace string + }) + err := ctx.ShouldBindQuery(&parms) + if err != nil { + global.TPLogger.Error("获取statefulset列表失败", err) + global.ReturnContext(ctx).Failed("failed", err.Error()) + return + } + statefulsetList, err := sk.NewK8sInterface().GetStatefulSetList(cid, parms.namespace) + if err != nil { + global.ReturnContext(ctx).Failed("failed", err.Error()) + return + } + global.ReturnContext(ctx).Successful("success", statefulsetList) +} diff --git a/routers/v1/k8s.go b/routers/v1/k8s.go index 795ec8d..0b8965e 100644 --- a/routers/v1/k8s.go +++ b/routers/v1/k8s.go @@ -21,6 +21,7 @@ func InitK8sRouters(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) gi r.GET("/k8s/cluster", k8s.ListK8sCluster) r.Use(middles.K8sClientCache()) r.GET("/k8s/cluster/:cid/node/list", k8s.GetK8sClusterNodeList) + r.GET("/k8s/cluster/:cid/statefulset/listStatefulSet", k8s.ListstatefulSet) } return r } diff --git a/service/k8s/interface.go b/service/k8s/interface.go index 03194da..cb60edb 100644 --- a/service/k8s/interface.go +++ b/service/k8s/interface.go @@ -7,12 +7,18 @@ package k8s -import "genbu/models/k8s" +import ( + "genbu/models/k8s" + v1 "k8s.io/api/apps/v1" + "k8s.io/client-go/kubernetes" +) type InterfaceK8s interface { AddK8sCluster(cluster *k8s.Configs) (err error) ListK8sCluster(name string, limit, page int) (clusters *k8s.ClusterK8sList, err error) GetK8sClusterNodeList(cid interface{}) (err error) + InitClientSet(cid string) (clientSet *kubernetes.Clientset, err error) + GetStatefulSetList(cid, namespace string) (statefulSetList *v1.StatefulSetList, err error) } type k8sCluster struct{} diff --git a/service/k8s/statefulset.go b/service/k8s/statefulset.go new file mode 100644 index 0000000..2be462d --- /dev/null +++ b/service/k8s/statefulset.go @@ -0,0 +1,70 @@ +package k8s + +import ( + "context" + "errors" + "genbu/common/global" + "genbu/dao/k8s" + "genbu/utils" + v1 "k8s.io/api/apps/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" +) + +/*var Ks ks + +type ks struct { + ClientSet *kubernetes.Clientset +} + +func (k *ks) Init(cid string) (err error) { + cluster, err := k8s.NewK8sInterface().ActiveK8sCluster(cid) + if err != nil { + global.TPLogger.Error("获取可用集群信息失败: ", err) + return errors.New("获取可用集群信息失败") + } + configStr := cluster.Text + decodeConfig, err := utils.DecodeBase64(configStr) + if err != nil { + global.TPLogger.Error("集群config文件加载失败: ", err) + return errors.New("集群config文件加载失败") + } + k.ClientSet, err = global.NewClientInterface().NewClientSet(decodeConfig) + if err != nil { + global.TPLogger.Error("初始化client失败:", err) + return errors.New("初始化client失败") + } + return nil +}*/ + +func (k *k8sCluster) InitClientSet(cid string) (clientSet *kubernetes.Clientset, err error) { + cluster, err := k8s.NewK8sInterface().ActiveK8sCluster(cid) + if err != nil { + global.TPLogger.Error("获取可用集群信息失败: ", err) + return nil, errors.New("获取可用集群信息失败") + } + configStr := cluster.Text + decodeConfig, err := utils.DecodeBase64(configStr) + if err != nil { + global.TPLogger.Error("集群config文件加载失败: ", err) + return nil, errors.New("集群config文件加载失败") + } + clientSet, err = global.NewClientInterface().NewClientSet(decodeConfig) + if err != nil { + global.TPLogger.Error("初始化client失败:", err) + return nil, errors.New("初始化client失败") + } + return clientSet, nil +} + +//获取statefulset列表 +func (k *k8sCluster) GetStatefulSetList(cid, namespace string) (statefulSetList *v1.StatefulSetList, err error) { + clientSet, err := k.InitClientSet(cid) + statefulSetList, err = clientSet.AppsV1().StatefulSets(namespace).List(context.TODO(), metav1.ListOptions{}) + if err != nil { + global.TPLogger.Error("获取statefulSet列表失败:", err) + return nil, errors.New("获取statefulSet列表失败") + } + + return statefulSetList, nil +} From 06e22d34433e151b95f2a4a901a1f243339b7a3b Mon Sep 17 00:00:00 2001 From: tangjiangbo <17600060775@163.com> Date: Fri, 2 Feb 2024 14:50:36 +0800 Subject: [PATCH 2/2] =?UTF-8?q?yaml=E6=96=B9=E5=BC=8F=E5=88=9B=E5=BB=BAsta?= =?UTF-8?q?tefulset=20yaml=E6=96=B9=E5=BC=8F=E6=9B=B4=E6=96=B0statefulset?= =?UTF-8?q?=20=E8=8E=B7=E5=8F=96statefulset=E5=88=97=E8=A1=A8=20=E8=8E=B7?= =?UTF-8?q?=E5=8F=96statefulSet=E8=AF=A6=E6=83=85=20=E5=88=A0=E9=99=A4stat?= =?UTF-8?q?efulset=20=E6=B7=BB=E5=8A=A0=E6=9C=8D=E5=8A=A1=E8=B7=AF?= =?UTF-8?q?=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/global/statefulset.go | 23 +++ controllers/kubernetes/statefulset.go | 104 ++++++++++- routers/kubernetes/statefulset.go | 26 +++ routers/routers.go | 4 +- service/kubernetes/interface.go | 9 + service/kubernetes/sortFilter.go | 11 ++ service/kubernetes/statefulset.go | 239 ++++++++++++++++++++++---- 7 files changed, 372 insertions(+), 44 deletions(-) create mode 100644 common/global/statefulset.go create mode 100644 routers/kubernetes/statefulset.go diff --git a/common/global/statefulset.go b/common/global/statefulset.go new file mode 100644 index 0000000..657ba41 --- /dev/null +++ b/common/global/statefulset.go @@ -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"` +} diff --git a/controllers/kubernetes/statefulset.go b/controllers/kubernetes/statefulset.go index 71e598c..7b5ed54 100644 --- a/controllers/kubernetes/statefulset.go +++ b/controllers/kubernetes/statefulset.go @@ -1,27 +1,119 @@ -package k8s +package kubernetes +/* +@auth: Meersburg +@source: 云原生运维圈 +@website: https://www.kubesre.com/ +@time: 2024/2/02 +*/ import ( "genbu/common/global" - sk "genbu/service/k8s" + sk "genbu/service/kubernetes" "github.com/gin-gonic/gin" ) -//statefulset列表 +// 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 + 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("获取statefulset列表失败", err) + global.TPLogger.Error("添加参数校验失败", err) global.ReturnContext(ctx).Failed("failed", err.Error()) return } - statefulsetList, err := sk.NewK8sInterface().GetStatefulSetList(cid, parms.namespace) + 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成功") +} diff --git a/routers/kubernetes/statefulset.go b/routers/kubernetes/statefulset.go new file mode 100644 index 0000000..ce37c1c --- /dev/null +++ b/routers/kubernetes/statefulset.go @@ -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 +} diff --git a/routers/routers.go b/routers/routers.go index c1a63ee..e46e2f9 100644 --- a/routers/routers.go +++ b/routers/routers.go @@ -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 { @@ -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", "该接口未开放") diff --git a/service/kubernetes/interface.go b/service/kubernetes/interface.go index f9df1b0..7748f57 100644 --- a/service/kubernetes/interface.go +++ b/service/kubernetes/interface.go @@ -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" ) @@ -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{} diff --git a/service/kubernetes/sortFilter.go b/service/kubernetes/sortFilter.go index 9a27c44..7480327 100644 --- a/service/kubernetes/sortFilter.go +++ b/service/kubernetes/sortFilter.go @@ -8,6 +8,7 @@ package kubernetes import ( + "genbu/common/global" corev1 "k8s.io/api/core/v1" "sort" "strings" @@ -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 diff --git a/service/kubernetes/statefulset.go b/service/kubernetes/statefulset.go index 2be462d..449c3d3 100644 --- a/service/kubernetes/statefulset.go +++ b/service/kubernetes/statefulset.go @@ -1,70 +1,237 @@ -package k8s +package kubernetes +/* +@auth: Meersburg +@source: 云原生运维圈 +@website: https://www.kubesre.com/ +@time: 2024/2/02 +*/ import ( "context" "errors" "genbu/common/global" - "genbu/dao/k8s" "genbu/utils" - v1 "k8s.io/api/apps/v1" + appsv1 "k8s.io/api/apps/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/yaml" "k8s.io/client-go/kubernetes" + "time" ) -/*var Ks ks +//使用yaml创建statefulSet -type ks struct { - ClientSet *kubernetes.Clientset -} +func (k *k8sCluster) CreateStatefulSetYaml(cid, content string) (err error) { + + //获取clientSet所有信息 + clientSetAny, found := global.ClientSetCache.Get(cid) + if !found { + global.TPLogger.Error("当前集群不存在:", err) + return errors.New("当前集群不存在") + } -func (k *ks) Init(cid string) (err error) { - cluster, err := k8s.NewK8sInterface().ActiveK8sCluster(cid) + contentsYaml, err := utils.DecodeBase64(content) if err != nil { - global.TPLogger.Error("获取可用集群信息失败: ", err) - return errors.New("获取可用集群信息失败") + global.TPLogger.Error("base64解码失败", err) + return errors.New("base64解码失败") } - configStr := cluster.Text - decodeConfig, err := utils.DecodeBase64(configStr) + var stateful = &appsv1.StatefulSet{} + + err = yaml.UnmarshalStrict([]byte(contentsYaml), &stateful) if err != nil { - global.TPLogger.Error("集群config文件加载失败: ", err) - return errors.New("集群config文件加载失败") + global.TPLogger.Error("解析文件内容失败", err) + return errors.New("解析文件内容失败") + } + + if stateful.Namespace == "" { + stateful.Namespace = "default" } - k.ClientSet, err = global.NewClientInterface().NewClientSet(decodeConfig) + //获取clientSet + clientSet := clientSetAny.(*kubernetes.Clientset) + // 获取config + var ( + ctx context.Context + cancel context.CancelFunc + ) + ctx, cancel = context.WithTimeout(context.TODO(), time.Second*2) + defer cancel() + _, err = clientSet.AppsV1().StatefulSets(stateful.Namespace).Create(ctx, stateful, metav1.CreateOptions{}) if err != nil { - global.TPLogger.Error("初始化client失败:", err) - return errors.New("初始化client失败") + global.TPLogger.Error("创建statefulSet失败", err) + return errors.New("创建statefulSet失败") } return nil -}*/ +} + +//使用yaml更新statefulSet + +func (k *k8sCluster) UpdateStatefulSetYaml(cid, content string) (err error) { + //获取clientSet所有信息 + clientSetAny, found := global.ClientSetCache.Get(cid) + if !found { + global.TPLogger.Error("当前集群不存在:", err) + return errors.New("当前集群不存在") + } -func (k *k8sCluster) InitClientSet(cid string) (clientSet *kubernetes.Clientset, err error) { - cluster, err := k8s.NewK8sInterface().ActiveK8sCluster(cid) + contentsYaml, err := utils.DecodeBase64(content) if err != nil { - global.TPLogger.Error("获取可用集群信息失败: ", err) - return nil, errors.New("获取可用集群信息失败") + global.TPLogger.Error("base64解码失败", err) + return errors.New("base64解码失败") } - configStr := cluster.Text - decodeConfig, err := utils.DecodeBase64(configStr) + var stateful = &appsv1.StatefulSet{} + + err = yaml.UnmarshalStrict([]byte(contentsYaml), &stateful) if err != nil { - global.TPLogger.Error("集群config文件加载失败: ", err) - return nil, errors.New("集群config文件加载失败") + global.TPLogger.Error("解析文件内容失败", err) + return errors.New("解析文件内容失败") + } + + if stateful.Namespace == "" { + stateful.Namespace = "default" } - clientSet, err = global.NewClientInterface().NewClientSet(decodeConfig) + //获取clientSet + clientSet := clientSetAny.(*kubernetes.Clientset) + // 获取config + var ( + ctx context.Context + cancel context.CancelFunc + ) + ctx, cancel = context.WithTimeout(context.TODO(), time.Second*2) + defer cancel() + _, err = clientSet.AppsV1().StatefulSets(stateful.Namespace).Update(ctx, stateful, metav1.UpdateOptions{}) if err != nil { - global.TPLogger.Error("初始化client失败:", err) - return nil, errors.New("初始化client失败") + global.TPLogger.Error("更新statefulSet失败", err) + return errors.New("更新statefulSet失败") } - return clientSet, nil + return nil } -//获取statefulset列表 -func (k *k8sCluster) GetStatefulSetList(cid, namespace string) (statefulSetList *v1.StatefulSetList, err error) { - clientSet, err := k.InitClientSet(cid) - statefulSetList, err = clientSet.AppsV1().StatefulSets(namespace).List(context.TODO(), metav1.ListOptions{}) +// 获取statefulset列表 +func (k *k8sCluster) GetStatefulSetList(cid, namespace, filterName string, limit, page int) (statefulSetsResp *global.StatusfulSetsResp, err error) { + //获取clientSet所有信息 + clientSetAny, found := global.ClientSetCache.Get(cid) + if !found { + global.TPLogger.Error("当前集群不存在:", err) + return nil, errors.New("当前集群不存在") + } + //获取clientSet + clientSet := clientSetAny.(*kubernetes.Clientset) + // 获取config + var ( + ctx context.Context + cancel context.CancelFunc + ) + ctx, cancel = context.WithTimeout(context.TODO(), time.Second*2) + defer cancel() + //获取statefulSet列表 + statefulSetList, err := clientSet.AppsV1().StatefulSets(namespace).List(ctx, metav1.ListOptions{}) if err != nil { global.TPLogger.Error("获取statefulSet列表失败:", err) return nil, errors.New("获取statefulSet列表失败") } + var result []global.StatefulSetData + for _, item := range statefulSetList.Items { + result = append(result, global.StatefulSetData{ + Name: item.Name, + Namespace: item.Namespace, + CreationTimestamp: item.CreationTimestamp.Time, + Replicas: item.Status.Replicas, + ReadyReplicas: item.Status.ReadyReplicas, + CurrentReplicas: item.Status.CurrentReplicas, + }) + } + + //将result []global.StatefulSetData,放进Dataselector对象中,进行排序 + selectableData := &DataSelector{ + GenericDataList: k.StatefulSetToCells(result), + DataSelect: &DataSelectQuery{ + Filter: &FilterQuery{Name: filterName}, + Paginatite: &PaginateQuery{ + Limit: limit, + Page: page, + }, + }, + } + filtered := selectableData.Filter() + total := len(filtered.GenericDataList) + data := filtered.Sort().Paginate() + //将[]DataCell类型的转换为global.StatefulSetData列表 + statefulSets := k.StatefulSetFromCells(data.GenericDataList) + + return &global.StatusfulSetsResp{ + Items: statefulSets, + Total: total, + }, nil +} + +// 获取statefulSet详情 +func (k *k8sCluster) GetStatefulSetDetail(cid, name, namespace string) (statefulSet *appsv1.StatefulSet, err error) { + //获取clientSet所有信息 + clientSetAny, found := global.ClientSetCache.Get(cid) + if !found { + global.TPLogger.Error("当前集群不存在:", err) + return nil, errors.New("当前集群不存在") + } + //获取clientSet + clientSet := clientSetAny.(*kubernetes.Clientset) + // 获取config + var ( + ctx context.Context + cancel context.CancelFunc + ) + ctx, cancel = context.WithTimeout(context.TODO(), time.Second*2) + defer cancel() + //获取statefulSet详情 + statefulSet, err = clientSet.AppsV1().StatefulSets(namespace).Get(ctx, name, metav1.GetOptions{}) + if err != nil { + global.TPLogger.Error("获取statefulSet详情失败:", err) + return nil, errors.New("获取statefulSet详情失败") + } + //添加元数据信息,默认获取不到 + statefulSet.APIVersion = "apps/v1" + statefulSet.Kind = "StatefulSet" + return statefulSet, err +} + +//删除statefulSet + +func (k *k8sCluster) DeleteStatefulSet(cid, name, namespace string) (err error) { + //获取clientSet所有信息 + clientSetAny, found := global.ClientSetCache.Get(cid) + if !found { + global.TPLogger.Error("当前集群不存在:", err) + return errors.New("当前集群不存在") + } + //获取clientSet + clientSet := clientSetAny.(*kubernetes.Clientset) + // 获取config + var ( + ctx context.Context + cancel context.CancelFunc + ) + ctx, cancel = context.WithTimeout(context.TODO(), time.Second*2) + defer cancel() + //获取statefulSet详情 + err = clientSet.AppsV1().StatefulSets(namespace).Delete(ctx, name, metav1.DeleteOptions{}) + if err != nil { + global.TPLogger.Error("获取statefulSet详情失败:", err) + return errors.New("获取statefulSet详情失败") + } + return nil +} + +func (k *k8sCluster) StatefulSetToCells(std []global.StatefulSetData) []DataCell { + cells := make([]DataCell, len(std)) + for i := range std { + cells[i] = statefulSetCell(std[i]) + } + return cells +} + +func (k *k8sCluster) StatefulSetFromCells(cells []DataCell) []global.StatefulSetData { + statefulSets := make([]global.StatefulSetData, len(cells)) + for i := range cells { + statefulSets[i] = global.StatefulSetData(cells[i].(statefulSetCell)) + } - return statefulSetList, nil + return statefulSets }