mirror of https://github.com/goharbor/harbor.git
				
				
				
			
		
			
	
	
		
			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() |