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

K8s 管理系统项目[API部分–Namespace]

1. 接口实现

service/dataselector.go

type namespaceCell corev1.Namespace

func(n namespaceCell) GetCreation() time.Time {
    
    
	return n.CreationTimestamp.Time
}

func(n namespaceCell) GetName() string {
    
    
	return n.Name
}

2. Namespace功能

service/namespace.go

2.1 重写方法

func (n *namespace) toCells(std []corev1.Namespace) []DataCell {
    
    
	cells := make([]DataCell, len(std))
	for i := range std {
    
    
		cells[i] = namespaceCell(std[i])
	}
	return cells
}

func (n *namespace) fromCells(cells []DataCell) []corev1.Namespace {
    
    
	namespaces := make([]corev1.Namespace, len(cells))
	for i := range cells {
    
    
		namespaces[i] = corev1.Namespace(cells[i].(namespaceCell))
	}

	return namespaces
}

2.1 获取Namespace详情

// 获取namespace详情
func (n *namespace) GetNamespaceDetail(namespaceName string) (namespace *corev1.Namespace, err error) {
    
    
	namespace, err = K8s.ClientSet.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{
    
    })
	if err != nil {
    
    
		logger.Error(errors.New("获取Namespace详情失败, " + err.Error()))
		return nil, errors.New("获取Namespace详情失败, " + err.Error())
	}

	return namespace, nil
}

2.2 删除Namespace

// 删除namespace
func (n *namespace) DeleteNamespace(namespaceName string) (err error) {
    
    
	err = K8s.ClientSet.CoreV1().Namespaces().Delete(context.TODO(), namespaceName, metav1.DeleteOptions{
    
    })
	if err != nil {
    
    
		logger.Error(errors.New("删除Namespace失败, " + err.Error()))
		return errors.New("删除Namespace失败, " + err.Error())
	}

	return nil
}

2.3 Namespace完整

package service

