Modify api test for test step of add addition

Signed-off-by: danfengliu <danfengl@vmware.com>
This commit is contained in:
danfengliu 2020-03-16 10:13:28 +08:00
parent b0e87b46e4
commit 77e9fc38c7
26 changed files with 197 additions and 67 deletions

View File

@ -461,7 +461,13 @@ paths:
required: true
responses:
'200':
$ref: '#/responses/200'
description: Success
headers:
Content-Type:
description: The content type of the addition
type: string
schema:
type: string
'400':
$ref: '#/responses/400'
'401':

View File

@ -5,7 +5,14 @@ import base
import v2_swagger_client
from v2_swagger_client.rest import ApiException
class Artifact(base.Base):
class Artifact(base.Base, object):
def __init__(self):
super(Artifact,self).__init__(api_type = "artifact")
def list_artifacts(self, project_name, repo_name, **kwargs):
client = self._get_client(**kwargs)
return client.list_artifacts(project_name, repo_name)
def get_reference_info(self, project_name, repo_name, reference, **kwargs):
client = self._get_client(**kwargs)
params = {}
@ -15,7 +22,25 @@ class Artifact(base.Base):
params["with_tag"] = kwargs["with_tag"]
if "with_scan_overview" in kwargs:
params["with_scan_overview"] = kwargs["with_scan_overview"]
return client.get_artifact_with_http_info(project_name, repo_name, reference, **params )
return client.get_artifact_with_http_info(project_name, repo_name, reference, **params)
def delete_artifact(self, project_name, repo_name, reference, expect_status_code = 200, expect_response_body = None, **kwargs):
client = self._get_client(**kwargs)
try:
_, status_code, _ = client.delete_artifact_with_http_info(project_name, repo_name, reference)
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)
def get_addition(self, project_name, repo_name, reference, addition, **kwargs):
client = self._get_client(**kwargs)
return client.get_addition_with_http_info(project_name, repo_name, reference, addition)
def add_label_to_reference(self, project_name, repo_name, reference, label_id, **kwargs):
client = self._get_client(**kwargs)

View File

@ -39,6 +39,7 @@ def _create_client(server, credential, debug, api_type="products"):
"artifact": v2_swagger_client.ArtifactApi(v2_swagger_client.ApiClient(cfg)),
"repository": v2_swagger_client.RepositoryApi(v2_swagger_client.ApiClient(cfg)),
"scan": v2_swagger_client.ScanApi(v2_swagger_client.ApiClient(cfg)),
"scanner": swagger_client.ScannersApi(swagger_client.ApiClient(cfg)),
}.get(api_type,'Error: Wrong API type')
def _assert_status_code(expect_code, return_code):

View File

@ -43,7 +43,7 @@ def cnab_push_bundle(bundle_file, target):
raise Exception(r"Fail to get sha256 in returned data: {}".format(ret))
def push_cnab_bundle(harbor_server, user, password, service_image, invocation_image, target, auto_update_bundle = True):
docker_api.docker_login(harbor_server, user, password, enable_manifest = False)
docker_api.docker_login_cmd(harbor_server, user, password, enable_manifest = False)
bundle_file = load_bundle(service_image, invocation_image)
fixed_bundle_file = cnab_fixup_bundle(bundle_file, target, auto_update_bundle = auto_update_bundle)
sha256 = cnab_push_bundle(fixed_bundle_file, target)

View File

@ -10,13 +10,13 @@ except ImportError:
pip.main(['install', 'docker'])
import docker
def docker_login(harbor_host, user, password, enable_manifest = True):
def docker_login_cmd(harbor_host, user, password, enable_manifest = True):
command = ["sudo", "docker", "login", harbor_host, "-u", user, "-p", password]
print "Docker Login Command: ", command
base.run_command(command)
if enable_manifest == True:
try:
subprocess.check_output(["./tests/apitests/python/update_docker_cfg.sh"], shell=False)
ret = subprocess.check_output(["./tests/apitests/python/update_docker_cfg.sh"], shell=False)
except subprocess.CalledProcessError, exc:
raise Exception("Failed to update docker config, error is {} {}.".format(exc.returncode, exc.output))
@ -40,7 +40,7 @@ def docker_manifest_push(index):
return index_sha256, manifest_list
def docker_manifest_push_to_harbor(index, manifests, harbor_server, user, password):
docker_login(harbor_server, user, password)
docker_login_cmd(harbor_server, user, password)
docker_manifest_create(index, manifests)
return docker_manifest_push(index)

