blob: 3a106a17b705fd52e5424b911043dd75eb175362 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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
#
# https://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.
name: TR Ultimate Test Harness
env:
DOCKER_BUILDKIT: '1'
COMPOSE_DOCKER_CLI_BUILD: '1'
on:
push:
paths:
- .github/actions/tr-ultimate-test-harness/**
- .github/workflows/tr-ultimate-test-harness.yml
- dev/traffic_router/**
- traffic_router/**
create:
pull_request:
paths:
- .github/actions/tr-ultimate-test-harness/**
- .github/workflows/tr-ultimate-test-harness.yml
- dev/traffic_router/**
- traffic_router/**
types: [ opened, reopened, ready_for_review, synchronize ]
jobs:
tests:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Fetch environment variables
run: |
source dev/atc.dev.sh &&
env | grep -e^TO_ -e^UID= >> .env
- name: Load environment
run: |
set -o pipefail &&
cat infrastructure/cdn-in-a-box/variables.env .env |
sed /^#/d |
tee --append "${{ github.env }}"
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: ${{ env.GO_VERSION }}
- name: Vendor dependencies
run: go mod vendor
- name: Build docker-compose services
run: |
docker-compose build --parallel &&
docker-compose pull db
- name: Cache local Maven repository
uses: actions/cache@v2
with:
path: ${{ github.workspace }}/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Cache node modules
uses: actions/cache@v2
with:
path: ${{ github.workspace }}/.npm
key: ${{ runner.os }}-node-modules-${{ hashFiles('traffic_portal/**/package*.json') }}-
restore-keys: |
${{ runner.os }}-node-modules-
- name: Start the Dev CDN in a Box
run: docker-compose up -d
- name: Wait until Traffic Ops is ready to accept requests
run: |
trap 'echo "Error on line ${LINENO} of setting interface IP addresses"; exit 1' ERR
set -o errexit -o nounset -o pipefail
# Get atc-ready function
source dev/atc.dev.sh
export -f atc-ready
echo 'Waiting until Traffic Ops is ready to accept requests...'
if ! timeout 10m bash -c 'atc-ready -w'; then
echo 'Traffic Ops was not available within 10 minutes!'
trap - ERR
echo 'Exiting...'
exit 1
fi
- name: Set interface IP addresses
run: |2
trap 'echo "Error on line ${LINENO} of setting interface IP addresses"; exit 1' ERR
# set -o xtrace
# uncomment this line ^ to check interface data
set -o errexit -o nounset -o pipefail
source infrastructure/cdn-in-a-box/traffic_ops/to-access.sh
declare -A service_by_hostname
service_by_hostname[trafficrouter]=trafficrouter
service_by_hostname[edge]=t3c
for hostname in trafficrouter edge; do
container_id="$(docker-compose ps -q "${service_by_hostname[$hostname]}")"
interface="$(<<'JSON' jq
{
"mtu": 1500,
"monitor": true,
"ipAddresses": [],
"name": "eth0"
}
JSON
)"
docker_network="$(docker network inspect dev.ciab.test)"
for ip_address_field in IPv4Address IPv6Address; do
ip_address="$(<<<"$docker_network" jq -r --arg CONTAINER_ID "$container_id" --arg IP_ADDRESS_FIELD "$ip_address_field" '.[0].Containers[$CONTAINER_ID][$IP_ADDRESS_FIELD]')"
if [[ "$ip_address" == null ]]; then
echo "Could not find ${ip_address_field} for ${hostname} service!"
exit 1
fi
interface="$(<<<"$interface" jq --arg IP_ADDRESS "$ip_address" '.ipAddresses += [{} | .address = $IP_ADDRESS | .serviceAddress = true]')"
done
# Get server JSON
server="$(to-get "api/$TO_API_VERSION/servers?hostName=${hostname}" | jq '.response[0]')"
if [[ -z "$server" ]]; then
echo "Could not get JSON for server ${hostname}"
exit 1
fi
# Update server's interface with its IP addresses
server="$(<<<"$server" jq ".interfaces = [${interface}]")"
server_id="$(<<<"$server" jq .id)"
if ! to-put "api/$TO_API_VERSION/servers/${server_id}" "$server"; then
echo "Could not update server ${hostname} with ${server}"
exit 1
fi
done
# Snapshot
cdn_id="$(<<<"$server" jq .cdnId)"
to-put "api/$TO_API_VERSION/snapshot?cdnID=${cdn_id}"
- name: Wait for Traffic Monitor to serve a snapshot
run: |
echo "Waiting for Traffic Monitor to serve a snapshot..."
if ! timeout 10m curl \
--retry 99999 \
--retry-delay 5 \
--show-error \
-fIso/dev/null \
http://localhost/publish/CrConfig
then
echo "CrConfig was not available from Traffic Monitor within 10 minutes!"
trap - ERR
echo 'Exiting...'
exit 1
fi
- name: Compile the tests
run: go test -c ./traffic_router/ultimate-test-harness
- name: Wait for Delivery Service to become available
id: wait-for-ds
run: |
trap 'echo "Error on line ${LINENO} of waiting for the Delivery Service to become available"; exit 1' ERR
set -o errexit -o nounset -o pipefail
# Get atc-ready function
source dev/atc.dev.sh
export -f atc-ready
deliveryservice=cdn.dev-ds.ciab.test
echo "Waiting for Delivery Service ${deliveryservice} to become available..."
if ! timeout 10m bash -c 'atc-ready -d'; then
echo "Delivery Service ${deliveryservice} was not available within 10 minutes!"
trap - ERR
echo 'Exiting...'
exit 1
fi
- name: Run Traffic Router Ultimate Test Harness HTTP tests
run: ./ultimate-test-harness.test -test.v -test.run=^TestHTTPLoad$ -http_requests_threshold=1200
- name: Run Traffic Router Ultimate Test Harness DNS tests
run: ./ultimate-test-harness.test -test.v -test.run=^TestDNSLoad$ -dns_requests_threshold=2500
if: ${{ steps.wait-for-ds.outcome == 'success' && always() }}
- name: Write Dev CDN-in-a-Box logs to files
run: |
set -o errexit -o nounset
mkdir -p dev/logs
for service in $(docker-compose ps --services); do
docker-compose logs --no-color --timestamps "$service" >"dev/logs/${service}.log"
done
if: ${{ failure() }}
- name: Upload Dev CDN-in-a-Box logs
uses: actions/upload-artifact@v2
with:
name: dev-ciab-logs
path: dev/logs/*.log
if: ${{ failure() }}