mirror of
https://github.com/goharbor/harbor.git
synced 2024-11-27 20:59:10 +01:00
136 lines
5.4 KiB
Python
136 lines
5.4 KiB
Python
|
#!/usr/bin/env python
|
||
|
# -*- coding:utf-8 -*-
|
||
|
# bug-report: feilengcui008@gmail.com
|
||
|
|
||
|
""" cli tool """
|
||
|
|
||
|
import argparse
|
||
|
import sys
|
||
|
import json
|
||
|
from registry import RegistryApi
|
||
|
|
||
|
|
||
|
class ApiProxy(object):
|
||
|
""" user RegistryApi """
|
||
|
def __init__(self, registry, args):
|
||
|
self.registry = registry
|
||
|
self.args = args
|
||
|
self.callbacks = dict()
|
||
|
self.register_callback("repo", "list", self.list_repo)
|
||
|
self.register_callback("tag", "list", self.list_tag)
|
||
|
self.register_callback("tag", "delete", self.delete_tag)
|
||
|
self.register_callback("manifest", "list", self.list_manifest)
|
||
|
self.register_callback("manifest", "delete", self.delete_manifest)
|
||
|
self.register_callback("manifest", "get", self.get_manifest)
|
||
|
|
||
|
def register_callback(self, target, action, func):
|
||
|
""" register real actions """
|
||
|
if not target in self.callbacks.keys():
|
||
|
self.callbacks[target] = {action: func}
|
||
|
return
|
||
|
self.callbacks[target][action] = func
|
||
|
|
||
|
def execute(self, target, action):
|
||
|
""" execute """
|
||
|
print json.dumps(self.callbacks[target][action](), indent=4, sort_keys=True)
|
||
|
|
||
|
def list_repo(self):
|
||
|
""" list repo """
|
||
|
return self.registry.getRepositoryList(self.args.num)
|
||
|
|
||
|
def list_tag(self):
|
||
|
""" list tag """
|
||
|
return self.registry.getTagList(self.args.repo)
|
||
|
|
||
|
def delete_tag(self):
|
||
|
""" delete tag """
|
||
|
(_, ref) = self.registry.existManifest(self.args.repo, self.args.tag)
|
||
|
if ref is not None:
|
||
|
return self.registry.deleteManifest(self.args.repo, ref)
|
||
|
return False
|
||
|
|
||
|
def list_manifest(self):
|
||
|
""" list manifest """
|
||
|
tags = self.registry.getTagList(self.args.repo)["tags"]
|
||
|
manifests = list()
|
||
|
if tags is None:
|
||
|
return None
|
||
|
for i in tags:
|
||
|
content = self.registry.getManifestWithConf(self.args.repo, i)
|
||
|
manifests.append({i: content})
|
||
|
return manifests
|
||
|
|
||
|
def delete_manifest(self):
|
||
|
""" delete manifest """
|
||
|
return self.registry.deleteManifest(self.args.repo, self.args.ref)
|
||
|
|
||
|
def get_manifest(self):
|
||
|
""" get manifest """
|
||
|
return self.registry.getManifestWithConf(self.args.repo, self.args.tag)
|
||
|
|
||
|
|
||
|
# since just a script tool, we do not construct whole target->action->args
|
||
|
# structure with oo abstractions which has more flexibility, just register
|
||
|
# parser directly
|
||
|
def get_parser():
|
||
|
""" return a parser """
|
||
|
parser = argparse.ArgumentParser("cli")
|
||
|
|
||
|
parser.add_argument('--username', action='store', required=True, help='username')
|
||
|
parser.add_argument('--password', action='store', required=True, help='password')
|
||
|
parser.add_argument('--registry_endpoint', action='store', required=True,
|
||
|
help='registry endpoint')
|
||
|
|
||
|
subparsers = parser.add_subparsers(dest='target', help='target to operate on')
|
||
|
|
||
|
# repo target
|
||
|
repo_target_parser = subparsers.add_parser('repo', help='target repository')
|
||
|
repo_target_subparsers = repo_target_parser.add_subparsers(dest='action',
|
||
|
help='repository subcommand')
|
||
|
repo_cmd_parser = repo_target_subparsers.add_parser('list', help='list repositories')
|
||
|
repo_cmd_parser.add_argument('--num', action='store', required=False, default=None,
|
||
|
help='the number of data to return')
|
||
|
|
||
|
# tag target
|
||
|
tag_target_parser = subparsers.add_parser('tag', help='target tag')
|
||
|
tag_target_subparsers = tag_target_parser.add_subparsers(dest='action',
|
||
|
help='tag subcommand')
|
||
|
tag_list_parser = tag_target_subparsers.add_parser('list', help='list tags')
|
||
|
tag_list_parser.add_argument('--repo', action='store', required=True, help='list tags')
|
||
|
tag_delete_parser = tag_target_subparsers.add_parser('delete', help='delete tag')
|
||
|
tag_delete_parser.add_argument('--repo', action='store', required=True, help='delete tags')
|
||
|
tag_delete_parser.add_argument('--tag', action='store', required=True,
|
||
|
help='tag reference')
|
||
|
|
||
|
# manifest target
|
||
|
manifest_target_parser = subparsers.add_parser('manifest', help='target manifest')
|
||
|
manifest_target_subparsers = manifest_target_parser.add_subparsers(dest='action',
|
||
|
help='manifest subcommand')
|
||
|
manifest_list_parser = manifest_target_subparsers.add_parser('list', help='list manifests')
|
||
|
manifest_list_parser.add_argument('--repo', action='store', required=True,
|
||
|
help='list manifests')
|
||
|
manifest_delete_parser = manifest_target_subparsers.add_parser('delete', help='delete manifest')
|
||
|
manifest_delete_parser.add_argument('--repo', action='store', required=True,
|
||
|
help='delete manifest')
|
||
|
manifest_delete_parser.add_argument('--ref', action='store', required=True,
|
||
|
help='manifest reference')
|
||
|
manifest_get_parser = manifest_target_subparsers.add_parser('get', help='get manifest content')
|
||
|
manifest_get_parser.add_argument('--repo', action='store', required=True, help='delete tags')
|
||
|
manifest_get_parser.add_argument('--tag', action='store', required=True,
|
||
|
help='manifest reference')
|
||
|
|
||
|
return parser
|
||
|
|
||
|
|
||
|
def main():
|
||
|
""" main entrance """
|
||
|
parser = get_parser()
|
||
|
options = parser.parse_args(sys.argv[1:])
|
||
|
registry = RegistryApi(options.username, options.password, options.registry_endpoint)
|
||
|
proxy = ApiProxy(registry, options)
|
||
|
proxy.execute(options.target, options.action)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|