View File

@ -46,7 +46,9 @@ def is_repo_exist_in_project(repositories, repo_name):
return True
return result
class Repository(base.Base):
class Repository(base.Base, object):
def __init__(self):
super(Repository,self).__init__(api_type = "repository")
def list_tags(self, repository, **kwargs):
client = self._get_client(**kwargs)

View File

@ -5,7 +5,10 @@ import base
import v2_swagger_client
from v2_swagger_client.rest import ApiException
class Scan(base.Base):
class Scan(base.Base, object):
def __init__(self):
super(Scan,self).__init__(api_type = "scan")
def scan_artifact(self, project_name, repo_name, reference, expect_status_code = 202, **kwargs):
client = self._get_client(**kwargs)
data, status_code, _ = client.scan_artifact_with_http_info(project_name, repo_name, reference)

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
import time
import base
import swagger_client
from swagger_client.rest import ApiException
class Scanner(base.Base, object):
def __init__(self):
super(Scanner,self).__init__(api_type = "scanner")
def scanners_get(self, **kwargs):
client = self._get_client(**kwargs)
return client.scanners_get()
def scanners_get_uuid(self, is_default = False, **kwargs):
scanners = self.scanners_get(**kwargs)
for scanner in scanners:
if scanner.is_default == is_default:
return scanner.uuid
def scanners_registration_id_patch(self, registration_id, is_default = True, **kwargs):
client = self._get_client(**kwargs)
isdefault = swagger_client.IsDefault(is_default)
client.scanners_registration_id_patch(registration_id, isdefault)

View File

@ -17,8 +17,8 @@ class TestProjects(unittest.TestCase):
def setUp(self):
self.project = Project()
self.user = User()
self.artifact = Artifact(api_type='artifact')
self.repo = Repository(api_type='repository')
self.artifact = Artifact()
self.repo = Repository()
self.label = Label()
@classmethod

View File

@ -20,8 +20,8 @@ class TestProjects(unittest.TestCase):
def setUpClass(self):
self.project = Project()
self.user = User()
self.artifact = Artifact(api_type='artifact')
self.repo = Repository(api_type='repository')
self.artifact = Artifact()
self.repo = Repository()
@classmethod
def tearDownClass(self):

View File

@ -22,8 +22,8 @@ class TestProjects(unittest.TestCase):
def setUpClass(self):
self.project= Project()
self.user= User()
self.artifact = Artifact(api_type='artifact')
self.repo= Repository(api_type='repository')
self.artifact = Artifact()
self.repo= Repository()
self.url = ADMIN_CLIENT["endpoint"]
self.user_password = "Aa123456"
self.repo_name = "hello-world"

View File

@ -18,7 +18,7 @@ class TestProjects(unittest.TestCase):
def setUpClass(self):
self.project= Project()
self.user= User()
self.repo= Repository(api_type='repository')
self.repo= Repository()
@classmethod
def tearDownClass(self):

View File

@ -10,14 +10,9 @@ from library.configurations import Configurations
class TestProjects(unittest.TestCase):
@classmethod
def setUp(self):
conf = Configurations()
self.conf= conf
project = Project()
self.project= project
user = User()
self.user= user
self.conf= Configurations()
self.project= Project()
self.user= User()
@classmethod
def tearDown(self):

View File

@ -18,7 +18,7 @@ class TestProjects(unittest.TestCase):
self.system = System()
self.project = Project()
self.user = User()
self.repo = Repository(api_type='repository')
self.repo = Repository()
@classmethod
def tearDown(self):

View File

@ -15,7 +15,7 @@ class TestProjects(unittest.TestCase):
def setUp(self):
self.project = Project()
self.user = User()
self.repo = Repository(api_type='repository')
self.repo = Repository()
@classmethod
def tearDown(self):

View File

@ -18,8 +18,8 @@ class TestProjects(unittest.TestCase):
def setUp(self):
self.project= Project()
self.user= User()
self.artifact= Artifact(api_type='artifact')
self.repo= Repository(api_type='repository')
self.artifact= Artifact()
self.repo= Repository()
@classmethod
def tearDown(self):

View File

@ -10,7 +10,7 @@ from library.system import System
class TestProjects(unittest.TestCase):
@classmethod
def setUp(cls):
cls.repo = Repository(api_type='repository')
cls.repo = Repository()
cls.system = System()
@classmethod

View File

