需求:我需要每天删除没有使用的harbor镜像,就需要判断所有的pod使用的那些镜像,然后把没有使用的删除掉。
harbor 版本v2.4.3-85ef1409
import requests
import base64
from loguru import logger
logger.add("harbro_del.log", rotation="100 MB")
import subprocess
cangku = "dataoke-test"
xiangmu = []
xianshi = 25
Page = 1
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36"
}
def Shell_cmd(dev):
xhel = """kubectl get pod -o=jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{\"\\n\"}{end}'"""
shell_c = f"{xhel} -n {dev}"
Cmd_run = subprocess.run(shell_c, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode(
"utf-8")
data_list = Cmd_run.splitlines()
return data_list
pingjie_id = []
no_del_id = []
ID_list = {}
timct_taim = []
def ijit(xiangmu,id):
url = f"https://test.com/api/v2.0/projects/dataoke-test/repositories/{xiangmu}/artifacts/{id}/tags?with_signature=true&with_immutable_status=true&page_size=8&page=1"
payload={}
headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Pragma': 'no-cache',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36'
}
response = requests.request("GET", url, headers=headers, data=payload)
tag = response.json()[0]["name"]
mess = xiangmu + ":" + tag + "---"+f"{id}"
pingjie_id.append(mess)
def xiangmu1():
for i in range(10):
url = "https://test.com/api/v2.0/projects/dataoke-test/repositories?page_size=100&page={}".format(i)
response = requests.get(url, headers=headers)
dat_sdfji = response.json()
if len(dat_sdfji) == 0:
break
for i in dat_sdfji:
sss= i["name"]
oksdf = sss.split('/')
xiangmu.append(oksdf[1])
def login():
headers = {"Content-Type": "application/json;charset=UTF-8"}
"""获取token"""
data = {"principal": "admin",
"password": "123456"
}
url = "https://test.com/c/login"
r = requests.post(url=url, json=data, headers=headers)
# 将获取到的token返回
return r.headers["X-Harbor-Csrf-Token"]
def delete_image(del_xiangmu, del_id):
username = "admin"
password = "123546"
user_info_str = username + ":" + password
user_info = base64.b64encode(user_info_str.encode())
header_info = {
"Authorization" : "Basic " + user_info.decode(),
"X-Harbor-CSRF-Token": login()
}
#
url = "https://test.com/api/v2.0/projects/dataoke-test/repositories/{}/artifacts/{}".format(del_xiangmu,del_id)
r = requests.delete(url=url, headers=header_info)
print(r.status_code)
print(url)
if r.status_code == 200:
logger.debug("{}-{}删除成功".format(del_xiangmu, del_id))
k8s_image_dev1 = Shell_cmd("dev1")
k8s_image_test1 = Shell_cmd("test1")
k8s_image_huise = Shell_cmd("huise")
k8s_clened = list(set(k8s_image_dev1).union(k8s_image_test1).union(k8s_image_huise))
k8s_image = [item.replace("test.com/dataoke-test/", "") for item in k8s_clened]
xiangmu1()
for oks in xiangmu:
if oks == "php" or oks == "openresty" or oks == "alpine" or oks == "golang":
print("daolewotuichule")
continue
Page +=1
ID_key = []
try:
for i in range(2,12):
url = "https://test.com/api/v2.0/projects/{}/repositories/{}/artifacts?with_tag=false&with_scan_overview=true&with_label=true&page_size={}&page={}".format(
cangku, xiangmu[Page], xianshi, i)
print(url)
response = requests.get(url, headers=headers)
dat_sdfji = response.json()
# print(dat_sdfji)
if len(dat_sdfji) != 0:
for i in dat_sdfji:
# print(i["digest"])
creat_time = i["extra_attrs"]["created"]
timct_taim.append(creat_time)
# ID_name_list.append(xiangmu[Page])
ID_key.append(i["digest"])
# print(ID_key)
ID_name = xiangmu[Page]
ID_list[ID_name]= ID_key
except:
print('11111')
for i in ID_list:
for i2 in ID_list[i]:
try:
ijit(i, i2)
except:
logger.error(f"ijit is error {i,i2}")
for i in pingjie_id:
sf = i.split("---")
if sf[0] in k8s_image:
no_del_id.append(sf[-1])
print(k8s_image,ID_list,pingjie_id,no_del_id)
for i in ID_list:
for i2 in ID_list[i]:
if i2 in no_del_id:
continue
else:
delete_image(i, i2)