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

news2024/11/18 2:44:44

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

1. 接口实现

service/dataselector.go

type pvCell corev1.PersistentVolume

func(p pvCell) GetCreation() time.Time {
	return p.CreationTimestamp.Time
}

func(p pvCell) GetName() string {
	return p.Name
}

2. Pv功能

service/pv.go

2.1 获取Pv详情

// 获取pv详情
func (p *pv) GetPvDetail(pvName string) (pv *corev1.PersistentVolume, err error) {
	pv, err = K8s.ClientSet.CoreV1().PersistentVolumes().Get(context.TODO(), pvName, metav1.GetOptions{})
	if err != nil {
		logger.Error(errors.New("获取Pv详情失败, " + err.Error()))
		return nil, errors.New("获取Pv详情失败, " + err.Error())
	}

	return pv, nil
}

2.2 删除Pv

// 删除pv
func (p *pv) DeletePv(pvName string) (err error) {
	err = K8s.ClientSet.CoreV1().PersistentVolumes().Delete(context.TODO(), pvName, metav1.DeleteOptions{})
	if err != nil {
		logger.Error(errors.New("删除Pv失败, " + err.Error()))
		return errors.New("删除Pv失败, " + err.Error())
	}

	return nil
}

2.3 pv完整

package service

import (
	"context"
	"errors"

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

var Pv pv

type pv struct{}

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

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

	return &PvsResp{
		Items: pvs,
		Total: total,
	}, nil
}

// 获取pv详情
func (p *pv) GetPvDetail(pvName string) (pv *corev1.PersistentVolume, err error) {
	pv, err = K8s.ClientSet.CoreV1().PersistentVolumes().Get(context.TODO(), pvName, metav1.GetOptions{})
	if err != nil {
		logger.Error(errors.New("获取Pv详情失败, " + err.Error()))
		return nil, errors.New("获取Pv详情失败, " + err.Error())
	}

	return pv, nil
}

// 删除pv
func (p *pv) DeletePv(pvName string) (err error) {
	err = K8s.ClientSet.CoreV1().PersistentVolumes().Delete(context.TODO(), pvName, metav1.DeleteOptions{})
	if err != nil {
		logger.Error(errors.New("删除Pv失败, " + err.Error()))
		return errors.New("删除Pv失败, " + err.Error())
	}

	return nil
}

func (p *pv) toCells(std []corev1.PersistentVolume) []DataCell {
	cells := make([]DataCell, len(std))
	for i := range std {
		cells[i] = pvCell(std[i])
	}
	return cells
}

func (p *pv) fromCells(cells []DataCell) []corev1.PersistentVolume {
	pvs := make([]corev1.PersistentVolume, len(cells))
	for i := range cells {
		pvs[i] = corev1.PersistentVolume(cells[i].(pvCell))
	}

	return pvs
}

3. 获取Pv列表

controller/pv.go

package controller

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

var Pv pv

type pv struct {}
//获取pv列表,支持过滤、排序、分页
func(p *pv) GetPvs(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.Pv.GetPvs(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": "获取Pv列表成功",
		"data": data,
	})
}

