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

news2024/11/23 10:51:19

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

1. 接口实现

service/dataselector.go

// daemonCell
type daemonSetCell appsv1.DaemonSet

func(d daemonSetCell) GetCreation() time.Time {
	return d.CreationTimestamp.Time
}

func(d daemonSetCell) GetName() string {
	return d.Name
}

2. DaemontSet功能

service/daemonset.go

2.1 from和to方法

func (d *daemonSet) toCells(std []appsv1.DaemonSet) []DataCell {
	cells := make([]DataCell, len(std))
	for i := range std {
		cells[i] = daemonSetCell(std[i])
	}
	return cells
}

func (d *daemonSet) fromCells(cells []DataCell) []appsv1.DaemonSet {
	daemonSets := make([]appsv1.DaemonSet, len(cells))
	for i := range cells {
		daemonSets[i] = appsv1.DaemonSet(cells[i].(daemonSetCell))
	}

	return daemonSets
}

2.2 获取daemonset详情

// 获取daemonset详情
func (d *daemonSet) GetDaemonSetDetail(daemonSetName, namespace string) (daemonSet *appsv1.DaemonSet, err error) {
	daemonSet, err = K8s.ClientSet.AppsV1().DaemonSets(namespace).Get(context.TODO(), daemonSetName, metav1.GetOptions{})
	if err != nil {
		logger.Error(errors.New("获取DaemonSet详情失败, " + err.Error()))
		return nil, errors.New("获取DaemonSet详情失败, " + err.Error())
	}

	return daemonSet, nil
}

2.3 删除daemonset

// 删除daemonset
func (d *daemonSet) DeleteDaemonSet(daemonSetName, namespace string) (err error) {
	err = K8s.ClientSet.AppsV1().DaemonSets(namespace).Delete(context.TODO(), daemonSetName, metav1.DeleteOptions{})
	if err != nil {
		logger.Error(errors.New("删除DaemonSet失败, " + err.Error()))
		return errors.New("删除DaemonSet失败, " + err.Error())
	}
	return nil
}

2.4 更新daemonset

// 更新daemonset
func (d *daemonSet) UpdateDaemonSet(namespace, content string) (err error) {
	var daemonSet = &appsv1.DaemonSet{}

	err = json.Unmarshal([]byte(content), daemonSet)
	if err != nil {
		logger.Error(errors.New("反序列化失败, " + err.Error()))
		return errors.New("反序列化失败, " + err.Error())
	}

	_, err = K8s.ClientSet.AppsV1().DaemonSets(namespace).Update(context.TODO(), daemonSet, metav1.UpdateOptions{})
	if err != nil {
		logger.Error(errors.New("更新DaemonSet失败, " + err.Error()))
		return errors.New("更新DaemonSet失败, " + err.Error())
	}
	return nil
}

2.5 整个Daemonset.go

package service

import (
	"context"
	"encoding/json"
	"errors"

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

var DaemonSet daemonSet

type daemonSet struct{}

type DaemonSetsResp struct {
	Items []appsv1.DaemonSet `json:"items"`
	Total int                `json:"total"`
}

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

	return &DaemonSetsResp{
		Items: daemonSets,
		Total: total,
	}, nil
}

// 获取daemonset详情
func (d *daemonSet) GetDaemonSetDetail(daemonSetName, namespace string) (daemonSet *appsv1.DaemonSet, err error) {
	daemonSet, err = K8s.ClientSet.AppsV1().DaemonSets(namespace).Get(context.TODO(), daemonSetName, metav1.GetOptions{})
	if err != nil {
		logger.Error(errors.New("获取DaemonSet详情失败, " + err.Error()))
		return nil, errors.New("获取DaemonSet详情失败, " + err.Error())
	}

	return daemonSet, nil
}

// 删除daemonset
func (d *daemonSet) DeleteDaemonSet(daemonSetName, namespace string) (err error) {
	err = K8s.ClientSet.AppsV1().DaemonSets(namespace).Delete(context.TODO(), daemonSetName, metav1.DeleteOptions{})
	if err != nil {
		logger.Error(errors.New("删除DaemonSet失败, " + err.Error()))
		return errors.New("删除DaemonSet失败, " + err.Error())
	}
	return nil
}

// 更新daemonset
func (d *daemonSet) UpdateDaemonSet(namespace, content string) (err error) {
	var daemonSet = &appsv1.DaemonSet{}

	err = json.Unmarshal([]byte(content), daemonSet)
	if err != nil {
		logger.Error(errors.New("反序列化失败, " + err.Error()))
		return errors.New("反序列化失败, " + err.Error())
	}

	_, err = K8s.ClientSet.AppsV1().DaemonSets(namespace).Update(context.TODO(), daemonSet, metav1.UpdateOptions{})
	if err != nil {
		logger.Error(errors.New("更新DaemonSet失败, " + err.Error()))
		return errors.New("更新DaemonSet失败, " + err.Error())
	}
	return nil
}

