You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.7 KiB
71 lines
2.7 KiB
#! /usr/bin/env python3
|
|
# -*- coding:utf-8 -*-
|
|
# 基于时间排序后删除 保留最新n个tag
|
|
|
|
import requests
|
|
|
|
requests.packages.urllib3.disable_warnings()
|
|
|
|
|
|
class CleanHarbor:
|
|
# haror地址 用户 密码 保留tag数量
|
|
def __init__(self, base_url, user, password, counts):
|
|
self.user = user
|
|
self.password = password
|
|
self.base_url = base_url
|
|
self.counts = counts
|
|
# harbor 1.8的登录url加了个c
|
|
self.login_url = self.base_url + '/c/login'
|
|
self.project_url = self.base_url + '/api/projects'
|
|
self.repo_url = self.base_url + '/api/repositories'
|
|
self.gc_url = self.base_url + '/api/system/gc/schedule'
|
|
self.session = requests.Session()
|
|
self.session.verify = False
|
|
self.session.post(self.login_url, params={"principal": self.user, "password": self.password})
|
|
|
|
def get_project(self):
|
|
project_info = []
|
|
harbor_info = self.session.get(self.project_url).json()
|
|
for project in harbor_info:
|
|
info = {'project_id': project['project_id'], 'project_name': project['name']}
|
|
project_info.append(info)
|
|
return project_info
|
|
|
|
def get_delete_repo(self):
|
|
project_info = self.get_project()
|
|
delete_reponame = []
|
|
for project_id in project_info:
|
|
repo_info = self.session.get(self.repo_url, params={"project_id": project_id['project_id']}).json()
|
|
for repo in repo_info:
|
|
# 如果该repo的tag数量不大于期望值则略过
|
|
if repo['tags_count'] > self.counts:
|
|
delete_reponame.append(repo['name'])
|
|
return delete_reponame
|
|
|
|
def delete_repo_tag(self):
|
|
delete_reponame = self.get_delete_repo()
|
|
for repo_name in delete_reponame:
|
|
tag_url = self.repo_url + "/" + repo_name + "/tags"
|
|
tags = self.session.get(tag_url).json()
|
|
tags_sort = sorted(tags, key=lambda tags: tags["created"])
|
|
del_tags = tags_sort[0:len(tags_sort) - self.counts]
|
|
for tag in del_tags:
|
|
# print(tag)
|
|
del_repo_tag_url = tag_url + "/" + tag['name']
|
|
print(del_repo_tag_url)
|
|
result = self.session.delete(del_repo_tag_url)
|
|
if result.status_code == 200:
|
|
print('{}:{} tag删除成功..'.format(repo_name, tag['name']))
|
|
print("所有tag删除完成...")
|
|
self.gc()
|
|
|
|
def gc(self):
|
|
result = self.session.post(self.gc_url, params={"schedule": {"type": "Manual"}})
|
|
if result.status_code == 201:
|
|
print("gc成功")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
Harobr = CleanHarbor('https://hub.my.com', 'admin', 'Harbor12345', 5)
|
|
Harobr.delete_repo_tag()
|