Fix quotas test issue in upgrade pipeline

1. Change way for quotas verification in upgrade pipeline, prepare specific size of image, then it's an known value for verifcation;
2. Add notary key rotate test;
3. For issue brought by docker 20, clean containerd cache is the only effective way, so both dockerd and containerd should be cache cleard and restarted;
4. Upgrade E2E Dockerfile for importing readable file size package, and other issues;
5. Uncomment project level robot account test in nightly.
6. Get DNS from local setting, and set it into docker deamon config file;

Signed-off-by: danfengliu <danfengl@vmware.com>
This commit is contained in:
danfengliu 2021-02-25 11:57:27 +08:00
parent 4c47b1777e
commit a2fc1bcfaf
29 changed files with 304 additions and 788 deletions

View File

@ -92,6 +92,32 @@ def _get_string_from_unicode(udata):
result = result + tmp.strip('\n\r\t') result = result + tmp.strip('\n\r\t')
return result return result
def restart_process(process):
if process == "dockerd":
full_process_name = process
elif process == "containerd":
full_process_name = "/usr/local/bin/containerd"
else:
raise Exception("Please input dockerd or containerd for process retarting.")
run_command_with_popen("ps aux |grep " + full_process_name)
for i in range(10):
pid = run_command_with_popen(["pidof " + full_process_name])
if pid in [None, ""]:
break
run_command_with_popen(["kill " + str(pid)])
time.sleep(3)
run_command_with_popen("ps aux |grep " + full_process_name)
run_command_with_popen("rm -rf /var/lib/" + process + "/*")
run_command_with_popen(full_process_name + " > ./daemon-local.log 2>&1 &")
time.sleep(3)
pid = run_command_with_popen(["pidof " + full_process_name])
if pid in [None, ""]:
raise Exception("Failed to start process {}.".format(full_process_name))
run_command_with_popen("ps aux |grep " + full_process_name)
def run_command_with_popen(command): def run_command_with_popen(command):
print("Command: ", subprocess.list2cmdline(command)) print("Command: ", subprocess.list2cmdline(command))
@ -100,11 +126,14 @@ def run_command_with_popen(command):
stdout=subprocess.PIPE,stderr=subprocess.STDOUT) stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output, errors = proc.communicate() output, errors = proc.communicate()
except Exception as e: except Exception as e:
print("Error:", e) print("Run command caught exception:", e)
output = None
else: else:
print(proc.returncode, errors, output) print(proc.returncode, errors, output)
finally: finally:
proc.stdout.close() proc.stdout.close()
print("output: ", output)
return output
def run_command(command, expected_error_message = None): def run_command(command, expected_error_message = None):
print("Command: ", subprocess.list2cmdline(command)) print("Command: ", subprocess.list2cmdline(command))

View File

@ -1,6 +1,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import unittest import unittest
import time
from testutils import ADMIN_CLIENT, suppress_urllib3_warning from testutils import ADMIN_CLIENT, suppress_urllib3_warning
from testutils import harbor_server from testutils import harbor_server
@ -12,6 +13,8 @@ from library.repository import Repository
from library.repository import push_self_build_image_to_project from library.repository import push_self_build_image_to_project
from library.repository import pull_harbor_image from library.repository import pull_harbor_image
from library.docker_api import docker_image_clean_all from library.docker_api import docker_image_clean_all
from library.base import restart_process
class TestProjects(unittest.TestCase): class TestProjects(unittest.TestCase):
@suppress_urllib3_warning @suppress_urllib3_warning
def setUp(self): def setUp(self):
@ -78,6 +81,9 @@ class TestProjects(unittest.TestCase):
#7. Pull image(IA) failed and the reason is "The image is not signed in Notary". #7. Pull image(IA) failed and the reason is "The image is not signed in Notary".
docker_image_clean_all() docker_image_clean_all()
restart_process("containerd")
restart_process("dockerd")
time.sleep(30)
pull_harbor_image(harbor_server, ADMIN_CLIENT["username"], ADMIN_CLIENT["password"], TestProjects.repo_name, tag, expected_error_message = "The image is not signed in Notary") pull_harbor_image(harbor_server, ADMIN_CLIENT["username"], ADMIN_CLIENT["password"], TestProjects.repo_name, tag, expected_error_message = "The image is not signed in Notary")
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -45,11 +45,11 @@ class TestProjects(unittest.TestCase):
@unittest.skipIf(TEARDOWN == False, "Test data won't be erased.") @unittest.skipIf(TEARDOWN == False, "Test data won't be erased.")
def tearDown(self): def tearDown(self):
#TODO delete_repository will fail when no tags left anymore #TODO delete_repository will fail when no tags left anymore
# resp=self.repo.list_repositories(TestProjects.project_src_repo_id, **TestProjects.USER_RA_CLIENT) resp=self.repo.list_repositories(TestProjects.project_src_repo_name, **TestProjects.USER_RA_CLIENT)
# for repo in resp: for repo in resp:
# self.repo.delete_repository(repo.name, **TestProjects.USER_RA_CLIENT) self.repo.delete_repository(TestProjects.project_src_repo_name, repo.name.split('/')[1], **TestProjects.USER_RA_CLIENT)
# self.project.delete_project(TestProjects.project_src_repo_id, **TestProjects.USER_RA_CLIENT) self.project.delete_project(TestProjects.project_src_repo_id, **TestProjects.USER_RA_CLIENT)
# self.user.delete_user(TestProjects.user_ra_id, **ADMIN_CLIENT) self.user.delete_user(TestProjects.user_ra_id, **ADMIN_CLIENT)
print("Case completed") print("Case completed")
def testTagRetention(self): def testTagRetention(self):

View File

