Skip to content
This repository was archived by the owner on Nov 28, 2024. It is now read-only.

Commit d34a399

Browse files
berendtTim Beermann
andcommitted
Initial import from osism/public-services
Co-authored-by: Tim Beermann <[email protected]> Signed-off-by: Christian Berendt <[email protected]>
0 parents  commit d34a399

File tree

8 files changed

+248
-0
lines changed

8 files changed

+248
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# python-harborclient

api.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
from json import JSONDecodeError
2+
import requests
3+
4+
5+
class Api:
6+
url: str = ""
7+
password: str = ""
8+
username: str = ""
9+
verify: bool = True
10+
11+
def __init__(self, url: str, password: str, username: str, verify: bool = True) -> None:
12+
self.url = url
13+
self.password = password
14+
self.username = username
15+
self.verify = verify
16+
17+
requests.packages.urllib3.disable_warnings()
18+
19+
def get(self, endpoint: str) -> list:
20+
r = requests.get(
21+
url=f"{self.url}/{endpoint}",
22+
auth=(self.username, self.password),
23+
verify=self.verify
24+
)
25+
result = r.json()
26+
27+
if type(result) is dict:
28+
return [result]
29+
30+
return result
31+
32+
def post(self, endpoint: str, payload: dict, statuscode: int = 201) -> dict:
33+
r = requests.post(
34+
url=f"{self.url}/{endpoint}",
35+
auth=(self.username, self.password),
36+
json=payload,
37+
verify=self.verify
38+
)
39+
40+
# Catch error when r.json() is not available
41+
try:
42+
result = r.json()
43+
except JSONDecodeError:
44+
result = {}
45+
46+
if r.status_code != statuscode:
47+
print("Failed!")
48+
# add a dict key to identify if the result is an error message
49+
result['is_failed'] = True
50+
51+
return result

config.yml

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
---
2+
# harbor api url and credentials.
3+
api:
4+
url: https://harbor.services.osism.tech/api/v2.0
5+
username: foobar
6+
password: foobar
7+
# verfiy = check ssl or not
8+
verify: true
9+
10+
# this variable is unsed and rather for documentation of possible permissions.
11+
available_permissions:
12+
- artifact:delete
13+
- artifact:list
14+
- artifact:read
15+
- artifact-label:create
16+
- artifact-label:delete
17+
- helm-chart-version-label:create
18+
- helm-chart-version-label:delete
19+
- helm-chart-version:create
20+
- helm-chart-version:delete
21+
- helm-chart:read
22+
- repository:delete
23+
- repository:list
24+
- repository:pull
25+
- repository:push
26+
- scan:create
27+
- scan:stop
28+
- tag:create
29+
- tag:delete
30+
- tag:list
31+
32+
# list of harbor projects
33+
projects:
34+
- project_name: "kolla"
35+
public: true
36+
- project_name: "osism"
37+
public: true
38+
39+
# list of robot accounts
40+
robot_accounts:
41+
- name: github
42+
disable: False
43+
level: system
44+
duration: -1
45+
description: ""
46+
permissions:
47+
- kind: project
48+
namespace: "*"
49+
access_simplified:
50+
- artifact:list
51+
- artifact-label:create
52+
- repository:list
53+
- repository:pull
54+
- repository:push
55+
- scan:create
56+
- scan:stop
57+
- tag:create
58+
59+
# list of registries which should be connected to harbor (no replication yet)
60+
registries:
61+
- credential:
62+
access_key: foo+bar
63+
access_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
64+
type: basic
65+
# or oauth
66+
name: quay.io
67+
url: https://quay.io
68+
type: docker-registry
69+
# possible values of type:
70+
# quay-io
71+
# harbor
72+
# google-gcr
73+
# aws-ecr
74+
# azure-acr
75+
# ali-acr
76+
# gitlab
77+
# docker-registry
78+
# docker-hub
79+
# huawei-SWR
80+
# jfrog-artifactory
81+
# helm-hub
82+
description: ""
83+
84+
# list of replication rules
85+
replication_rules:
86+
- description: ""
87+
dest_namespace_replace_conut: -1
88+
replicate_deletion: true
89+
filters:
90+
- type: "name"
91+
value: "kolla/**"
92+
name: "kolla"
93+
dest_registry: "quay.io"
94+
enabled: true
95+
dest_namespace: kolla
96+
trigger:
97+
type: "event_based"
98+
override: true
99+
- description: ""
100+
dest_namespace_replace_conut: -1
101+
replicate_deletion: true
102+
filters:
103+
- type: "name"
104+
value: "osism/**"
105+
name: "osism"
106+
dest_registry: "quay.io"
107+
enabled: true
108+
dest_namespace: osism
109+
trigger:
110+
type: "event_based"
111+
override: true

main.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import yaml
2+
import robot_accounts
3+
import replication_rules
4+
import registries
5+
import projects
6+
from api import Api
7+
8+
9+
def main(api: Api, config: dict) -> None:
10+
registries.create(api=api, registries=config['registries'])
11+
projects.create(api=api, projects=config['projects'])
12+
replication_rules.create(api=api, replication_rules=config['replication_rules'])
13+
print(robot_accounts.create(api=api, robot_accounts=config['robot_accounts']))
14+
15+
16+
if __name__ == "__main__":
17+
with open("config.yml", "r") as stream:
18+
try:
19+
config = yaml.safe_load(stream)
20+
except yaml.YAMLError as exc:
21+
print(exc)
22+
23+
api = Api(
24+
url=config['api']['url'],
25+
username=config['api']['username'],
26+
password=config['api']['password'],
27+
verify=config['api']['verify']
28+
)
29+
main(api, config)

projects.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from api import Api
2+
3+
4+
def create(api: Api, projects: list) -> None:
5+
for project in projects:
6+
api.post(endpoint="projects", payload=project)

registries.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from api import Api
2+
3+
4+
def create(api: Api, registries: list) -> None:
5+
for registry in registries:
6+
api.post(endpoint="registries", payload=registry)

replication_rules.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from api import Api
2+
3+
4+
def get_registry_id(api: Api, registry_name: str) -> int:
5+
result = api.get(endpoint="registries")
6+
7+
for registry in result:
8+
if registry['name'] == registry_name:
9+
return {"id": registry['id']}
10+
11+
return {"id": -1}
12+
13+
14+
def create(api: Api, replication_rules: list) -> None:
15+
for replication_rule in replication_rules:
16+
replication_rule['dest_registry'] = get_registry_id(api=api, registry_name=replication_rule['dest_registry'])
17+
18+
api.post(endpoint="replication/policies", payload=replication_rule)

robot_accounts.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from api import Api
2+
3+
4+
def rework_permissions(permissions_list: list) -> list:
5+
for permission in permissions_list:
6+
permission['access'] = []
7+
for entry in permission['access_simplified']:
8+
resource, action = entry.split(":")
9+
permission['access'].append(
10+
{"action": action, "resource": resource}
11+
)
12+
del permission['access_simplified']
13+
return permissions_list
14+
15+
16+
def create(api: Api, robot_accounts: list) -> list:
17+
result = []
18+
for robot_account in robot_accounts:
19+
robot_account['permissions'] = rework_permissions(permissions_list=robot_account['permissions'])
20+
21+
rvalue = api.post(endpoint="robots", payload=robot_account)
22+
23+
if "is_failed" not in rvalue:
24+
result.append(f"{rvalue['name']}: {rvalue['secret']}")
25+
26+
return result

0 commit comments

Comments
 (0)