From 71bf7a85f83b5485614694e59a8e22a6f28a31a6 Mon Sep 17 00:00:00 2001 From: wangyan Date: Thu, 4 May 2017 02:38:46 -0700 Subject: [PATCH] Upgrade python SDK to v1.1.1 --- .../harbor-py/harborclient/harborclient.py | 214 +++++++++++++----- 1 file changed, 154 insertions(+), 60 deletions(-) diff --git a/contrib/sdk/harbor-py/harborclient/harborclient.py b/contrib/sdk/harbor-py/harborclient/harborclient.py index 31f9690bcc67..22ef9db22ece 100755 --- a/contrib/sdk/harbor-py/harborclient/harborclient.py +++ b/contrib/sdk/harbor-py/harborclient/harborclient.py @@ -4,7 +4,7 @@ import logging import requests -logging.basicConfig(level=logging.INFO) +logging.basicConfig(level=logging.WARNING) class HarborClient(object): @@ -14,8 +14,6 @@ def __init__(self, host, user, password, protocol="http"): self.password = password self.protocol = protocol - self.session_id = self.login() - def __del__(self): self.logout() @@ -26,36 +24,17 @@ def login(self): 'password': self.password}) if login_data.status_code == 200: session_id = login_data.cookies.get('beegosessionID') - + self.session_id = session_id logging.debug("Successfully login, session id: {}".format( session_id)) - return session_id else: logging.error("Fail to login, please try again") - return None def logout(self): - requests.get('%s://%s/logout' % (self.protocol, self.host), + requests.get('%s://%s/log_out' % (self.protocol, self.host), cookies={'beegosessionID': self.session_id}) logging.debug("Successfully logout") - # Get project id - def get_project_id_from_name(self, project_name): - registry_data = requests.get( - '%s://%s/api/projects?project_name=%s' % - (self.protocol, self.host, project_name), - cookies={'beegosessionID': self.session_id}) - if registry_data.status_code == 200 and registry_data.json(): - project_id = registry_data.json()[0]['project_id'] - logging.debug( - "Successfully get project id: {}, project name: {}".format( - project_id, project_name)) - return project_id - else: - logging.error("Fail to get project id from project name", - project_name) - return None - # GET /search def search(self, query_string): result = None @@ -71,8 +50,7 @@ def search(self, query_string): return result # GET /projects - def get_projects(self, project_name=None, is_public=None): - # TODO: support parameter + def get_projects(self): result = None path = '%s://%s/api/projects' % (self.protocol, self.host) response = requests.get(path, @@ -105,7 +83,7 @@ def check_project_exist(self, project_name): return result # POST /projects - def create_project(self, project_name, is_public=False): + def create_project(self, project_name, is_public=0): result = False path = '%s://%s/api/projects' % (self.protocol, self.host) request_body = json.dumps({'project_name': project_name, @@ -113,8 +91,7 @@ def create_project(self, project_name, is_public=False): response = requests.post(path, cookies={'beegosessionID': self.session_id}, data=request_body) - if response.status_code == 201 or response.status_code == 500: - # TODO: the response return 500 sometimes + if response.status_code == 201: result = True logging.debug( "Successfully create project with project name: {}".format( @@ -125,11 +102,64 @@ def create_project(self, project_name, is_public=False): project_name, response.status_code)) return result + # GET /projects/{project_id}/members + def get_project_members(self, project_id): + result = None + path = '%s://%s/api/projects/%s/members' % (self.protocol, self.host, project_id) + response = requests.get(path, + cookies={'beegosessionID': self.session_id}) + if response.status_code == 200: + result = response.json() + logging.debug( + "Successfully create project with project id: {}".format( + project_id)) + else: + logging.error( + "Fail to create project with project id: {}, response code: {}".format( + project_id, response.status_code)) + return result + + # POST /projects/{project_id}/members + def add_project_member(self, project_id, username, role_id): + result = False + path = '%s://%s/api/projects/%s/members' % (self.protocol, self.host, project_id) + request_str = '{"username": "%s","roles": [%s]}' % (username, role_id) + request_body = json.dumps(json.loads(request_str)) + response = requests.post(path, + cookies={'beegosessionID': self.session_id}, + data=request_body) + if response.status_code == 200: + result = True + logging.debug( + "Successfully add project member with project id: {}".format( + project_id)) + else: + logging.error( + "Fail to add project member with project id: {}, response code: {}".format( + project_id, response.status_code)) + return result + + # DELETE /projects/{project_id}/members/{user_id} + def delete_member_from_project(self, project_id, user_id): + result = False + path = '%s://%s/api/projects/%s/members/%s' % (self.protocol, self.host, + project_id, user_id) + response = requests.delete(path, + cookies={'beegosessionID': self.session_id}) + if response.status_code == 200: + result = True + logging.debug("Successfully delete member with id: {}".format( + user_id)) + else: + logging.error("Fail to delete member with id: {}, response code: {}" + .format(user_id, response.status_code)) + return result + # PUT /projects/{project_id}/publicity def set_project_publicity(self, project_id, is_public): result = False - path = '%s://%s/api/projects/%s/publicity?project_id=%s' % ( - self.protocol, self.host, project_id, project_id) + path = '%s://%s/api/projects/%s/publicity' % ( + self.protocol, self.host, project_id) request_body = json.dumps({'public': is_public}) response = requests.put(path, cookies={'beegosessionID': self.session_id}, @@ -155,11 +185,12 @@ def get_statistics(self): result = response.json() logging.debug("Successfully get statistics: {}".format(result)) else: - logging.error("Fail to get statistics result") + logging.error("Fail to get statistics result with status code: {}" + .format(response.status_code)) return result # GET /users - def get_users(self, user_name=None): + def get_users(self): # TODO: support parameter result = None path = '%s://%s/api/users' % (self.protocol, self.host) @@ -169,7 +200,22 @@ def get_users(self, user_name=None): result = response.json() logging.debug("Successfully get users result: {}".format(result)) else: - logging.error("Fail to get users result") + logging.error("Fail to get users result with status code: {}" + .format(response.status_code)) + return result + + # GET /users/current + def get_user_info(self): + result = None + path = '%s://%s/api/users/current' % (self.protocol, self.host) + response = requests.get(path, + cookies={'beegosessionID': self.session_id}) + if response.status_code == 200: + result = response.json() + logging.debug("Successfully get users result: {}".format(result)) + else: + logging.error("Fail to get users result with status code: {}" + .format(response.status_code)) return result # POST /users @@ -198,8 +244,8 @@ def create_user(self, username, email, password, realname, comment): def update_user_profile(self, user_id, email, realname, comment): # TODO: support not passing comment result = False - path = '%s://%s/api/users/%s?user_id=%s' % (self.protocol, self.host, - user_id, user_id) + path = '%s://%s/api/users/%s' % (self.protocol, self.host, + user_id) request_body = json.dumps({'email': email, 'realname': realname, 'comment': comment}) @@ -220,8 +266,8 @@ def update_user_profile(self, user_id, email, realname, comment): # DELETE /users/{user_id} def delete_user(self, user_id): result = False - path = '%s://%s/api/users/%s?user_id=%s' % (self.protocol, self.host, - user_id, user_id) + path = '%s://%s/api/users/%s' % (self.protocol, self.host, + user_id) response = requests.delete(path, cookies={'beegosessionID': self.session_id}) if response.status_code == 200: @@ -229,14 +275,15 @@ def delete_user(self, user_id): logging.debug("Successfully delete user with id: {}".format( user_id)) else: - logging.error("Fail to delete user with id: {}".format(user_id)) + logging.error("Fail to delete user with id: {}, response code: {}" + .format(user_id, response.status_code)) return result # PUT /users/{user_id}/password def change_password(self, user_id, old_password, new_password): result = False - path = '%s://%s/api/users/%s/password?user_id=%s' % ( - self.protocol, self.host, user_id, user_id) + path = '%s://%s/api/users/%s/password' % ( + self.protocol, self.host, user_id) request_body = json.dumps({'old_password': old_password, 'new_password': new_password}) response = requests.put(path, @@ -252,13 +299,15 @@ def change_password(self, user_id, old_password, new_password): return result # PUT /users/{user_id}/sysadmin - def promote_as_admin(self, user_id): - # TODO: always return 404, need more test + def promote_as_admin(self, user_id, has_admin_role): result = False - path = '%s://%s/api/users/%s/sysadmin?user_id=%s' % ( - self.protocol, self.host, user_id, user_id) + path = '%s://%s/api/users/%s/sysadmin' % ( + self.protocol, self.host, user_id) + request_body = json.dumps({'has_admin_role': has_admin_role, + 'user_id': user_id}) response = requests.put(path, - cookies={'beegosessionID': self.session_id}) + cookies={'beegosessionID': self.session_id}, + data=request_body) if response.status_code == 200: result = True logging.debug( @@ -284,17 +333,33 @@ def get_repositories(self, project_id, query_string=None): "Successfully get repositories with id: {}, result: {}".format( project_id, result)) else: - logging.error("Fail to get repositories result with id: {}".format( - project_id)) + logging.error("Fail to get repositories result with id: {}, response code: {}".format( + project_id, response.status_code)) return result - # DELETE /repositories - def delete_repository(self, repo_name, tag=None): + # DELETE /repositories/{repo_name}/tags/{tag} + def delete_tag_of_repository(self, repo_name, tag): # TODO: support to check tag # TODO: return 200 but the repo is not deleted, need more test result = False - path = '%s://%s/api/repositories?repo_name=%s' % (self.protocol, - self.host, repo_name) + path = '%s://%s/api/repositories/%s/tags/%s' % (self.protocol,self.host, + repo_name, tag) + response = requests.delete(path, + cookies={'beegosessionID': self.session_id}) + if response.status_code == 200: + result = True + logging.debug("Successfully delete a tag of repository: {}".format( + repo_name)) + else: + logging.error("Fail to delete repository with name: {}, response code: {}".format( + repo_name, response.status_code)) + return result + + # DELETE /repositories/{repo_name}/tags + def delete_tags_of_repository(self, repo_name): + result = False + path = '%s://%s/api/repositories/%s/tags' % (self.protocol, + self.host, repo_name) response = requests.delete(path, cookies={'beegosessionID': self.session_id}) if response.status_code == 200: @@ -302,13 +367,14 @@ def delete_repository(self, repo_name, tag=None): logging.debug("Successfully delete repository: {}".format( repo_name)) else: - logging.error("Fail to delete repository: {}".format(repo_name)) + logging.error("Fail to delete repository with name: {}, response code: {}".format( + repo_name, response.status_code)) return result - # Get /repositories/tags + # Get /repositories/{repo_name}/tags def get_repository_tags(self, repo_name): result = None - path = '%s://%s/api/repositories/tags?repo_name=%s' % ( + path = '%s://%s/api/repositories/%s/tags' % ( self.protocol, self.host, repo_name) response = requests.get(path, cookies={'beegosessionID': self.session_id}) @@ -318,14 +384,14 @@ def get_repository_tags(self, repo_name): "Successfully get tag with repo name: {}, result: {}".format( repo_name, result)) else: - logging.error("Fail to get tags with repo name: {}".format( - repo_name)) + logging.error("Fail to get tags with repo name: {}, response code: {}".format( + repo_name, response.status_code)) return result - # GET /repositories/manifests - def get_repository_manifests(self, repo_name, tag): + # GET /repositories/{repo_name}/tags/{tag}/manifest + def get_repository_manifest(self, repo_name, tag): result = None - path = '%s://%s/api/repositories/manifests?repo_name=%s&tag=%s' % ( + path = '%s://%s/api/repositories/%s/tags/%s/manifest' % ( self.protocol, self.host, repo_name, tag) response = requests.get(path, cookies={'beegosessionID': self.session_id}) @@ -370,3 +436,31 @@ def get_logs(self, lines=None, start_time=None, end_time=None): logging.error("Fail to get logs and response code: {}".format( response.status_code)) return result + + # Get /systeminfo + def get_systeminfo(self): + result = None + path = '%s://%s/api/systeminfo' % (self.protocol, self.host) + response = requests.get(path, + cookies={'beegosessionID': self.session_id}) + if response.status_code == 200: + result = response.json() + logging.debug( + "Successfully get systeminfo, result: {}".format(result)) + else: + logging.error("Fail to get systeminfo, response code: {}".format(response.status_code)) + return result + + # Get /configurations + def get_configurations(self): + result = None + path = '%s://%s/api/configurations' % (self.protocol, self.host) + response = requests.get(path, + cookies={'beegosessionID': self.session_id}) + if response.status_code == 200: + result = response.json() + logging.debug( + "Successfully get configurations, result: {}".format(result)) + else: + logging.error("Fail to get configurations, response code: {}".format(response.status_code)) + return result