@ -18,6 +18,33 @@ cat /proc/version
sudo -H pip install --ignore-installed urllib3 chardet requests --upgrade sudo -H pip install --ignore-installed urllib3 chardet requests --upgrade
python --version python --version
#---------------Set DNS for docker v20-------------------#
# In docker v20, it fixed an issue named "Wrong resolv.conf
# used on Ubuntu 19", this fix caused DNS solve problem
# in container. So the current work round is read DNS server
# from system and set the value in /etc/docker/daemon.json.
ip addr
dns_ip=$(netplan ip leases eth0 | grep -i dns | awk -F = '{print $2}')
dns_ip_list=$(echo $dns_ip | tr " " "\n")
dns_cfg=""
for ip in $dns_ip_list
do
dns_cfg="$dns_cfg,\"$ip\""
done
cat /etc/docker/daemon.json
if [ $(cat /etc/docker/daemon.json |grep \"dns\" |wc -l) -eq 0 ];then
sudo sed "s/}/,\n \"dns\": [${dns_cfg:1}]\n}/" -i /etc/docker/daemon.json
fi
cat /etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl status docker
#--------------------------------------------------------#
sudo ./tests/hostcfg.sh sudo ./tests/hostcfg.sh
if [ "$2" = 'LDAP' ]; then if [ "$2" = 'LDAP' ]; then

View File

@ -18,7 +18,7 @@ harbor_logs_bucket="harbor-ci-logs"
#echo "content_language = en" >> $botofile #echo "content_language = en" >> $botofile
#echo "default_project_id = $GS_PROJECT_ID" >> $botofile #echo "default_project_id = $GS_PROJECT_ID" >> $botofile
DIR="$(cd "$(dirname "$0")" && pwd)" DIR="$(cd "$(dirname "$0")" && pwd)"
E2E_IMAGE="goharbor/harbor-e2e-engine:2.6.2" E2E_IMAGE="goharbor/harbor-e2e-engine:2.6.3"
# GS util # GS util
function uploader { function uploader {

View File

@ -1,11 +1,14 @@
FROM ubuntu:18.04 FROM ubuntu:18.04
ENV LANG C.UTF-8 ENV LANG C.UTF-8
# V 2.0 # V 2.0
# V 2.0.1: upgrade docker to version 19.03.12. # V 2.0.1: Upgrade docker to version 19.03.12.
# V 2.5 Add support for e2e py-test (especially containerd). # V 2.5 Add support for e2e py-test (especially containerd).
# V 2.6 docker 19.03.12. # V 2.6 Upgrade docker 19.03.12.
# V 2.6.1 upgrade containerd(ctr) to v1.4.3, docker 20.10.3. # V 2.6.1 Upgrade containerd(ctr) to v1.4.3, docker 20.10.3.
# V 2.6.2 package busybox into E2E image. # V 2.6.2 Package busybox into E2E image.
# V 2.6.3 a. Swith python version from 3.7 to 3.6;
# b. Upgrade and fix cnab-to-oci build issue;
# c. Install hurry.filesize tool in python.
RUN apt-get update && apt-get install -y --no-install-recommends wget curl gnupg2 RUN apt-get update && apt-get install -y --no-install-recommends wget curl gnupg2
RUN apt-get install libseccomp2 RUN apt-get install libseccomp2
@ -66,8 +69,8 @@ RUN apt-get update && apt-get install -y software-properties-common && \
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y golang-go apt-get install -y golang-go
RUN apt-get update -y ; apt-get install -y zbar-tools libzbar-dev python-zbar python3.7 RUN apt-get update -y ; apt-get install -y zbar-tools libzbar-dev python-zbar python3.6
RUN rm /usr/bin/python ; ln -s /usr/bin/python3.7 /usr/bin/python ; apt-get install -y python3-pip RUN rm /usr/bin/python ; ln -s /usr/bin/python3.6 /usr/bin/python ; apt-get install -y python3-pip
RUN python -m pip install --upgrade pip RUN python -m pip install --upgrade pip
RUN wget -N http://chromedriver.storage.googleapis.com/2.40/chromedriver_linux64.zip && \ RUN wget -N http://chromedriver.storage.googleapis.com/2.40/chromedriver_linux64.zip && \
@ -82,7 +85,7 @@ RUN apt-get update && apt install libnss3-tools && \
echo Harbor12345 > password.ca && \ echo Harbor12345 > password.ca && \
certutil -d sql:$HOME/.pki/nssdb -N -f password.ca certutil -d sql:$HOME/.pki/nssdb -N -f password.ca
RUN pip3 install pyasn1 google-apitools==0.5.31 gsutil robotframework==3.2.1 robotframework-sshlibrary robotframework-httplibrary requests dbbot robotframework-seleniumlibrary==4.3.0 robotframework-pabot robotframework-JSONLibrary --upgrade RUN pip3 install pyasn1 google-apitools==0.5.31 gsutil robotframework==3.2.1 robotframework-sshlibrary robotframework-httplibrary requests dbbot robotframework-seleniumlibrary==4.3.0 robotframework-pabot robotframework-JSONLibrary hurry.filesize --upgrade
ENV CONTAINERD_VERSION 1.4.3 ENV CONTAINERD_VERSION 1.4.3
RUN wget https://github.com/containerd/containerd/releases/download/v1.4.3/containerd-$CONTAINERD_VERSION-linux-amd64.tar.gz && \ RUN wget https://github.com/containerd/containerd/releases/download/v1.4.3/containerd-$CONTAINERD_VERSION-linux-amd64.tar.gz && \
@ -147,8 +150,8 @@ RUN wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz &&
cd /ixdba.net/bin && \ cd /ixdba.net/bin && \
mv expect /usr/local/bin/expect mv expect /usr/local/bin/expect
RUN CNAB_PATH=$(go env GOPATH)/src/github.com/docker && mkdir -p $CNAB_PATH && cd $CNAB_PATH && git clone https://github.com/cnabio/cnab-to-oci.git && \ RUN CNAB_PATH=$(go env GOPATH)/src/github.com/cnabio && mkdir -p $CNAB_PATH && cd $CNAB_PATH && git clone https://github.com/cnabio/cnab-to-oci.git && \
cd cnab-to-oci && git checkout v0.3.0-beta4 && \ cd cnab-to-oci && git checkout v0.3.1-beta1 && \
go list && \ go list && \
make build && \ make build && \
mv bin/cnab-to-oci /usr/local/bin mv bin/cnab-to-oci /usr/local/bin

BIN
tests/e2e-image/busybox.tar Normal file

Binary file not shown.

View File

@ -27,7 +27,7 @@ Pull image
Log To Console \nRunning docker pull ${image}... Log To Console \nRunning docker pull ${image}...
${image_with_tag}= Set Variable If '${tag}'=='${null}' ${image} ${image}:${tag} ${image_with_tag}= Set Variable If '${tag}'=='${null}' ${image} ${image}:${tag}
Run Keyword If ${is_robot}==${false} Wait Unitl Command Success docker login -u ${user} -p ${pwd} ${ip} Run Keyword If ${is_robot}==${false} Wait Unitl Command Success docker login -u ${user} -p ${pwd} ${ip}
... ELSE Wait Unitl Command Success docker login -u robot\\\$${user} -p ${pwd} ${ip} ... ELSE Wait Unitl Command Success docker login -u robot\\\$${project}+${user} -p ${pwd} ${ip}
${output}= Docker Pull ${ip}/${project}/${image_with_tag} ${output}= Docker Pull ${ip}/${project}/${image_with_tag}
Log ${output} Log ${output}
Log To Console ${output} Log To Console ${output}
@ -48,7 +48,7 @@ Push image
${image_in_use}= Set Variable If ${need_pull_first}==${true} ${image_in_use} ${image_with_or_without_tag} ${image_in_use}= Set Variable If ${need_pull_first}==${true} ${image_in_use} ${image_with_or_without_tag}
Run Keyword If ${need_pull_first}==${true} Docker Pull ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image_in_use} Run Keyword If ${need_pull_first}==${true} Docker Pull ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image_in_use}
Run Keyword If ${is_robot}==${false} Wait Unitl Command Success docker login -u ${user} -p ${pwd} ${ip} Run Keyword If ${is_robot}==${false} Wait Unitl Command Success docker login -u ${user} -p ${pwd} ${ip}
... ELSE Wait Unitl Command Success docker login -u robot\\\$${user} -p ${pwd} ${ip} ... ELSE Wait Unitl Command Success docker login -u robot\\\$${project}+${user} -p ${pwd} ${ip}
Run Keyword If ${need_pull_first}==${true} Wait Unitl Command Success docker tag ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image_in_use} ${ip}/${project}/${image_in_use_with_tag} Run Keyword If ${need_pull_first}==${true} Wait Unitl Command Success docker tag ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image_in_use} ${ip}/${project}/${image_in_use_with_tag}
... ELSE Wait Unitl Command Success docker tag ${image_in_use} ${ip}/${project}/${image_in_use_with_tag} ... ELSE Wait Unitl Command Success docker tag ${image_in_use} ${ip}/${project}/${image_in_use_with_tag}
Wait Unitl Command Success docker push ${ip}/${project}/${image_in_use_with_tag} Wait Unitl Command Success docker push ${ip}/${project}/${image_in_use_with_tag}
@ -70,8 +70,10 @@ Push Image With Tag
Clean All Local Images Clean All Local Images
Clean All Local Images Clean All Local Images
Wait Unitl Command Success docker rmi -f $(docker images -a -q) ${rc} ${out}= Run Keyword And Ignore Error Run docker rmi -f $(docker images -a -q)
Wait Unitl Command Success docker system prune -a -f Log All ${out}
${rc} ${out}= Run Keyword And Ignore Error Run docker system prune -a -f
Log All ${out}
Cannot Docker Login Harbor Cannot Docker Login Harbor
[Arguments] ${ip} ${user} ${pwd} [Arguments] ${ip} ${user} ${pwd}
@ -79,6 +81,8 @@ Cannot Docker Login Harbor
Cannot Pull Image Cannot Pull Image
[Arguments] ${ip} ${user} ${pwd} ${project} ${image} ${tag}=${null} ${err_msg}=${null} [Arguments] ${ip} ${user} ${pwd} ${project} ${image} ${tag}=${null} ${err_msg}=${null}
Restart Process Locally containerd
Restart Process Locally dockerd
${image_with_tag}= Set Variable If '${tag}'=='${null}' ${image} ${image}:${tag} ${image_with_tag}= Set Variable If '${tag}'=='${null}' ${image} ${image}:${tag}
Wait Unitl Command Success docker login -u ${user} -p ${pwd} ${ip} Wait Unitl Command Success docker login -u ${user} -p ${pwd} ${ip}
FOR ${idx} IN RANGE 0 30 FOR ${idx} IN RANGE 0 30
@ -86,17 +90,11 @@ Cannot Pull Image
Exit For Loop If '${out[0]}'=='PASS' Exit For Loop If '${out[0]}'=='PASS'
Sleep 3 Sleep 3
END END
Clean All Local Images
Log To Console Cannot Pull Image - Pull Log: ${out[1]} Log To Console Cannot Pull Image - Pull Log: ${out[1]}
Should Be Equal As Strings '${out[0]}' 'PASS' Should Be Equal As Strings '${out[0]}' 'PASS'
Run Keyword If '${err_msg}' != '${null}' Should Contain ${out[1]} ${err_msg} Run Keyword If '${err_msg}' != '${null}' Should Contain ${out[1]} ${err_msg}
Cannot Pull Unsigned Image
[Arguments] ${ip} ${user} ${pass} ${proj} ${imagewithtag}
Wait Unitl Command Success docker login -u ${user} -p ${pass} ${ip}
${output}= Command Should be Failed docker pull ${ip}/${proj}/${imagewithtag}
Log To Console ${output}
Should Contain ${output} The image is not signed in Notary
Cannot Push image Cannot Push image
[Arguments] ${ip} ${user} ${pwd} ${project} ${image} ${err_msg}=${null} ${err_msg_2}=${null} [Arguments] ${ip} ${user} ${pwd} ${project} ${image} ${err_msg}=${null} ${err_msg_2}=${null}
Log To Console \nRunning docker push ${image}... Log To Console \nRunning docker push ${image}...
@ -108,6 +106,7 @@ Cannot Push image
Run Keyword If '${err_msg}' != '${null}' Should Contain ${output} ${err_msg} Run Keyword If '${err_msg}' != '${null}' Should Contain ${output} ${err_msg}
Run Keyword If '${err_msg_2}' != '${null}' Should Contain ${output} ${err_msg_2} Run Keyword If '${err_msg_2}' != '${null}' Should Contain ${output} ${err_msg_2}
Wait Unitl Command Success docker logout ${ip} Wait Unitl Command Success docker logout ${ip}
Clean All Local Images
Wait Until Container Stops Wait Until Container Stops
[Arguments] ${container} [Arguments] ${container}
@ -149,9 +148,9 @@ Start Docker Daemon Locally
[Return] ${handle} [Return] ${handle}
Start Containerd Daemon Locally Start Containerd Daemon Locally
${handle}= Start Process containerd > ./daemon-local.log 2>&1 & shell=True ${handle}= Start Process /usr/local/bin/containerd > ./daemon-local.log 2>&1 & shell=True
FOR ${IDX} IN RANGE 5 FOR ${IDX} IN RANGE 5
${pid}= Run pidof containerd ${pid}= Run pidof /usr/local/bin/containerd
Log To Console pid: ${pid} Log To Console pid: ${pid}
Exit For Loop If '${pid}' != '${EMPTY}' Exit For Loop If '${pid}' != '${EMPTY}'
Sleep 2s Sleep 2s
@ -159,27 +158,40 @@ Start Containerd Daemon Locally
Sleep 2s Sleep 2s
[Return] ${handle} [Return] ${handle}
Restart Docker Daemon Locally Restart Process Locally
[Arguments] ${process}
${full_process}= Set Variable If
... '${process}'=='containerd' /usr/local/bin/containerd dockerd
${start_process_cmd}= Set Variable If
... '${process}'=='dockerd' /usr/local/bin/dockerd-entrypoint.sh dockerd>./daemon-local.log 2>&1
... '${process}'=='containerd' ${full_process} > ./daemon-local.log 2>&1 &
Should Be True '${start_process_cmd}' != '${EMPTY}'
Run Keyword If '${process}'=='dockerd' OperatingSystem.File Should Exist /usr/local/bin/dockerd-entrypoint.sh
FOR ${IDX} IN RANGE 5 FOR ${IDX} IN RANGE 5
${pid}= Run pidof dockerd ${pid}= Run pidof ${full_process}
Exit For Loop If '${pid}' == '${EMPTY}' Exit For Loop If '${pid}' == '${EMPTY}'
${result}= Run Process kill ${pid} shell=True ${result}= Run kill ${pid}
Log To Console Kill docker process: ${result} Log To Console Kill docker process: ${result}
Sleep 2s Sleep 2s
END END
${pid}= Run pidof dockerd ${pid}= Run pidof ${full_process}
Should Be Equal As Strings '${pid}' '${EMPTY}' Should Be Equal As Strings '${pid}' '${EMPTY}'
OperatingSystem.File Should Exist /usr/local/bin/dockerd-entrypoint.sh
${result}= Run Process rm -rf /var/lib/docker/* shell=True ${result}= Run rm -rf /var/lib/${process}/*
Log To Console Clear /var/lib/docker: ${result} Log All Clear /var/lib/${process}: ${result}
${handle}= Start Process /usr/local/bin/dockerd-entrypoint.sh dockerd>./daemon-local.log 2>&1 shell=True ${handle}= Start Process ${start_process_cmd} shell=True
Process Should Be Running ${handle} Log All handle : ${handle}
FOR ${IDX} IN RANGE 5 FOR ${IDX} IN RANGE 5
${pid}= Run pidof dockerd ${pid}= Run pidof ${full_process}
Log All pid : ${pid}
Exit For Loop If '${pid}' != '${EMPTY}' Exit For Loop If '${pid}' != '${EMPTY}'
Sleep 2s Sleep 2s
END END
Sleep 2s Sleep 2s
#Process Should Be Running ${handle}
${result}= Run ps aux |grep ${full_process}
Log All result : ${result}
[Return] ${handle} [Return] ${handle}
Prepare Docker Cert Prepare Docker Cert
@ -217,7 +229,7 @@ Docker Login
Docker Pull Docker Pull
[Arguments] ${image} [Arguments] ${image}
${output}= Retry Keyword N Times When Error 2 Wait Unitl Command Success docker pull ${image} ${output}= Retry Keyword N Times When Error 6 Wait Unitl Command Success docker pull ${image}
Log All Docker Pull: ${output} Log All Docker Pull: ${output}
[Return] ${output} [Return] ${output}
@ -245,6 +257,7 @@ Docker Image Can Not Be Pulled
Log To Console Docker pull return value is ${out} Log To Console Docker pull return value is ${out}
Sleep 3 Sleep 3
END END
Clean All Local Images
Log To Console Cannot Pull Image From Docker - Pull Log: ${out[1]} Log To Console Cannot Pull Image From Docker - Pull Log: ${out[1]}
Should Be Equal As Strings '${out[0]}' 'PASS' Should Be Equal As Strings '${out[0]}' 'PASS'
@ -259,5 +272,6 @@ Docker Image Can Be Pulled
Exit For Loop If '${out[0]}'=='PASS' Exit For Loop If '${out[0]}'=='PASS'
Sleep 5 Sleep 5
END END
Clean All Local Images
Run Keyword If '${out[0]}'=='FAIL' Capture Page Screenshot Run Keyword If '${out[0]}'=='FAIL' Capture Page Screenshot
Should Be Equal As Strings '${out[0]}' 'PASS' Should Be Equal As Strings '${out[0]}' 'PASS'

View File

@ -90,8 +90,9 @@ Switch To Project Tab Overflow
Navigate To Projects Navigate To Projects
Reload Page Reload Page
Sleep 3
Retry Element Click xpath=${projects_xpath} Retry Element Click xpath=${projects_xpath}
Sleep 2 Sleep 1
Project Should Display Project Should Display
[Arguments] ${projectname} [Arguments] ${projectname}
@ -235,12 +236,12 @@ Go Into Repo
Retry Wait Until Page Not Contains Element ${repo_list_spinner} Retry Wait Until Page Not Contains Element ${repo_list_spinner}
${repo_name_element}= Set Variable xpath=//clr-dg-cell[contains(.,'${repoName}')]/a ${repo_name_element}= Set Variable xpath=//clr-dg-cell[contains(.,'${repoName}')]/a
FOR ${n} IN RANGE 1 3 FOR ${n} IN RANGE 1 3
Reload Page
Retry Element Click ${repo_search_icon} Retry Element Click ${repo_search_icon}
Retry Clear Element Text ${repo_search_input} Retry Clear Element Text ${repo_search_input}
Retry Text Input ${repo_search_input} ${repoName} Retry Text Input ${repo_search_input} ${repoName}
${out} Run Keyword And Ignore Error Retry Wait Until Page Contains Element ${repo_name_element} ${out} Run Keyword And Ignore Error Retry Wait Until Page Contains Element ${repo_name_element}
Sleep 2 Sleep 2
Run Keyword If '${out[0]}'=='FAIL' Reload Page
Continue For Loop If '${out[0]}'=='FAIL' Continue For Loop If '${out[0]}'=='FAIL'
Retry Click Repo Name ${repo_name_element} Retry Click Repo Name ${repo_name_element}
Sleep 2 Sleep 2
@ -330,7 +331,7 @@ Get Statics
Retry Get Statics Retry Get Statics
[Arguments] ${locator} [Arguments] ${locator}
@{param} Create List ${locator} @{param} Create List ${locator}
${ret}= Retry Keyword N Times When Error 3 Get Statics @{param} ${ret}= Retry Keyword N Times When Error 5 Get Statics @{param}
[Return] ${ret} [Return] ${ret}
Get Statics Private Repo Get Statics Private Repo

View File

@ -16,7 +16,8 @@ Create A Robot Account And Return Token
Switch To Project Robot Account Switch To Project Robot Account
Retry Element Click ${project_robot_account_create_btn} Retry Element Click ${project_robot_account_create_btn}
Retry Text Input ${project_robot_account_create_name_input} ${robot_account_name} Retry Text Input ${project_robot_account_create_name_input} ${robot_account_name}
Retry Element Click ${project_robot_account_never_expired_chkbox} Retry Element Click xpath=//select[@id='expiration-type']
Retry Element Click xpath=//select[@id='expiration-type']//option[@value='never']
Retry Double Keywords When Error Retry Element Click ${project_robot_account_create_save_btn} Retry Wait Until Page Not Contains Element ${project_robot_account_create_save_btn} Retry Double Keywords When Error Retry Element Click ${project_robot_account_create_save_btn} Retry Wait Until Page Not Contains Element ${project_robot_account_create_save_btn}
${token}= Get Value ${project_robot_account_token_input} ${token}= Get Value ${project_robot_account_token_input}
[Return] ${token} [Return] ${token}

View File

@ -5,6 +5,5 @@ Documentation This resource provides any keywords related to the Harbor robot-a
${project_robot_account_tabpage} xpath=//project-detail//a[contains(.,'Robot Accounts')] ${project_robot_account_tabpage} xpath=//project-detail//a[contains(.,'Robot Accounts')]
${project_robot_account_create_btn} xpath=//project-detail/app-robot-account//button ${project_robot_account_create_btn} xpath=//project-detail/app-robot-account//button
${project_robot_account_token_input} xpath=//app-robot-account//hbr-copy-input//input ${project_robot_account_token_input} xpath=//app-robot-account//hbr-copy-input//input
${project_robot_account_never_expired_chkbox} xpath=//add-robot//clr-checkbox-wrapper/label[contains(.,'Never Expired')] ${project_robot_account_create_name_input} //input[@id='name']
${project_robot_account_create_name_input} //input[@id='robot_name'] ${project_robot_account_create_save_btn} //button[@id='system-robot-save']
${project_robot_account_create_save_btn} //add-robot//button[contains(.,'SAVE')]

View File

@ -229,7 +229,7 @@ Select Rule And Replicate
Retry Double Keywords When Error Retry Element Click xpath=${dialog_replicate} Retry Wait Until Page Not Contains Element xpath=${dialog_replicate} Retry Double Keywords When Error Retry Element Click xpath=${dialog_replicate} Retry Wait Until Page Not Contains Element xpath=${dialog_replicate}
Image Should Be Replicated To Project Image Should Be Replicated To Project
[Arguments] ${project} ${image} ${period}=60 ${times}=3 ${tag}=${null} ${expected_image_size_in_regexp}=${null} [Arguments] ${project} ${image} ${period}=60 ${times}=20 ${tag}=${null} ${expected_image_size_in_regexp}=${null}
FOR ${n} IN RANGE 0 ${times} FOR ${n} IN RANGE 0 ${times}
Sleep ${period} Sleep ${period}
Go Into Project ${project} Go Into Project ${project}

View File

@ -1,4 +1,5 @@
*** settings *** *** settings ***
Library ../../robot-cases/Group3-Upgrade/util.py
Resource ../../resources/Util.robot Resource ../../resources/Util.robot
*** Keywords *** *** Keywords ***
@ -548,15 +549,22 @@ Loop P2P Preheat Policys
Verify Quotas Display Verify Quotas Display
[Arguments] ${json} [Arguments] ${json}
Log To Console "Verify Quotas Display..." Log To Console "Verify Quotas Display..."
@{project}= Get Value From Json ${json} $.projects.[*].name @{project}= Get Value From Json ${json} $.quotas.[*].name
Init Chrome Driver Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
FOR ${project} IN @{project} FOR ${project} IN @{project}
${is_proxy_project}= Evaluate "proxy" in """${project}"""
Continue For Loop If '${is_proxy_project}' == '${true}'
${storage_quota_ret}= Get Project Storage Quota Text From Project Quotas List ${project} ${storage_quota_ret}= Get Project Storage Quota Text From Project Quotas List ${project}
${storage_quota_expected_display}= Get Value From Json ${json} $.projects[?(@.name=${project})].quotas_usage_display ${storage_limit}= Get Value From Json ${json} $.quotas[?(@.name=${project})].storage_limit
Log All storage_quota_expected_display:${storage_quota_expected_display} ${size}= Get Value From Json ${json} $.quotas[?(@.name=${project})].size
Should Match Regexp ${storage_quota_ret} ${storage_quota_expected_display}[0] ${size_in_mb}= Evaluate ${size}[0] * 1024 * 1024
${storage_usage}= Convert Int To Readable File Size ${size_in_mb}
${storage_usage_without_unit}= Get Substring ${storage_usage} 0 -2
${storage_usage_unit}= Get Substring ${storage_usage} -2
${storage_total_size}= Convert Int To Readable File Size ${storage_limit}[0]
Log All storage_usage_without_unit:${storage_usage_without_unit}
Log All storage_usage_unit:${storage_usage_unit}
Log All storage_total_size:${storage_total_size}
Log All storage_quota_ret:${storage_quota_ret}
Should Match Regexp ${storage_quota_ret} ${storage_usage_without_unit}(\\\.\\d{1,2})*${storage_usage_unit} of ${storage_total_size}
END END
Close Browser Close Browser

View File

@ -97,9 +97,16 @@ Enable Notary Client
Log ${output} Log ${output}
Should Be Equal As Integers ${rc} 0 Should Be Equal As Integers ${rc} 0
Remove Notary Signature Notary Remove Signature
[Arguments] ${ip} ${image} [Arguments] ${ip} ${project} ${image} ${tag} ${user} ${pwd}
${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/notary-remove-image-signature.expect ${ip} library ${image} ${notaryServerEndpoint} ${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/notary-util.sh remove ${ip} ${project} ${image} ${tag} ${notaryServerEndpoint} ${user} ${pwd}
Log To Console ${output}
Log ${output}
Should Be Equal As Integers ${rc} 0
Notary Key Rotate
[Arguments] ${ip} ${project} ${image} ${tag} ${user} ${pwd}
${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/notary-util.sh key_rotate ${ip} ${project} ${image} ${tag} ${notaryServerEndpoint} ${user} ${pwd}
Log To Console ${output} Log To Console ${output}
Log ${output} Log ${output}
Should Be Equal As Integers ${rc} 0 Should Be Equal As Integers ${rc} 0

View File

@ -53,9 +53,6 @@ Nightly Test Setup For Nightly
Run Keyword Start Docker Daemon Locally Run Keyword Start Docker Daemon Locally
Log To Console Start Containerd Daemon Locally ... Log To Console Start Containerd Daemon Locally ...
Run Keyword Start Containerd Daemon Locally Run Keyword Start Containerd Daemon Locally
#Prepare docker image for push special image keyword in replication test
Docker Pull ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/busybox:latest
Docker Tag ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/busybox:latest busybox:latest
CA Setup For Nightly CA Setup For Nightly
[Arguments] ${ip} ${HARBOR_PASSWORD} ${cert}=/ca/ca.crt [Arguments] ${ip} ${HARBOR_PASSWORD} ${cert}=/ca/ca.crt

View File

@ -153,22 +153,34 @@ Body Of List Helm Charts
Multi-delete Chart Files ${prometheus_chart_name} ${harbor_chart_name} Multi-delete Chart Files ${prometheus_chart_name} ${harbor_chart_name}
Close Browser Close Browser
Body Of Push Signed Image
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
${user}= Set Variable user010
${pwd}= Set Variable Test1@34
Sign In Harbor ${HARBOR_URL} ${user} ${pwd}
Create An New Project And Go Into Project project${d}
Body Of Admin Push Signed Image project${d} tomcat latest ${user} ${pwd}
Body Of Admin Push Signed Image project${d} alpine latest ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Close Browser
Body Of Admin Push Signed Image Body Of Admin Push Signed Image
[Arguments] ${image}=tomcat ${project}=library ${with_remove}=${false} [Arguments] ${project} ${image} ${tag} ${user} ${pwd} ${with_remove}=${false}
Enable Notary Client Enable Notary Client
Docker Pull ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image} Docker Pull ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image}
${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/notary-push-image.sh ${ip} ${project} ${image} latest ${notaryServerEndpoint} ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image}:latest ${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/notary-push-image.sh ${ip} ${project} ${image} ${tag} ${notaryServerEndpoint} ${LOCAL_REGISTRY}/${LOCAL_REGISTRY_NAMESPACE}/${image}:${tag} ${user} ${pwd}
Clean All Local Images
Log ${output} Log ${output}
Should Be Equal As Integers ${rc} 0 Should Be Equal As Integers ${rc} 0
${rc} ${output}= Run And Return Rc And Output curl -u admin:Harbor12345 -s --insecure -H "Content-Type: application/json" -X GET "https://${ip}/api/v2.0/projects/${project}/repositories/${image}/artifacts/latest?with_signature=true" ${rc} ${output}= Run And Return Rc And Output curl -u admin:Harbor12345 -s --insecure -H "Content-Type: application/json" -X GET "https://${ip}/api/v2.0/projects/${project}/repositories/${image}/artifacts/${tag}?with_signature=true"
Log To Console ${output} Log To Console ${output}
Should Be Equal As Integers ${rc} 0 Should Be Equal As Integers ${rc} 0
Should Contain ${output} "signed":true Should Contain ${output} "signed":true
Run Keyword If ${with_remove} == ${true} Remove Notary Signature ${ip} ${image} Run Keyword If ${with_remove} == ${true} Notary Remove Signature ${ip} ${project} ${image} ${tag} ${user} ${pwd}
Delete A Project Without Sign In Harbor Delete A Project Without Sign In Harbor
[Arguments] ${harbor_ip}=${ip} ${username}=${HARBOR_ADMIN} ${password}=${HARBOR_PASSWORD} [Arguments] ${harbor_ip}=${ip} ${username}=${HARBOR_ADMIN} ${password}=${HARBOR_PASSWORD}

View File

@ -90,7 +90,7 @@ Wait Until Element Is Visible And Enabled
Retry Action Keyword Retry Action Keyword
[Arguments] ${keyword} @{param} [Arguments] ${keyword} @{param}
Retry Keyword N Times When Error 3 ${keyword} @{param} Retry Keyword N Times When Error 4 ${keyword} @{param}
Retry Wait Element Retry Wait Element
[Arguments] ${element_xpath} [Arguments] ${element_xpath}

View File

@ -159,5 +159,4 @@ Test Case - Metrics
Test Case - Project Level Policy Content Trust Test Case - Project Level Policy Content Trust
[Tags] content_trust [Tags] content_trust
Restart Docker Daemon Locally
Harbor API Test ./tests/apitests/python/test_project_level_policy_content_trust.py Harbor API Test ./tests/apitests/python/test_project_level_policy_content_trust.py

View File

@ -3,7 +3,9 @@
#docker pull $3:$4 #docker pull $3:$4
IP=$1 IP=$1
PASSHRASE='Harbor12345' USER=$7
PWD=$8
PASSHRASE=$8
notaryServerEndpoint=$5 notaryServerEndpoint=$5
tag_src=$6 tag_src=$6
echo $IP echo $IP
@ -28,6 +30,6 @@ export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE=$PASSHRASE
export DOCKER_CONTENT_TRUST_OFFLINE_PASSPHRASE=$PASSHRASE export DOCKER_CONTENT_TRUST_OFFLINE_PASSPHRASE=$PASSHRASE
export DOCKER_CONTENT_TRUST_TAGGING_PASSPHRASE=$PASSHRASE export DOCKER_CONTENT_TRUST_TAGGING_PASSPHRASE=$PASSHRASE
docker login -u admin -p Harbor12345 $IP docker login -u $USER -p $PWD $IP
docker tag $tag_src $IP/$2/$3:$4 docker tag $tag_src $IP/$2/$3:$4
docker push $IP/$2/$3:$4 docker push $IP/$2/$3:$4

View File

@ -0,0 +1,33 @@
#!/bin/bash
CMD=$1
HOST=$2
PROJECT=$3
IMAGE=$4
TAG=$5
NOTARY_SERVER_ENDPOINT=$6
USER=$7
PWD=$8
PASSHRASE=$8
export DOCKER_CONTENT_TRUST=1
export NOTARY_ROOT_PASSPHRASE=$PASSHRASE
export NOTARY_TARGETS_PASSPHRASE=$PASSHRASE
export NOTARY_SNAPSHOT_PASSPHRASE=$PASSHRASE
export DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE=$PASSHRASE
export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE=$PASSHRASE
export DOCKER_CONTENT_TRUST_OFFLINE_PASSPHRASE=$PASSHRASE
export DOCKER_CONTENT_TRUST_TAGGING_PASSPHRASE=$PASSHRASE
export NOTARY_AUTH=$(echo $USER:$PWD | base64)
echo $USER:$PWD
NOTARY_CMD_OPTIONS="notary -s https://$NOTARY_SERVER_ENDPOINT --tlscacert /notary_ca.crt -d /root/.docker/trust"
if [ "$CMD" == "key_rotate" ]; then
echo "$NOTARY_CMD_OPTIONS key rotate $HOST/$PROJECT/$IMAGE snapshot -r"
$NOTARY_CMD_OPTIONS key rotate $HOST/$PROJECT/$IMAGE snapshot -r
elif [ "$CMD" == "remove" ]; then
echo "$NOTARY_CMD_OPTIONS remove -p $HOST/$PROJECT/$IMAGE $TAG"
$NOTARY_CMD_OPTIONS remove -p $HOST/$PROJECT/$IMAGE $TAG
fi

View File

@ -610,18 +610,18 @@ Test Case - Tag Immutability
Delete Success busybox Delete Success busybox
Close Browser Close Browser
#TODO in 2.2: Modify this case when new robot account feature is ready. Test Case - Robot Account
#Test Case - Robot Account [tags] robot_account
# Init Chrome Driver Init Chrome Driver
# ${d}= Get Current Date result_format=%m%s ${d}= Get Current Date result_format=%m%s
# Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
# Create An New Project And Go Into Project project${d} Create An New Project And Go Into Project project${d}
# ${token}= Create A Robot Account And Return Token project${d} robot${d} ${token}= Create A Robot Account And Return Token project${d} robot${d}
# Log To Console ${token} Log To Console ${token}
# Log ${token} Log ${token}
# Push image ${ip} robot${d} ${token} project${d} hello-world:latest is_robot=${true} Push image ${ip} robot${d} ${token} project${d} hello-world:latest is_robot=${true}
# Pull image ${ip} robot${d} ${token} project${d} hello-world:latest is_robot=${true} Pull image ${ip} robot${d} ${token} project${d} hello-world:latest is_robot=${true}
# Close Browser Close Browser
Test Case - Push Docker Manifest Index and Display Test Case - Push Docker Manifest Index and Display
Init Chrome Driver Init Chrome Driver

View File

@ -1,675 +0,0 @@
// Copyright (c) 2017 VMware, Inc. All Rights Reserved.
//
// 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 Harbor BATs
Resource ../../resources/Util.robot
Suite Setup Nightly Test Setup ${ip} ${SSH_PWD} ${HARBOR_PASSWORD} ${ip1}
Suite Teardown Collect Nightly Logs ${ip} ${SSH_PWD} ${ip1}
Default Tags Nightly
*** Variables ***
${HARBOR_URL} https://${ip}
${SSH_USER} root
${HARBOR_ADMIN} admin
*** Test Cases ***
Test Case - Get Harbor Version
#Just get harbor version and log it
Get Harbor Version
Test Case - Read Only Mode
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=tester${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=true
Enable Read Only
Cannot Push image ${ip} tester${d} Test1@34 project${d} busybox:latest
Disable Read Only
Push image ${ip} tester${d} Test1@34 project${d} busybox:latest
Close Browser
Test Case - Repo Size
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Push Image With Tag ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library alpine 2.6 2.6
Go Into Project library
Go Into Repo alpine
Page Should Contain 1.92MB
Close Browser
Test Case - Staticsinfo
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
${privaterepocount1}= Get Statics Private Repo
${privateprojcount1}= Get Statics Private Project
${publicrepocount1}= Get Statics Public Repo
${publicprojcount1}= Get Statics Public Project
${totalrepocount1}= Get Statics Total Repo
${totalprojcount1}= Get Statics Total Project
Create An New Project private${d}
Create An New Project public${d} true
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} private${d} hello-world
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} public${d} hello-world
Reload Page
${privaterepocount2}= Get Statics Private Repo
${privateprojcount2}= get statics private project
${publicrepocount2}= get statics public repo
${publicprojcount2}= get statics public project
${totalrepocount2}= get statics total repo
${totalprojcount2}= get statics total project
${privateprojcount}= evaluate ${privateprojcount1}+1
${privaterepocount}= evaluate ${privaterepocount1}+1
${publicprojcount}= evaluate ${publicprojcount1}+1
${publicrepocount}= evaluate ${publicrepocount1}+1
${totalrepocount}= evaluate ${totalrepocount1}+2
${totalprojcount}= evaluate ${totalprojcount1}+2
Should Be Equal As Integers ${privateprojcount2} ${privateprojcount}
Should be equal as integers ${privaterepocount2} ${privaterepocount}
Should be equal as integers ${publicprojcount2} ${publicprojcount}
Should be equal as integers ${publicrepocount2} ${publicrepocount}
Should be equal as integers ${totalprojcount2} ${totalprojcount}
Should be equal as integers ${totalrepocount2} ${totalrepocount}
Test Case - Create An New User
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Close Browser
Test Case - Sign With Admin
Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Close Browser
Test Case - Update User Comment
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Update User Comment Test12#4
Logout Harbor
Test Case - Update Password
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Change Password Test1@34 Test12#4
Logout Harbor
Sign In Harbor ${HARBOR_URL} tester${d} Test12#4
Close Browser
Test Case - Create An New Project
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Create An New Project test${d}
Close Browser
Test Case - User View Projects
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Create An New Project test${d}1
Create An New Project test${d}2
Create An New Project test${d}3
Switch To Log
Wait Until Page Contains test${d}1
Wait Until Page Contains test${d}2
Wait Until Page Contains test${d}3
Close Browser
Test Case - Push Image
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Create An New Project test${d}
Push image ${ip} tester${d} Test1@34 test${d} hello-world:latest
Go Into Project test${d}
Wait Until Page Contains test${d}/hello-world
Test Case - User View Logs
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=tester${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=true
Push image ${ip} tester${d} Test1@34 project${d} busybox:latest
Pull image ${ip} tester${d} Test1@34 project${d} busybox:latest
Go Into Project project${d}
Delete Repo project${d}
Go To Project Log
Advanced Search Should Display
Do Log Advanced Search
Close Browser
Test Case - Manage project publicity
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=usera${d} email=usera${d}@vmware.com realname=usera${d} newPassword=Test1@34 comment=harbor
Logout Harbor
Create An New User url=${HARBOR_URL} username=userb${d} email=userb${d}@vmware.com realname=userb${d} newPassword=Test1@34 comment=harbor
Logout Harbor
Sign In Harbor ${HARBOR_URL} usera${d} Test1@34
Create An New Project project${d} public=true
Push image ${ip} usera${d} Test1@34 project${d} hello-world:latest
Pull image ${ip} userb${d} Test1@34 project${d} hello-world:latest
Logout Harbor
Sign In Harbor ${HARBOR_URL} userb${d} Test1@34
Project Should Display project${d}
Search Private Projects
Project Should Not Display project${d}
Logout Harbor
Sign In Harbor ${HARBOR_URL} usera${d} Test1@34
Make Project Private project${d}
Logout Harbor
Sign In Harbor ${HARBOR_URL} userb${d} Test1@34
Project Should Not Display project${d}
Cannot Pull Image ${ip} userb${d} Test1@34 project${d} hello-world:latest
Logout Harbor
Sign In Harbor ${HARBOR_URL} usera${d} Test1@34
Make Project Public project${d}
Logout Harbor
Sign In Harbor ${HARBOR_URL} userb${d} Test1@34
Project Should Display project${d}
Close Browser
Test Case - Project Level Policy Public
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Create An New Project project${d}
Go Into Project project${d} has_image=${false}
Goto Project Config
Click Project Public
Save Project Config
# Verify
Public Should Be Selected
# Project${d} default should be private
# Here logout and login to try avoid a bug only in autotest
Logout Harbor
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Filter Object project${d}
Project Should Be Public project${d}
Close Browser
Test Case - Project Level Policy Content Trust
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Create An New Project project${d}
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} project${d} hello-world:latest
Go Into Project project${d}
Goto Project Config
Click Content Trust
Save Project Config
# Verify
Content Trust Should Be Selected
Cannot Pull Unsigned Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} project${d} hello-world:latest
Close Browser
Test Case - Edit Project Creation
# Create normal user and login
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Project Creation Should Display
Logout Harbor
Sleep 3
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Set Pro Create Admin Only
Logout Harbor
Sign In Harbor ${HARBOR_URL} tester${d} Test1@34
Project Creation Should Not Display
Logout Harbor
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Set Pro Create Every One
Close browser
Test Case - Edit Self-Registration
Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Disable Self Reg
Logout Harbor
Sign Up Should Not Display
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To Configure
Self Reg Should Be Disabled
Sleep 1
# Restore setting
Enable Self Reg
Close Browser
Test Case - Edit Email Settings
Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To Email
Config Email
Logout Harbor
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To Email
Verify Email
Close Browser
Test Case - Edit Token Expire
Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To System Settings
Modify Token Expiration 20
Logout Harbor
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To System Settings
Token Must Be Match 20
#reset to default
Modify Token Expiration 30
Close Browser
Test Case - Create A New Labels
Init Chrome Driver
${d}= Get Current Date
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To System Labels
Create New Labels label_${d}
Close Browser
Test Case - Update Label
Init Chrome Driver
${d}= Get Current Date
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To System Labels
Create New Labels label_${d}
Sleep 3
${d1}= Get Current Date
Update A Label label_${d}
Close Browser
Test Case - Delete Label
Init Chrome Driver
${d}= Get Current Date
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To System Labels
Create New Labels label_${d}
Sleep 3
Delete A Label label_${d}
Close Browser
TestCase - Project Admin Operate Labels
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=test${d} email=test${d}@vmware.com realname=test${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
Go Into Project project${d} has_image=${false}
Sleep 2
# Add labels
Switch To Project Label
Create New Labels label_${d}
Sleep 2
Update A Label label_${d}
Sleep 2
Delete A Label label_${d}
Close Browser
TestCase - Project Admin Add Labels To Repo
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=test${d} email=test${d}@vmware.com realname=test${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
## Push Image With Tag ${ip} test${d} Test1@34 project${d} vmware/photon 1.0 1.0
Push Image With Tag ${ip} test${d} Test1@34 project${d} redis 3.2.10-alpine 3.2.10-alpine
Push Image With Tag ${ip} test${d} Test1@34 project${d} redis 4.0.7-alpine 4.0.7-alpine
Go Into Project project${d}
Sleep 2
# Add labels
Switch To Project Label
Create New Labels label111
Create New Labels label22
Sleep 2
Switch To Project Repo
Go Into Repo project${d}/redis
Add Labels To Tag 3.2.10-alpine label111
Add Labels To Tag 4.0.7-alpine label22
Filter Labels In Tags label111 label22
Close Browser
TestCase - Developer Operate Labels
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=test${d} email=test${d}@vmware.com realname=test${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
Logout Harbor
Create An New User url=${HARBOR_URL} username=bob${d} email=bob${d}@vmware.com realname=bob${d} newPassword=Test1@34 comment=habor
Logout Harbor
Manage Project Member test${d} Test1@34 project${d} bob${d} Add has_image=${false}
Change User Role In Project test${d} Test1@34 project${d} bob${d} Developer
Sign In Harbor ${HARBOR_URL} bob${d} Test1@34
Go Into Project project${d} has_image=${false}
Sleep 3
Retry Wait Until Page Not Contains Element xpath=//a[contains(.,'Labels')]
Close Browser
Test Case - Scan A Tag In The Repo
Init Chrome Driver
${d}= get current date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=tester${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
Push Image ${ip} tester${d} Test1@34 project${d} hello-world
Go Into Project project${d}
Go Into Repo project${d}/hello-world
Scan Repo latest Succeed
Summary Chart Should Display latest
Pull Image ${ip} tester${d} Test1@34 project${d} hello-world
# Edit Repo Info
Close Browser
Test Case - Scan As An Unprivileged User
Init Chrome Driver
${d}= get current date result_format=%m%s
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library hello-world
Create An New User ${HARBOR_URL} user${d} user${d}@vmware.com user${d} Test1@34 harbor
Go Into Project library
Go Into Repo hello-world
Select Object latest
Scan Is Disabled
Close Browser
##
Test Case - Scan Image With Empty Vul
Init Chrome Driver
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library hello-world
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Go Into Project library
Go Into Repo hello-world
Scan Repo latest Succeed
Move To Summary Chart
Wait Until Page Contains No vulnerability
Close Browser
###
Test Case - Disable Scan Schedule
Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To Vulnerability Page
Disable Scan Schedule
Logout Harbor
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To Vulnerability Page
Page Should Contain None
Close Browser
###
Test Case - Manual Scan All
Init Chrome Driver
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library redis
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To Vulnerability Page
Trigger Scan Now And Wait Until The Result Appears
Navigate To Projects
Go Into Project library
Go Into Repo redis
Summary Chart Should Display latest
Close Browser
#
Test Case - Project Level Image Serverity Policy
Init Chrome Driver
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library haproxy
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Go Into Project library
Go Into Repo haproxy
Scan Repo latest Succeed
Navigate To Projects
Go Into Project library
Set Vulnerabilty Serverity 0
Cannot pull image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library haproxy
Close Browser
Test Case - Verify Download Ca Link
Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch To System Settings
Page Should Contain Registry Root Certificate
Close Browser
Test Case - Edit Repo Info
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=tester${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
Push Image ${ip} tester${d} Test1@34 project${d} hello-world
Go Into Project project${d}
Go Into Repo project${d}/hello-world
Edit Repo Info
Close Browser
Test Case - Manage Project Member
Init Chrome Driver
${d}= Get current Date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=alice${d} email=alice${d}@vmware.com realname=alice${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
Push image ip=${ip} user=alice${d} pwd=Test1@34 project=project${d} image=hello-world
Logout Harbor
Create An New User url=${HARBOR_URL} username=bob${d} email=bob${d}@vmware.com realname=bob${d} newPassword=Test1@34 comment=habor
Logout Harbor
Create An New User url=${HARBOR_URL} username=carol${d} email=carol${d}@vmware.com realname=carol${d} newPassword=Test1@34 comment=harbor
Logout Harbor
User Should Not Be A Member Of Project bob${d} Test1@34 project${d}
Manage Project Member alice${d} Test1@34 project${d} bob${d} Add
User Should Be Guest bob${d} Test1@34 project${d}
Change User Role In Project alice${d} Test1@34 project${d} bob${d} Developer
User Should Be Developer bob${d} Test1@34 project${d}
Change User Role In Project alice${d} Test1@34 project${d} bob${d} Admin
User Should Be Admin bob${d} Test1@34 project${d} carol${d}
Manage Project Member alice${d} Test1@34 project${d} bob${d} Remove
User Should Not Be A Member Of Project bob${d} Test1@34 project${d}
User Should Be Guest carol${d} Test1@34 project${d}
Close Browser
Test Case - Delete A Project
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New Project With New User ${HARBOR_URL} tester${d} tester${d}@vmware.com tester${d} Test1@34 harobr project${d} false
Push Image ${ip} tester${d} Test1@34 project${d} hello-world
Project Should Not Be Deleted project${d}
Go Into Project project${d}
Delete Repo project${d}
Navigate To Projects
Project Should Be Deleted project${d}
Close Browser
Test Case - Delete Multi Project
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User ${HARBOR_URL} test${d} test${d}@vmware.com test${d} Test1@34 harbor
Create An New Project projecta${d}
Create An New Project projectb${d}
Push Image ${ip} test${d} Test1@34 projecta${d} hello-world
Filter Object project
@{project_list} Create List projecta projectb
Multi-delete Object ${project_delete_btn} @{project_list}
# Verify delete project with image should not be deleted directly
Delete Fail projecta${d}
Delete Success projectb${d}
Close Browser
Test Case - Delete Multi User
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User ${HARBOR_URL} deletea${d} testa${d}@vmware.com test${d} Test1@34 harbor
Logout Harbor
Create An New User ${HARBOR_URL} deleteb${d} testb${d}@vmware.com test${d} Test1@34 harbor
Logout Harbor
Create An New User ${HARBOR_URL} deletec${d} testc${d}@vmware.com test${d} Test1@34 harbor
Logout Harbor
Sign In Harbor ${HARBOR_URL} admin Harbor12345
Switch To User Tag
Filter Object delete
@{user_list} Create List deletea deleteb deletec
Multi-delete Object ${user_delete_btn} @{user_list}
# Assert delete
Delete Success deletea deleteb deletec
Sleep 1
Close Browser
Test Case - Delete Multi Repo
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User ${HARBOR_URL} test${d} test${d}@vmware.com test${d} Test1@34 harbor
Create An New Project project${d}
Push Image ${ip} test${d} Test1@34 project${d} hello-world
Push Image ${ip} test${d} Test1@34 project${d} busybox
Sleep 2
Go Into Project project${d}
@{repo_list} Create List hello-world busybox
Multi-delete Object ${repo_delete_btn} @{repo_list}
# Verify
Delete Success hello-world busybox
Close Browser
Test Case - Delete Multi Tag
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User ${HARBOR_URL} test${d} test${d}@vmware.com test${d} Test1@34 harbor
Create An New Project project${d}
Push Image With Tag ${ip} test${d} Test1@34 project${d} redis 3.2.10-alpine 3.2.10-alpine
Push Image With Tag ${ip} test${d} Test1@34 project${d} redis 4.0.7-alpine 4.0.7-alpine
Sleep 2
Go Into Project project${d}
Go Into Repo redis
@{tag_list} Create List 3.2.10-alpine 4.0.7-alpine
Multi-delete object ${tag_delete_btn} @{tag_list}
# Verify
Delete Success 3.2.10-alpine 4.0.7-alpine
Close Browser
Test Case - Delete Repo on CardView
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User ${HARBOR_URL} test${d} test${d}@vmware.com test${d} Test1@34 harbor
Create An New Project project${d}
Push Image ${ip} test${d} Test1@34 project${d} hello-world
Push Image ${ip} test${d} Test1@34 project${d} busybox
Sleep 2
Go Into Project project${d}
Switch To CardView
Delete Repo on CardView busybox
# Verify
Delete Success busybox
Close Browser
Test Case - Delete Multi Member
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User ${HARBOR_URL} testa${d} testa${d}@vmware.com test${d} Test1@34 harbor
Logout Harbor
Create An New User ${HARBOR_URL} testb${d} testb${d}@vmware.com test${d} Test1@34 harbor
Logout Harbor
Create An New User ${HARBOR_URL} test${d} test${d}@vmware.com test${d} Test1@34 harbor
Create An New Project project${d}
Go Into Project project${d} has_image=${false}
Switch To Member
Add Guest Member to project testa${d}
Add Guest Member to project testb${d}
Multi-delete Member testa${d} testb${d}
Delete Success testa${d} testb${d}
Close Browser
Test Case - Assign Sys Admin
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
Create An New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest
Logout Harbor
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Switch to User Tag
Assign User Admin tester${d}
Logout Harbor
Sign In Harbor ${HARBOR_URL} tester${d} Test1@34
Administration Tag Should Display
Close Browser
Test Case - Admin Push Signed Image
Enable Notary Client
${rc} ${output}= Run And Return Rc And Output docker pull hello-world:latest
Log ${output}
Push image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library hello-world:latest
${rc} ${output}= Run And Return Rc And Output ./tests/robot-cases/Group0-Util/notary-push-image.sh ${ip}
Log ${output}
Should Be Equal As Integers ${rc} 0
${rc} ${output}= Run And Return Rc And Output curl -u admin:Harbor12345 -s --insecure -H "Content-Type: application/json" -X GET "https://${ip}/api/repositories/library/tomcat/signatures"
Log To Console ${output}
Should Be Equal As Integers ${rc} 0
Should Contain ${output} sha256
Test Case - View Scan Results
Init Chrome Driver
${d}= get current date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=tester${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
Push Image ${ip} tester${d} Test1@34 project${d} tomcat
Go Into Project project${d}
Go Into Repo project${d}/tomcat
Scan Repo latest Succeed
Summary Chart Should Display latest
View Repo Scan Details
Close Browser
Test Case - View Scan Error
Init Chrome Driver
${d}= get current date result_format=%m%s
Create An New Project With New User url=${HARBOR_URL} username=tester${d} email=tester${d}@vmware.com realname=tester${d} newPassword=Test1@34 comment=harbor projectname=project${d} public=false
Push Image ${ip} tester${d} Test1@34 project${d} vmware/photon:1.0
Go Into Project project${d}
Go Into Repo project${d}/vmware/photon
Scan Repo 1.0 Fail
View Scan Error Log
Close Browser
Test Case - Scan Image On Push
Init Chrome Driver
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Go Into Project library
Goto Project Config
Enable Scan On Push
Push Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} library memcached
Navigate To Projects
Go Into Project library
Go Into Repo memcached
Summary Chart Should Display latest
Close Browser

View File

@ -25,7 +25,6 @@ ${HARBOR_ADMIN} admin
*** Test Cases *** *** Test Cases ***
Test Case - Project Level Policy Content Trust Test Case - Project Level Policy Content Trust
Restart Docker Daemon Locally
Init Chrome Driver Init Chrome Driver
${d}= Get Current Date result_format=%m%s ${d}= Get Current Date result_format=%m%s
Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} Sign In Harbor ${HARBOR_URL} ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
@ -40,12 +39,34 @@ Test Case - Project Level Policy Content Trust
Content Trust Should Be Selected Content Trust Should Be Selected
Cannot Pull Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} project${d} hello-world:latest err_msg=The image is not signed in Notary Cannot Pull Image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} project${d} hello-world:latest err_msg=The image is not signed in Notary
# Signed image can be pulled # Signed image can be pulled
Body Of Admin Push Signed Image image=redis project=project${d} Body Of Admin Push Signed Image project${d} redis latest ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Pull image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} project${d} redis tag=latest Pull image ${ip} ${HARBOR_ADMIN} ${HARBOR_PASSWORD} project${d} redis tag=latest
Close Browser Close Browser
Test Case - Admin Push Signed Image Test Case - Admin Push Signed Image
Body Of Admin Push Signed Image [tags] sign_image
Body Of Push Signed Image
Test Case - Admin Push Signed Image And Remove Signature Test Case - Admin Push Signed Image And Remove Signature
Body Of Admin Push Signed Image image=alpine with_remove=${true} [tags] rm_signature
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
${user}= Set Variable user012
${pwd}= Set Variable Test1@34
Sign In Harbor ${HARBOR_URL} ${user} ${pwd}
Create An New Project And Go Into Project project${d}
Body Of Admin Push Signed Image project${d} alpine latest ${user} ${pwd} with_remove=${true}
Body Of Admin Push Signed Image project${d} busybox latest ${HARBOR_ADMIN} ${HARBOR_PASSWORD} with_remove=${true}
Test Case - Key Rotate
[tags] key_rotate
Init Chrome Driver
${d}= Get Current Date result_format=%m%s
${user}= Set Variable user012
${pwd}= Set Variable Test1@34
Sign In Harbor ${HARBOR_URL} ${user} ${pwd}
Create An New Project And Go Into Project project${d}
Body Of Admin Push Signed Image project${d} busybox latest ${user} ${pwd}
Notary Key Rotate ${ip} project${d} busybox latest ${user} ${pwd}
Body Of Admin Push Signed Image project${d} alpine latest ${HARBOR_ADMIN} ${HARBOR_PASSWORD}
Notary Key Rotate ${ip} project${d} alpine latest ${HARBOR_ADMIN} ${HARBOR_PASSWORD}

View File

@ -34,4 +34,5 @@ Test Case - List Helm Charts
Body Of List Helm Charts Body Of List Helm Charts
Test Case - Admin Push Signed Image Test Case - Admin Push Signed Image
Body Of Admin Push Signed Image [tags] sign_image
Body Of Push Signed Image

View File

@ -176,9 +176,6 @@
"p2p_preheat_policy":null, "p2p_preheat_policy":null,
"count_limit":1234, "count_limit":1234,
"storage_limit":53687091200, "storage_limit":53687091200,
"storage_limit_for_verify":50,
"storage_unit_for_verify":"GB",
"quotas_usage_display":"9.4\\d*MB of 50GB",
"replications":{ "replications":{
"rulename":"ruleproject1", "rulename":"ruleproject1",
"endpointname":"endpoint_for_proxy_cache", "endpointname":"endpoint_for_proxy_cache",
@ -299,9 +296,6 @@
], ],
"count_limit":-1, "count_limit":-1,
"storage_limit":32985348833280, "storage_limit":32985348833280,
"storage_limit_for_verify":30,
"storage_unit_for_verify":"TB",
"quotas_usage_display":"0Byte of 30TB",
"replications":{ "replications":{
"rulename":"rulename1", "rulename":"rulename1",
"endpointname":"endpoint_for_proxy_cache", "endpointname":"endpoint_for_proxy_cache",
@ -432,9 +426,6 @@
], ],
"count_limit":-1, "count_limit":-1,
"storage_limit":57671680, "storage_limit":57671680,
"storage_limit_for_verify":55,
"storage_unit_for_verify":"MB",
"quotas_usage_display":"of 55MB",
"labels":[ "labels":[
{ {
"name":"proj2label1" "name":"proj2label1"
@ -523,5 +514,19 @@
} }
} }
} }
],
"quotas":[
{
"name":"pro_quota_1",
"size":25,
"count_limit":1234,
"storage_limit":57671680
},
{
"name":"pro_quota_2",
"size":1024,
"count_limit":1234,
"storage_limit":53687091200
}
] ]
} }

View File

@ -490,5 +490,23 @@
"branch":2, "branch":2,
"version":"2.2" "version":"2.2"
} }
],
"populate_quotas":[
{
"branch":1,
"version":"1.10"
},
{
"branch":1,
"version":"2.0"
},
{
"branch":1,
"version":"2.1"
},
{
"branch":1,
"version":"2.2"
}
] ]
} }

View File

@ -58,14 +58,12 @@ class HarborAPI:
@get_feature_branch @get_feature_branch
def populate_projects(self, **kwargs): def populate_projects(self, **kwargs):
for project in data["projects"]: for project in data["projects"]:
if kwargs["branch"] == 1: if kwargs["branch"] in [1,2]:
if project["registry_name"] is not None: if "registry_name" in project:
continue print("Populate proxy project...")
elif kwargs["branch"] == 2: # continue
if project["registry_name"] is not None:
continue
elif kwargs["branch"] == 3: elif kwargs["branch"] == 3:
print("Populate all projects") print("Populate all projects...")
else: else:
raise Exception(r"Error: Feature {} has no branch {}.".format(sys._getframe().f_code.co_name, branch)) raise Exception(r"Error: Feature {} has no branch {}.".format(sys._getframe().f_code.co_name, branch))
self.create_project(project, version=args.version) self.create_project(project, version=args.version)
@ -89,6 +87,12 @@ class HarborAPI:
project["configuration"]["deployment_security"], version=args.version) project["configuration"]["deployment_security"], version=args.version)
time.sleep(30) time.sleep(30)
@get_feature_branch
def populate_quotas(self, **kwargs):
for quotas in data["quotas"]:
self.create_project(quotas, version=args.version)
push_self_build_image_to_project(quotas["name"], args.endpoint, 'admin', 'Harbor12345', quotas["name"], "latest", size=quotas["size"])
@get_feature_branch @get_feature_branch
def create_project(self, project, **kwargs): def create_project(self, project, **kwargs):
if kwargs["branch"] == 1: if kwargs["branch"] == 1:
@ -98,7 +102,7 @@ class HarborAPI:
body=dict(body={"project_name": project["name"], "metadata": {"public": "true"},"count_limit":project["count_limit"],"storage_limit":project["storage_limit"]}) body=dict(body={"project_name": project["name"], "metadata": {"public": "true"},"count_limit":project["count_limit"],"storage_limit":project["storage_limit"]})
request(url+"projects", 'post', **body) request(url+"projects", 'post', **body)
elif kwargs["branch"] == 3: elif kwargs["branch"] == 3:
if project["registry_name"] is not None: if project.get("registry_name") is not None:
r = request(url+"registries?name="+project["registry_name"]+"", 'get') r = request(url+"registries?name="+project["registry_name"]+"", 'get')
registry_id = int(str(r.json()[0]['id'])) registry_id = int(str(r.json()[0]['id']))
else: else:
@ -106,8 +110,8 @@ class HarborAPI:
body=dict(body={"project_name": project["name"], "registry_id":registry_id, "metadata": {"public": "true"},"storage_limit":project["storage_limit"]}) body=dict(body={"project_name": project["name"], "registry_id":registry_id, "metadata": {"public": "true"},"storage_limit":project["storage_limit"]})
request(url+"projects", 'post', **body) request(url+"projects", 'post', **body)
#Project with registry_name must have repo and to verify repo can be pulled. #Project with registry_name is a proxy project, there should be images can be pulled.
if project["registry_name"] is not None: if project.get("registry_name") is not None:
USER_ADMIN=dict(endpoint = "https://"+args.endpoint+"/api/v2.0" , username = "admin", password = "Harbor12345") USER_ADMIN=dict(endpoint = "https://"+args.endpoint+"/api/v2.0" , username = "admin", password = "Harbor12345")
repo = Repository() repo = Repository()
for _repo in project["repo"]: for _repo in project["repo"]:
@ -644,6 +648,7 @@ def do_data_creation():
harborAPI.add_distribution(distribution, version=args.version) harborAPI.add_distribution(distribution, version=args.version)
harborAPI.populate_projects(version=args.version) harborAPI.populate_projects(version=args.version)
harborAPI.populate_quotas(version=args.version)
harborAPI.push_artifact_index(data["projects"][0]["name"], data["projects"][0]["artifact_index"]["name"], data["projects"][0]["artifact_index"]["tag"], version=args.version) harborAPI.push_artifact_index(data["projects"][0]["name"], data["projects"][0]["artifact_index"]["name"], data["projects"][0]["artifact_index"]["tag"], version=args.version)
#pull_image("busybox", "redis", "haproxy", "alpine", "httpd:2") #pull_image("busybox", "redis", "haproxy", "alpine", "httpd:2")

View File

@ -0,0 +1,5 @@
from hurry.filesize import size
from hurry.filesize import alternative
def convert_int_to_readable_file_size(file_size):
return size(file_size, system=alternative).replace(' ', '')

View File

@ -73,8 +73,7 @@ Test Case - Upgrade Verify
Run Keyword Verify Project Metadata ${data} check_content_trust=${false} Run Keyword Verify Project Metadata ${data} check_content_trust=${false}
#Run Keyword Verify Project Label ${data} #Run Keyword Verify Project Label ${data}
Run Keyword Verify Member Exist ${data} Run Keyword Verify Member Exist ${data}
#TODO in 2.2: Modify this case when new robot account feature is ready. Run Keyword Verify Robot Account Exist ${data}
#Run Keyword Verify Robot Account Exist ${data}
Run Keyword Verify Project-level Allowlist ${data} Run Keyword Verify Project-level Allowlist ${data}
Run Keyword Verify Webhook For 2.0 ${data} Run Keyword Verify Webhook For 2.0 ${data}
Run Keyword Verify Tag Retention Rule ${data} Run Keyword Verify Tag Retention Rule ${data}
@ -88,7 +87,7 @@ Test Case - Upgrade Verify
Run Keyword Verify Image Tag ${data} Run Keyword Verify Image Tag ${data}
Run Keyword Verify Trivy Is Default Scanner Run Keyword Verify Trivy Is Default Scanner
Run Keyword Verify Artifact Index ${data} Run Keyword Verify Artifact Index ${data}
#Run Keyword Verify Quotas Display ${data} Run Keyword Verify Quotas Display ${data}
Test Case - Upgrade Verify Test Case - Upgrade Verify
[Tags] 2.1-latest [Tags] 2.1-latest
@ -98,8 +97,7 @@ Test Case - Upgrade Verify
Run Keyword Verify Project Metadata ${data} check_content_trust=${false} verify_registry_name=${true} Run Keyword Verify Project Metadata ${data} check_content_trust=${false} verify_registry_name=${true}
#Run Keyword Verify Project Label ${data} verify_registry_name=${true} #Run Keyword Verify Project Label ${data} verify_registry_name=${true}
Run Keyword Verify Member Exist ${data} verify_registry_name=${true} Run Keyword Verify Member Exist ${data} verify_registry_name=${true}
##TODO in 2.2: Modify this case when new robot account feature is ready. Run Keyword Verify Robot Account Exist ${data} verify_registry_name=${true}
#Run Keyword Verify Robot Account Exist ${data} verify_registry_name=${true}
Run Keyword Verify Project-level Allowlist ${data} verify_registry_name=${true} Run Keyword Verify Project-level Allowlist ${data} verify_registry_name=${true}
Run Keyword Verify Webhook For 2.0 ${data} verify_registry_name=${true} Run Keyword Verify Webhook For 2.0 ${data} verify_registry_name=${true}
Run Keyword Verify Tag Retention Rule ${data} verify_registry_name=${true} Run Keyword Verify Tag Retention Rule ${data} verify_registry_name=${true}
@ -116,4 +114,4 @@ Test Case - Upgrade Verify
Run Keyword Verify Proxy Cache Image Existence ${data} Run Keyword Verify Proxy Cache Image Existence ${data}
Run Keyword Verify Distributions ${data} Run Keyword Verify Distributions ${data}
Run Keyword Verify P2P Preheat Policy ${data} Run Keyword Verify P2P Preheat Policy ${data}
#Run Keyword Verify Quotas Display ${data} Run Keyword Verify Quotas Display ${data}