@ -19,8 +19,8 @@ class TestProjects(unittest.TestCase):
def setUpClass(self):
self.project= Project()
self.user= User()
self.artifact = Artifact(api_type='artifact')
self.repo= Repository(api_type='repository')
self.artifact = Artifact()
self.repo= Repository()
self.url = ADMIN_CLIENT["endpoint"]
self.user_push_chart_password = "Aa123456"
self.chart_file = "https://storage.googleapis.com/harbor-builds/helm-chart-test-files/harbor-0.2.0.tgz"
@ -51,8 +51,10 @@ class TestProjects(unittest.TestCase):
1. Create a new user(UA);
2. Create a new project(PA) by user(UA);
3. Push an chart(CA) to Harbor by helm3 registry/chart CLI successfully;
4. Get chart(CA) from Harbor successfully;
5. TO_DO: Verify this chart artifact information, like digest.
4. List artifacts successfully;
5. Get chart(CA) by reference successfully;
6. Get addtion successfully;
7. Delete chart by reference successfully.
Tear down:
1. Delete repository chart(CA) by user(UA);
2. Delete project(PA);
@ -69,14 +71,27 @@ class TestProjects(unittest.TestCase):
chart_cli_ret = library.helm.helm_chart_push_to_harbor(self.chart_file, self.archive, harbor_server, TestProjects.project_push_chart_name, self.repo_name, self.verion, user_name, self.user_push_chart_password)
print "chart_cli_ret:", chart_cli_ret
#4. Get chart(CA) from Harbor successfully;
artifact = self.artifact.get_reference_info(TestProjects.project_push_chart_name, self.repo_name, self.verion, **TestProjects.USER_CLIENT)
print "artifact:", artifact
#4. List artifacts successfully;
artifacts = self.artifact.list_artifacts(TestProjects.project_push_chart_name, self.repo_name, **TestProjects.USER_CLIENT)
self.assertEqual(artifacts[0].type, 'CHART')
self.assertEqual(artifacts[0].tags[0].name, self.verion)
#5. TO_DO: Verify this chart artifact information, like digest;
#5. Get chart(CA) by reference successfully;
artifact = self.artifact.get_reference_info(TestProjects.project_push_chart_name, self.repo_name, self.verion, **TestProjects.USER_CLIENT)
self.assertEqual(artifact[0].type, 'CHART')
self.assertEqual(artifact[0].tags[0].name, self.verion)
#6. Get addtion successfully;
addition_r = self.artifact.get_addition(TestProjects.project_push_chart_name, self.repo_name, self.verion, "readme.md", **TestProjects.USER_CLIENT)
self.assertIn("Helm Chart for Harbor", addition_r[0])
addition_d = self.artifact.get_addition(TestProjects.project_push_chart_name, self.repo_name, self.verion, "dependencies", **TestProjects.USER_CLIENT)
self.assertIn("https://kubernetes-charts.storage.googleapis.com", addition_d[0])
addition_v = self.artifact.get_addition(TestProjects.project_push_chart_name, self.repo_name, self.verion, "values.yaml", **TestProjects.USER_CLIENT)
self.assertIn("adminserver", addition_v[0])
#7. Delete chart by reference successfully.
self.artifact.delete_artifact(TestProjects.project_push_chart_name, self.repo_name, self.verion, **TestProjects.USER_CLIENT)
if __name__ == '__main__':
unittest.main()

View File

@ -20,8 +20,8 @@ class TestProjects(unittest.TestCase):
def setUpClass(self):
self.project= Project()
self.user= User()
self.artifact = Artifact(api_type='artifact')
self.repo= Repository(api_type='repository')
self.artifact = Artifact()
self.repo= Repository()
self.url = ADMIN_CLIENT["endpoint"]
self.user_push_chart_password = "Aa123456"
self.cnab_repo_name = "test_cnab"

View File