//获取pv详情
func(p *pv) GetPvDetail(ctx *gin.Context) {
	params := new(struct {
		PvName    string `form:"pv_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.Pv.GetPvDetail(params.PvName)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}

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

//删除pv
func(p *pv) DeletePv(ctx *gin.Context) {
	params := new(struct{
		PvName   string  `json:"pv_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.Pv.DeletePv(params.PvName)
	if err != nil {
		ctx.JSON(http.StatusInternalServerError, gin.H{
			"msg": err.Error(),
			"data": nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"msg": "删除Pv成功",
		"data": nil,
	})
}

4. 定义路由

controller/router.go

		//pv操作
		GET("/api/k8s/pvs", Pv.GetPvs).
		GET("/api/k8s/pv/detail", Pv.GetPvDetail)

5. 测试Pv方法

5.1 创建PV

先创建一个pv这样方便一会测试

  1. 先准备一个nfs
  2. 测试nfs可以正常被读取
root@master-01:~# showmount -e 192.168.31.109
Export list for 192.168.31.109:
/data/k8s/wework/images *
/data/ehelp             *
/data/k8s               *

yaml文件

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Mi
  accessModes:
  - ReadWriteMany
  nfs:
    server: 192.168.31.109
    path: /data/k8s

创建pv

root@master-01:~# kubectl apply -f pv.yaml 
persistentvolume/nfs-pv created
root@master-01:~# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv   10Mi       RWX            Retain           Available                                   4s

5.2 获取pv

/api/k8s/pvs

请添加图片描述

5.2 获取pv详细信息

/api/k8s/pv/detail

请添加图片描述

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

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

相关文章

沙龙预告|2023 年展望 Web3 Crypto

全长 621 字,预计阅读 3 分钟 作者:MiX 起起落落的2022年即将结束,随着传统金融机构的采用和 Web3 创新的不断深入,加密领域已经成为全球资本和技术创新的重要组成部分。 总结2022,展望2023,这对每一位加…

【数据库与缓存保持一致性】

文章目录1. 方案1先更新数据库,再更新缓存先更新缓存,在更新数据库2. 方案2先更新数据库,在删缓存先删缓存,在更新数据库3. 方案3—如何保证两个操作都能执行成功?重试机制订阅 MySQL binlog1. 方案1 先更新数据库&am…

S7-1200PLC与组态王进行TCP通信的基本方法和步骤

S7-1200PLC与组态王进行TCP通信的基本方法和步骤 如下图所示,打开博途软件,新建一个项目,设置该PLC的IP地址为:192.168.1.102, 如下图所示,在OB1中编写一段简单的启保停程序, 如下图所示,打开Kingview组态王软件,点击文件—新建工程, 新建一个项目,如下图所示…

化工企业安全风险管控数字化解决方案

当前我国化工行业的基础能力缺失问题非常严重。由于一些共性技术的缺失,给以化工行业为代表的关键基础工业的产业安全带来诸多隐患。粗放式发展 带来的环保安全问题,不仅造成了巨大的资源浪费和社会成本的增加,同 时也使整个产业的发展环境恶…

SpringBoot+Vue前后端分离项目搭建

好久没写文章了!!! 企业级项目,开袋即食。扩展、修改起来非常方便 系统基本功能 用户管理:提供用户的相关配置,新增用户后,默认密码为:Pass_123角色管理:对权限与菜单…

基于注解的AOP之切入点表达式的语法和获取连接点的信息以及切入点表达式的重用

基于注解的AOP之切入点表达式的语法和获取连接点的信息以及切入点表达式的重用 1.切入点表达式的语法 ①作用 ②语法细节 用*号代替“权限修饰符”和“返回值”部分表示“权限修饰符”和“返回值”不限 在包名的部分,一个“*”号只能代表包的层次结构中的一层&…

Vue3+TS+Vant3——增删改input和通过双页面进行增删改操作

Vue3TSVant3——增删改input和通过双页面进行增删改操作 两种方案: 第一种点击添加按钮添加一项,缺点:页面过于臃肿,用户体验较差 第二种:分成两种页面进行添加等操作 先说一下第一种,我这里用到了va…

Linux下Qt程序用qBreakpad定位崩溃位置

目录1. 使用qBreakpad1.1. 下载1.2. 编译1.3. 使用2. 使用dump文件2.1. 编译breakpad2.2. 解析dmp文件生成sym文件2.3. 解析dmp可能遇到的问题问题一Qt程序的release版本交付给用户或者测试后,如果出现崩溃,很多时候都比较难重现,如果程序能自…

赛卓电子冲刺科创板上市:计划募资11亿元,股东包括尚颀资本等

12月28日,赛卓电子科技(上海)股份有限公司(下称“赛卓电子”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,赛卓电子计划募资11亿元,将用于车规级芯片研发及产业化项…

高级网络复习——防火墙,OSPF协议,rip协议,三层,DHCP中继知识题解(带答案)

作者简介:一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 简答题 二.选择题 前言 本章讲解讲解防火墙,OSPF协…

java多线程(9):线程状态

1 五大状态 2 线程方法 3 停止线程 不推荐使用JDK提供的 stop()、 destroy()方法。【已废弃】推荐线程自己停止下来建议使用一个标志位进行终止变量 ,当flagfalse,则终止线程运行。package xiong.demo3;public class TestStop implements Runnable{//1.…

从DTCC2022盘点各大厂商如何看待数据库发展趋势

DTCC 2022 已落下帷幕有些时日,回顾大会上的一些分享,尤其是头一天上午几大数据库厂商均在演讲一开始纷纷表达了对数据库发展趋势的看法。从各个厂商的观点来看,对数据库发展趋势基本属于是不谋而合,未来数据库的样子离不开以下这…

MATLAB形态学的基本运算膨胀和腐蚀(开、闭运算)

形态学中两种基本的操作是膨胀和腐蚀,膨胀是指在图像中为其边界添加像素点,而腐蚀是其逆过程。对应的添加和移除像素点数依赖于处理图像结构元素矩阵的大小和形式。 一.膨胀处理 膨胀的运算符为⊕, A用B来膨胀写作A⊕B,MATLAB中提供了预定义…

小程序-小程序框架

目录 一,框架简介 响应的数据绑定 二,视图层 View WXML (html) WXSS 样式 JS 逻辑交互 三,事件 什么是事件 事件的使用方式 四,逻辑层 APP service 1,生命周期 生命周期演示 页面路…

快速排序(Java分治法)

快速排序(Java分治法) 文章目录快速排序(Java分治法)0、 分治策略1、思路步骤2、代码3、复杂度分析3.1 最好情况3.2 最坏情况3.3 平均情况3.4 性能影响因素4、合并排序VS快速排序5、参考0、 分治策略 快速排序是对气泡排序的一种改…

minio下载、安装、Java集成应用

1.下载MinIO 下载链接:https://dl.min.io/server/minio/release/windows-amd64/minio.exe 网盘:https://pan.baidu.com/s/1uS2ii958tTjnb0KTpsKpCg 提取码:3nr9 2.安装启动 下载好的文件不要双击,自己定义一个文件夹放下载好的文件,本文指定的位置D:\minio,同时创建一…

淮北绿金通过港交所上市聆讯:净利润再度下滑,收入依赖股东

12月27日,港交所披露的信息显示,淮北绿金产业投资股份有限公司(下称“淮北绿金”)通过港交所上市聆讯并递交了聆讯后招股书,光大证券国际为其独家保荐人。据了解,淮北绿金曾于2021年12月递表,20…

【答学员问】网站换ip后遇到的问题排查思路

文章目录遇到问题先进行基本的问题排查1. 查看IP2. 是否能通网3. 关闭防火墙和selinux4. 使用windows的浏览器访问问题复现1. 安装好wordpress ,确保能够访问2. 修改IP,进行测试3. 访问测试:问题排查问题解决方案遇到问题 学员反馈在家访问网…

C++类和对象1:类是什么?对象是什么?

目录 类的引入 类的定义 类的定义规则 类域问题: 类的访问限定符及封装 访问限定符 封装 类的实例化 类对象的大小问题 this指针 This指针的一些特性: 类的引入 在学习C语言的时候,C语言是面向过程的,关注的是过程&#xff…

2023年5月北京老博会,医养家具展,护理床展,老年护理展

2023中国国际养老服务业博览会CISSE介绍: 2023中国国际养老服务业博览会(CISSE)将于5月5-7日在北京国家会议中心举行。大会以养老产业为主题,通过展贸平台为涉老企业抢占市场先机,对企业营销策略、宣传影响力、定位产品…