mirror of https://github.com/goharbor/harbor.git
Update xpath for some UI components (#21817)
Update testcase for audit log enhancement Add e2e_setup for e2e testcases Signed-off-by: stonezdj <stone.zhang@broadcom.com>
This commit is contained in:
parent
280ab5a027
commit
b60bd1a69b
|
@ -50,6 +50,7 @@ src/portal/cypress/screenshots
|
|||
**/aot
|
||||
**/dist
|
||||
**/.bin
|
||||
**/robotvars.py
|
||||
src/core/conf/app.conf
|
||||
|
||||
src/server/v2.0/models/
|
||||
|
|
|
@ -9,12 +9,12 @@ class Audit_Log(base.Base):
|
|||
def __init__(self):
|
||||
super(Audit_Log, self).__init__(api_type="audit_log")
|
||||
|
||||
def get_latest_audit_log(self):
|
||||
return self.list_audit_logs(sort="-creation_time", page_size=1, page=1)[0]
|
||||
def get_latest_audit_log_ext(self):
|
||||
return self.list_auditlog_ext(sort="-creation_time", page_size=1, page=1)[0]
|
||||
|
||||
def list_audit_logs(self, sort, page_size, page, expect_status_code=200, expect_response_body=None, **kwargs):
|
||||
def list_auditlog_ext(self, sort, page_size, page, expect_status_code=200, expect_response_body=None, **kwargs):
|
||||
try:
|
||||
return_data, status_code, _ = self._get_client(**kwargs).list_audit_logs_with_http_info(sort=sort, page_size=page_size, page=page)
|
||||
return_data, status_code, _ = self._get_client(**kwargs).list_audit_log_exts_with_http_info(sort=sort, page_size=page_size, page=page)
|
||||
except ApiException as e:
|
||||
base._assert_status_code(expect_status_code, e.status)
|
||||
if expect_response_body is not None:
|
||||
|
|
|
@ -80,7 +80,7 @@ class TestAuditLogForword(unittest.TestCase, object):
|
|||
repo_name, tag = push_self_build_image_to_project(project_name, harbor_server, user_name, user_password, self.image, self.tag)
|
||||
|
||||
# 6. Verify that the Audit Log should be in the log database
|
||||
first_audit_log = self.audit_log.get_latest_audit_log()
|
||||
first_audit_log = self.audit_log.get_latest_audit_log_ext()
|
||||
self.assertEqual(first_audit_log.operation, "create")
|
||||
self.assertEqual(first_audit_log.resource, "{}:{}".format(repo_name, tag))
|
||||
self.assertEqual(first_audit_log.resource_type, "artifact")
|
||||
|
@ -101,7 +101,7 @@ class TestAuditLogForword(unittest.TestCase, object):
|
|||
self.artifact.create_tag(project_name, self.image, self.tag, self.tag2, **user_client)
|
||||
|
||||
# 10. Verify that the Audit Log should not be in log database
|
||||
second_audit_log = self.audit_log.get_latest_audit_log()
|
||||
second_audit_log = self.audit_log.get_latest_audit_log_ext()
|
||||
self.assertEqual(first_audit_log.operation, second_audit_log.operation)
|
||||
self.assertEqual(first_audit_log.resource, second_audit_log.resource)
|
||||
self.assertEqual(first_audit_log.resource_type,second_audit_log.resource_type)
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
## Guide to Harbor E2E testing
|
||||
|
||||
### Prerequisites
|
||||
|
||||
In order to run e2e testing, you need to install the following tools:
|
||||
|
||||
1. Elastic search -- required ES_ENDPOINT
|
||||
2. Dex -- OIDC testing environment -- required by OIDC login testcase, if not used, just ignore it.
|
||||
3. LDAP server -- required by LDAP login testcase. if not used, just ignore it.
|
||||
4. Webhook Server -- required by webhook testcase. WEBHOOK_ENDPOINT
|
||||
5. Dragonfly -- Required by p2p preheat testcase, DISTRIBUTION_ENDPOINT, DRAGONFLY_AUTH_TOKEN
|
||||
6. Fake Scanner -- required by scanner testcase, SCANNER_ENDPOINT
|
||||
7. Install Harbor, need to installed with https enabled. the root ca should be the root ca in harbor repository: https://github.com/goharbor/harbor/blob/main/tests/harbor_ca.crt
|
||||
|
||||
|
||||
|
||||
|
||||
#### 1. Git clone the following repositories:
|
||||
|
||||
```
|
||||
git clone https://github.com/goharbor/harbor
|
||||
```
|
||||
|
||||
#### 2. Update the tests/e2e_setup/robotvars.py in e2e_setup, update the environment variable with the prerequest env settings. change the ip to the IP address of the harbor instance
|
||||
|
||||
```
|
||||
cd tests/e2e_setup
|
||||
cp robotvars.sample.py robotvars.py
|
||||
# update the environment variable in robotvars.py
|
||||
|
||||
```
|
||||
|
||||
#### 3. Start e2e container
|
||||
|
||||
```
|
||||
./e2e_container.sh
|
||||
```
|
||||
|
||||
#### 4. Run setup, in the previous container console, run the following command.
|
||||
```
|
||||
robot -V /drone/tests/e2e_setup/robotvars.py /drone/tests/robot-cases/Group1-Nightly/Setup_Nightly.robot
|
||||
```
|
||||
|
||||
#### 5. Run robot test
|
||||
|
||||
After setup you can select to run single test or full test
|
||||
|
||||
##### 5.1 Run single test
|
||||
```
|
||||
robot --include sbom_manual_gen -V /drone/tests/e2e_setup/robotvars.py /drone/tests/robot-cases/Group1-Nightly/Trivy.robot
|
||||
```
|
||||
|
||||
##### 5.2 Run full test
|
||||
```
|
||||
robot -V /drone/tests/e2e_setup/robotvars.py /drone/tests/robot-cases/Group1-Nightly/Setup_Nightly.robot /drone/tests/robot-cases/Group1-Nightly/Common_GC.robot /drone/tests/robot-cases/Group1-Nightly/Webhook.robot /drone/tests/robot-cases/Group1-Nightly/Routing.robot /drone/tests/robot-cases/Group1-Nightly/P2P_Preheat.robot /drone/tests/robot-cases/Group1-Nightly/Trivy.robot /drone/tests/robot-cases/Group1-Nightly/DB.robot /drone/tests/robot-cases/Group1-Nightly/Common.robot /drone/tests/robot-cases/Group1-Nightly/Teardown.robot
|
||||
```
|
||||
|
||||
#### 6. Check report in the harbor source code directory.
|
||||
|
||||
After the test complete, check the test report in the harbor source code directory.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
|
||||
HARBOR_SRC_FOLDER=$(realpath ../../)
|
||||
echo ${HARBOR_SRC_FOLDER}
|
||||
|
||||
docker run -it --privileged -v /var/log/harbor:/var/log/harbor -v /etc/hosts:/etc/hosts -v ${HARBOR_SRC_FOLDER}:/drone -v ${HARBOR_SRC_FOLDER}/tests/harbor_ca.crt:/ca/ca.crt -v /dev/shm:/dev/shm -w /drone registry.goharbor.io/harbor-ci/goharbor/harbor-e2e-engine:latest-ui /bin/bash
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# all value should be string
|
||||
SCANNER_ENDPOINT = "http://<scanner_ip>:8081"
|
||||
ES_ENDPOINT = "<elastic_search_ip>:9200"
|
||||
WEBHOOK_ENDPOINT = "<webhook_server_ip>:8084"
|
||||
DISTRIBUTION_ENDPOINT = "http://<dragonfly_server_ip>:8080"
|
||||
DOCKER_USER = "<docker_user_name>"
|
||||
DOCKER_PWD = "<docker_password>"
|
||||
DRAGONFLY_AUTH_TOKEN = "<dragonfly_auth_token>"
|
||||
ip = "<harbor ip address or fqdn>"
|
||||
|
||||
# fixed value, do not change
|
||||
LOCAL_REGISTRY = "registry.goharbor.io"
|
||||
LOCAL_REGISTRY_NAMESPACE = "harbor-ci"
|
||||
HARBOR_PASSWORD = "Harbor12345"
|
||||
OIDC_HOSTNAME = "nightly-oidc.harbor.io"
|
||||
http_get_ca = "true"
|
||||
ip1 = ""
|
|
@ -184,8 +184,6 @@ Prepare Docker Cert In Ubuntu
|
|||
Wait Unitl Command Success mkdir -p /etc/docker/certs.d/${ip}
|
||||
Wait Unitl Command Success cp ${cert} /etc/docker/certs.d/${ip}
|
||||
Wait Unitl Command Success cp ${cert} /usr/local/share/ca-certificates/
|
||||
#Add pivotal ecs cert for docker manifest push test.
|
||||
Wait Unitl Command Success cp /ecs_ca/vmwarecert.crt /usr/local/share/ca-certificates/
|
||||
Wait Unitl Command Success update-ca-certificates
|
||||
|
||||
Prepare Docker Cert In Photon
|
||||
|
|
|
@ -69,7 +69,7 @@ ${retain_image_last_pull_time_label} //clr-checkbox-wrapper//label[contains(@cl
|
|||
${retain_image_last_pull_time_checkbox} //*[@id='scannerSkipUpdatePullTime']
|
||||
${banner_message_input_id} //*[@id='banner-message']
|
||||
${banner_message_type_select_id} //*[@id='banner-message-type']
|
||||
${banner_message_closable_checkbox} //div[contains(@class,'clr-checkbox-wrapper')]//label[contains(@class,'clr-control-label')]
|
||||
${banner_message_closable_checkbox} //div[contains(@class,'clr-checkbox-wrapper')]//label[contains(@class,'clr-control-label') and contains(@for, 'banner-message-closable')]
|
||||
${banner_message_from_date} (//clr-date-container)[1]//button
|
||||
${banner_message_to_date} (//clr-date-container)[2]//button
|
||||
${banner_message_date_next_month} //button[@aria-label='Next month']
|
||||
|
|
|
@ -31,7 +31,7 @@ Set LDAP Group Admin DN
|
|||
Retry Element Click ${config_auth_save_button_xpath}
|
||||
|
||||
Ldap User Should Not See Change Password
|
||||
Retry Element Click //clr-header//clr-dropdown[2]//button
|
||||
Retry Element Click //clr-header//clr-dropdown//button
|
||||
Sleep 2
|
||||
Page Should Not Contain Password
|
||||
|
||||
|
|
|
@ -24,6 +24,9 @@ Purge Now
|
|||
[Arguments] ${keep_records} ${keep_records_unit} ${expected_status}=SUCCESS ${exclude_operations}=@{EMPTY}
|
||||
Retry Text Input ${keep_records_input} ${keep_records}
|
||||
Retry Double Keywords When Error Retry Element Click ${keep_records_unit_select} Retry Element Click ${keep_records_unit_select}//option[contains(.,'${keep_records_unit}')]
|
||||
Retry Element Click ${include_event_type_create_artifact}
|
||||
Retry Element Click ${include_event_type_pull_artifact}
|
||||
Retry Element Click ${include_event_type_delete_artifact}
|
||||
${len}= Get Length ${exclude_operations}
|
||||
Run Keyword If ${len} > 0 Click Exclude Operation @{exclude_operations}
|
||||
Retry Double Keywords When Error Retry Button Click ${purge_now_btn} Retry Wait Until Page Contains Element ${latest_purge_job_status_xpath}\[contains(.,'${expected_status}')]
|
||||
|
|
|
@ -19,6 +19,9 @@ Documentation This resource provides any keywords related to the Harbor private
|
|||
${log_rotation_page_xpath} //app-clearing-job//nav//a[contains(.,'Log Rotation')]
|
||||
${keep_records_input} //*[@id='retentionTime']
|
||||
${keep_records_unit_select} //*[@id='expiration-type']
|
||||
${include_event_type_create_artifact} //*[@for='create_artifact']
|
||||
${include_event_type_pull_artifact} //*[@for='pull_artifact']
|
||||
${include_event_type_delete_artifact} //*[@for='delete_artifact']
|
||||
${latest_purge_job_status_xpath} //app-purge-history//div//clr-dg-row[1]//clr-dg-cell[4]
|
||||
${latest_purge_job_update_time_xpath} //app-purge-history//div//clr-dg-row[1]//clr-dg-cell[6]
|
||||
${purge_job_last_completed_time_xpath} //app-set-job//div//span[contains(@class,'mr-3')]
|
||||
|
|
|
@ -26,10 +26,10 @@ Refresh Logs
|
|||
Verify Log
|
||||
[Arguments] ${username} ${resource} ${resource_type} ${operation} ${row_num}=1
|
||||
Refresh Logs
|
||||
${real_username}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[1]
|
||||
${real_resource}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[2]
|
||||
${real_resource_type}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[3]
|
||||
${real_operation}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[4]
|
||||
${real_username}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[2]
|
||||
${real_resource}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[3]
|
||||
${real_resource_type}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[4]
|
||||
${real_operation}= Get Text //clr-datagrid//clr-dg-row[${row_num}]//clr-dg-cell[5]
|
||||
Should Be Equal ${real_username} ${username}
|
||||
Should Be Equal ${real_resource} ${resource}
|
||||
Should Be Equal ${real_resource_type} ${resource_type}
|
||||
|
|
|
@ -17,4 +17,4 @@ Documentation This resource provides any keywords related to the Harbor private
|
|||
|
||||
*** Variables ***
|
||||
${logs_xpath} //clr-main-container//clr-vertical-nav//a[contains(.,'Logs')]
|
||||
${logs_refresh_btn} //hbr-log//span[contains(@class,'refresh-btn')]
|
||||
${logs_refresh_btn} //hbr-audit-log//span[contains(@class,'refresh-btn')]
|
|
@ -111,7 +111,7 @@ Execute P2P Preheat
|
|||
Verify Latest Execution Result
|
||||
[Arguments] ${project_name} ${policy_name} ${contain} ${not_contain}=${null} ${expected_status}=Success
|
||||
Retry Double Keywords When Error Select P2P Preheat Policy ${policy_name} Wait Until Element Is Visible ${p2p_preheat_executions_refresh_xpath}
|
||||
Retry Keyword N Times When Error 5 Retry P2P Preheat Be Successful ${project_name} ${policy_name} ${contain} ${not_contain}
|
||||
Retry Keyword N Times When Error 10 Retry P2P Preheat Be Successful ${project_name} ${policy_name} ${contain} ${not_contain}
|
||||
|
||||
Retry P2P Preheat Be Successful
|
||||
[Arguments] ${project_name} ${policy_name} ${contain} ${not_contain}=${null} ${expected_status}=Success
|
||||
|
|
|
@ -164,7 +164,7 @@ Project Should Be Deleted
|
|||
Retry Wait Until Page Contains Element //*[@id='contentAll']//div[contains(.,'${projname}')]/../div/clr-icon[@shape='success-standard']
|
||||
|
||||
Advanced Search Should Display
|
||||
Retry Wait Until Page Contains Element xpath=//audit-log//div[@class='flex-xs-middle']/button
|
||||
Retry Wait Until Page Contains Element xpath=//project-audit-log//button[contains(., 'Advanced')]
|
||||
|
||||
# it's not a common keywords, only used into log case.
|
||||
Do Log Advanced Search
|
||||
|
@ -173,24 +173,24 @@ Do Log Advanced Search
|
|||
Retry Wait Until Page Contains Element xpath=//clr-dg-row[contains(.,'artifact') and contains(.,'delete')]
|
||||
Retry Wait Until Page Contains Element xpath=//clr-dg-row[contains(.,'project') and contains(.,'create')]
|
||||
Retry Wait Until Page Contains Element xpath=//clr-dg-row[contains(.,'repository') and contains(.,'delete')]
|
||||
Retry Element Click xpath=//audit-log//div[@class='flex-xs-middle']/button
|
||||
Retry Element Click xpath=//project-detail//audit-log//clr-dropdown/button
|
||||
Retry Element Click xpath=//project-audit-log//button[contains(., 'Advanced')]
|
||||
Retry Element Click xpath=//project-audit-log//button[contains(., 'Operations')]
|
||||
#pull log
|
||||
Retry Element Click xpath=//audit-log//clr-dropdown//a[contains(.,'Pull')]
|
||||
Retry Element Click xpath=//project-audit-log//clr-dropdown//a[contains(.,'Pull')]
|
||||
Retry Wait Until Page Not Contains Element xpath=//clr-dg-row[contains(.,'pull')]
|
||||
#create log
|
||||
Retry Element Click xpath=//audit-log//clr-dropdown/button
|
||||
Retry Element Click xpath=//audit-log//clr-dropdown//a[contains(.,'Create')]
|
||||
Retry Element Click xpath=//project-audit-log//button[contains(., 'Operations')]
|
||||
Retry Element Click xpath=//project-audit-log//clr-dropdown//a[contains(.,'Create')]
|
||||
Retry Wait Until Page Not Contains Element xpath=//clr-dg-row[contains(.,'create')]
|
||||
#delete log
|
||||
Retry Element Click xpath=//audit-log//clr-dropdown/button
|
||||
Retry Element Click xpath=//audit-log//clr-dropdown//a[contains(.,'Delete')]
|
||||
Retry Element Click xpath=//project-audit-log//button[contains(., 'Operations')]
|
||||
Retry Element Click xpath=//project-audit-log//clr-dropdown//a[contains(.,'Delete')]
|
||||
Retry Wait Until Page Not Contains Element xpath=//clr-dg-row[contains(.,'delete')]
|
||||
#others
|
||||
Retry Element Click xpath=//audit-log//clr-dropdown/button
|
||||
Retry Element Click xpath=//audit-log//clr-dropdown//a[contains(.,'Others')]
|
||||
Retry Element Click xpath=//audit-log//hbr-filter//clr-icon
|
||||
Retry Text Input xpath=//audit-log//hbr-filter//input harbor-jobservice
|
||||
Retry Element Click xpath=//project-audit-log//button[contains(., 'Operations')]
|
||||
Retry Element Click xpath=//project-audit-log//clr-dropdown//a[contains(.,'Others')]
|
||||
Retry Element Click xpath=//project-audit-log//hbr-filter//clr-icon
|
||||
Retry Text Input xpath=//project-audit-log//hbr-filter//input harbor-jobservice
|
||||
Retry Wait Until Page Not Contains Element //audit-log//clr-dg-row[2]
|
||||
|
||||
Retry Click Repo Name
|
||||
|
|
|
@ -101,6 +101,7 @@ Create A New Endpoint
|
|||
Run Keyword If '${provider}' == 'harbor' or '${provider}' == 'gitlab' Run keyword Retry Text Input xpath=${destination_url_xpath} ${url}
|
||||
Run Keyword If '${provider}' == 'aws-ecr' or '${provider}' == 'google-gcr' Run keyword Select Destination URL ${url}
|
||||
Run Keyword If '${provider}' != 'google-gcr' and '${username}' != '${null}' Retry Password Input xpath=${destination_username_xpath} ${username}
|
||||
Run Keyword If '${username}' != '${null}' Retry Text Input xpath=${destination_username_xpath} ${username}
|
||||
Run Keyword If '${pwd}' != '${null}' Retry Password Input xpath=${destination_password_xpath} ${pwd}
|
||||
#cancel verify cert since we use a selfsigned cert
|
||||
Retry Element Click ${destination_insecure_xpath}
|
||||
|
|
|
@ -17,7 +17,7 @@ Documentation This resource provides any keywords related to the Harbor private
|
|||
|
||||
*** Variables ***
|
||||
${head_admin_xpath} xpath=//clr-dropdown//button//clr-icon[@shape='user']
|
||||
${change_password_xpath} xpath=//clr-main-container//clr-dropdown//a[2]
|
||||
${change_password_xpath} xpath=//clr-main-container//clr-dropdown//a[contains(.,'Change Password')]
|
||||
${user_profile_xpath} xpath=//clr-main-container//clr-dropdown//a[1]
|
||||
${old_password_xpath} xpath=//*[@id='oldPassword']
|
||||
${new_password_xpath} xpath=//*[@id='newPassword']
|
||||
|
|
|
@ -444,18 +444,6 @@ Body Of Generate Image SBOM On Push
|
|||
Checkout And Review SBOM Details latest
|
||||
Close Browser
|
||||
|
||||
Body Of Stop SBOM Manual Generation
|
||||
Init Chrome Driver
|
||||
${d}= get current date result_format=%m%s
|
||||
${repo}= Set Variable goharbor/harbor-e2e-engine
|
||||
${tag}= Set Variable test-ui
|
||||
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
|
||||
Create An New Project And Go Into Project project${d}
|
||||
Push Image With Tag ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} project${d} ${repo} ${tag} ${tag}
|
||||
# stop generate sbom of an artifact
|
||||
Retry Action Keyword Stop SBOM Generation project${d} ${repo}
|
||||
Close Browser
|
||||
|
||||
Stop SBOM Generation
|
||||
[Arguments] ${project_name} ${repo}
|
||||
Generate Artifact SBOM ${project_name} ${repo}
|
||||
|
@ -676,7 +664,7 @@ Create Schedules For Job Service Dashboard Schedules
|
|||
Create An New P2P Preheat Policy ${p2p_policy_name} ${distribution_name} ** ** Scheduled ${schedule_type} ${schedule_cron}
|
||||
# Create a replication policy triggered by schedule
|
||||
Switch to Registries
|
||||
Create A New Endpoint harbor goharbor${d} ${null} ${null} ${null} Y
|
||||
Create A New Endpoint harbor goharbor${d} https://${LOCAL_REGISTRY} ${null} ${null} Y
|
||||
Switch To Replication Manage
|
||||
Create A Rule With Existing Endpoint ${replication_policy_name} pull harbor-ci/goharbor/harbor-core image goharbor${d} ${project_name} filter_tag=dev mode=Scheduled cron=${schedule_cron}
|
||||
# Set up a schedule to scan all
|
||||
|
|
|
@ -902,7 +902,7 @@ Test Case - Audit Log And Purge
|
|||
Logout Harbor
|
||||
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
|
||||
Switch To Logs
|
||||
Verify Log ${user} project${d} project delete
|
||||
Verify Log ${user} project${d} project delete 3
|
||||
Switch To Log Rotation
|
||||
Purge Now 1 Hours
|
||||
Close Browser
|
||||
|
|
|
@ -110,6 +110,7 @@ Test Case - Project Quotas Control Under GC
|
|||
Close Browser
|
||||
|
||||
Test Case - Garbage Collection Accessory
|
||||
[Tags] garbage_collection_accessory
|
||||
Init Chrome Driver
|
||||
${d}= Get Current Date result_format=%m%s
|
||||
${image}= Set Variable hello-world
|
||||
|
|
|
@ -144,7 +144,7 @@ Test Case - Replication Of Pull Images from DockerHub To Self
|
|||
Log All image1:${image1}
|
||||
${image2}= Get From Dictionary ${image2_with_tag} image
|
||||
@{target_images}= Create List '&{image1_with_tag}' '&{image2_with_tag}'
|
||||
Body Of Replication Of Pull Images from Registry To Self docker-hub https://hub.docker.com/ ${DOCKER_USER} ${DOCKER_PWD} ${DOCKER_USER}/{${image1}*,${image2}} ${null} N Flatten 1 Level @{target_images}
|
||||
Body Of Replication Of Pull Images from Registry To Self docker-hub ${null} ${DOCKER_USER} ${DOCKER_PWD} ${DOCKER_USER}/{${image1}*,${image2}} ${null} N Flatten 1 Level @{target_images}
|
||||
|
||||
Test Case - Replication Of Push Images from Self To Harbor
|
||||
Init Chrome Driver
|
||||
|
|
|
@ -27,7 +27,7 @@ Test Case - Main Menu Routing
|
|||
Init Chrome Driver
|
||||
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
|
||||
&{routing}= Create Dictionary harbor/projects=//projects//div//h2[contains(.,'Projects')]
|
||||
... harbor/logs=//hbr-log//div//h2[contains(.,'Logs')]
|
||||
... harbor/logs=//app-logs/h2[contains(.,'Logs')]
|
||||
... harbor/users=//harbor-user//div//h2[contains(.,'Users')]
|
||||
... harbor/robot-accounts=//system-robot-accounts//h2[contains(.,'Robot Accounts')]
|
||||
... harbor/registries=//hbr-endpoint//h2[contains(.,'Registries')]
|
||||
|
@ -65,7 +65,7 @@ Test Case - Project Tab Routing
|
|||
... harbor/projects/1/tag-strategy/immutable-tag=//project-detail//app-tag-feature-integration//app-immutable-tag
|
||||
... harbor/projects/1/robot-account=//project-detail//app-robot-account
|
||||
... harbor/projects/1/webhook=//project-detail//ng-component//button//span[contains(.,'New Webhook')]
|
||||
... harbor/projects/1/logs=//project-detail//audit-log
|
||||
... harbor/projects/1/logs=//project-detail/project-logs
|
||||
... harbor/projects/1/configs=//project-detail//app-project-config//hbr-project-policy-config
|
||||
FOR ${key} IN @{routing.keys()}
|
||||
Retry Double Keywords When Error Go To ${HARBOR_URL}/${key} Retry Wait Element ${routing['${key}']}
|
||||
|
|
|
@ -230,7 +230,7 @@ Test Case - Log Rotation Schedule Job
|
|||
Init Chrome Driver
|
||||
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
|
||||
Switch To Log Rotation
|
||||
${exclude_operations} Create List Pull
|
||||
${exclude_operations} Create List Pull artifact
|
||||
Set Log Rotation Schedule 2 Days Custom 0 */2 * * * * ${exclude_operations}
|
||||
Sleep 480
|
||||
Set Log Rotation Schedule 2 Days None
|
||||
|
|
|
@ -172,10 +172,6 @@ Test Case - Generate Image SBOM On Push
|
|||
[Tags] run-once
|
||||
Body Of Generate Image SBOM On Push
|
||||
|
||||
Test Case - Stop SBOM Manual Generation
|
||||
[Tags] stop_sbom_gen
|
||||
Body Of Stop SBOM Manual Generation
|
||||
|
||||
Test Case - External Scanner CRUD
|
||||
[Tags] external_scanner_crud need_scanner_endpoint
|
||||
${SCANNER_ENDPOINT_VALUE}= Get Variable Value ${SCANNER_ENDPOINT} ${EMPTY}
|
||||
|
|
|
@ -35,6 +35,10 @@
|
|||
{
|
||||
"branch":3,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":3,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"populate_projects":[
|
||||
|
@ -73,6 +77,10 @@
|
|||
{
|
||||
"branch":3,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":3,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_member":[
|
||||
|
@ -111,6 +119,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"set_user_admin":[
|
||||
|
@ -149,6 +161,10 @@
|
|||
{
|
||||
"branch":3,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":3,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_endpoint":[
|
||||
|
@ -187,6 +203,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_replication_rule":[
|
||||
|
@ -225,6 +245,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_sys_allowlist":[
|
||||
|
@ -247,6 +271,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"update_project_setting_allowlist":[
|
||||
|
@ -269,6 +297,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_project_robot_account":[
|
||||
|
@ -295,6 +327,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_tag_retention_rule":[
|
||||
|
@ -317,6 +353,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":1,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_tag_immutability_rule":[
|
||||
|
@ -335,6 +375,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":1,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_webhook":[
|
||||
|
@ -357,6 +401,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"update_interrogation_services":[
|
||||
|
@ -379,6 +427,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":1,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"push_artifact_index":[
|
||||
|
@ -393,6 +445,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":1,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_distribution":[
|
||||
|
@ -403,6 +459,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":1,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"add_p2p_preheat_policy":[
|
||||
|
@ -413,6 +473,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":1,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"get_ca":[
|
||||
|
@ -451,6 +515,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"set_url":[
|
||||
|
@ -489,6 +557,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"update_systemsetting":[
|
||||
|
@ -515,6 +587,10 @@
|
|||
{
|
||||
"branch":2,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":2,
|
||||
"version":"2.12"
|
||||
}
|
||||
],
|
||||
"populate_quotas":[
|
||||
|
@ -533,6 +609,10 @@
|
|||
{
|
||||
"branch":1,
|
||||
"version":"2.2"
|
||||
},
|
||||
{
|
||||
"branch":1,
|
||||
"version":"2.12"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -354,8 +354,12 @@ class HarborAPI:
|
|||
def add_project_robot_account(self, project, robot_account, **kwargs):
|
||||
r = request(url+"projects?name="+project+"", 'get')
|
||||
projectid = str(r.json()[0]['project_id'])
|
||||
|
||||
create_url = url
|
||||
print("robot_account:", robot_account)
|
||||
print("branch:", kwargs["branch"])
|
||||
print("version:", kwargs["version"])
|
||||
if kwargs["branch"] == 1:
|
||||
create_url = url+"projects/"+projectid+"/robots"
|
||||
if len(robot_account["access"]) == 1:
|
||||
robot_account_ac = robot_account["access"][0]
|
||||
payload = {
|
||||
|
@ -383,10 +387,34 @@ class HarborAPI:
|
|||
}
|
||||
else:
|
||||
raise Exception(r"Error: Robot account count {} is not legal!".format(len(robot_account["access"])))
|
||||
elif kwargs["branch"] == 2:
|
||||
create_url = url+"/robots"
|
||||
if len(robot_account["access"]) == 1:
|
||||
robot_account_ac = robot_account["access"][0]
|
||||
payload = {
|
||||
"name":robot_account["name"],
|
||||
"level":"project",
|
||||
"duration": -1,
|
||||
"permissions":[
|
||||
{"access":[{"resource":"repository","action":robot_account_ac["action"]}],
|
||||
"kind":"project","namespace":project}]
|
||||
}
|
||||
elif len(robot_account["access"]) == 2:
|
||||
payload = {
|
||||
"name":robot_account["name"],
|
||||
"level":"project",
|
||||
"duration": -1,
|
||||
"permissions":[
|
||||
{"access":[{"resource":"repository","action":"pull"},
|
||||
{"resource":"repository","action":"push"}],
|
||||
"kind":"project","namespace":project}]
|
||||
}
|
||||
else:
|
||||
raise Exception(r"Error: Robot account count {} is not legal!".format(len(robot_account["access"])))
|
||||
else:
|
||||
raise Exception(r"Error: Feature {} has no branch {}.".format(sys._getframe().f_code.co_name, branch))
|
||||
body=dict(body=payload)
|
||||
request(url+"projects/"+projectid+"/robots", 'post', **body)
|
||||
request(create_url, 'post', **body)
|
||||
|
||||
@get_feature_branch
|
||||
def add_tag_retention_rule(self, project, tag_retention_rule, **kwargs):
|
||||
|
|
Loading…
Reference in New Issue