@ -22,8 +22,8 @@ class TestProjects(unittest.TestCase):
def setUpClass(self):
self.project= Project()
self.user= User()
self.artifact = Artifact(api_type='artifact')
self.repo= Repository(api_type='repository')
self.artifact = Artifact()
self.repo= Repository()
self.url = ADMIN_CLIENT["endpoint"]
self.user_push_index_password = "Aa123456"
self.index_name = "ci_test_index"
@ -57,9 +57,13 @@ class TestProjects(unittest.TestCase):
2. Create a new project(PA) by user(UA);
3. Create 2 new repositorys(RA,RB) in project(PA) by user(UA);
4. Push an index(IA) to Harbor by docker manifest CLI successfully;
5. Get index(IA) from Harbor successfully;
6. Verify harbor index is index(IA) pushed by docker manifest CLI;
7. Verify harbor index(IA) can be pulled by docker CLI successfully.
5. Get Artifacts successfully;
6. Get index(IA) by reference successfully;
7. Verify harbor index is index(IA) pushed by docker manifest CLI;
8. Verify harbor index(IA) can be pulled by docker CLI successfully;
9. Get addition successfully;
10. Unable to Delete artifact in manifest list;
11. Delete index successfully.
Tear down:
1. Delete repository(RA,RB,IA) by user(UA);
2. Delete project(PA);
@ -82,18 +86,47 @@ class TestProjects(unittest.TestCase):
index = harbor_server+"/"+TestProjects.project_push_index_name+"/"+self.index_name+":"+self.index_tag
index_sha256_cli_ret, manifests_sha256_cli_ret = library.docker_api.docker_manifest_push_to_harbor(index, manifests, harbor_server, user_name, self.user_push_index_password)
#5. Get index(IA) from Harbor successfully;
#5. Get Artifacts successfully;
artifacts = self.artifact.list_artifacts(TestProjects.project_push_index_name, self.index_name, **TestProjects.USER_CLIENT)
artifacts_ref_child_list = [artifacts[0].references[1].child_digest, artifacts[0].references[0].child_digest]
self.assertEqual(artifacts_ref_child_list.count(manifests_sha256_cli_ret[0]), 1)
self.assertEqual(artifacts_ref_child_list.count(manifests_sha256_cli_ret[1]), 1)
#6. Get index(IA) by reference successfully;
index_data = self.artifact.get_reference_info(TestProjects.project_push_index_name, self.index_name, self.index_tag, **TestProjects.USER_CLIENT)
manifests_sha256_harbor_ret = [index_data[0].references[1].child_digest, index_data[0].references[0].child_digest]
#6. Verify harbor index is index(IA) pushed by docker manifest CLI;
#7. Verify harbor index is index(IA) pushed by docker manifest CLI;
self.assertEqual(index_data[0].digest, index_sha256_cli_ret)
self.assertEqual(manifests_sha256_harbor_ret.count(manifests_sha256_cli_ret[0]), 1)
self.assertEqual(manifests_sha256_harbor_ret.count(manifests_sha256_cli_ret[1]), 1)
#7. Verify harbor index(IA) can be pulled by docker CLI successfully;
#8. Verify harbor index(IA) can be pulled by docker CLI successfully;
pull_harbor_image(harbor_server, user_name, self.user_push_index_password, TestProjects.project_push_index_name+"/"+self.index_name, self.index_tag)
#9. Get addition successfully;
addition_v = self.artifact.get_addition(TestProjects.project_push_index_name, self.index_name, self.index_tag, "vulnerabilities", **TestProjects.USER_CLIENT)
self.assertEqual(addition_v[0], '{}')
#This artifact has no build history
addition_v = self.artifact.get_addition(TestProjects.project_push_index_name, self.index_name, manifests_sha256_cli_ret[0], "vulnerabilities", **TestProjects.USER_CLIENT)
self.assertEqual(addition_v[0], '{}')
addition_b = self.artifact.get_addition(TestProjects.project_push_index_name, self.index_name, manifests_sha256_cli_ret[0], "build_history", **TestProjects.USER_CLIENT)
self.assertIn("ADD file:e69d441d729412d24675dcd33e04580885df99981cec43de8c9b24015313ff8e", addition_b[0])
image_data = self.artifact.get_reference_info(TestProjects.project_push_index_name, self.index_name, manifests_sha256_cli_ret[0], **TestProjects.USER_CLIENT)
addition_v = self.artifact.get_addition(TestProjects.project_push_index_name, self.index_name, manifests_sha256_cli_ret[1], "vulnerabilities", **TestProjects.USER_CLIENT)
self.assertEqual(addition_v[0], '{}')
addition_b = self.artifact.get_addition(TestProjects.project_push_index_name, self.index_name, manifests_sha256_cli_ret[1], "build_history", **TestProjects.USER_CLIENT)
self.assertIn("ADD file:450bea8cddb743ed282cb1ade3d1614033172b93ef531c69a4e49fda3016cef0", addition_b[0])
image_data = self.artifact.get_reference_info(TestProjects.project_push_index_name, self.index_name, manifests_sha256_cli_ret[0], **TestProjects.USER_CLIENT)
#10. Unable to Delete artifact in manifest list;
self.artifact.delete_artifact(TestProjects.project_push_index_name, self.index_name, manifests_sha256_cli_ret[0], expect_status_code = 412, **TestProjects.USER_CLIENT)
#11. Delete index successfully.
self.artifact.delete_artifact(TestProjects.project_push_index_name, self.index_name, self.index_tag, **TestProjects.USER_CLIENT)
if __name__ == '__main__':
unittest.main()

