Harbor 间通过API实现镜像复制

背景:

通过harbor搭建私有镜像仓库时,往往会设计出 研发镜像仓库--》测试镜像仓库--》产品镜像仓库,甚至更多。那个多镜像间的复制将成了一个必须解决的问题。当然可以通过harbor自带的界面操作即可实现需求,也可以通过harbor提供的API来实现。本文将针对通过jenkins来实现不同harbor间的镜像复制。

材料:

Harbor 镜像仓库A,Harbor镜像仓库B,jenkins(可选)

实现:

1、贴脚本:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import requests
import json
import argparse
import re

# 构造函数传参
parser = argparse.ArgumentParser()
parser.add_argument('--url',type=str,default='http://harbor.com:9090')
parser.add_argument('--user',type=str,default='admin')
parser.add_argument('--pwd',type=str,default='Harbor12345')
parser.add_argument('--taskname',type=str,default='')

#获取harbor登录token
def get_user_token(url):

  user_agent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Mobile Safari/537.36'  

  headers = {"Content-Type":"application/json","Cookie":"sid=a2f1c8cffed832cb42e0d718b6339acb","user-agent":user_agent}

  response = requests.get(url+"/c/log_out", headers = headers)

  cookiejar = response.cookies

  cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
  #获得请求结果中的headers信息
  headers = response.headers
  #获得请求结果中的token
  csrf_token = headers.get('X-Harbor-Csrf-Token')
  #X-Request-Id
  requestId = headers.get('X-Request-Id')
  # 获得csrf
  csrf = cookiedict.get("_gorilla_csrf")
  #整合headers
  headers = {"Cookie":"_gorilla_csrf="+csrf,"X-Harbor-Csrf-Token":csrf_token,"Content-Type":"application/json;charset=UTF-8","user-agent":user_agent}
  #print headers
  return headers;

# 初始化用户登录信息
def login_init_user_tokken(url,username,password):
  headers = get_user_token(url)
  params = {"principal":username,"password":password}
  response = requests.post(url+"/c/login", headers = headers,params = params)
  cookiejar = response.cookies
  cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
  sid = cookiedict.get("sid")
  new_headers = {"Cookie":headers['Cookie']+";sid="+sid,"X-Harbor-Csrf-Token":headers['X-Harbor-Csrf-Token'],"Content-Type":"application/json;charset=UTF-8","user-agent":headers['user-agent']}
  return new_headers

# 执行指定的Harbor任务
def run_copy_task_list(url,headers,taskid):
  #初始化登录
  datas= {"policy_id": taskid}
  response = requests.post(url+"/api/v2.0/replication/executions",json = datas,headers=headers)
  returnstr = json.dumps(response.text)
  return response.status_code


#获取Harbor任务复制列表
def get_copy_task_list(url,username,password,taskname):
  #初始化登录
  headers = login_init_user_tokken(url,username,password)
  #print headers1
  response = requests.get(url+"/api/v2.0/replication/policies?page=1&page_size=10&name="+taskname,headers=headers)
  returndata = response.json()
  sid =returndata[0].get("id")
  print run_copy_task_list(url,headers,int(sid))

# main
def main():
  args = parser.parse_args()

  print get_copy_task_list(str(args.url),str(args.user),str(args.pwd),str(args.taskname))

main()

2、调用脚本:python replicatesManager.py --taskname="你的镜像复制任务名" --url="你的镜像地址" --user="admin" --pwd="Harbor12345" 。注:可通过脚本中默认值来减少调用时变量。

3、解说:harbor API的调用官方提供了2中方式进行鉴权,本脚本采用了其中第二种。鉴权思路:a、通过log_out 接口获得Cookie,X-Harbor-Csrf-Token 这2个变量。

 b、通过login接口获得对应授权后的SID(调用该接口需要在请求头添加cookie,X-Harbor-Csrf-Token)

c、通过/api/v2.0/replication/executions 来实现镜像的复制(需要在Header 头中添加Cookie,X-Harbor-Csrf-Token,要强调的是此时的Cookie需要在原有值的后面添加上登录返回的sid否则授权不能成功)

 d、任何Harbor 的API都可以参考c项来实现调用

Jenkins 中调用:

1、在gitlab 中新增一个项目并将如上脚本添加到其中。

1、jenkins中创建任务并通过shell 来执行脚本即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Golang调用Harbor API删除镜像,可以按照以下步骤进行操作: 1. 导入相关的Golang软件包: ```go import ( "bytes" "net/http" ) ``` 2. 构建HTTP请求: ```go func createRequest(method, url string, payload []byte) (*http.Request, error) { req, err := http.NewRequest(method, url, bytes.NewBuffer(payload)) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/json") return req, nil } ``` 3. 发送HTTP请求并获取响应: ```go func sendRequest(req *http.Request) (*http.Response, error) { client := http.DefaultClient resp, err := client.Do(req) if err != nil { return nil, err } return resp, nil } ``` 4. 构建删除镜像的URL: ```go func buildDeleteURL(baseURL, projectName, repoName, tag string) string { return fmt.Sprintf("%s/api/repositories/%s/%s/tags/%s", baseURL, projectName, repoName, tag) } ``` 5. 执行删除镜像的操作: ```go func deleteImage(baseURL, projectName, repoName, tag, username, password string) error { url := buildDeleteURL(baseURL, projectName, repoName, tag) req, err := createRequest("DELETE", url, nil) if err != nil { return err } req.SetBasicAuth(username, password) resp, err := sendRequest(req) if err != nil { return err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return fmt.Errorf("Failed to delete image. Status code: %d", resp.StatusCode) } return nil } ``` 其中,baseURL是Harbor的URL,projectName是项目名称,repoName是镜像仓库名称,tag是镜像标签,username和password是Harbor API的登录凭证。 通过以上步骤,就可以使用Golang调用Harbor API删除镜像了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值