From fd20aec27ef340d2ce14049645d8d3b6aea446a3 Mon Sep 17 00:00:00 2001 From: caicaihe Date: Mon, 28 Jan 2019 15:53:13 +0800 Subject: [PATCH] caicaihe:add-test-model --- Makefile | 11 ++ .../__pycache__/testutils.cpython-37.pyc | Bin 0 -> 1672 bytes tests/apitests/python/library/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 187 bytes .../library/__pycache__/base.cpython-37.pyc | Bin 0 -> 3200 bytes .../__pycache__/project.cpython-37.pyc | Bin 0 -> 7030 bytes tests/apitests/python/library/base.py | 83 +++++++++ tests/apitests/python/library/project.py | 169 ++++++++++++++++++ tests/apitests/python/test_project_get.py | 31 ++++ tests/apitests/python/testutils.py | 37 ++++ 10 files changed, 331 insertions(+) create mode 100644 tests/apitests/python/__pycache__/testutils.cpython-37.pyc create mode 100644 tests/apitests/python/library/__init__.py create mode 100644 tests/apitests/python/library/__pycache__/__init__.cpython-37.pyc create mode 100644 tests/apitests/python/library/__pycache__/base.cpython-37.pyc create mode 100644 tests/apitests/python/library/__pycache__/project.cpython-37.pyc create mode 100644 tests/apitests/python/library/base.py create mode 100644 tests/apitests/python/library/project.py create mode 100644 tests/apitests/python/test_project_get.py create mode 100644 tests/apitests/python/testutils.py diff --git a/Makefile b/Makefile index ee15981d5..f16ef8974 100644 --- a/Makefile +++ b/Makefile @@ -175,6 +175,17 @@ swagger: go get -u github.com/golang/dep/cmd/dep && \ nirvana api --output web/public pkg/server/apis" + +swagger_client: + @echo "Generate swagger client" + wget -q http://central.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.1/swagger-codegen-cli-2.4.1.jar -O swagger-codegen-cli.jar + rm -rf cycloneclient + mkdir cycloneclient + java -jar swagger-codegen-cli.jar generate -i api.v1alpha1.json -l python -o cycloneclient + cd cycloneclient; python3 ./setup.py install + + + deploy: sed -e "s/__REGISTRY__/$${REGISTRIES/\//\\/}/g" -e "s/__VERSION__/${VERSION}/g" manifests/cyclone.yaml.template > .cyclone.yaml kubectl create -f .cyclone.yaml diff --git a/tests/apitests/python/__pycache__/testutils.cpython-37.pyc b/tests/apitests/python/__pycache__/testutils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..511b1e1cd200c22c536de398f0bea0711851d373 GIT binary patch literal 1672 zcmZux&2HO95Z>jVXquAKIE9O(C={RWFU=i-{ z&Rc_d+-0l0$34D!N}2zNaG!Ti3Ga&TiOG7LJ|n@}JGhmM0$TeIs%-cs5tYu$0@hAd z$*ju(J zRxqb19GZtyR^Wvmo`Laj~4DF{Dp;JA07lNbx$3|X)0ut+Y7tI7??T z#@LxPDV46>nG&*yr=oVNSgE5@a_0RaWHz2hO69f9#o;VvD?r&Dv?<9L>9*a;lj zfiR>Cf^{dcJS=4d{^0-2OvWkm0L$g|KH6EKbX+9j4GCJ{*qNbm{&Ge)v4r`juK(@02JN>z6o z9ZiK&aVnrvEhX}C!&)m=!B_1@Kxw9<=nkwDHW`7a7VG~48C;%75Csm@AIk7kSS-ma zKn2AIxWJ}o#*&^>Y{3>Cx(!U(10|8e+KH&sYEA4O8KBOgC01B%@hs8s=I;IQcogkEc|05)u$AY} zhWpX}(J|vV4-xnveG_T4 H3~%)x6lkAt literal 0 HcmV?d00001 diff --git a/tests/apitests/python/library/__init__.py b/tests/apitests/python/library/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/apitests/python/library/__pycache__/__init__.cpython-37.pyc b/tests/apitests/python/library/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..225bfd2b75edd871b0c4168711f645e975b2db37 GIT binary patch literal 187 zcmYL?JqiLb6oj*2A;KQSX5R%w!~<+2+X*3?Jaz;5BQGg}x3Tj|w%)?Z1Q7@3n_-$c z_x+Al-EZTy<*VVRu9j0ZZ7LMIuzfc^SZwnjZv_)!BnX%=f-TZ3gvA@-7N96$(P_=| zAiV`Cv@|{|kfo+WNJxo51pO_cq}4kxdX6F%;9NVMI3GfJZV%S0Z1C9LshWKNeh@Pw literal 0 HcmV?d00001 diff --git a/tests/apitests/python/library/__pycache__/base.cpython-37.pyc b/tests/apitests/python/library/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c01f8a9b6abba039c52987928fb4ed5bd4568a2 GIT binary patch literal 3200 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 Gt^Pkm`N63G literal 0 HcmV?d00001 diff --git a/tests/apitests/python/library/base.py b/tests/apitests/python/library/base.py new file mode 100644 index 000000000..788a1a5df --- /dev/null +++ b/tests/apitests/python/library/base.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- + +import sys +import time +import swagger_client + +class Server: + def __init__(self, endpoint, verify_ssl): + self.endpoint = endpoint + self.verify_ssl = verify_ssl + +class Credential: + def __init__(self, type, username, password): + self.type = type + self.username = username + self.password = password + +def _create_client(server, credential, debug): + cfg = swagger_client.Configuration() + cfg.host = server.endpoint + cfg.verify_ssl = server.verify_ssl + # support basic auth only for now + cfg.username = credential.username + cfg.password = credential.password + cfg.debug = debug + return swagger_client.DefaultApi(swagger_client.ApiClient(cfg)) + +def _assert_status_code(expect_code, return_code): + if str(return_code) != str(expect_code): + raise Exception(r"HTTPS status code s not as we expected. Expected {}, while actual HTTPS status code is {}.".format(expect_code, return_code)) + +def _assert_status_body(expect_status_body, returned_status_body): + if expect_status_body.strip() != returned_status_body.strip(): + raise Exception(r"HTTPS status body s not as we expected. Expected {}, while actual HTTPS status body is {}.".format(expect_status_body, returned_status_body)) + +def _random_name(prefix): + return "%s-%d" % (prefix, int(round(time.time() * 1000))) + +def _get_id_from_header(header): + try: + location = header["Location"] + return location.split("/")[-1] + except Exception: + return None + +def _get_string_from_unicode(udata): + result='' + for u in udata: + tmp = u.encode('utf8') + result = result + tmp.strip('\n\r\t') + return result + +class Base: + def __init__(self, + server = Server(endpoint="http://192.168.17.100:30022", verify_ssl=False), + credential = Credential(type="basic_auth", username="admin", password="Harbor12345"), + debug = True): + if not isinstance(server.verify_ssl, bool): + server.verify_ssl = server.verify_ssl == "True" + self.server = server + self.credential = credential + self.debug = debug + self.client = _create_client(server, credential, debug) + + def _get_client(self, **kwargs): + if len(kwargs) == 0: + return self.client + server = self.server + if "endpoint" in kwargs: + server.endpoint = kwargs.get("endpoint") + if "verify_ssl" in kwargs: + if not isinstance(kwargs.get("verify_ssl"), bool): + server.verify_ssl = kwargs.get("verify_ssl") == "True" + else: + server.verify_ssl = kwargs.get("verify_ssl") + credential = self.credential + if "type" in kwargs: + credential.type = kwargs.get("type") + if "username" in kwargs: + credential.username = kwargs.get("username") + if "password" in kwargs: + credential.password = kwargs.get("password") + return _create_client(server, credential, self.debug) \ No newline at end of file diff --git a/tests/apitests/python/library/project.py b/tests/apitests/python/library/project.py new file mode 100644 index 000000000..e3daac202 --- /dev/null +++ b/tests/apitests/python/library/project.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- + +from library import base +import swagger_client +from swagger_client.rest import ApiException + +def is_member_exist_in_project(members, member_user_name, expected_member_role_id = None): + result = False + for member in members: + if member.entity_name == member_user_name: + if expected_member_role_id != None: + if member.role_id == expected_member_role_id: + return True + else: + return True + return result + +class Project(base.Base): + def create_project(self, name=None, metadata=None, expect_status_code = 201, expect_response_body = None, **kwargs): + if name is None: + name = base._random_name("project") + if metadata is None: + metadata = {} + client = self._get_client(**kwargs) + + try: + _, status_code, header = client.projects_post_with_http_info(swagger_client.ProjectReq(name, metadata)) + except ApiException as e: + base._assert_status_code(expect_status_code, e.status) + if expect_response_body is not None: + base._assert_status_body(expect_response_body, e.body) + return + base._assert_status_code(expect_status_code, status_code) + base._assert_status_code(201, status_code) + return base._get_id_from_header(header), name + + + def get_projects(self, params, **kwargs): + client = self._get_client(**kwargs) + data = [] + data, status_code, _ = client.apis_v1alpha1_projects_get_with_http_info(**params) + base._assert_status_code(200, status_code) + return data + + def projects_should_exist(self, params, expected_count = None, expected_project_id = None, **kwargs): + project_data = self.get_projects(params, **kwargs) + actual_count = len(project_data) + if expected_count is not None and actual_count!= expected_count: + raise Exception(r"Private project count should be {}.".format(expected_count)) + if expected_project_id is not None and actual_count == 1 and str(project_data[0].project_id) != str(expected_project_id): + raise Exception(r"Project-id check failed, expect {} but got {}, please check this test case.".format(str(expected_project_id), str(project_data[0].project_id))) + + def check_project_name_exist(self, name=None, **kwargs): + client = self._get_client(**kwargs) + _, status_code, _ = client.projects_head_with_http_info(name) + return { + 200: True, + 404: False, + }.get(status_code,'error') + + def get_project(self, project_id, expect_status_code = 200, expect_response_body = None, **kwargs): + client = self._get_client(**kwargs) + try: + data, status_code, _ = client.projects_project_id_get_with_http_info(project_id) + except ApiException as e: + base._assert_status_code(expect_status_code, e.status) + if expect_response_body is not None: + base._assert_status_body(expect_response_body, e.body) + return + + base._assert_status_code(expect_status_code, status_code) + base._assert_status_code(200, status_code) + return data + + def update_project(self, project_id, metadata, **kwargs): + client = self._get_client(**kwargs) + project = swagger_client.Project(project_id, None, None, None, None, None, None, None, None, None, None, metadata) + _, status_code, _ = client.projects_project_id_put_with_http_info(project_id, project) + base._assert_status_code(200, status_code) + + def delete_project(self, project_id, expect_status_code = 200, **kwargs): + client = self._get_client(**kwargs) + _, status_code, _ = client.projects_project_id_delete_with_http_info(project_id) + base._assert_status_code(expect_status_code, status_code) + + def get_project_metadata_by_name(self, project_id, meta_name, expect_status_code = 200, **kwargs): + client = self._get_client(**kwargs) + ProjectMetadata = swagger_client.ProjectMetadata() + ProjectMetadata, status_code, _ = client.projects_project_id_metadatas_meta_name_get_with_http_info(project_id, meta_name) + base._assert_status_code(expect_status_code, status_code) + return { + 'public': ProjectMetadata.public, + 'enable_content_trust': ProjectMetadata.enable_content_trust, + 'prevent_vul': ProjectMetadata.prevent_vul, + 'auto_scan': ProjectMetadata.auto_scan, + 'severity': ProjectMetadata.severity, + }.get(meta_name,'error') + + def get_project_log(self, project_id, expect_status_code = 200, **kwargs): + client = self._get_client(**kwargs) + body, status_code, _ = client.projects_project_id_logs_get_with_http_info(project_id) + base._assert_status_code(expect_status_code, status_code) + return body + + def filter_project_logs(self, project_id, operator, repository, tag, operation_type, **kwargs): + access_logs = self.get_project_log(project_id, **kwargs) + count = 0 + for each_access_log in list(access_logs): + if each_access_log.username == operator and \ + each_access_log.repo_name.strip(r'/') == repository and \ + each_access_log.repo_tag == tag and \ + each_access_log.operation == operation_type: + count = count + 1 + return count + + def get_project_members(self, project_id, **kwargs): + client = self._get_client(**kwargs) + return client.projects_project_id_members_get(project_id) + + def get_project_member(self, project_id, member_id, expect_status_code = 200, expect_response_body = None, **kwargs): + client = self._get_client(**kwargs) + data = [] + try: + data, status_code, _ = client.projects_project_id_members_mid_get_with_http_info(project_id, member_id,) + except ApiException as e: + base._assert_status_code(expect_status_code, e.status) + if expect_response_body is not None: + base._assert_status_body(expect_response_body, e.body) + return + + base._assert_status_code(expect_status_code, status_code) + base._assert_status_code(200, status_code) + return data + + def check_project_member_not_exist(self, project_id, member_user_name, **kwargs): + members = self.get_project_members(project_id, **kwargs) + result = is_member_exist_in_project(list(members), member_user_name) + if result == True: + raise Exception(r"User {} should not be a member of project with ID {}.".format(member_user_name, project_id)) + + def check_project_members_exist(self, project_id, member_user_name, expected_member_role_id = None, **kwargs): + members = self.get_project_members(project_id, **kwargs) + result = is_member_exist_in_project(members, member_user_name, expected_member_role_id = expected_member_role_id) + if result == False: + raise Exception(r"User {} should be a member of project with ID {}.".format(member_user_name, project_id)) + + def update_project_member_role(self, project_id, member_id, member_role_id, expect_status_code = 200, **kwargs): + client = self._get_client(**kwargs) + role = swagger_client.Role(role_id = member_role_id) + data = [] + data, status_code, _ = client.projects_project_id_members_mid_put_with_http_info(project_id, member_id, role = role) + base._assert_status_code(expect_status_code, status_code) + return data + + def delete_project_member(self, project_id, member_id, expect_status_code = 200, **kwargs): + client = self._get_client(**kwargs) + _, status_code, _ = client.projects_project_id_members_mid_delete_with_http_info(project_id, member_id) + base._assert_status_code(expect_status_code, status_code) + + def add_project_members(self, project_id, user_id, member_role_id = None, expect_status_code = 201, **kwargs): + if member_role_id is None: + member_role_id = 1 + _member_user = {"user_id": int(user_id)} + projectMember = swagger_client.ProjectMember(member_role_id, member_user = _member_user) + client = self._get_client(**kwargs) + data = [] + data, status_code, header = client.projects_project_id_members_post_with_http_info(project_id, project_member = projectMember) + base._assert_status_code(201, status_code) + return base._get_id_from_header(header) \ No newline at end of file diff --git a/tests/apitests/python/test_project_get.py b/tests/apitests/python/test_project_get.py new file mode 100644 index 000000000..78d809bd2 --- /dev/null +++ b/tests/apitests/python/test_project_get.py @@ -0,0 +1,31 @@ +from __future__ import absolute_import + +import unittest + + +from testutils import TEARDOWN +from testutils import ADMIN_CLIENT +from library.project import Project + + +class TestProjects(unittest.TestCase): + @classmethod + def setUp(self): + project = Project() + self.project= project + + + @classmethod + def tearDown(self): + print ("Case completed") + + @unittest.skipIf(TEARDOWN == False, "Test data won't be erased.") + def test_ClearData(self): + #1. Delete repository(RA) by admin; + kk = {"x_tenant":"devops"} + data = self.project.get_projects(kk) + print(data) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/tests/apitests/python/testutils.py b/tests/apitests/python/testutils.py new file mode 100644 index 000000000..a903eb240 --- /dev/null +++ b/tests/apitests/python/testutils.py @@ -0,0 +1,37 @@ +import time +import os +import sys + + +from swagger_client.rest import ApiException +import swagger_client.models +from pprint import pprint + +#CLIENT=dict(endpoint="https://"+harbor_server+"/api") +ADMIN_CLIENT=dict(endpoint = "https://"+"192.168.17.100:30022"+"/apis") +USER_ROLE=dict(admin=0,normal=1) +TEARDOWN = True + +def GetProductApi(username, password, harbor_server= "192.168.17.100:30022"): + + cfg = swagger_client.Configuration() + cfg.host = "https://"+harbor_server+"/api" + cfg.username = username + cfg.password = password + cfg.verify_ssl = False + cfg.debug = True + api_client = swagger_client.ApiClient(cfg) + api_instance = swagger_client.DefaultApi(api_client) + return api_instance +class TestResult(object): + def __init__(self): + self.num_errors = 0 + self.error_message = [] + def add_test_result(self, error_message): + self.num_errors = self.num_errors + 1 + self.error_message.append(error_message) + def get_final_result(self): + if self.num_errors > 0: + for each_err_msg in self.error_message: + print ("Error message:", each_err_msg) + raise Exception(r"Test case failed with {} errors.".format(self.num_errors)) \ No newline at end of file