【GO】 K8s 管理系统项目[API部分--Node]

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

请添加图片描述

猜你喜欢

转载自blog.csdn.net/qq_29974229/article/details/128409759