Go语言搬砖 harbor-api调用

3,619 阅读4分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

image.png

需求例子🚊

解决每增加一个项目,就新增一个用户,需要手动去harbor创建用户,这是因为前期在设计kubernetes项目部署时,做了项目隔离,每个项目都有属于自已的namespace和user

类似的例子还有比如自动清理镜像,自动新建项目等等

为了完善自动化流程,调用harbor api完成相应的功能是必不可少的了

安装

官方提供了一键安装脚本,分为离线和在线两种方式,对于访问docker hub比较慢的建议使用离线方式

离线包: github.com/goharbor/ha…

在线包: github.com/goharbor/ha…

下载后解压包

tar xzvf harbor-offline-installer-v2.3.1.tgz
tar xzvf harbor-online-installer-v2.3.1.tgz

运行一键安装脚本

cd harbor-offline-installer
./install.sh

访问服务器IP,harbor默认账密admin和Harbor12345

harbor api🚩

harbor要身已经提供了api接口,还集成了swagger文档,点击左下角的Harbot Api V2打开

image.png

页面直接可以看需要提供的参数和返回值 image.png

用户查询接口例子

  • 参数: 提供一个string类型的username, 分页大小和页码选填
  • 返回值: 返回string类型的username,以及int类型的user_id

使用 点击页面右边的 Try it out 按扭, 然后在输入框填入值,点击Execute运行 得到结果

image.png

api例子⛔

因为这里直接使用的api 是官方提供的,且是域名带路径参数的方式,所以使用curl 命令是直接可以调用, 因此完全可以集成的到shell脚本里面。

创建用户⬆️

curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users" -d @user.json

user.json

{
  "user_id": 5,
  "username": "zhangsan",
  "email": "zhangsan@qq.com",
  "password": "Zs20210802",
  "realname": "zhangsan",
  "role_id": 2
}

获取用户信息⬆️

curl -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users"

删除用户⬆️

curl -u "admin:Harbor12345" -X DELETE  -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users/{user_id}"

修改用户密码⬆️

curl -u "admin:Harbor12345" -X PUT -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users/{user_id}/password" -d @uppwd.json
# cat uppwd.json
{
  "old_password": "Harbor6666",
  "new_password": "Harbor8888"
}

harbor sdk🚩

上面虽然使用cur命令可以调用api,也可以方便集成到shell脚本里面,但是我们整个devops是项目化的,自动化的流程使用golang语言使用的项目,所以需要使用golang实现

接下分享2个第三方的harbor sdk的测试结果,最终goharbor-client能够满足增删改查需要,而go-harbor没有增改功能

go sdk❤️

目前在github找到2种go sdk包 github.com/mittwald/go… github.com/TimeBye/go-… go-harbor 实现了 Projects  Repositories  Artifacts 三组api功能,其他还未实现

image.png

goharbor-client 说明文档中不够详细,只简单的说了支持curd操作,具体如何还需要自已调用测试

image.png

那么现在 把这2个包都调用测一测

go-harbor1️⃣

使用 1️

现在项目都使用go mod来管理包,所有直接import 同步一下既可

import "github.com/TimeBye/go-harbor"

现在调一下各api看看

  • 文档说没有实现user对应api,其实是有的
  • 已实现的api目前都只支持3种方法类型Get,List,Delete 没有创建和更新功能
harborClient, err := harbor.NewClientSet("https://harbor-test.xxxxx.org", "username", "password")
if err != nil {
   panic(err)
}
query := model.Query{}

//用户
fmt.Println(harborClient.User.Get("1"))
fmt.Println(harborClient.User.List(&query))
fmt.Println(harborClient.User.Delete("6"))

//仓库
fmt.Println(harborClient.V2.Repositories("bitsensor").Get("elastalert"))
fmt.Println(harborClient.V2.Repositories("cloudos").List(&query))
fmt.Println(harborClient.V2.Repositories("cloudos").Delete("cloudos-next-allinone"))

//项目
fmt.Println(harborClient.V2.Get("15"))
fmt.Println(harborClient.V2.List(&query))
fmt.Println(harborClient.V2.Delete("11"))

//制品
fmt.Println(harborClient.V2.Repositories("appsmith").Artifacts("appsmith-editor").List(&query))
fmt.Println(harborClient.V2.Repositories("appsmith").Artifacts("appsmith-editor").Get("latest"))
fmt.Println(harborClient.V2.Repositories("appsmith").Artifacts("appsmith-editor").Delete("latest"))

运行后部分结果✴️

image.png 目前来看,该项目只能留待观察,毕竟现在没有我们需要的功能

goharbor-client2️⃣

这个项目有v1和v2版本,因为我们的harbor是2.x的,支持v2版本,这里直接import v2版本的包

import "github.com/mittwald/goharbor-client/v4/apiv2"

因该项目没有文档(因为是按照官方的swagger ui来的),所以只能自行摸索,但是创建了客户端之后发现 该项目语义化非常好,各功能非常好找

看图 image.png

image.png

在创建client时需要传入的url要带上api

harborClient, err := apiv2.NewRESTClientForHost("https://harbor-test.xxxxx.org/api/", "admin", "Harbor12345")
if err != nil {
   log.Println("连接harbor错误",err)
}

创建用户,仓库,项目例子

下面运行成功的例子✴️

harborClient, err := apiv2.NewRESTClientForHost("https://harbor-test.xxxxx.org/api/", "admin", "Harbor12345")
if err != nil {
   log.Println("连接harbor错误",err)
}

//新建用户
result, err := harborClient.NewUser(context.TODO(),"zhangsan3","zhangsan3@qq.com","zhangsan3","Zs20210803","")
if err != nil {
   log.Println("创建用户错误",err)
}
fmt.Println(result)

//新建项目
var storageLimit int64 = 10
result2, err := harborClient.NewProject(context.TODO(),"zhangsan3",&storageLimit)
if err != nil {
   log.Println("创建项目错误",err)
}
fmt.Println(result2)

//新建仓库
legacyModel := legacymodel.RegistryCredential{
   AccessKey: "",
   AccessSecret : "",
   Type: "",
}
result3,err := harborClient.NewRegistry(context.TODO(),"zhangsan3","helm-hub","http://ip:9000",&legacyModel,false)
if err != nil {
   log.Println("创建仓库错误",err)
}
fmt.Println(result3)

返回结果,虽然创建返回报错了,但在界面上可以看到刚刚创建的项目

image.png

image.png

以创建来看,这项目已经能够满足我们的需要求,至于其他的接口,本文就不一一贴出来了,有兴趣的同事自行测试一下既可