View File

@ -35,7 +35,7 @@ class TestProjects(unittest.TestCase):
def setUpClass(self):
self.user = User()
self.system = System()
self.repo = Repository(api_type='repository')
self.repo = Repository()
self.project = Project()
self.retention = Retention()

View File

@ -17,7 +17,7 @@ class TestProjects(unittest.TestCase):
def setUp(self):
self.project = Project()
self.user = User()
self.repo = Repository(api_type='repository')
self.repo = Repository()
@classmethod
def tearDown(self):

View File

@ -10,20 +10,22 @@ from library.repository import Repository
from library.repository import push_image_to_project
from library.artifact import Artifact
from library.scan import Scan
from library.scanner import Scanner
class TestProjects(unittest.TestCase):
@classmethod
def setUp(self):
self.project= Project()
self.user= User()
self.artifact = Artifact(api_type='artifact')
self.repo = Repository(api_type='repository')
self.scan = Scan(api_type='scan')
self.artifact = Artifact()
self.repo = Repository()
self.scan = Scan()
self.scanner = Scanner()
@classmethod
def tearDown(self):
print "Case completed"
@unittest.skipIf(TEARDOWN == False, "Test data won't be erased.")
@unittest.skipIf(TEARDOWN == True, "Test data won't be erased.")
def test_ClearData(self):
#1. Delete repository(RA) by user(UA);
self.repo.delete_repoitory(TestProjects.project_scan_image_name, TestProjects.repo_name.split('/')[1], **TestProjects.USER_SCAN_IMAGE_CLIENT)
@ -45,6 +47,8 @@ class TestProjects(unittest.TestCase):
4. Get private project of user(UA), user(UA) can see only one private project which is project(PA);
5. Create a new repository(RA) and tag(TA) in project(PA) by user(UA);
6. Send scan image command and get tag(TA) information to check scan result, it should be finished;
7. Swith Scanner;
8. Send scan another image command and get tag(TA) information to check scan result, it should be finished.
Tear down:
1. Delete repository(RA) by user(UA);
2. Delete project(PA);
@ -69,8 +73,7 @@ class TestProjects(unittest.TestCase):
expected_project_id = TestProjects.project_scan_image_id, **TestProjects.USER_SCAN_IMAGE_CLIENT)
#Note: Please make sure that this Image has never been pulled before by any other cases,
# so it is a not-scanned image right after repository creation.
#image = "tomcat"
# so it is a not-scanned image right after repository creation.
image = "docker"
src_tag = "1.13"
#5. Create a new repository(RA) and tag(TA) in project(PA) by user(UA);
@ -78,8 +81,17 @@ class TestProjects(unittest.TestCase):
#6. Send scan image command and get tag(TA) information to check scan result, it should be finished;
self.scan.scan_artifact(TestProjects.project_scan_image_name, TestProjects.repo_name.split('/')[1], tag, **TestProjects.USER_SCAN_IMAGE_CLIENT)
self.artifact.check_image_scan_result(TestProjects.project_scan_image_name, image, tag, **TestProjects.USER_SCAN_IMAGE_CLIENT)
#6. Send scan image command and get tag(TA) information to check scan result, it should be finished;
#7. Swith Scanner;
uuid = self.scanner.scanners_get_uuid(**ADMIN_CLIENT)
self.scanner.scanners_registration_id_patch(uuid, **ADMIN_CLIENT)
image = "tomcat"
src_tag = "latest"
TestProjects.repo_name, tag = push_image_to_project(TestProjects.project_scan_image_name, harbor_server, user_scan_image_name, user_001_password, image, src_tag)
#8. Send scan another image command and get tag(TA) information to check scan result, it should be finished.
self.scan.scan_artifact(TestProjects.project_scan_image_name, TestProjects.repo_name.split('/')[1], tag, **TestProjects.USER_SCAN_IMAGE_CLIENT)
self.artifact.check_image_scan_result(TestProjects.project_scan_image_name, image, tag, **TestProjects.USER_SCAN_IMAGE_CLIENT)
if __name__ == '__main__':

