Harbor 鏡像回收流程
Harbor 鏡像回收分兩部分:python
-
一、刪除鏡像 TAG -
二、執行垃圾清理
早期 Harbor 1.0 版本時,刪除鏡像TAG
能夠經過UI界面手動一個個選取刪除,也能夠調用官方提供的SDK
刪除(很早之前官方不維護了)。後來官方在 1.9
版本提供TAG保留策略
,解決之前鏡像Tag回收麻煩的問題。git
TAG保留策略
有哪些策略,以下圖:github
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
Harbor Python SDK
做者寫了一個 Python SDK
方法,錦上添花吧!web
代碼項目地址
:https://github.com/yangpeng14/harbor_sdk_v2.0面試
注意:Harbor v2.0+ 和 Harbor v1 版本 API調用方式發生很大的改變。安全方面:修復
跨域攻擊問題
,API登錄Harbor方法也發現變化。數據庫
#!/usr/bin/env python3
# -*- coding=utf8 -*-
import logging
import requests
logging.basicConfig(level=logging.INFO)
class HarborClient(object):
def __init__(self, host, user, password, protocol="http"):
self.host = host
self.user = user
self.password = password
self.protocol = protocol
# 第一次get請求,獲取 cookie 信息
self.cookies, self.headers = self.get_cookie()
# 獲取登錄成功 session
self.session_id = self.login()
# 把登錄成功的 sid值 替換 get_cookie 方法中 cookie sid值,用於 delete 操做
self.cookies_new = self.cookies
self.cookies_new.update({'sid': self.session_id})
# def __del__(self):
# self.logout()
def get_cookie(self):
response = requests.get("{0}://{1}/c/login".format(self.protocol, self.host))
csrf_cookie = response.cookies.get_dict()
headers = {'X-Harbor-CSRF-Token': csrf_cookie['__csrf']}
return csrf_cookie, headers
def login(self):
login_data = requests.post('%s://%s/c/login' %
(self.protocol, self.host),
data={'principal': self.user,
'password': self.password}, cookies=self.cookies, headers=self.headers)
if login_data.status_code == 200:
session_id = login_data.cookies.get('sid')
logging.debug("Successfully login, session id: {}".format(
session_id))
return session_id
else:
logging.error("Fail to login, please try again")
return None
def logout(self):
requests.get('%s://%s/c/logout' % (self.protocol, self.host),
cookies={'sid': self.session_id})
logging.debug("Successfully logout")
# GET /projects
def get_projects(self, project_name=None, is_public=None):
# TODO: support parameter
result = []
page = 1
page_size = 15
while True:
path = '%s://%s/api/v2.0/projects?page=%s&page_size=%s' % (self.protocol, self.host, page, page_size)
response = requests.get(path,
cookies={'sid': self.session_id})
if response.status_code == 200:
logging.debug("Successfully get projects result: {}".format(
result))
if isinstance(response.json(), list):
result.extend(response.json())
page += 1
else:
break
else:
logging.error("Fail to get projects result")
result = None
break
return result
# GET /projects/{project_name}/repositories
def get_repositories(self, project_name, query_string=None):
# TODO: support parameter
result = []
page = 1
page_size = 15
while True:
path = '%s://%s/api/v2.0/projects/%s/repositories?page=%s&page_size=%s' % (
self.protocol, self.host, project_name, page, page_size)
response = requests.get(path,
cookies={'sid': self.session_id})
if response.status_code == 200:
logging.debug(
"Successfully get repositories with name: {}, result: {}".format(
project_name, result))
if len(response.json()):
result.extend(response.json())
page += 1
else:
break
else:
logging.error("Fail to get repositories result with name: {}".format(
project_name))
result = None
break
return result
# GET /projects/{project_name}/repositories/{repository_name}/artifacts
# GET /projects/{project_name}/repositories/{repository_name}/artifacts?with_tag=true&with_scan_overview=true&with_label=true&page_size=15&page=1
def get_repository_artifacts(self, project_name, repository_name):
result = []
page = 1
page_size = 15
while True:
path = '%s://%s/api/v2.0/projects/%s/repositories/%s/artifacts?with_tag=true&with_scan_overview=true&with_label=true&page_size=%s&page=%s' % (
self.protocol, self.host, project_name, repository_name, page_size, page)
response = requests.get(path,
cookies={'sid': self.session_id}, timeout=60)
if response.status_code == 200:
logging.debug(
"Successfully get repositories artifacts with name: {}, {}, result: {}".format(
project_name, repository_name, result))
if len(response.json()):
result.extend(response.json())
page += 1
else:
break
else:
logging.error("Fail to get repositories artifacts result with name: {}, {}".format(
project_name, repository_name))
result = None
break
return result
# DELETE /projects/{project_name}/repositories/{repository_name}
def delete_repository(self, project_name, repository_name, tag=None):
# TODO: support to check tag
# TODO: return 200 but the repo is not deleted, need more test
result = False
path = '%s://%s/api/v2.0/projects/%s/repositories/%s' % (
self.protocol, self.host, project_name, repository_name)
response = requests.delete(path,
cookies=self.cookies_new, headers=self.headers)
if response.status_code == 200:
result = True
print("Delete {} successful!".format(repository_name))
logging.debug("Successfully delete repository: {}".format(
repository_name))
else:
logging.error("Fail to delete repository: {}".format(repository_name))
return result
# Get /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/tags
def get_repository_tags(self, project_name, repository_name, reference_hash):
result = None
path = '%s://%s/api/v2.0/projects/%s/repositories/%s/artifacts/%s/tags' % (
self.protocol, self.host, project_name, repository_name, reference_hash)
response = requests.get(path,
cookies={'sid': self.session_id}, timeout=60)
if response.status_code == 200:
result = response.json()
logging.debug(
"Successfully get tag with repository name: {}, result: {}".format(
repository_name, result))
else:
logging.error("Fail to get tags with repository name: {}".format(
repository_name))
return result
# Del /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/tags/{tag_name}
def del_repository_tag(self, project_name, repository_name, reference_hash, tag):
result = False
path = '%s://%s/api/v2.0/projects/%s/repositories/%s/artifacts/%s/tags/%s' % (
self.protocol, self.host, project_name, repository_name, reference_hash, tag)
response = requests.delete(path, cookies=self.cookies_new, headers=self.headers)
if response.status_code == 200:
result = True
print("Delete {} {} {} {} successful!".format(project_name, repository_name, reference_hash, tag))
logging.debug(
"Successfully delete repository project_name: {}, repository_name: {}, reference_hash: {}, tag: {}".format(
project_name, repository_name, reference_hash, tag))
else:
logging.error("Fail to delete repository project_name: {}, repository_name: {}, reference_hash: {}, tag: {}".format(
project_name, repository_name, reference_hash, tag))
return result
# Del /projects/{project_name}/repositories/{repository_name}/artifacts/{reference}
def del_artifacts_hash(self, project_name, repository_name, reference_hash):
result = False
path = '%s://%s/api/v2.0/projects/%s/repositories/%s/artifacts/%s' % (
self.protocol, self.host, project_name, repository_name, reference_hash)
response = requests.delete(path, cookies=self.cookies_new, headers=self.headers)
if response.status_code == 200:
result = True
print("Delete artifacts hash {} {} {} successful!".format(project_name, repository_name, reference_hash))
logging.debug(
"Successfully delete repository project_name: {}, repository_name: {}, artifacts hash: {}".format(
project_name, repository_name, reference_hash))
else:
logging.error("Fail to delete repository project_name: {}, repository_name: {}, artifacts hash: {}".format(
project_name, repository_name, reference_hash))
return result
使用舉例
列出 Harbor Projectsjson
import harborclient_modify_v2_0
class GetHarborApi(object):
def __init__(self, host, user, password, protocol="http"):
self.host = host
self.user = user
self.password = password
self.protocol = protocol
self.client = harborclient_modify_v2_0.HarborClient(self.host, self.user, self.password, self.protocol)
def main(self):
print(self.client.get_projects())
if __name__ == '__main__':
host = "harbor.example.com"
user = "admin"
password = "******"
protocol = "https"
cline_get = GetHarborApi(host, user, password, protocol)
cline_get.main()
熱門文章推薦
-
IT運維面試問題總結-簡述Etcd、Kubernetes、Lvs、HAProxy等 -
IT運維面試問題總結-數據庫、監控、網絡管理 -
IT運維面試問題總結-運維工具、開源應用(Ceph、Docker、Apache、Nginx等) -
IT運維面試問題總結-基礎服務、磁盤管理、虛擬平臺和系統管理 -
IT運維面試問題總結-Linux基礎 -
Harbor v1.7.0自動鏡像回收
最後
-
歡迎您加我微信【 ypxiaozhan01】,拉您進技術羣,一塊兒交流學習... -
歡迎您關注【 YP小站】,學習互聯網最流行的技術,作個專業的技術人...
![](http://static.javashuo.com/static/loading.gif)
本文分享自微信公衆號 - YP小站(ypxiaozhan)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。api