【GO】 K8s 管理系统项目5[API部分--Node]
2023-09-14 09:02:04 时间
K8s 管理系统项目[API部分–Node]
1. 接口实现
service/dataselector.go
type nodeCell corev1.Node
func(n nodeCell) GetCreation() time.Time {
return n.CreationTimestamp.Time
}
func(n nodeCell) GetName() string {
return n.Name
}
2. Node功能
service/node.go
2.1 重写方法
func (n *node) toCells(std []corev1.Node) []DataCell {
cells := make([]DataCell, len(std))
for i := range std {
cells[i] = nodeCell(std[i])
}
return cells
}
func (n *node) fromCells(cells []DataCell) []corev1.Node {
nodes := make([]corev1.Node, len(cells))
for i := range cells {
nodes[i] = corev1.Node(cells[i].(nodeCell))
}
return nodes
}
2.2 获取node详情
// 获取node详情
func (n *node) GetNodeDetail(nodeName string) (node *corev1.Node, err error) {
node, err = K8s.ClientSet.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
if err != nil {
logger.Error(errors.New("获取Node详情失败, " + err.Error()))
return nil, errors.New("获取Node详情失败, " + err.Error())
}
return node, nil
}
2.3 node完整
package service
import (
"context"
"errors"
"github.com/wonderivan/logger"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
var Node node
type node struct{}
type NodesResp struct {
Items []corev1.Node `json:"items"`
Total int `json:"total"`
}
// 获取node列表,支持过滤、排序、分页
func (n *node) GetNodes(filterName string, limit, page int) (nodesResp *NodesResp, err error) {
//获取nodeList类型的node列表
nodeList, err := K8s.ClientSet.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
if err != nil {
logger.Error(errors.New("获取Node列表失败, " + err.Error()))
return nil, errors.New("获取Node列表失败, " + err.Error())
}
//将nodeList中的node列表(Items),放进dataselector对象中,进行排序
selectableData := &dataSelector{
GenericDataList: n.toCells(nodeList.Items),
DataSelect: &DataSelectQuery{
Filter: &FilterQuery{Name: filterName},
Paginate: &PaginateQuery{
Limit: limit,
Page: page,
},
},
}
filtered := selectableData.Filter()
total := len(filtered.GenericDataList)
data := filtered.Sort().Paginate()
//将[]DataCell类型的node列表转为v1.node列表
nodes := n.fromCells(data.GenericDataList)
return &NodesResp{
Items: nodes,
Total: total,
}, nil
}
// 获取node详情
func (n *node) GetNodeDetail(nodeName string) (node *corev1.Node, err error) {
node, err = K8s.ClientSet.CoreV1().Nodes().Get(context.TODO(), nodeName, metav1.GetOptions{})
if err != nil {
logger.Error(errors.New("获取Node详情失败, " + err.Error()))
return nil, errors.New("获取Node详情失败, " + err.Error())
}
return node, nil
}
func (n *node) toCells(std []corev1.Node) []DataCell {
cells := make([]DataCell, len(std))
for i := range std {
cells[i] = nodeCell(std[i])
}
return cells
}
func (n *node) fromCells(cells []DataCell) []corev1.Node {
nodes := make([]corev1.Node, len(cells))
for i := range cells {
nodes[i] = corev1.Node(cells[i].(nodeCell))
}
return nodes
}
3. 获取Node列表
controller/node.go
package controller
import (
"github.com/gin-gonic/gin"
"github.com/wonderivan/logger"
"k8s-plantform/service"
"net/http"
)
var Node node
type node struct {}
//获取node列表,支持过滤、排序、分页
func(n *node) GetNodes(ctx *gin.Context) {
params := new(struct {
FilterName string `form:"filter_name"`
Page int `form:"page"`
Limit int `form:"limit"`
})
if err := ctx.Bind(params); err != nil {
logger.Error("Bind请求参数失败, " + err.Error())
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
data, err := service.Node.GetNodes(params.FilterName, params.Limit, params.Page)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"msg": "获取Node列表成功",
"data": data,
})
}
//获取node详情
func(n *node) GetNodeDetail(ctx *gin.Context) {
params := new(struct {
NodeName string `form:"node_name"`
})
if err := ctx.Bind(params); err != nil {
logger.Error("Bind请求参数失败, " + err.Error())
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
data, err := service.Node.GetNodeDetail(params.NodeName)
if err != nil {
ctx.JSON(http.StatusInternalServerError, gin.H{
"msg": err.Error(),
"data": nil,
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"msg": "获取Node详情成功",
"data": data,
})
}
4. 定义路由
controller/router.go
//node操作
GET("/api/k8s/nodes", Node.GetNodes).
GET("/api/k8s/node/detail", Node.GetNodeDetail)
5. 测试Node方法
5.1 获取node节点
/api/k8s/nodes
5.2 获取node节点详情
/api/k8s/node/detail
相关文章
- [Go] Http包 使用简介
- [Go] 数组 和 切片(array、slice)
- Go语言基础之接口
- K8S API调用:使用client-go工具调用kubernetes API接口进行增删改查示例(v1.17.9)
- 【Go】K8s 管理系统项目36[K8s环境–应用部署]
- 【GO】K8s 管理系统项目34[Linux环境–应用部署]
- 【GO】K8s 管理系统项目33[前端部分–登录和登出]
- 【GO】K8s 管理系统项目30[前端部分–ConfigMap]
- 【GO】K8s 管理系统项目25[前端部分–StatefulSet]
- 【GO】K8s 管理系统项目24[前端部分–DaemonSet]
- 【GO】K8s 管理系统项目9[API部分--Secret]
- 【GO】k8s 管理系统项目22[前端部分–工作负载-Deployment]
- 【GO】K8s 管理系统项目13[API部分--Workflow]
- 【GO】 K8s 管理系统项目6[API部分--Namespace]
- [手游项目3]-13-go语言的defer语句
- Go语言精进自学系列 | 使用iota实现枚举常量
- 387集Go语言核心编程培训视频教材整理 | Golang的概述(二)
- 解决kubelet报错:kubelet.go:2183] node “k8s-20-52“ not found
- go读取键盘输入两种方式
- k8s集群外go客户端示例
- Redcon:快速的Redis服务器Go实现
- Go语言 异常panic和恢复recover用法
- Go一个协程实现加法demo