diff --git a/.drone.ova.yml b/.drone.ova.yml new file mode 100644 index 000000000..2a7b1f782 --- /dev/null +++ b/.drone.ova.yml @@ -0,0 +1,36 @@ +# Harbor OVA drone. +--- +workspace: + base: /drone + path: src/github.com/vmware/harbor + +pipeline: + clone: + image: plugins/git + tags: true + recursive: false + + integration-test-on-pr: + image: vmware/harbor-e2e-engine:1.39 + pull: true + privileged: true + environment: + BIN: bin + GOPATH: /drone + SHELL: /bin/bash + LOG_TEMP_DIR: install-logs + HARBOR_ADMIN: ${HARBOR_ADMIN} + HARBOR_PASSWORD: ${HARBOR_PASSWORD} + DHCP: ${DHCP} + PROTOCOL: ${PROTOCOL} + USER: ${USER} + PASSWORD: ${PASSWORD} + HOST: ${HOST} + DATASTORE: ${DATASTORE} + CLUSTER: ${CLUSTER} + DATACENTER: ${DATACERTER} + commands: + - tests/integration_ova.sh + when: + status: success + diff --git a/tests/integration_ova.sh b/tests/integration_ova.sh new file mode 100755 index 000000000..473904df8 --- /dev/null +++ b/tests/integration_ova.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Copyright 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. +# + +set -x +gsutil version -l +set +x +container_ip=`ip addr s eth0 |grep "inet "|awk '{print $2}' |awk -F "/" '{print $1}'` +echo $container_ip + +ova_url="$(python /auto-ova/ova.py)" +echo $ova_url + +## --------------------------------------------- Init Env ------------------------------------------------- +# Start Xvfb for Chrome headlesss +Xvfb -ac :99 -screen 0 1280x1024x16 & export DISPLAY=:99 + +## --------------------------------------------- Run ------------------------------------------------- +pybot -v ip:$container_ip -v ova_url:$ova_url --include OVA tests/robot-cases/Group5-OVA-install-config/5-00-OVA-BAT.robot + +## --------------------------------------------- Tear Down ------------------------------------------------- +rc="$?" +echo $rc +exit $rc \ No newline at end of file diff --git a/tests/resources/Harbor-Util.robot b/tests/resources/Harbor-Util.robot index 4a6424ee7..028ce0375 100644 --- a/tests/resources/Harbor-Util.robot +++ b/tests/resources/Harbor-Util.robot @@ -148,3 +148,16 @@ Compile and Up Harbor With Source Code Log ${output} Should Be Equal As Integers ${rc} 0 Sleep 20 + +Wait for Harbor Ready + [Arguments] ${protocol} ${HARBOR_IP} + Log To Console Waiting for Harbor to Come Up... + :FOR ${i} IN RANGE 20 + \ ${out}= Run curl -k ${protocol}://${HARBOR_IP} + \ Log ${out} + \ ${status}= Run Keyword And Return Status Should Not Contain ${out} 502 Bad Gateway + \ ${status}= Run Keyword If ${status} Run Keyword And Return Status Should Not Contain ${out} Connection refused + \ ${status}= Run Keyword If ${status} Run Keyword And Return Status Should Contain ${out} Harbor + \ Return From Keyword If ${status} ${HARBOR_IP} + \ Sleep 30s + Fail Harbor failed to come up properly! diff --git a/tests/resources/OVA-Util.robot b/tests/resources/OVA-Util.robot index 88cb5be4a..b7eaabb7d 100644 --- a/tests/resources/OVA-Util.robot +++ b/tests/resources/OVA-Util.robot @@ -17,9 +17,9 @@ Documentation This resource provides any keywords related to Unified OVA *** Variables *** ${ova_root_pwd} ova-test-root-pwd -${ova_appliance_options} --prop:appliance.root_pwd=${ova_root_pwd} --prop:appliance.permit_root_login=True +${ova_appliance_options} --prop:root_pwd=${ova_root_pwd} --prop:permit_root_login=true -${ova_target_vm_name} vic-unified-ova-integration-test +${ova_target_vm_name} harbor-unified-ova-integration-test ${ovftool_options} --noSSLVerify --acceptAllEulas --name=${ova_target_vm_name} --diskMode=thin --powerOn --X:waitForIp --X:injectOvfEnv --X:enableHiddenProperties ${ova_network_ip0} 10.17.109.207 @@ -32,7 +32,7 @@ ${ova_network_options} --prop:network.ip0=${ova_network_ip0} --prop:network.net ${ova_harbor_admin_password} harbor-admin-passwd ${ova_harbor_db_password} harbor-db-passwd -${ova_service_options} --prop:registry.admin_password=${ova_harbor_admin_password} --prop:registry.db_password=${ova_harbor_db_password} +${ova_service_options} --prop:auth_mode="%{AUTH_MODE}" --prop:clair_db_password="%{CLAIR_DB_PASSWORD}" --prop:max_job_workers="%{MAX_JOB_WORKERS}" --prop:harbor_admin_password="%{HARBOR_ADMIN_PASSWORD}" --prop:db_password="%{DB_PASSWORD}" ${ova_options} ${ovftool_options} ${ova_appliance_options} ${ova_service_options} ${ova_options_with_network} ${ova_options} ${ova_network_options} @@ -41,11 +41,8 @@ ${tls_not_disabled} False *** Keywords *** # Requires vc credential for govc -Deploy VIC-OVA To Test Server - [Arguments] ${dhcp}=False ${build}=False ${user}=%{TEST_USERNAME} ${password}=%{TEST_PASSWORD} ${host}=%{TEST_URL} ${datastore}=%{TEST_DATASTORE} ${cluster}=%{TEST_RESOURCE} ${datacenter}=%{TEST_DATACENTER} - Run Keyword if ${build} Build Unified OVA - ${rev}= Run git rev-parse --short HEAD - Set Test Variable ${ova_path} bin/vic-1.1.0-${rev}.ova +Deploy Harbor-OVA To Test Server + [Arguments] ${dhcp} ${protocol} ${build} ${user} ${password} ${ova_path} ${host} ${datastore} ${cluster} ${datacenter} Log To Console \nCleanup environment... Run Keyword And Ignore Error Run GOVC_URL=${host} GOVC_USERNAME=${user} GOVC_PASSWORD=${password} GOVC_INSECURE=1 govc vm.destroy ${ova_target_vm_name} @@ -56,16 +53,31 @@ Deploy VIC-OVA To Test Server ... ELSE Log To Console ovftool --datastore=${datastore} ${ova_options_with_network} ${ova_path} 'vi://${user}:${password}@${host}/${datacenter}/host/${cluster}' ${out}= Run Keyword If ${dhcp} Run ovftool --datastore=${datastore} ${ova_options} ${ova_path} 'vi://${user}:${password}@${host}/${datacenter}/host/${cluster}' ... ELSE Run ovftool --datastore=${datastore} ${ova_options_with_network} ${ova_path} 'vi://${user}:${password}@${host}/${datacenter}/host/${cluster}' - Log ${out} + + Should Contain ${out} Received IP address: + Should Not Contain ${out} None - Log To Console \n${out} - @{out}= Split To Lines ${out} - Should Contain @{out}[-1] Completed successfully + ${out}= Run GOVC_URL=${host} GOVC_USERNAME=${user} GOVC_PASSWORD=${password} GOVC_INSECURE=1 govc ls /ha-datacenter/host/cls/ + ${out}= Split To Lines ${out} + ${idx}= Set Variable 1 + :FOR ${line} IN @{out} + \ Continue For Loop If '${line}' == '/ha-datacenter/host/cls/Resources' + \ ${ip}= Fetch From Right ${line} / + \ Set Suite Variable ${esx${idx}-ip} ${ip} + \ ${idx}= Evaluate ${idx}+1 - Log To Console \nUnified OVA is deployed successfully + Run Keyword And Ignore Error Run GOVC_URL=${host} GOVC_USERNAME=${user} GOVC_PASSWORD=${password} GOVC_INSECURE=1 govc host.esxcli -host.ip=${esx1-ip} system settings advanced set -o /Net/GuestIPHack -i 1 + ${ip}= Run GOVC_URL=${host} GOVC_USERNAME=${user} GOVC_PASSWORD=${password} GOVC_INSECURE=1 govc vm.ip -esxcli harbor-unified-ova-integration-test + + Set Environment Variable HARBOR_IP ${ip} + + Log To Console \nHarbor IP: %{HARBOR_IP} + + Wait for Harbor Ready ${protocol} %{HARBOR_IP} + [Return] %{HARBOR_IP} # Requires vc credential for govc -Cleanup VIC-OVA On Test Server +Cleanup Harbor-OVA On Test Server [Arguments] ${url}=%{GOVC_URL} ${username}=%{GOVC_USERNAME} ${password}=%{GOVC_PASSWORD} ${rc} ${output}= Run And Return Rc And Output GOVC_URL=${url} GOVC_USERNAME=${username} GOVC_PASSWORD=${password} GOVC_INSECURE=1 govc vm.destroy ${ova_target_vm_name} Log ${output} @@ -82,8 +94,4 @@ Build Unified OVA Log ${out} @{out}= Split To Lines ${out} Should Not Contain @{out}[-1] Error - Log To Console \nUnified OVA is built successfully - -Remove OVA Artifacts Locally - ${rev}= Run git rev-parse --short HEAD - Remove Files bin/vic-1.1.0-${rev}.ova bin/vic-1.1.0-${rev}.ovf bin/vic-1.1.0-${rev}.mk bin/vic-1.1.0-${rev}-disk*.vmdk + Log To Console \nUnified OVA is built successfully \ No newline at end of file diff --git a/tests/resources/Vsphere-Util.robot b/tests/resources/Vsphere-Util.robot index 7fdccd9c3..6072cc9ae 100644 --- a/tests/resources/Vsphere-Util.robot +++ b/tests/resources/Vsphere-Util.robot @@ -18,28 +18,23 @@ Documentation This resource contains any keywords dealing with operations being *** Keywords *** Power On VM OOB [Arguments] ${vm} - ${rc} ${output}= Run Keyword If '%{HOST_TYPE}' == 'VC' Run And Return Rc And Output govc vm.power -on %{VCH-NAME}/"${vm}" - Run Keyword If '%{HOST_TYPE}' == 'VC' Should Be Equal As Integers ${rc} 0 - ${rc} ${output}= Run Keyword If '%{HOST_TYPE}' == 'ESXi' Run And Return Rc And Output govc vm.power -on "${vm}" - Run Keyword If '%{HOST_TYPE}' == 'ESXi' Should Be Equal As Integers ${rc} 0 + ${rc} ${output}= Run And Return Rc And Output govc vm.power -on "${vm}" + Should Be Equal As Integers ${rc} 0 Log To Console Waiting for VM to power on ... Wait Until VM Powers On ${vm} Power Off VM OOB [Arguments] ${vm} - ${rc} ${output}= Run Keyword If '%{HOST_TYPE}' == 'VC' Run And Return Rc And Output govc vm.power -off %{VCH-NAME}/"${vm}" - Run Keyword If '%{HOST_TYPE}' == 'VC' Should Be Equal As Integers ${rc} 0 - ${rc} ${output}= Run Keyword If '%{HOST_TYPE}' == 'ESXi' Run And Return Rc And Output govc vm.power -off "${vm}" - Run Keyword If '%{HOST_TYPE}' == 'ESXi' Should Be Equal As Integers ${rc} 0 + ${rc} ${output}= Run And Return Rc And Output govc vm.power -off "${vm}" + Log To Console ${output} + Should Be Equal As Integers ${rc} 0 Log To Console Waiting for VM to power off ... Wait Until VM Powers Off "${vm}" Destroy VM OOB [Arguments] ${vm} - ${rc} ${output}= Run Keyword If '%{HOST_TYPE}' == 'VC' Run And Return Rc And Output govc vm.destroy %{VCH-NAME}/"*-${vm}" - Run Keyword If '%{HOST_TYPE}' == 'VC' Should Be Equal As Integers ${rc} 0 - ${rc} ${output}= Run Keyword If '%{HOST_TYPE}' == 'ESXi' Run And Return Rc And Output govc vm.destroy "*-${vm}" - Run Keyword If '%{HOST_TYPE}' == 'ESXi' Should Be Equal As Integers ${rc} 0 + ${rc} ${output}= Run And Return Rc And Output govc vm.destroy "*-${vm}" + Should Be Equal As Integers ${rc} 0 Put Host Into Maintenance Mode ${rc} ${output}= Run And Return Rc And Output govc host.maintenance.enter -host.ip=%{TEST_URL} @@ -56,13 +51,19 @@ Reboot VM Power On VM OOB ${vm} Log To Console ${vm} Powered On +Reset VM + [Arguments] ${vm} + ${rc} ${output}= Run And Return Rc And Output govc vm.power -reset "${vm}" + Log To Console ${output} + Should Be Equal As Integers ${rc} 0 + Log To Console Waiting for VM to reset ... + Wait Until VM Powers On "${vm}" + Wait Until VM Powers On [Arguments] ${vm} :FOR ${idx} IN RANGE 0 30 - \ ${ret}= Run Keyword If '%{HOST_TYPE}' == 'VC' Run govc vm.info %{VCH-NAME}/${vm} - \ Run Keyword If '%{HOST_TYPE}' == 'VC' Set Test Variable ${out} ${ret} - \ ${ret}= Run Keyword If '%{HOST_TYPE}' == 'ESXi' Run govc vm.info ${vm} - \ Run Keyword If '%{HOST_TYPE}' == 'ESXi' Set Test Variable ${out} ${ret} + \ ${ret}= Run govc vm.info ${vm} + \ Set Test Variable ${out} ${ret} \ ${status}= Run Keyword And Return Status Should Contain ${out} poweredOn \ Return From Keyword If ${status} \ Sleep 1 @@ -71,10 +72,8 @@ Wait Until VM Powers On Wait Until VM Powers Off [Arguments] ${vm} :FOR ${idx} IN RANGE 0 30 - \ ${ret}= Run Keyword If '%{HOST_TYPE}' == 'VC' Run govc vm.info %{VCH-NAME}/${vm} - \ Run Keyword If '%{HOST_TYPE}' == 'VC' Set Test Variable ${out} ${ret} - \ ${ret}= Run Keyword If '%{HOST_TYPE}' == 'ESXi' Run govc vm.info ${vm} - \ Run Keyword If '%{HOST_TYPE}' == 'ESXi' Set Test Variable ${out} ${ret} + \ ${ret}= Run govc vm.info ${vm} + \ Set Test Variable ${out} ${ret} \ ${status}= Run Keyword And Return Status Should Contain ${out} poweredOff \ Return From Keyword If ${status} \ Sleep 1 @@ -83,10 +82,8 @@ Wait Until VM Powers Off Wait Until VM Is Destroyed [Arguments] ${vm} :FOR ${idx} IN RANGE 0 30 - \ ${ret}= Run Keyword If '%{HOST_TYPE}' == 'VC' Run govc ls vm/%{VCH-NAME}/${vm} - \ Run Keyword If '%{HOST_TYPE}' == 'VC' Set Test Variable ${out} ${ret} - \ ${ret}= Run Keyword If '%{HOST_TYPE}' == 'ESXi' Run govc ls vm/${vm} - \ Run Keyword If '%{HOST_TYPE}' == 'ESXi' Set Test Variable ${out} ${ret} + \ ${ret}= Run govc ls vm/${vm} + \ Set Test Variable ${out} ${ret} \ ${status}= Run Keyword And Return Status Should Be Empty ${out} \ Return From Keyword If ${status} \ Sleep 1 @@ -215,4 +212,4 @@ Enable Host Firewall Run govc host.esxcli network firewall set --enabled true Disable Host Firewall - Run govc host.esxcli network firewall set --enabled false + Run govc host.esxcli network firewall set --enabled false \ No newline at end of file diff --git a/tests/robot-cases/Group5-OVA-install-config/5-00-OVA-BAT.robot b/tests/robot-cases/Group5-OVA-install-config/5-00-OVA-BAT.robot new file mode 100644 index 000000000..ba58e008f --- /dev/null +++ b/tests/robot-cases/Group5-OVA-install-config/5-00-OVA-BAT.robot @@ -0,0 +1,51 @@ +// 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 +Default Tags OVA + +*** Test Cases *** +Test Case - Deploy OVA + Deploy Harbor-OVA To Test Server %{DHCP} %{PROTOCOL} False %{USER} %{PASSWORD} ${ova_url} %{HOST} %{DATASTORE} %{CLUSTER} %{DATACENTER} + +Test Case - Sign With Admin Modified Pwd + Open Connection %{HARBOR_IP} + Login root ova-test-root-pwd + SSHLibrary.Get File /data/ca_download/harbor_ca.crt + Close All Connections + Generate Certificate Authority For Chrome %{HARBOR_PASSWORD} + Init Chrome Driver + Sign In Harbor https://%{HARBOR_IP} admin %{HARBOR_ADMIN_PASSWORD} + Close Browser + +Test Case - Push Image + Init Chrome Driver + Start Docker Daemon Locally + ${d}= Get Current Date result_format=%m%s + Create An New User url=https://%{HARBOR_IP} username=tester${d} email=tester${d}@vmware.com realname=harbortest newPassword=Test1@34 comment=harbortest + Create An New Project test${d} + + Push image %{HARBOR_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 - OVA reboot + Reboot VM harbor-unified-ova-integration-test + Wait for Harbor Ready %{protocol} %{HARBOR_IP} + +Test Case - OVA reset + Reset VM harbor-unified-ova-integration-test + Wait for Harbor Ready %{protocol} %{HARBOR_IP}