【GO】K8s 管理系统项目9[API部分--Secret]
K8s 管理系统项目[API部分–Secret]
1. 接口实现
service/dataselector.go
// secret
type secretCell corev1.Secretfunc (s secretCell) GetCreation() time.Time {return s.CreationTimestamp.Time
}func (s secretCell) GetName() string {return s.Name
}
2. Secret功能
service/secret.go
package serviceimport ("context""encoding/json""errors""github.com/wonderivan/logger"corev1 "k8s.io/api/core/v1"metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)var Secret secrettype secret struct{}type SecretsResp struct {Items []corev1.Secret `json:"items"`Total int `json:"total"`
}// 获取secret列表,支持过滤、排序、分页
func (s *secret) GetSecrets(filterName, namespace string, limit, page int) (secretsResp *SecretsResp, err error) {//获取secretList类型的secret列表secretList, err := K8s.ClientSet.CoreV1().Secrets(namespace).List(context.TODO(), metav1.ListOptions{})if err != nil {logger.Error(errors.New("获取Secret列表失败, " + err.Error()))return nil, errors.New("获取Secret列表失败, " + err.Error())}//将secretList中的secret列表(Items),放进dataselector对象中,进行排序selectableData := &dataSelector{GenericDataList: s.toCells(secretList.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类型的secret列表转为v1.secret列表secrets := s.fromCells(data.GenericDataList)return &SecretsResp{Items: secrets,Total: total,}, nil
}// 获取secret详情
func (s *secret) GetSecretDetail(secretName, namespace string) (secret *corev1.Secret, err error) {secret, err = K8s.ClientSet.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, metav1.GetOptions{})if err != nil {logger.Error(errors.New("获取Secret详情失败, " + err.Error()))return nil, errors.New("获取Secret详情失败, " + err.Error())}return secret, nil
}// 删除secret
func (s *secret) DeleteSecret(secretName, namespace string) (err error) {err = K8s.ClientSet.CoreV1().Secrets(namespace).Delete(context.TODO(), secretName, metav1.DeleteOptions{})if err != nil {logger.Error(errors.New("删除Secret失败, " + err.Error()))return errors.New("删除Secret失败, " + err.Error())}return nil
}// 更新secret
func (s *secret) UpdateSecret(namespace, content string) (err error) {var secret = &corev1.Secret{}err = json.Unmarshal([]byte(content), secret)if err != nil {logger.Error(errors.New("反序列化失败, " + err.Error()))return errors.New("反序列化失败, " + err.Error())}_, err = K8s.ClientSet.CoreV1().Secrets(namespace).Update(context.TODO(), secret, metav1.UpdateOptions{})if err != nil {logger.Error(errors.New("更新Secret失败, " + err.Error()))return errors.New("更新Secret失败, " + err.Error())}return nil
}func (s *secret) toCells(std []corev1.Secret) []DataCell {cells := make([]DataCell, len(std))for i := range std {cells[i] = secretCell(std[i])}return cells
}func (s *secret) fromCells(cells []DataCell) []corev1.Secret {secrets := make([]corev1.Secret, len(cells))for i := range cells {secrets[i] = corev1.Secret(cells[i].(secretCell))}return secrets
}
3. 获取Secret列表
controller/secret.go
package controllerimport ("k8s-plantform/service""net/http""github.com/gin-gonic/gin""github.com/wonderivan/logger"
)var Secret secrettype secret struct{}// 获取secret列表,支持过滤、排序、分页
func (s *secret) GetSecrets(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.Secret.GetSecrets(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": "获取Secret列表成功","data": data,})
}// 获取secret详情
func (s *secret) GetSecretDetail(ctx *gin.Context) {params := new(struct {SecretName string `form:"secret_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.Secret.GetSecretDetail(params.SecretName, params.Namespace)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error(),"data": nil,})return}ctx.JSON(http.StatusOK, gin.H{"msg": "获取Secret详情成功","data": data,})
}// 删除secret
func (s *secret) DeleteSecret(ctx *gin.Context) {params := new(struct {SecretName string `json:"secret_name"`Namespace string `json:"namespace"`})//DELETE请求,绑定参数方法改为ctx.ShouldBindJSONif 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.Secret.DeleteSecret(params.SecretName, params.Namespace)if err != nil {ctx.JSON(http.StatusInternalServerError, gin.H{"msg": err.Error(),"data": nil,})return}ctx.JSON(http.StatusOK, gin.H{"msg": "删除Secret成功","data": nil,})
}// 更新secret
func (s *secret) UpdateSecret(ctx *gin.Context) {params := new(struct {Namespace string `json:"namespace"`Content string `json:"content"`})//PUT请求,绑定参数方法改为ctx.ShouldBindJSONif 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.Secret.UpdateSecret(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": "更新Secret成功","data": nil,})
}
4. 定义路由
controller/router.go
// secretGET("/api/k8s/secrets", Secret.GetSecrets).GET("/api/k8s/secret/detail", Secret.GetSecretDetail).DELETE("/api/k8s/secret/del", Secret.DeleteSecret).PUT("/api/k8s/secret/update", Secret.UpdateSecret)
5. 测试Secret方法
5.1 获取Secrets

5.2 获取Secret详情

其余等做好前端一起测试
相关文章:
【GO】K8s 管理系统项目9[API部分--Secret]
K8s 管理系统项目[API部分–Secret] 1. 接口实现 service/dataselector.go // secret type secretCell corev1.Secretfunc (s secretCell) GetCreation() time.Time {return s.CreationTimestamp.Time }func (s secretCell) GetName() string {return s.Name }2. Secret功能…...
ESP32 Arduino EspNow点对点双向通讯
ESP32 Arduino EspNow点对点双向通讯✨本案例分别采用esp32和esp32C3之间点对点单播无线通讯方式。 🌿esp32开发板 🌾esp32c3开发板 🔧所需库(需要自行导入到Arduino IDE library文件夹中,无法在IDE 管理库界面搜索下载到该库)&am…...
Linux SID 开发指南
Linux SID 开发指南 1 前言 1.1 编写目的 介绍Linux 内核中基于Sunxi 硬件平台的SID 模块驱动的详细设计,为软件编码和维护提供基 础。 1.2 适用范围 内核版本Linux-5.4, Linux-4.9 的平台。 1.3 相关人员 SID 驱动、Efuse 驱动、Sysinfo 驱动的维护、应用开…...
Matlab进阶绘图第2期—线型热图
线型热图由共享X轴的多条渐变直线组成,其颜色表示某一特征值。 与传统热图相比,线型热图适应于X轴数据远多于Y轴(条数)的情况,可以很好地对不同组数据间的分布情况进行比较,也因此可以在一些期刊中看到它的…...
【Redis中bigkey你了解吗?bigkey的危害?】
一.Redis中bigkey你了解吗?bigkey的危害? 如果面试官问到了这个问题,不必惊慌,接下来我们从什么是bigkey?bigkey划分的类型?bigkey危害之处? 二.什么是bigkey?会有什么影响ÿ…...
C++回顾(一)——从C到C++
前言 在学习了C语言的基础上,C到底和C有什么区别呢? 1.1 第一个C程序 #include <iostream>// 使用名为std的命名空间 using namespace std;int main() {// printf ("hello world\n");// cout 标准输出 往屏幕打印内容 相当于C语言的…...
CRF条件随机场 | 关键原理+面试知识点
😄 CRF之前跟人生导师:李航学习过,这里结合自己的理解,精简一波CRF,总结一下面试中高频出现的要点。个人觉得没网上说的那么复杂,我看网上很大部分都是一长篇先举个例子,然后再说原理。没必要原理其实不难,直接从原理下手更好理解。 文章目录 1、概率无向图(马尔可夫…...
秒懂算法 | 回归算法中的贝叶斯
在本文中,我们会用概率的观点来看待机器学习模型,用简单的例子帮助大家理解判别式模型和生成式模型的区别。通过思考曲线拟合的问题,发现习以为常的损失函数和正则化项背后有着深刻的意义 01、快速理解判别式模型和生成式模型 从概率的角度来理解数据有着两个不同的角度,假…...
用Netty实现物联网01:XML-RPC和JSON-RPC
最近十年,物联网和云计算、人工智能等技术一道,受到业内各方追捧,被炒得火热,甚至还诞生了AIoT这样的技术概念。和(移动)互联网不同,物联网针对的主要是一些资源有限的硬件设备,比如监控探头、烟雾感应器、温湿度感应器、车载OBD诊断器、智能电表、智能血压计等。这些硬…...
腾讯云服务器centos7安装python3.7+,解决ssl问题
使用requests模块访问百度,报错如下: requests.exceptions.SSLError: HTTPSConnectionPool(hostwww.baidu.com, port443): Max retries exceeded with url: / (Caused by SSLError("Cant connect to HTTPS URL because the SSL module is not avail…...
C++【模板STL简介】
文章目录C模板&&STL初阶一、泛型编程二、函数模板2.1.函数模板概念2.2.函数模板格式2.3.函数模板的实例化2.4.模板参数的匹配原则三、 类模板3.1.模板的定义格式3.2.类模板的实例化STL简介一、STL的概念、组成及缺陷二、STL的版本C模板&&STL初阶 一、泛型编程…...
该学会是自己找bug了(vs调试技巧)
前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言初阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍c语言初阶的最后一篇.有关调试的重要性. 金句分享…...
Redis大全(概念与下载安装)
目录 一、概念 1.非关系型数据库(NoSQL)的介绍 2.什么是redis 3.redis的作者 4.Redis的特点 5.redis的应用场景 6.高度概括知识 一、二 缓存穿透、缓存击穿、缓存雪崩的概念 (一)缓存穿透 (二)缓…...
指针的进阶【上篇】
文章目录📀1.字符指针📀2.指针数组📀3.数组指针💿3.1.数组指针的定义💿3.2. &数组名VS数组名💿3.3.数组指针的使用📀1.字符指针 int main() {char ch w;char* pc &ch;// pc就是字符指…...
MATLAB | 如何用MATLAB绘制花里胡哨的山脊图
本期推送教大家如何绘制各种样式的山脊图,这里做了一个工具函数用来实现好看的山脊图的绘制,编写不易请多多点赞,大体绘制效果如下: 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中,…...
.Net与程序集
一个简单的C#程序回想一下我们第一个.net 程序 hello world,它具有那些步骤呢?打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来,上面打印着hello world。我们打开文件夹的bin目录,会发现里…...
软考中级之数据库系统(重点)
涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...
界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!
DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序,该套件附带功能齐…...
【架构师】零基础到精通——网关策略
博客昵称:架构师Cool 最喜欢的座右铭:一以贯之的努力,不得懈怠的人生。 作者简介:一名退役Coder,软件设计师/鸿蒙高级工程师认证,在备战高级架构师/系统分析师,欢迎关注小弟! 博主小…...
【java 8】方法引用与构造器引用
📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言Ὅ…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