import (
	"context"
	"errors"

	"github.com/wonderivan/logger"
	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

var Namespace namespace

type namespace struct{
    
    }

type NamespacesResp struct {
    
    
	Items []corev1.Namespace `json:"items"`
	Total int                `json:"total"`
}

// 获取namespace列表,支持过滤、排序、分页
func (n *namespace) GetNamespaces(filterName string, limit, page int) (namespacesResp *NamespacesResp, err error) {
    
    
	//获取namespaceList类型的namespace列表
	namespaceList, err := K8s.ClientSet.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{
    
    })
	if err != nil {
    
    
		logger.Error(errors.New("获取Namespace列表失败, " + err.Error()))
		return nil, errors.New("获取Namespace列表失败, " + err.Error())
	}
	//将namespaceList中的namespace列表(Items),放进dataselector对象中,进行排序
	selectableData := &dataSelector{
    
    
		GenericDataList: n.toCells(namespaceList.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类型的namespace列表转为v1.namespace列表
	namespaces := n.fromCells(data.GenericDataList)

	return &NamespacesResp{
    
    
		Items: namespaces,
		Total: total,
	}, nil
}

// 获取namespace详情
func (n *namespace) GetNamespaceDetail(namespaceName string) (namespace *corev1.Namespace, err error) {
    
    
	namespace, err = K8s.ClientSet.CoreV1().Namespaces().Get(context.TODO(), namespaceName, metav1.GetOptions{
    
    })
	if err != nil {
    
    
		logger.Error(errors.New("获取Namespace详情失败, " + err.Error()))
		return nil, errors.New("获取Namespace详情失败, " + err.Error())
	}

	return namespace, nil
}

// 删除namespace
func (n *namespace) DeleteNamespace(namespaceName string) (err error) {
    
    
	err = K8s.ClientSet.CoreV1().Namespaces().Delete(context.TODO(), namespaceName, metav1.DeleteOptions{
    
    })
	if err != nil {
    
    
		logger.Error(errors.New("删除Namespace失败, " + err.Error()))
		return errors.New("删除Namespace失败, " + err.Error())
	}

	return nil
}

func (n *namespace) toCells(std []corev1.Namespace) []DataCell {
    
    
	cells := make([]DataCell, len(std))
	for i := range std {
    
    
		cells[i] = namespaceCell(std[i])
	}
	return cells
}

func (n *namespace) fromCells(cells []DataCell) []corev1.Namespace {
    
    
	namespaces := make([]corev1.Namespace, len(cells))
	for i := range cells {
    
    
		namespaces[i] = corev1.Namespace(cells[i].(namespaceCell))
	}

	return namespaces
}

3. 获取Namespace列表

controller/namespace.go

package controller

import (
	"k8s-plantform/service"
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/wonderivan/logger"
)

var Namespace namespace

type namespace struct{
    
    }

// 获取namespace列表,支持过滤、排序、分页
func (n *namespace) GetNamespaces(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.Namespace.GetNamespaces(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":  "获取Namespace列表成功",
		"data": data,
	})
}

// 获取namespace详情
func (n *namespace) GetNamespaceDetail(ctx *gin.Context) {
    
    
	params := new(struct {
    
    
		NamespaceName string `form:"namespace_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.Namespace.GetNamespaceDetail(params.NamespaceName)
	if err != nil {
    
    
		ctx.JSON(http.StatusInternalServerError, gin.H{
    
    
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	ctx.JSON(http.StatusOK, gin.H{
    
    
		"msg":  "获取Namespace详情成功",
		"data": data,
	})
}

// 删除namespace
func (n *namespace) DeleteNamespace(ctx *gin.Context) {
    
    
	params := new(struct {
    
    
		NamespaceName string `json:"namespace_name"`
	})
	//DELETE请求,绑定参数方法改为ctx.ShouldBindJSON
	if err := ctx.ShouldBindJSON(params); err != nil {
    
    
		logger.Error("Bind请求参数失败, " + err.Error())
		ctx.JSON(http.StatusInternalServerError, gin.H{
    
    
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}

	err := service.Namespace.DeleteNamespace(params.NamespaceName)
	if err != nil {
    
    
		ctx.JSON(http.StatusInternalServerError, gin.H{
    
    
			"msg":  err.Error(),
			"data": nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
    
    
		"msg":  "删除Namespace成功",
		"data": nil,
	})
}

4. 定义路由

controller/router.go

		//namespace操作
		GET("/api/k8s/namespaces", Namespace.GetNamespaces).
		GET("/api/k8s/namespace/detail", Namespace.GetNamespaceDetail).
		DELETE("/api/k8s/namespace/del", Namespace.DeleteNamespace)

5. 测试Namespace方法

5.1 获取Namespace

/api/k8s/namespaces

请添加图片描述

5.2 获取Namespace详情

/api/k8s/namespace/detail

请添加图片描述

5.3 删除Namespace

/api/k8s/namespace/del
root@master-01:~# kubectl  get ns
NAME              STATUS   AGE
default           Active   3d20h
ingress-nginx     Active   3d17h
k8s               Active   19h
kube-flannel      Active   3d20h
kube-node-lease   Active   3d20h
kube-public       Active   3d20h
kube-system       Active   3d20h
wework            Active   3d17h
root@master-01:~# kubectl get pods -n k8s
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-66b6c48dd5-44scf   1/1     Running   0          18h
nginx-deployment-66b6c48dd5-9gtjt   1/1     Running   0          18h
nginx-deployment-66b6c48dd5-rkww9   1/1     Running   0          18h

请添加图片描述

这里可以看到k8s命名空间连同下面的资源都被一并删除

root@master-01:~# kubectl get pods -n k8s
No resources found in k8s namespace.
root@master-01:~# kubectl get ns
NAME              STATUS   AGE
default           Active   3d20h
ingress-nginx     Active   3d17h
kube-flannel      Active   3d20h
kube-node-lease   Active   3d20h
kube-public       Active   3d20h
kube-system       Active   3d20h
wework            Active   3d17h

猜你喜欢

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