From a416570ea28b2ea38735dffbb65342d9f98d28ef Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Wed, 9 Sep 2020 18:59:36 +0100 Subject: [PATCH] schutzbot: add CI integration The CI is in two stages, for each supported distro. First the RPMs are generated from the spec file in the repo for the given distro and architecture. Once all the RPM builds have succeeded successfully, a test machine is provisioned with osbulid-composer installed, and koji API enabled. The repository containing the RPMs of the code being tested is also enabled on the test machine, and the cli client is installed. Finally, the test/integration.sh script is executed, which currently does nothing. Signed-off-by: Tom Gundersen --- meson.build | 12 ++ schutzbot/Jenkinsfile | 183 ++++++++++++++++++ schutzbot/ci_details.sh | 48 +++++ schutzbot/deploy.sh | 69 +++++++ schutzbot/mockbuild.sh | 101 ++++++++++ .../repos/fedora/32/osbuild-composer.repo | 7 + .../repos/rhel/8.2/osbuild-composer.repo | 7 + schutzbot/team_ssh_keys.txt | 20 ++ test/integration.sh | 3 + 9 files changed, 450 insertions(+) create mode 100644 schutzbot/Jenkinsfile create mode 100755 schutzbot/ci_details.sh create mode 100755 schutzbot/deploy.sh create mode 100755 schutzbot/mockbuild.sh create mode 100644 schutzbot/repos/fedora/32/osbuild-composer.repo create mode 100644 schutzbot/repos/rhel/8.2/osbuild-composer.repo create mode 100644 schutzbot/team_ssh_keys.txt create mode 100755 test/integration.sh diff --git a/meson.build b/meson.build index 75bcaa6..ff17b2f 100644 --- a/meson.build +++ b/meson.build @@ -73,6 +73,18 @@ rpmdirs_target = custom_target( rpmbuild = find_program('rpmbuild', required: false) +srpm_target = custom_target( + 'srpm', + command: [ + rpmbuild, '-bs', + spec_file, + '--define', '_sourcedir ' + meson.build_root(), + '--define', '_topdir ' + rpmdirs_target.full_path() + ], + output: 'srpms', + depends: [archive] +) + rpm_target = custom_target( 'rpm', command: [ diff --git a/schutzbot/Jenkinsfile b/schutzbot/Jenkinsfile new file mode 100644 index 0000000..837334a --- /dev/null +++ b/schutzbot/Jenkinsfile @@ -0,0 +1,183 @@ +pipeline { + agent none + + environment { + AWS_REGION = "us-east-2" + AWS_BUCKET = "imagebuilder-jenkins-testing-use2" + } + + options { + timestamps() + ansiColor('xterm') + // Cancel the pipeline if it runs for more than three hours. + timeout( + time: 3, + unit: "HOURS" + ) + } + stages { + + stage("Prepare ๐Ÿค”") { + agent { label "schutzbot" } + options { + // Don't checkout the git repository here. It just clogs + // up the Jenkins disk space and does nothing for us. + skipDefaultCheckout() + } + steps { + sh ( + label: "Get environment variables", + script: "env | sort" + ) + } + } + + stage("Mock build ๐Ÿ‘ท๐Ÿป") { + // Halt the pipeline immediately if a single mock build fails. + // A failure to build an RPM is serious and must be + // investigated. + failFast true + + parallel { + + stage('F32') { + agent { label "f32cloudbase && x86_64 && aws" } + environment { + AWS_CREDS = credentials('aws-credentials-osbuildci') + } + steps { + sh "schutzbot/ci_details.sh" + retry(3) { + sh "schutzbot/mockbuild.sh" + } + stash ( + includes: 'mock.repo', + name: 'fedora32' + ) + } + } + stage('EL8') { + agent { label "rhel8cloudbase && x86_64 && aws" } + environment { + AWS_CREDS = credentials('aws-credentials-osbuildci') + RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production') + } + steps { + sh "schutzbot/ci_details.sh" + retry(3) { + sh "schutzbot/mockbuild.sh" + } + stash ( + includes: 'mock.repo', + name: 'rhel8cdn' + ) + } + } + } + } + + stage("Testing ๐ŸŒ") { + parallel { + + stage('F32 Integration') { + agent { label "f32cloudbase && x86_64 && aws" } + environment { + TEST_TYPE = "integration" + AWS_CREDS = credentials('aws-credentials-osbuildci') + } + steps { + unstash 'fedora32' + run_tests('integration') + } + post { + always { + preserve_logs('fedora32-integration') + } + } + } + stage('EL8 Integration') { + agent { label "rhel8cloudbase && x86_64 && aws" } + environment { + TEST_TYPE = "integration" + AWS_CREDS = credentials('aws-credentials-osbuildci') + RHN_REGISTRATION_SCRIPT = credentials('rhn-register-script-production') + } + steps { + unstash 'rhel8cdn' + run_tests('integration') + } + post { + always { + preserve_logs('rhel8-integration') + } + } + } + } + } + } + + post { + success { + node('schutzbot') { + script { + if (env.BRANCH_NAME == 'master') { + telegramSend "๐Ÿ’š CI passed for koji-osbuild master branch ${env.BUILD_URL}" + } + } + } + } + unsuccessful { + node('schutzbot') { + script { + if (env.BRANCH_NAME == 'master') { + telegramSend "๐Ÿ’ฃ CI failed for koji-osbuild master branch ${env.BUILD_URL}" + } + } + } + } + } + +} + +// Set up a function to hold the steps needed to run the tests so we don't +// need to copy/paste the same lines over and over above. +void run_tests(test_type) { + + // Get CI machine details. + sh ( + label: "Get CI machine details", + script: "schutzbot/ci_details.sh" + ) + + // Deploy the Image Builder packages and services. + sh ( + label: "Deploy", + script: "schutzbot/deploy.sh" + ) + + if (test_type == 'integration') { + sh ( + label: "Integration tests", + script: "test/integration.sh" + ) + } + +} + +// Move logs to a unique location and tell Jenkins to capture them on success +// or failure. +void preserve_logs(test_slug) { + + // Save the systemd journal. + sh "journalctl --boot > systemd-journald.log" + + // Make a directory for the log files and move the logs there. + sh "mkdir ${test_slug} && mv *.log *.jpg ${test_slug}/ || true" + + // Artifact the logs. + archiveArtifacts ( + allowEmptyArchive: true, + artifacts: "${test_slug}/*.log,${test_slug}/*.jpg" + ) + +} diff --git a/schutzbot/ci_details.sh b/schutzbot/ci_details.sh new file mode 100755 index 0000000..cbba794 --- /dev/null +++ b/schutzbot/ci_details.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# Dumps details about the instance running the CI job. + +PRIMARY_IP=$(ip route get 8.8.8.8 | head -n 1 | cut -d' ' -f7) +EXTERNAL_IP=$(curl --retry 5 -s -4 icanhazip.com) +PTR=$(curl --retry 5 -s -4 icanhazptr.com) +CPUS=$(nproc) +MEM=$(free -m | grep -oP '\d+' | head -n 1) +DISK=$(df --output=size -h / | sed '1d;s/[^0-9]//g') +HOSTNAME=$(uname -n) +USER=$(whoami) +ARCH=$(uname -m) +KERNEL=$(uname -r) + +echo -e "\033[0;36m" +cat << EOF +------------------------------------------------------------------------------ +CI MACHINE SPECS +------------------------------------------------------------------------------ + + Hostname: ${HOSTNAME} + User: ${USER} + Primary IP: ${PRIMARY_IP} + External IP: ${EXTERNAL_IP} + Reverse DNS: ${PTR} + CPUs: ${CPUS} + RAM: ${MEM} GB + DISK: ${DISK} GB + ARCH: ${ARCH} + KERNEL: ${KERNEL} + +------------------------------------------------------------------------------ +EOF +echo -e "\033[0m" + +echo "List of installed packages:" +rpm -qa | sort +echo "------------------------------------------------------------------------------" + +# Ensure cloud-init has completely finished on the instance. This ensures that +# the instance is fully ready to go. +while true; do + if [[ -f /var/lib/cloud/instance/boot-finished ]]; then + break + fi + echo -e "\n๐Ÿค” Waiting for cloud-init to finish running..." + sleep 5 +done diff --git a/schutzbot/deploy.sh b/schutzbot/deploy.sh new file mode 100755 index 0000000..0594506 --- /dev/null +++ b/schutzbot/deploy.sh @@ -0,0 +1,69 @@ +#!/bin/bash +set -euxo pipefail + +function retry { + local count=0 + local retries=5 + until "$@"; do + exit=$? + count=$(($count + 1)) + if [[ $count -lt $retries ]]; then + echo "Retrying command..." + sleep 1 + else + echo "Command failed after ${retries} retries. Giving up." + return $exit + fi + done + return 0 +} + +# Get OS details. +source /etc/os-release + +# Koji is only available in EPEL for RHEL. +if [[ $ID == rhel ]] && ! rpm -q epel-release; then + curl -Ls --retry 5 --output /tmp/epel.rpm \ + https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm + sudo rpm -Uvh /tmp/epel.rpm +fi + +# Register RHEL if we are provided with a registration script. +if [[ -n "${RHN_REGISTRATION_SCRIPT:-}" ]] && ! sudo subscription-manager status; then + sudo chmod +x $RHN_REGISTRATION_SCRIPT + sudo $RHN_REGISTRATION_SCRIPT +fi + +# Restart systemd to work around some Fedora issues in cloud images. +sudo systemctl restart systemd-journald + +# Remove Fedora's modular repositories to speed up dnf. +sudo rm -f /etc/yum.repos.d/fedora*modular* + +# Enable fastestmirror and disable weak dependency installation to speed up +# dnf operations. +echo -e "fastestmirror=1\ninstall_weak_deps=0" | sudo tee -a /etc/dnf/dnf.conf + +# Ensure we are using the latest dnf since early revisions of Fedora 31 had +# some dnf repo priority bugs like BZ 1733582. +# NOTE(mhayden): We can exclude kernel updates here to save time with dracut +# and module updates. The system will not be rebooted in CI anyway, so a +# kernel update is not needed. +if [[ $ID == fedora ]]; then + sudo dnf -y upgrade --exclude kernel --exclude kernel-core +fi + +# Add osbuild team ssh keys. +cat schutzbot/team_ssh_keys.txt | tee -a ~/.ssh/authorized_keys > /dev/null + +# Set up a dnf repository for the RPMs we built via mock. +sudo cp mock.repo /etc/yum.repos.d/ +# Add any overlay repos +sudo cp schutzbot/repos/${ID}/${VERSION_ID}/* /etc/yum.repos.d/ + +# Install the Image Builder packages and the koji cli plugin. +retry sudo dnf -y install osbuild-composer-koji koji-osbuild-cli + +# Start services. +sudo systemctl enable --now osbuild-composer.socket +sudo systemctl enable --now osbuild-composer-koji.socket diff --git a/schutzbot/mockbuild.sh b/schutzbot/mockbuild.sh new file mode 100755 index 0000000..7bbbb94 --- /dev/null +++ b/schutzbot/mockbuild.sh @@ -0,0 +1,101 @@ +#!/bin/bash +set -euo pipefail + +# Colorful output. +function greenprint { + echo -e "\033[1;32m${1}\033[0m" +} + +# Get OS and architecture details. +source /etc/os-release +ARCH=$(uname -m) + +# Mock is only available in EPEL for RHEL. +if [[ $ID == rhel ]] && ! rpm -q epel-release; then + greenprint "๐Ÿ“ฆ Setting up EPEL repository" + curl -Ls --retry 5 --output /tmp/epel.rpm \ + https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm + sudo rpm -Uvh /tmp/epel.rpm +fi + +# Register RHEL if we are provided with a registration script. +if [[ -n "${RHN_REGISTRATION_SCRIPT:-}" ]] && ! sudo subscription-manager status; then + greenprint "๐Ÿช™ Registering RHEL instance" + sudo chmod +x $RHN_REGISTRATION_SCRIPT + sudo $RHN_REGISTRATION_SCRIPT +fi + +# Install requirements for building RPMs in mock. +greenprint "๐Ÿ“ฆ Installing mock requirements" +sudo dnf -y install createrepo_c meson mock ninja-build python3-pip rpm-build + +# Install s3cmd if it is not present. +if ! s3cmd --version > /dev/null 2>&1; then + greenprint "๐Ÿ“ฆ Installing s3cmd" + sudo pip3 -q install s3cmd +fi + +# Jenkins sets a workspace variable as the root of its working directory. +WORKSPACE=${WORKSPACE:-$(pwd)} + +# Mock configuration file to use for building RPMs. +MOCK_CONFIG="${ID}-${VERSION_ID%.*}-$(uname -m)" + +# The commit we are testing +GIT_SHA=$(git rev-parse --short HEAD) + +# Bucket in S3 where our artifacts are uploaded +REPO_BUCKET=osbuild-composer-repos + +# Public URL for the S3 bucket with our artifacts. +MOCK_REPO_BASE_URL="http://${REPO_BUCKET}.s3-website.us-east-2.amazonaws.com" + +# Directory to hold the RPMs temporarily before we upload them. +REPO_DIR=koji-osbuild/${GIT_SHA}/${ID}${VERSION_ID//./}_${ARCH} + +# Full URL to the RPM repository after they are uploaded. +REPO_URL=${MOCK_REPO_BASE_URL}/${REPO_DIR} + +# Print some data. +greenprint "๐Ÿงฌ Using mock config: ${MOCK_CONFIG}" +greenprint "๐Ÿ“ฆ Git SHA: ${GIT_SHA}" +greenprint "๐Ÿ“ค RPMS will be uploaded to: ${REPO_URL}" + +# Build source RPMs. +greenprint "๐Ÿ”ง Building source RPMs." +meson build +ninja -C build srpms + +# Compile RPMs in a mock chroot +greenprint "๐ŸŽ Building RPMs with mock" +sudo mock -v -r $MOCK_CONFIG --resultdir repo/$REPO_DIR --with=tests \ + build/rpmbuild/SRPMS/*.src.rpm + +# Change the ownership of all of our repo files from root to our CI user. +sudo chown -R $USER repo/${REPO_DIR%%/*} + +# Move the logs out of the way. +greenprint "๐Ÿงน Retaining logs from mock build" +mv repo/${REPO_DIR}/*.log $WORKSPACE + +# Create a repo of the built RPMs. +greenprint "โ›“๏ธ Creating dnf repository" +createrepo_c repo/${REPO_DIR} + +# Upload repository to S3. +greenprint "โ˜ Uploading RPMs to S3" +pushd repo + s3cmd --acl-public sync . s3://${REPO_BUCKET}/ +popd + +# Create a repository file. +greenprint "๐Ÿ“œ Generating dnf repository file" +tee mock.repo << EOF +[schutzbot-mock] +name=schutzbot mock ${GIT_SHA} ${ID}${VERSION_ID//./} +baseurl=${REPO_URL} +enabled=1 +gpgcheck=0 +# Default dnf repo priority is 99. Lower number means higher priority. +priority=5 +EOF diff --git a/schutzbot/repos/fedora/32/osbuild-composer.repo b/schutzbot/repos/fedora/32/osbuild-composer.repo new file mode 100644 index 0000000..0703e40 --- /dev/null +++ b/schutzbot/repos/fedora/32/osbuild-composer.repo @@ -0,0 +1,7 @@ +[osbuild-mock] +name=osbuild mock osbuild/osbuild-composer/PR-952-98cb0e5 fedora32 +baseurl=http://osbuild-composer-repos.s3-website.us-east-2.amazonaws.com/osbuild/osbuild-composer/PR-952/98cb0e5/fedora32_x86_64 +enabled=1 +gpgcheck=0 +# Default dnf repo priority is 99. Lower number means higher priority. +priority=5 diff --git a/schutzbot/repos/rhel/8.2/osbuild-composer.repo b/schutzbot/repos/rhel/8.2/osbuild-composer.repo new file mode 100644 index 0000000..8f06455 --- /dev/null +++ b/schutzbot/repos/rhel/8.2/osbuild-composer.repo @@ -0,0 +1,7 @@ +[osbuild-mock] +name=osbuild mock osbuild/osbuild-composer/PR-952-98cb0e5 rhel82 +baseurl=http://osbuild-composer-repos.s3-website.us-east-2.amazonaws.com/osbuild/osbuild-composer/PR-952/98cb0e5/rhel82_x86_64 +enabled=1 +gpgcheck=0 +# Default dnf repo priority is 99. Lower number means higher priority. +priority=5 diff --git a/schutzbot/team_ssh_keys.txt b/schutzbot/team_ssh_keys.txt new file mode 100644 index 0000000..cff54db --- /dev/null +++ b/schutzbot/team_ssh_keys.txt @@ -0,0 +1,20 @@ +# SSH keys from members of the osbuild team that are used in CI. +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCxjfFIIlGfCn9iclHymWrEBrTU2lL6tkSGT1ep7dCPzw1jY6WnhQlPXMpePriNxNXlG8cWO9/RFpBd0z9FwNy+kfgh9fuyNY49I+Ma6OyTVBg5hNoFxfRXG5iHtc/SQlnbEFiKpSk4lipo4QZtBtmgAqgkSA6Dzhygb6u5M9ixTIx4WBjuSM0GXQzNjpefyiWu+sIR+h2UrQkKABuuIYQbrjl+FhVmaLvrvyTO2usOtvnYBjhbPwyO72WPjapKd/9hTaqPE1wFy6UF2nXc4Pgw0giQb6sibFTz7NTexW35Q98qpQOWMYKcpgZrlSaHHKZSMhtzO7MdZrOLFUXoS1AeAy4ghtcNrOBTlb5SvP73zz0qBRF2cCO4O0wp5wwqPhvw2ntb3pTLPtdetJ+V50QPnpnXySSnZp2zFwce21bXx67nh9lnhLrZgje7coQnPAFx/cl36ESJygiuPcBw+k18YulYMXUqaBtkwJLkRjDpjTX2e5MJ16oD7sJHc4/W5kyfLvdMsVhdq1CXHGVVOpzogb095VYi0RXFpnZR/1eVgC/R+WVytYfY80rfVOcdAo2GZfnJ5zYRUXJJ9MZkanxx3E7UOikEJN9sUj200z6Cyy0IfIqTbJ1B5f7fd3acRrL4DcYUdFI/1ByNW6F1j7cZiAGOJKNbzXF0T3tf8x0e1Q== major@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDE+WCsyhgXLEBvcNKmEO5w9cYsqlcTUpQLgtHAO8+Ub1bw3UTuiJ/Qd3QmAr6gnb1US0Zs8srTZ5W34jOmYcupmmujLEUUrc/Lj2UzIDWqYi04GD3nzGM/oRWT2glJUXBe63bdy38/GfGdNqp9ZkVgaOEkwVyaxAuNcgNXoEJroSWMStvnDki9SvmXn972QFn+vfQdSt+6z18YFqyE0UhNVX+VE6rezNFRzARCrd+nCc8fVdTRd2vQ+0McButDLzwRXEwLjNOPfXCvoI5EH8+uhOWzLlR9ChfsMcbsipDRHyee0hKWhqg/C8j2DCC9r0zHArPcvLi+qGNIxdSE+KXjWRInr/DSttN/MwDulhJ4uHQQA/PDM1W8yddZpfBv1PaDO+wsm6s2bMN1mzgUPAOZK+i6gaYuoVc89f6+aHJVEPgtqT9Zp+6PD13RWDV6jfi0pfmwRi/CXLlc588oU5D8LEmlUNnUvSNmyV7OJayIK+K6+e7hWGC6/UWess+WSBc= larskarlitski@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQR4bv/n0rVI0ZHV4QoEjNrnHsUFFAcLJ6FWnnJyI31aFXWjjPf3NkbynPqqv3ksk9mj6jJzIBnlo2lZ0kLKIlnblJAyz0GVctxPsBQjzijgLPWTWXS/cLoyLZNS7AsqyTe9rzUATDHmBSje5FaJ6Shas2fybiD5V56fVekgen+sKVBWyFAKsxlWV1EytH5WLn0X0H6K50eCA7sNDfNlGs8k8EXmQPmLOEV55nGI4xBxLmAwx/dn9F3t2EhBwGzw1B6Zc4HA/ayWtJcoARO3gNiazTHKZUz37AAoJ2MnLB698L39aYZ/M55zduSLcyUqF+DBHMfzHH3QRsG0kzv+X9 tgunders@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDV/HNj7nVUp+Yh2hAhHgU+R6X9tLAnApUALhPK8oqH/WG6SjXDiLLEoCSisqu+3+WQ3/UcJeoRl5jpyRAjhxnsz/o5tfLXFDJBZ1/njE9T+e73tjfgS6s+BRpCdEAv6/BUVCxz4B5yI7+5mph0JFpv/soe8uhR6MlxAVxAhaLla4S2UPcn6SciyVznIzrTWgfsSHk/o5hIDVfJ68qYVPWqZWmV86hjE/VhPVgmiqFFh2YsJO/FlH36+wtABcKHbovkCjqQ9PkUqfns+82CNjP/XQ6GJZVK5xpYT59ILjlFwA5s9SYkLcjI+Xy2GGNm4ftNqtoF57q33pfDkxQsYJ+D obudai@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDm5/cfoo+5LBS+0bZ51w8gnB8gUUnUf4Kl4TaLIJF0wBrsywMBXtyRZFhEf04U40bNvWoVjkA3ISvq2Y1PBTRYy78VI5LfOA9/39THVDUZy1l9siSXKpNKx3bUgWGQ17jql7zwzF/Ad4h7E2YD56gtfRXmmF2eFQ2q6OZBXxJgDpbyvBpV0HdmarKTnUSwuvCjkLBSbFSc9MGrFkkkfQjkXtDq6ovzaxr40+u2pEZn/GuwTGFi93Lyovfa/Z4fOrHbJD+AlSmRKUO9Wm+QkSyIuQYeQlr1lN2Mx5tgV2umuuM++mEZq0clfMl7LCz/BfvEUb7w6KxmR++G9nATv1s/ anilsson@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAw6IgsAlMJQlOtJXvtlY1racZPntLiy4+iDwrPMCgbYbsylY5TI2S4JCzC3OsnOF/abozKOhTrX04KOSOPkG8iZjBEUsMX4rQXtdViyec8pAdKOimzN9tdlfC2joW8jPlr/wpKMnMRCQmNDUZIOl1ujyTeY592JE8sj9TTqyc+fk= bcl@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDCk/bA7cpp5ynNr+0SGFFjfdJY1M4EUGqbqbcEQ3uU/CX7AhDEHB2pZMAoCPenoIlB0tz3qTvhQqn9jskiT70qU7bDIRbouXit3Jo0YheYZB7+eD/zxAHropUqjA3Bs6JSoBf2z48FumiFfP+eI0UFJ601Zux2fJCTpLuiboEscegWGyzJrl8/b7XCppNusewM1POyErZDlgHh/2gD7rsupMQKxv3rDOexbGMsA3aGgdrPkvg966tCN5Fz7eBM1RQ3o2ywojTgX9I3U/VeZRJ3w1T1IRDAF/DIMh/dA0afsSXn/7PJUx4NiTRstaBbuYYOMs+PQYSE6o2MLdRXZMQA2Dve/dARkg8LO1gvgNEtNUnDcmVPBrKvULDY9viHrGym9Q0Uo6eaxkqQMjzunV5ozUK6pmuYrMK0dODsVDiB4Ja5CQ6pybAOi+i45FqTT8Wc032KbvydWFpnNCvq31vXfVIysqtGASbhWyvry/Qjr04fkcwQhv6Lnph0pAJr5x9ow5rQrQBJZA23hRXDRuUQqpmnFvzK9TWxb1YQSdyQtpuPplbFUfr5JvyCDwHSBzmPZQUESgddmwCmsO6j0KZVmyJkSbXcWW69LMKGmpb1+Fgg2oo9kAW3e89XWyC7VfLIw5Qog08GtlgcpW92w75nSu3wPMi3ww2g78aG5zgLGw== daherrma@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEApQ0yn8aUPRXoJgGZpWXcOjMXjJgmq9KN/tg0iyK9nuR3uRfdiNGTpgKr7DY9HfdP07R09e/uZ8qnLcXUrXYfJj087JNTMHjT1Ifb0KUB9Mzy82RDUFuefds356arhzhW6YS4cOOgY2GmEt2KhftjdHRic/eElZW9I5mA3Oz/uDk= ckellner@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8E4VU/3riYCdVAQMBWpwXHiN2/MmUoriYDe6o+hNQ6E1aubdHJ4kYIBxLPYaRvy5sLrbXhsFQH3eNx3HD0TvLiaKU6p9Vj1vEJuTGxB0rIWFATGxvUmBRmUrPNSiWJNCfhjNHTHqboNTf9rX+qgQY5ZqobVpbWHm+sq9QFMtrrF29FiWyowQIFQEPVFx7069Hfk0/JZlEc6rwqX+uiLU8fWP8X1uyXVuNP1xODFX+E/+SC4AbF/wfLlzZ1DVAadzBmCqmqaYQ/dTutXXOeCkiyT8WsPMwp/3FVM+IBwNbyr99fxX0l9j99g7v3vBX3rxV1R4jdQg6htdB7f+ihLAjnAqdNM2ufj0zLn7luJ9icVmV88+DkZf85Y81y/wqqiXEA8BgLlR8zsgnO4RcJoZHq6IErCjvOHBD2rgUAPtJWRLGPUeO53nKyYSobLslIg5dK4klp94DBblV6R+e0tsZQMVvlyj2iBSY/aBR0Cm4em8sXsoZeUQ9+JW6KWXM0yCLAYzhPOsWVi+65qaGjM9JfJKkrdk70Bqx9CixY25WRHiEtUbTpzqNoVil8AB/Ajvofjd36GhQhcng4MKfAUnGm5QQo4k1XT0ExSAwBI3FkkUNZQREhzAdkFdbSo/Iteh2u/OENgJ84nonCUVVFm/vw4nhG+Vmi8E7PJno/jzwoQ== jgiardin@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDQqwlSYW+lD0qlxrol3JQgcN0QSaT9sm3vmhxX18OnP/3XyxZwgnEiJtIDnoZ2FAWOEKTQ9PP0Ab9gfko9mWl6OP5Nj0wT37ZeWYAJoOA3qLw1PCUF8caHs9NcgTEc2Gd+yKIxObQo2xGZQFLBW7owI4S9Rl1a30+5oLFRZJXx8Yd5+b1xFUU/4oOSkc3birHlwTZrFrW6H+AYT4u9ioSvBKtmj7KCqzbRW7p6Sk40p0EoCYU83ZsevzYXTHTAFRHD/gsRS4N7SOUClz+ZnakVBV7fa0ETLkfSmVplhlklBQjBM7OVLeghjlSRXhAcVV63iJfTMNlTjM47MB/C48L+AlH9KMYmbR1ur44NsNGFKTe08B3Q1YfcSR4no6B5iR+zgb6fpDolklAcW5qbHiOOad3Gd8M7VGpDrHZzQe7QGe6fVMKjVq7xfJFgvOaW44F7RTgL6FnT3bNoi6k26enl1O7WlM0v8j/SwtJlSl3I0HpJXLWP/sgr7U590hZSRgG2U5hoXV9YXUCyLFy4pom82CSkAPT2DybdbnhCf4FAnW2CuZMr7KXuVrHC11LA+S2HLN9Fc9f8SA745+0gO5GTvoSWEt6oAgqPWgK6xj3aeHqWN4WQvMHzdftLh4ZxjHd+c7VxreEMQgZJ124W5nUttn4S0xpJHFMADJ44Kjxg6w== jkozol-1@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDMk4+D+GkL/se9RYdQ6mmv0v7cG3gXPiZdLvsbRFk+JMgnLEFUu4uwRN9+huMWdTXYLVcCZVw1l9kmDAOwPKYCGwetOwYI73nYt4n7i9zSQqKknxEO2w+16PvWy6kbgk7zQp9YEqJlIeZbVXiDuFeFyqEH5TxdAfDLu0VG/Db0M1Cor3v7g0/utHWVfS0QiLMQ5xLZ3jAbn/uTjOzsvtA219BTfdx7IVxKmG9/zeLUqyHBcOquI2rUjgHj1FN4yMCob2pSmAfV2u1iQZYHghXlw/kzh4BODjOSWCO9v+621eBdDJ36hdMHWizevxLz9Tj7X1Pwz+4TS/WABXs5MXBFcxx65wpSBr84LfZfWebe+vFe3Kkmdop3FPt7uuZyl8xdRsvfoIG3qZg2izX4IAtXo9tR++yIsEkP/5k/NVwkq158molT0HUruuK9regPRRvf7j6psAH4bMhV3o430eD7ibC5g1yT3kKbGnbJJX+HHL0+lt8IKMPCHWEWOT8uR0x9VUbT4RYFXt53I/ZXHXop+eypEctoKlsgMv1rpPGwSnrhtK1hgf399ph7GDjixZiuzcTP+Ulmj3atB32UHR7mRjarnaCI1w7PJt8pmg9K+8/XUa51q7bap1PGwsJS0lZ3zJEXFPdJfqO8/fkhDb4NYPlX0/bg/LNI9YqPg8CWSw== jkozol-2@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDZ9VgDuObR96fouIDfvzTQxfvMdb4OaK9UPYtQkaVg25a+Yb734Xf0bPFGjM9vtvJmy19qUSlCioqmkEcwheczoDsI/nLBnlRFH3FTmRt3WGJdWcO5MkVXbQAlTqMAlMI86OkeV3jGi5aKYbQ2QJa2ilvQ4JjTEPcAdBmaV9iFgrh9DnIHiAG4RJhrl2BGyf29FIGHusQp7rQSvkwuFPsITjXLcwUKSKbI4+ycwmJN492ovcsiqzG5+YWx12fm3woUWvqFIrt70yc+C7QP68qKJE6qnzWtzZxqtdHR48US0l9xTWB78HGlu0chtTfcF9xT7gokHmx95RWmfXU2fygt1wEYiKNoQnhZTb71ay6fWgzZMOnWrQSyhvKQpIGdPuyevCG7aNtQYTfgCfmPAfZpR1hLQe0feTTLWeS/3aBHUYwYigskFfOZuKy/3Gd8UA2uLeFSOaQ4rYK7sk/FnhGkzxpnW0FR6EXpvWRWdiusjvIZJRyHqb8O3I2uY9aiqV92OaEzwrBlNqqqg0+a7sZOlV8ZtVtzuqBO3yD4tVLGMvO/f28GJ0FnHExrLWHCStqlRiZvqukoJrGBRHJS0j2UK8agwzDM0jHQ4mxbfOwf618puV/YeRhd77GsFcrPD0KONTMeOEoN1jETTBBGZ7Ly/0MsnpP0WR/s8uuvmT7Xaw== msehnout-1@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC1pAobLYTC9BepQi0MViep8sQ0+OpTxP5FSZyiww+IQHpiXPvAzzYL0CYGagvPCI9zPQXx852XjP4T4/Oda5ejcP4+RbT/6ndbUm78xlzRrkYi4dd7OVdmm/1vriK1Q5llcnh+69wao5lXXTZ/j84O2bzAFGnG8MJfMa0gRiqOBCt24EQW1a5NYgTAZQBuD92/pJqc1b1S+hZWerxSdtVrhHi8oRlCwYbVWyhxF+OygfZqe4UyaH5m+eHYLJsxOfwvl9aUvp0ahlOT92l74l0ILuzYSTYIFr/W46F/9tYxiV+rEzjX9niR3sUE9R4U6Jia2aIQXJ6gsftX0Oi5r8nr7DJSPzr4zYMPcxZMEe3nt9ig1dp5DEuT16/e9dgfOuPYBPuEpxVjUPgXeYXIEURRuN9WaCXTkhpAEjIlAzaZsUGMNOVIQsPaHyYnsN/Chk2t4wf/ZIXbGefsTqPLwedbhULPzojHJMfg6Jt2PmUkOhmDtY0jd1vE2cV8/o6refnInf8ePliYZeM7xaF3zZz6ZAmpVAwhkyzJA8AoC4Y4A8+nEWnE641B/l6hXeSd2gdmYSi8FkIstTq6+cUammnJRt/yWLQyYkG4T0RYe9Xp79ZdYC28WOCy6tCzin24a1Zxwf2bWUwnji/01GLxwBHL+wIGHA0noG6XNqbdhRumGQ== msehnout-2@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCv+bp9I2UqM4msF8D2deAp8s7LjdmH4zHZgioKFRcWMT7ibAVb9B/DNyV9E5VwNs/ofPVjstylHq8R4AJIJGVhVN8woeBjDYdniVJ42Ae7IqoERACDiqASERQSAtYSi+YNZ91jR7ERyHRYspy7lvLhWTyutZbavZa1rk1H9a2pDCfl2RK1Pb+oL41jFzHpupHdBNR0P9feJbbAvwqK6lZI0vMSdY8sJoiVq5MdvB2dy+S+BFs3TNNREaAr4l9XrJ42kmCkBSWVJkmQlCwT8CefZiTKecDNPQE0NI28ABUwQ2T3UElL65Uw5HrWNqIH6CcDfQPDgRfXnfLbPmJMTFQMWRy0H35EdCz0G21M+DfiSxgtOTL2gY872acqtyRwuOdD8/kKD7BuQtlsjpfJtORY+DIMHFF1hfNSWEDztD/4rP9eehYqY3s6UPMTeaowf+6QoAQqDvZG/RH85LhL1FV42N63cIPuTfPErw35hlOhYOUqYrApNtOdsOoEMUunGM= msehnout-3@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDjBCoSJv5HrA0PquLDJYU36oPI0H23AmU2gs8F3k6kBA71N9pHbs/C+YxFYyrsjLqaLwdo44sE2vXB5igJTZN/YpHYytbKHIGdnh3qc0myMvxDLJUxA1kxx3XfT8vbJ0AHrRIJdV6lxfrifI92a0vqRL1pAuWzW/NYytk6DeYDXbUy4xtHOlRIf2WXqZ2pZXsFleaYMdfmUP0y0awe5YDQsNkOBD2HDbU9669jP+UB0nirVuxDhZr1kZmQ8QdQxlePN5LN0RmbNY5Hm1/2SDuXhWh90/fbbWoCkrLTlkAUHckZPmGiEBhD2n4c7jHc25/fhaZsjZITRzHKP5wWW7LE3tXJVMF4eFEzgCoYEr6RpdEwQqQl86WiA0VuLQZbfju5T8t3y6PcGvXD5BF5BJuq710Uqw6y+gy4gNepO4U32jwBz2DDMMBhHsgjSmPfdTvqrjUnlt9NWTXnVDP34Zc5V+RwCgyB09gkwqW+Ae0jDoRSo1hTBSi7v9Gp5R/Hed0= msehnout-4@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDRhju+UtbgUyUzE56Hr8fcRsy0lwk6SKDGn6M7TQ+B0EL5mMTmylbGZ4eP3h+II+GVF5DcoDfXolQvSVn6kSz5lSq/adlbAgGZdxd8Q6N1V+zmMejQf3ZpKQoFWFkmzQoHV+yJkMtWGz//RYqn6eHXvuyDxGyCsdEzBnt10VZL9/g+C45w8l5FlMdGHOhBIkZg1UDLL+2pu8/t4DuPskyr83Thrmb0eZBC4BLLS8Ob9BSZroUgDE1BoSGmfUVnt2Yipjj9qTJ1vWpZPGuqXyCtHHBneJA1b+Hu21CCX/FtSWBNgkbGW2l0rgl8py/GIjqYXPQG0UHkpg6RNlXDARb/GxJVRA2rILX7BsnndKlEh+Kw9Q/IgxpcR5RxZwbH1hYxX1igVyrRW2kAobJhazGV5gBfgm4tZ05dqBL6QX/PqTd6lC5jsyRStwCYIwkh0+Knl2WRagRK/matzvX6MmQXV/vArtY2S4sG73lWN/Af5PnWXQRHRTAyZdSbQC/Ti8c= msehnout-5@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDoVIpowzsQseMML/7I9LcA18G7quBjp2te6GHX9g2IrKh3PxssIS4jQSskRePaCl1yLWhTRDgADkDuOwd8SrQFy7eo7I/GD2wDcdLaWYy4GkdV1M9nhquqpbdLQ2m/3sRhqdHEHadGuw0iYdNgR0M5sNig+xL+G+G4MvjL7hcuaC7GUVbAFWQgePwFWLxjTmX2zmpKQMwk1r4n/i4Wj2GJ7CayxOc9qtnLdnZm9Tj3WA/aRLdbnlM0TCzXrtfO5OLVa9/n3AHY4qqZ1PmRCizLlLtvDeTjhM5qTYCk/xnUNCVnPhe+YqkqXlV6D/D7SI6EIiEd+GI+qJsHt9AgKZpr msehnout-6@redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDY/ylCrPBzil4TnZR4tWULpz3QgfBMQyEnMOHDAJNp/FK70hD+PUiRm3UY96pmGXonQvqiDoyPuVh025FkWshPK91Dyq8QD8h25q5C5Cg6kMgBpdGzbX44ksms1KyOHmSZ48MpWw3PFOrlNP1vysr6Imjz9Jixmx4sOZvqKnrbsbOW04gowVzpZM8m048lvf6/KhqeImfeSRc9Rtpos8GqEQVlwRevE1qBON963V1QtFOrm9weoQgb369SdqRRdxaGNAymNh3d78DneOWXmEyBflLSpIDx5I2s/1NB1Dp95Bp3VvlV3CH1HC7LAFKYi+xsz3/KHdgtvgShX6LFSdsp rvykydal@dhcp-lab-144.englab.brq.redhat.com +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtJv3QKdqQ+0+jJND7bXVq9ux87yyi4qyJk7iOsX2VsgAUuYXpBf337p5yNB3N1kjOwGYSDjvDvS7GuhdatuvJI3/xzcyodbwJp32AT76e9uvUQHTBBGmUvBLzw3nk8ZDNp5d4rt2cZvlhv7lzDSt30DF14ivg5Xp/V0tK0BEfFlvYHuHheDeiSOQRQ392J7TefPQOW+JpxANU4Bxc1aHIettaIqQMWm9r4ZELd8M83IYt5Btp1bPsnfYywQMYqNXyDuhwhcsBTR5kVObP0DwxKZbMNPmA2lBvrX2GMIa+qfvKIW87KooaoPLt7CR7/DKfQ1S492L1wIwNUPUBLsQD xiaofwan@dhcp-8-203.nay.redhat.com diff --git a/test/integration.sh b/test/integration.sh new file mode 100755 index 0000000..8bbd7bd --- /dev/null +++ b/test/integration.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "IT IS ALIVE!"