View File

@ -16,8 +16,8 @@ class TestProjects(unittest.TestCase):
def setUp(self):
self.project = Project()
self.user = User()
self.artifact = Artifact(api_type='artifact')
self.repo = Repository(api_type='repository')
self.artifact = Artifact()
self.repo = Repository()
@classmethod
def tearDown(self):

View File

@ -10,6 +10,7 @@ from library.user import User
from library.repository import Repository
from library.repository import push_image_to_project
from library.artifact import Artifact
from library.scanner import Scanner
class TestProjects(unittest.TestCase):
@classmethod
@ -17,8 +18,9 @@ class TestProjects(unittest.TestCase):
self.system = System()
self.project= Project()
self.user= User()
self.artifact = Artifact(api_type='artifact')
self.repo = Repository(api_type='repository')
self.artifact = Artifact()
self.repo = Repository()
self.scanner = Scanner()
@classmethod
def tearDown(self):
@ -88,10 +90,20 @@ class TestProjects(unittest.TestCase):
self.system.scan_now(**ADMIN_CLIENT)
#5. Check if image in project_Alice and another image in project_Luca were both scanned.
#self.repo.check_image_scan_result(TestProjects.repo_Alice_name, tag_Alice, **USER_ALICE_CLIENT)
#self.repo.check_image_scan_result(TestProjects.repo_Luca_name, tag_Luca, **USER_LUCA_CLIENT)
self.artifact.check_image_scan_result(TestProjects.project_Alice_name, image_a, tag_Alice, **USER_ALICE_CLIENT)
self.artifact.check_image_scan_result(TestProjects.project_Luca_name, image_b, tag_Luca, **USER_LUCA_CLIENT)
#6. Swith Scanner;
uuid = self.scanner.scanners_get_uuid(**ADMIN_CLIENT)
self.scanner.scanners_registration_id_patch(uuid, **ADMIN_CLIENT)
#7. Trigger scan all event;
self.system.scan_now(**ADMIN_CLIENT)
#8. Check if image in project_Alice and another image in project_Luca were both scanned.
self.artifact.check_image_scan_result(TestProjects.project_Alice_name, image_a, tag_Alice, **USER_ALICE_CLIENT)
self.artifact.check_image_scan_result(TestProjects.project_Luca_name, image_b, tag_Luca, **USER_LUCA_CLIENT)
if __name__ == '__main__':
unittest.main()

View File

@ -17,6 +17,10 @@ ${SERVER_API_ENDPOINT} ${SERVER_URL}/api
&{SERVER_CONFIG} endpoint=${SERVER_API_ENDPOINT} verify_ssl=False
*** Test Cases ***
Test Case - Scan Image
Harbor API Test ./tests/apitests/python/test_scan_image_artifact.py
Test Case - Scan All Images
Harbor API Test ./tests/apitests/python/test_system_level_scan_all.py
Test Case - Garbage Collection
Harbor API Test ./tests/apitests/python/test_garbage_collection.py
Test Case - Add Private Project Member and Check User Can See It
@ -29,10 +33,6 @@ Test Case - Add Replication Rule
Harbor API Test ./tests/apitests/python/test_add_replication_rule.py
Test Case - Edit Project Creation
Harbor API Test ./tests/apitests/python/test_edit_project_creation.py
Test Case - Scan Image
Harbor API Test ./tests/apitests/python/test_scan_image_artifact.py
Test Case - Scan All Images
Harbor API Test ./tests/apitests/python/test_system_level_scan_all.py
Test Case - Manage Project Member
Harbor API Test ./tests/apitests/python/test_manage_project_member.py
Test Case - Project Level Policy Content Trust
@ -64,7 +64,7 @@ Test Case - Health Check
Harbor API Test ./tests/apitests/python/test_health_check.py
Test Case - Push Index By Docker Manifest
Harbor API Test ./tests/apitests/python/test_push_index_by_docker_manifest.py
Test Case - Push Index By Docker Manifest
Test Case - Push Chart By Helm3 Chart CLI
Harbor API Test ./tests/apitests/python/test_push_chart_by_helm3_chart_cli.py
Test Case - Push Cnab Bundle
Harbor API Test ./tests/apitests/python/test_push_cnab_bundle.py