func (d *daemonSet) toCells(std []appsv1.DaemonSet) []DataCell {
	cells := make([]DataCell, len(std))
	for i := range std {
		cells[i] = daemonSetCell(std[i])
	}
	return cells
}

func (d *daemonSet) fromCells(cells []DataCell) []appsv1.DaemonSet {
	daemonSets := make([]appsv1.DaemonSet, len(cells))
	for i := range cells {
		daemonSets[i] = appsv1.DaemonSet(cells[i].(daemonSetCell))
	}

	return daemonSets
}

3. 获取DaemonSet列表

controller/daemonset.go

package controller

import (
	"github.com/gin-gonic/gin"
	"github.com/wonderivan/logger"
	"k8s-plantform/service"
	"net/http"
)

var DaemonSet daemonSet

type daemonSet struct {}
//获取daemonset列表,支持过滤、排序、分页
func(d *daemonSet) GetDaemonSets(ctx *gin.Context) {
	params := new(struct {
		FilterName  string `form:"filter_name"`
		Namespace   string `form:"namespace"`
		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.DaemonSet.GetDaemonSets(params.FilterName, params.Namespace, 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": "获取DaemonSet列表成功",
		"data": data,
	})
}

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

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

//删除daemonset
func(d *daemonSet) DeleteDaemonSet(ctx *gin.Context) {
	params := new(struct{
		DaemonSetName   string  `json:"daemonset_name"`
		Namespace       string  `json:"namespace"`
	})
	//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.DaemonSet.DeleteDaemonSet(params.DaemonSetName, params.Namespace)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": "删除DaemonSet成功",
		"data": nil,
	})
}

//更新daemonset
func(d *daemonSet) UpdateDaemonSet(ctx *gin.Context) {
	params := new(struct{
		Namespace       string  `json:"namespace"`
		Content         string  `json:"content"`
	})
	//PUT请求,绑定参数方法改为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.DaemonSet.UpdateDaemonSet(params.Namespace, params.Content)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": "更新DaemonSet成功",
		"data": nil,
	})
}

4. 定义路由

controller/router.go

		//daemonset操作
		GET("/api/k8s/daemonsets", DaemonSet.GetDaemonSets).
		GET("/api/k8s/daemonset/detail", DaemonSet.GetDaemonSetDetail).
		DELETE("/api/k8s/daemonset/del", DaemonSet.DeleteDaemonSet).
		PUT("/api/k8s/daemonset/update", DaemonSet.UpdateDaemonSet)

5. 测试Daemonset方法

5.1 获取Daemonset

/api/k8s/daemonsets

请添加图片描述

5.2 获取Daemonset详情

/api/k8s/daemonset/detail

请添加图片描述

5.3 删除Daemonset

/api/k8s/daemonset/del
root@master-01:~# kubectl get daemonsets.apps -n k8s
NAME                    DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
fluentd-elasticsearch   3         3         0       3            0           <none>          10s

请添加图片描述

root@master-01:~# kubectl get daemonsets.apps -n k8s
No resources found in k8s namespace.

5.4 更新Daemonset

/api/k8s/daemonset/update

这个结合前端一起测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/102712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高性能的Java IDE——IntelliJ IDEA v2022.3全新发布

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 I…

怎样在电脑上录制ppt课件?如何录制课件讲解视频

怎样在电脑上录制ppt课件&#xff1f;在当前的环境下&#xff0c;大部分学生都是在家进行上网课&#xff0c;本文就给大家分享几款非常简单实用的录制教学视频的工具。 一、PPT录屏 在windows系统中有个常用软件就是ppt&#xff0c;ppt也能够录屏&#xff0c;只是我们大家都忽…

postgresql数据库流复制

primary和standby在同一服务器的不同目录下。 primary: /var/postgre/data standby: /var/postgre/data1 1. 加账号 (也可以使用postgres账号) [postgresv-vlxsz-devdb01 data]$ psql psql (14.1) Type "help" for help. postgres# create role replica with r…

自动化制药设备中PLC如何进行远程监控?有何应用场景

随着科学技术水平的不断提高&#xff0c;制药设备也逐步走向自动化。自动化制药设备实现到精确的位置定位&#xff0c;实时的过程监控&#xff0c;快速的网络通讯&#xff0c;在到现场的每个动作的执行&#xff0c;具备高效率的生产特点。PLC作为现在工业设备控制系统的核心&am…

php-fpm 的状态查看和php-fpm 调优随笔

php-fpm status 配置 1. 找到php-fpm的配置文件&#xff0c;将 pm.status_path /status 注释去掉 重启php-fpm 2. 在nginx 中配置一个server块或者配置一个location 3. 最后通过curl 或者 http 请求可以看到php-fpm 的状态 可以带着参数访问&#xff0c;json、xml、html fu…

Android -- 每日一问:在项目中使用AsyncTask会有什么问题吗?

