harbor/tests/resources/Harbor-Pages/Project.robot
Yang Jiao 41297f8474
[cherry-pick]Add security hub UI test case (#19449)
Add security hub UI test case

Fix #19270

Signed-off-by: Yang Jiao <jiaoya@vmware.com>
2023-10-17 00:35:45 +08:00

421 lines
21 KiB
Plaintext

# Copyright Project Harbor Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License
*** Settings ***
Documentation This resource provides any keywords related to the Harbor private registry appliance
Resource ../../resources/Util.robot
*** Variables ***
*** Keywords ***
Create An New Project And Go Into Project
[Arguments] ${projectname} ${public}=false ${count_quota}=${null} ${storage_quota}=${null} ${storage_quota_unit}=${null} ${proxy_cache}=${false} ${registry}=${null}
Navigate To Projects
FOR ${n} IN RANGE 1 8
${out} Run Keyword And Ignore Error Retry Button Click xpath=${create_project_button_xpath}
Log All Return value is ${out[0]}
Exit For Loop If '${out[0]}'=='PASS'
END
Log To Console Project Name: ${projectname}
Retry Text Input xpath=${project_name_xpath} ${projectname}
${element_project_public}= Set Variable xpath=${project_public_xpath}
Run Keyword If '${public}' == 'true' Run Keywords Wait Until Element Is Visible And Enabled ${element_project_public} AND Retry Element Click ${element_project_public}
Run Keyword If '${count_quota}'!='${null}' Input Count Quota ${count_quota}
Run Keyword If '${storage_quota}'!='${null}' Input Storage Quota ${storage_quota} ${storage_quota_unit}
Run Keyword If '${proxy_cache}' == '${true}' Run Keywords Retry Element Click ${project_proxy_cache_switcher_xpath} AND Retry Element Click ${project_registry_select_id} AND Retry Element Click xpath=//select[@id='registry']//option[contains(.,'${registry}')]
Retry Double Keywords When Error Retry Element Click ${create_project_OK_button_xpath} Retry Wait Until Page Not Contains Element ${create_project_OK_button_xpath}
Go Into Project ${projectname} has_image=${false}
Create An New Project With New User
[Arguments] ${url} ${username} ${email} ${realname} ${newPassword} ${comment} ${projectname} ${public}
Create An New User url=${url} username=${username} email=${email} realname=${realname} newPassword=${newPassword} comment=${comment}
Logout Harbor
Sign In Harbor ${url} ${username} ${newPassword}
Create An New Project And Go Into Project ${projectname} ${public}
Artifact Exist
[Arguments] ${tag_name}
Retry Wait Until Page Contains Element //artifact-list-tab//clr-datagrid//clr-dg-row[contains(.,'sha256') and contains(.,'${tag_name}')]
Go To Project Log
#Switch To Project Tab Overflow
Retry Element Click xpath=${project_log_xpath}
Switch To Member
Retry Element Click xpath=${project_member_xpath}
Switch To Replication
Retry Element Click xpath=${project_replication_xpath}
Switch To Project Configuration
Retry Element Click ${project_config_tabsheet}
Switch To Tag Retention
#Switch To Project Tab Overflow
Retry Element Click xpath=${project_tag_strategy_xpath}
Switch To Tag Immutability
#Switch To Project Tab Overflow
Retry Double Keywords When Error Retry Element Click xpath=${project_tag_strategy_xpath} Retry Wait Until Page Contains Element ${project_tag_immutability_switch}
Retry Double Keywords When Error Retry Element Click xpath=${project_tag_immutability_switch} Retry Wait Until Page Contains Immutability rules
Switch To Project Tab Overflow
Retry Element Click xpath=${project_tab_overflow_btn}
Navigate To Projects
Retry Element Click xpath=${projects_xpath}
Project Should Display
[Arguments] ${projectname}
Retry Wait Element xpath=//projects//list-project//clr-dg-cell/a[contains(.,'${projectname}')]
Project Should Not Display
[Arguments] ${projectname}
Retry Wait Until Page Not Contains Element xpath=//projects//list-project//clr-dg-cell/a[contains(.,'${projectname}')]
Search Private Projects
Retry Element Click xpath=//select
Retry Element Click xpath=//select/option[@value=1]
Make Project Private
[Arguments] ${projectname}
Go Into Project ${project name}
Switch To Project Configuration
Retry Checkbox Should Be Selected ${project_config_public_checkbox}
Retry Double Keywords When Error Retry Element Click ${project_config_public_checkbox_label} Retry Checkbox Should Not Be Selected ${project_config_public_checkbox}
Retry Element Click //button[contains(.,'SAVE')]
Go Into Project ${project name}
Switch To Project Configuration
Retry Checkbox Should Not Be Selected ${project_config_public_checkbox}
Make Project Public
[Arguments] ${projectname}
Go Into Project ${project name}
Switch To Project Configuration
Retry Checkbox Should Not Be Selected ${project_config_public_checkbox}
Retry Double Keywords When Error Retry Element Click ${project_config_public_checkbox_label} Retry Checkbox Should Be Selected ${project_config_public_checkbox}
Retry Element Click //button[contains(.,'SAVE')]
Go Into Project ${project name}
Switch To Project Configuration
Retry Checkbox Should Be Selected ${project_config_public_checkbox}
Repo Exist
[Arguments] ${pro_name} ${repo_name}
Retry Wait Until Page Contains Element //clr-dg-row[contains(.,'${pro_name}/${repo_name}')]
Repo Not Exist
[Arguments] ${pro_name} ${repo_name}
Retry Wait Until Page Not Contains Element //clr-dg-row[contains(.,'${pro_name}/${repo_name}')]
Filter Repo
[Arguments] ${pro_name} ${repo_name} ${exsit}=${true}
${filter_dist_input_visible}= Run Keyword and Return Status Element Should Not Be Visible ${filter_dist_input}
IF ${filter_dist_input_visible}
Retry Double Keywords When Error Retry Element Click ${filter_dist_btn} Wait Until Element Is Visible And Enabled ${filter_dist_input}
END
Retry Clear Element Text ${filter_dist_input}
Retry Text Input ${filter_dist_input} ${pro_name}/${repo_name}
Run Keyword If ${exsit}==${true} Repo Exist ${pro_name} ${repo_name}
... ELSE Repo Not Exist ${pro_name} ${repo_name}
Delete Repo
[Arguments] ${pro_name} ${repo_name}
${element_repo_checkbox}= Set Variable xpath=//clr-dg-row[contains(.,'${pro_name}/${repo_name}')]//div[contains(@class,'clr-checkbox-wrapper')]//label[contains(@class,'clr-control-label')]
Filter Repo ${pro_name} ${repo_name}
Retry Double Keywords When Error Retry Element Click ${element_repo_checkbox} Wait Until Element Is Visible And Enabled ${repo_delete_btn}
Retry Double Keywords When Error Retry Element Click ${repo_delete_btn} Wait Until Element Is Visible And Enabled ${delete_confirm_btn}
Retry Double Keywords When Error Retry Element Click ${delete_confirm_btn} Retry Wait Until Page Not Contains Element ${delete_confirm_btn}
Retry Wait Until Page Not Contains Element ${element_repo_checkbox}
Filter Repo ${pro_name} ${repo_name} exsit=${false}
Delete Repo on CardView
[Arguments] ${reponame}
Retry Element Click //hbr-gridview//span[contains(.,'${reponame}')]//clr-dropdown/button
Retry Element Click //hbr-gridview//span[contains(.,'${reponame}')]//clr-dropdown/clr-dropdown-menu/button[contains(.,'Delete')]
Retry Element Click ${repo_delete_on_card_view_btn}
Delete Project
[Arguments] ${projectname}
Navigate To Projects
Retry Element Click xpath=//clr-dg-row[contains(.,'${projectname}')]//div[contains(@class,'clr-checkbox-wrapper')]//label[contains(@class,'clr-control-label')]
Retry Element Click ${project_action_xpath}
Retry Element Click xpath=//*[@id='delete-project']
Retry Element Click //clr-modal//button[contains(.,'DELETE')]
Project Should Not Be Deleted
[Arguments] ${projname}
Delete Project ${projname}
Retry Wait Until Page Contains Element //*[@id='contentAll']//div[contains(.,'${projname}')]/../div/clr-icon[@shape='error-standard']
Project Should Be Deleted
[Arguments] ${projname}
Delete Project ${projname}
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
# it's not a common keywords, only used into log case.
Do Log Advanced Search
Retry Wait Until Page Contains Element xpath=//clr-dg-row[contains(.,'artifact') and contains(.,'pull')]
Retry Wait Until Page Contains Element xpath=//clr-dg-row[contains(.,'artifact') and contains(.,'create')]
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
#pull log
Retry Element Click xpath=//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 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 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 Wait Until Page Not Contains Element //audit-log//clr-dg-row[2]
Retry Click Repo Name
[Arguments] ${repo_name_element}
FOR ${n} IN RANGE 1 2
${out} Run Keyword And Ignore Error Retry Double Keywords When Error Retry Element Click ${repo_name_element} Retry Wait Element ${tag_table_column_vulnerabilities}
Exit For Loop If '${out[0]}'=='PASS'
END
Should Be Equal As Strings '${out[0]}' 'PASS'
FOR ${n} IN RANGE 1 2
${out} Run Keyword And Ignore Error Retry Wait Until Page Not Contains Element ${repo_list_spinner}
Exit For Loop If '${out[0]}'=='PASS'
END
Should Be Equal As Strings '${out[0]}' 'PASS'
Go Into Project
[Arguments] ${project} ${has_image}=${true}
FOR ${n} IN RANGE 1 4
${out} Run Keyword And Ignore Error Retry Go Into Project ${project} ${has_image}
Run Keyword If '${out[0]}'=='PASS' Exit For Loop
Reload Page
Sleep 2
END
Run Keyword If '${out[0]}'=='FAIL' Capture Page Screenshot
Should Be Equal As Strings '${out[0]}' 'PASS'
Retry Go Into Project
[Arguments] ${project} ${has_image}
Retry Text Input ${search_input} ${project}
Wait Until Page Contains Element //list-project-ro//a[contains(., '${project}')]
Retry Link Click //list-project-ro//a[contains(., '${project}')]
Wait Until Page Contains Element //project-detail//h1[contains(., '${project}')]
Run Keyword If ${has_image}==${false} Wait Until Element Is Visible And Enabled //clr-dg-placeholder[contains(.,\"We couldn\'t find any repositories!\")]
... ELSE Wait Until Element Is Visible And Enabled //project-detail//hbr-repository-gridview//clr-dg-cell[contains(.,'${project}/')]
Go Into Repo
[Arguments] ${project_name} ${repo_name}
FOR ${n} IN RANGE 1 4
${out} Run Keyword And Ignore Error Retry Go Into Repo ${project_name} ${repo_name}
Run Keyword If '${out[0]}'=='PASS' Exit For Loop
Reload Page
Sleep 2
END
Run Keyword If '${out[0]}'=='FAIL' Capture Page Screenshot
Should Be Equal As Strings '${out[0]}' 'PASS'
Retry Go Into Repo
[Arguments] ${project_name} ${repo_name}
Retry Text Input ${search_input} ${project_name}/${repo_name}
Wait Until Page Contains Element //list-repository-ro//a[contains(., '${project_name}/${repo_name}')]
Retry Link Click //list-repository-ro//a[contains(., '${project_name}/${repo_name}')]
Wait Until Page Contains Element //artifact-list-page//h2[contains(., '${repo_name}')]
Click Index Achieve
[Arguments] ${tag_name}
Retry Element Click //artifact-list-tab//clr-datagrid//clr-dg-row[contains(.,'sha256') and contains(.,'${tag_name}')]//clr-dg-cell[1]//clr-tooltip//a
Go Into Index And Contain Artifacts
[Arguments] ${tag_name} ${total_artifact_count}=3 ${archive_count}=0 ${return_immediately}=${false}
Run Keyword If '${total_artifact_count}' == '${null}' Return From Keyword PASS
Should Not Be Empty ${tag_name}
Retry Double Keywords When Error Click Index Achieve ${tag_name} Page Should Contain Element ${tag_table_column_os_arch}
FOR ${n} IN RANGE 1 10
${out1} Run Keyword And Ignore Error Page Should Contain Element ${artifact_rows} limit=${total_artifact_count}
${out2} Run Keyword And Ignore Error Page Should Contain Element ${archive_rows} limit=${archive_count}
Exit For Loop If '${out1[0]}'=='PASS' and '${out2[0]}'=='PASS'
Sleep 3
END
${result}= Set Variable If '${out1[0]}'=='FAIL' or '${out2[0]}'=='FAIL' FAIL PASS
Return From Keyword If '${return_immediately}' == '${true}' ${result}
Should Be Equal As Strings '${out1[0]}' 'PASS'
Should Be Equal As Strings '${out2[0]}' 'PASS'
Switch To CardView
Retry Element Click xpath=//hbr-repository-gridview//span[@class='card-btn']/clr-icon
Expand Repo
[Arguments] ${projectname}
Retry Element Click //repository//clr-dg-row[contains(.,'${projectname}')]//button/clr-icon
Edit Repo Info
Retry Element Click //*[@id='repo-info']
Retry Wait Until Page Contains Element //*[@id='info']/form/div[2]
# Cancel input
Retry Element Click xpath=//*[@id='info-edit-button']/button
Input Text xpath=//*[@id='info-edit-textarea'] test_description_info
Retry Element Click xpath=//*[@id='edit-cancel']
Retry Element Click xpath=//clr-modal//button[contains(.,'CONFIRM')]
Retry Wait Until Page Contains Element //*[@id='no-editing']
# Confirm input
Retry Element Click xpath=//*[@id='info-edit-button']/button
Input Text xpath=//*[@id='info-edit-textarea'] test_description_info
Retry Element Click xpath=//*[@id='edit-save']
Retry Wait Until Page Contains test_description_info
Switch To Project Label
Retry Element Click xpath=//project-detail//a[contains(.,'Labels')]
Switch To Project Repo
Retry Element Click xpath=//project-detail//a[contains(.,'Repositories')]
Add Labels To Tag
[Arguments] ${tagName} ${labelName}
Retry Element Click xpath=//clr-dg-row[contains(.,'${tagName}')]//label[contains(@class,'clr-control-label')]
Retry Element Click xpath=//clr-dg-action-bar//clr-dropdown//span
Retry Element Click xpath=//clr-dropdown-menu//clr-dropdown//button[contains(.,'Add Labels')]
Retry Element Click xpath=//clr-dropdown//div//label[contains(.,'${labelName}')]
Retry Wait Until Page Contains Element xpath=//clr-dg-row//label[contains(.,'${labelName}')]
Filter Labels In Tags
[Arguments] ${labelName1} ${labelName2}
Retry Element Click xpath=//*[@id='search-btn']
Retry Element Click xpath=//*[@id='type-select']
Retry Element Click xpath=//*[@id='type-select']/option[@value='labels']
Retry Wait Until Page Contains Element xpath=//*[@id='filterArea']//div//button[contains(.,'${labelName1}')]
Retry Element Click xpath=//*[@id='filterArea']//div//button[contains(.,'${labelName1}')]
Retry Element Click xpath=//app-artifact-filter//clr-icon[contains(@shape,'search')]
Retry Wait Until Page Contains Element xpath=//clr-datagrid//label[contains(.,'${labelName1}')]
Retry Element Click xpath=//*[@id='search-btn']
Retry Element Click xpath=//*[@id='filterArea']//div//button[contains(.,'${labelName2}')]
Retry Element Click xpath=//app-artifact-filter//clr-icon[contains(@shape,'search')]
Retry Wait Until Page Contains Element xpath=//clr-dg-row[contains(.,'${labelName2}')]
Retry Wait Until Page Not Contains Element xpath=//clr-dg-row[contains(.,'${labelName1}')]
Get Statics
[Arguments] ${locator}
Reload Page
Wait Until Element Is Visible And Enabled ${locator}
${privaterepo}= Get Text ${locator}
[Return] ${privaterepo}
Retry Get Statics
[Arguments] ${locator}
@{param} Create List ${locator}
${ret}= Retry Keyword N Times When Error 5 Get Statics @{param}
[Return] ${ret}
Get Statics Private Repo
${privaterepo}= Retry Get Statics ${project_statistics_private_repository_icon}
[Return] ${privaterepo}
Get Statics Private Project
${privateproj}= Retry Get Statics //projects/div/div/div[1]/div/statistics-panel/div/div[1]/div/div[1]/div[2]
[Return] ${privateproj}
Get Statics Public Repo
${publicrepo}= Retry Get Statics //projects/div/div/div[1]/div/statistics-panel/div/div[1]/div/div[2]/div[2]
[Return] ${publicrepo}
Get Statics Public Project
${publicproj}= Retry Get Statics //projects/div/div/div[1]/div/statistics-panel/div/div[1]/div/div[2]/div[2]
[Return] ${publicproj}
Get Statics Total Repo
${totalrepo}= Retry Get Statics //projects/div/div/div[1]/div/statistics-panel/div/div[2]/div/div[3]/div[2]
[Return] ${totalrepo}
Get Statics Total Project
${totalproj}= Retry Get Statics //projects/div/div/div[1]/div/statistics-panel/div/div[1]/div/div[3]/div[2]
[Return] ${totalproj}
Input Count Quota
[Arguments] ${text}
${element_xpath}= Set Variable ${project_add_count_quota_input_text_id}
Retry Clear Element Text ${element_xpath}
Retry Text Input ${element_xpath} ${text}
Input Storage Quota
[Arguments] ${text} ${unit}=${null}
${element_xpath}= Set Variable ${project_add_storage_quota_input_text_id}
Retry Clear Element Text ${element_xpath}
Retry Text Input ${element_xpath} ${text}
Run Keyword If '${unit}'!='${null}' Select Storage Quota unit ${unit}
Select Storage Quota unit
[Arguments] ${unit}
Select From List By Value ${project_add_storage_quota_unit_id} ${unit}
Back Project Home
[Arguments] ${project_name}
Retry Link Click //a[contains(.,'${project_name}')]
Should Not Be Signed By Cosign
[Arguments] ${tag}
Retry Wait Element Visible //clr-dg-row[contains(.,'${tag}')]//clr-icon[contains(@class,'color-red')]
Should Be Signed By Cosign
[Arguments] ${tag}
Retry Wait Element Visible //clr-dg-row[contains(.,'${tag}')]//clr-icon[contains(@class,'signed')]
Delete Accessory
[Arguments] ${tag}
Retry Button Click //clr-dg-row[contains(.,'${tag}')]//button[contains(@class,'datagrid-expandable-caret-button')]
Retry Button Click //clr-dg-row[contains(.,'${tag}')]//button[contains(@class,'datagrid-action-toggle')]
Retry Button Click //button[contains(.,'Delete')]
Retry Button Click //div[contains(@class,'modal-content')]//button[contains(@class,'btn-danger')]
Should be Accessory deleted
[Arguments] ${tag}
Retry Wait Until Page Not Contains Element //clr-dg-row[contains(.,'${tag}')]//button[contains(@class,'datagrid-expandable-caret-button')]
Export CVEs
[Arguments] ${project} ${repositories} ${tags} ${labels} ${cve_ids}
Filter Project ${project}
Retry Element Click //clr-dg-row[contains(.,'${project}')]//div[contains(@class,'clr-checkbox-wrapper')]//label[contains(@class,'clr-control-label')]
Retry Element Click ${project_action_xpath}
Retry Button Click ${export_cve_btn}
Retry Text Input ${export_cve_filter_repo_input} ${repositories}
Retry Text Input ${export_cve_filter_tag_input} ${tags}
Select Filter Label @{labels}
Retry Text Input ${export_cve_filter_cveid_input} ${cve_ids}
Retry Double Keywords When Error Retry Button Click ${export_btn} Retry Wait Until Page Contains Trigger exporting CVEs successfully!
Should Not Be Export CVEs
Retry Element Click ${project_action_xpath}
Retry Wait Element Should Be Disabled ${export_cve_btn}
Retry Element Click ${project_action_xpath}
Download Latest CVE CSV File
Retry Element Click ${event_log_xpath}
${csv_file_name}= Get Text ${latest_cve_csv_file_name_xpath}
${csv_file_path}= Set Variable ${download_directory}/${csv_file_name}.csv
Retry Double Keywords When Error Retry Element Click ${latest_download_cve_csv_file_xpath} Retry Wait Until Page Does Not Contains ${csv_file_name}
Retry File Should Exist ${csv_file_path}
[Return] ${csv_file_path}