经典回答 那我们考查 AsyncTask 会问些什么呢&#xff1f;得先问问会不会用吧&#xff0c;看看知不知道有 onProgressUpdate 方法。 其次问一下是怎么理解 AsyncTask 的机制&#xff0c;有没有看过它的源代码&#xff1f; 这个问题主要看对方是否对 Android 的东西有好奇心&am…

夜天之书 #69 企业开源该选什么软件许可证?

开源软件和自由软件的概念与其许可证紧密绑定。通常&#xff0c;开源软件被定义为使用 OSI 认可的&#xff0c;即符合开源定义[1]的许可证来分发的软件&#xff0c;而自由软件被定义成使用 GPL 或说 Copyleft 式许可证分发的软件。尽管今天人们最关心的可能是软件的生产过程即如…

通过展开序列ISTA(SISTA)算法创建的递归神经网络(RNN)(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 递归神经网络&#xff08;recursive neural network&#xff09;是具有树状阶层结构且网络节点按其连接顺序对输入信息进行递归…

element表格去除border边框同时有竖直方向的边框

为什么要去除boder边框&#xff0c;原因是boder的边框与页面的背景色相同&#xff0c;然后显得表格内凹了一个像素 要实现的需求是表格去除border边框同时添加竖直方向的边框 但是如果不添加boder属性&#xff0c;表格则没有竖直方向的边框 这种下无内凹&#xff0c;但是显得…

ICV:上半年全球市场规模达20.4亿美元,超声波雷达仍具有竞争力!

全球前沿科技咨询机构ICV近期发布了全球车载超声波雷达的市场分析报告。ICV在报告中指出&#xff0c;在当前的自动驾驶发展阶段&#xff0c;超声波雷达在一众传感器中仍具有较强竞争力&#xff0c;其中APA类型超声波雷达的渗透率上升空间很大。2022年上半年中国的超声波雷达市场…

kettle - get请求

文章目录前言kettle - get请求前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊!!! kettle - get请…

学Python爬虫好找工作吗?要学到什么程度?

Python的火爆&#xff0c;同时也带动了Python爬虫岗位的的极大需求。可能有些人想问了&#xff0c;学Python爬虫真的好找工作吗&#xff1f;要学到什么程度&#xff1f;根据各大招聘网站的数据反馈&#xff0c;目前市场上对Python爬虫工程师的需求比较大。但是这并不意味着学习…

【Redis技术专题】「高可用技术基础」一同分析一下Redis高可用的“基石”之主从架构的本质原理解析

&#x1f4d5;技术箴言 当心中有更高的山峰去攀登&#xff0c;就不会在意脚下的泥沼。 &#x1f4d5;前提概要 Redis高可用的方案包括&#xff1a;持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群&#xff08;Cluster&#xff09;。 &#x1f4d5;&#x1f…

分布式注册服务中心etcd在云原生引擎中的实践

作者&#xff1a;王雷 etcd是什么 etcd是云原生架构中重要的基础组件&#xff0c;由CNCF孵化托管。ETCD是用于共享配置和服务发现的分布式&#xff0c;一致性的KV存储系统&#xff0c;是CoreOS公司发起的一个开源项目&#xff0c;授权协议为Apache。etcd 基于Go语言实现&…

vivo 推荐业务 x DeepRec:全链路优化实践

作者&#xff1a; vivo - 人工智能推荐团队&#xff1a;何鑫、李恒、周健、黄金宝 背景 vivo 人工智能推荐算法团队在深耕业务同时&#xff0c;也在积极探索适用于搜索/广告/推荐大规模性稀疏性算法训练框架。分别探索了 tensornet/XDL/tfra 等框架及组件&#xff0c;这些框…

docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例

在上一篇&#xff0c;学会了3主3从的Redis集群搭建。那么接下来&#xff0c;我们就来学习Redis集群主从容错切换迁移案例 本次案例从模拟两个场景 1&#xff1a;数据读写存储 a&#xff1a;一个新key数据来了&#xff0c;是否会按照预设的进入槽中&#xff1f;集群是否生效 …

黄病毒蛋白酶底物,113866-14-1,Boc-GRR-AMC

Boc-GRR-AMC被拟南芥的II型半胱氨酸蛋白酶Atmc4和Atmc9切割。Boc GRR AMC的储备溶液最好在DMSO中制备。 A substrate for flavivirus proteases such as West Nile virus protease, yellow fever virus NS3 protease, and dengue virus NS2B-NS3 protease.Boc-GRR-AMC is cleav…

JSP ssh排放登记管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 排放登记管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

抗疫逆行者网页作业 感动人物HTML网页代码成品 网页作业带JS下拉菜单 最美逆行者网页模板 致敬疫情感动人物网页设计制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

洛谷P1319 压缩技术

压缩技术 题目描述 设某汉字由 NNN \times NNN 的 0\texttt 00 和 1\texttt 11 的点阵图案组成。 我们依照以下规则生成压缩码。连续一组数值&#xff1a;从汉字点阵图案的第一行第一个符号开始计算&#xff0c;按书写顺序从左到右&#xff0c;由上至下。第一个数表示连续有…