| #!/usr/bin/env bash |
| # 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 |
| # |
| # 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. |
| # |
| # Non-interactive contributor smoke test for an Apache Airflow CTL release |
| # candidate. |
| # |
| # Meant to be run *inside* the Breeze container so a single command brings up |
| # Airflow and exercises ``airflowctl`` end-to-end against the live API. |
| # ``breeze shell`` configures SimpleAuthManager with admin/admin and a per-shell |
| # JWT secret, so booting ``airflow standalone`` and running the CLI in the |
| # *same* shell is all that is needed. |
| # |
| # Note on auth in a headless container: ``airflowctl auth login`` with a |
| # username/password stores the token in the OS keyring, which has no backend in |
| # the container. The headless path is to mint a token with ``airflowctl auth |
| # token`` and export it as ``AIRFLOW_CLI_TOKEN`` (``airflowctl auth login |
| # --skip-keyring`` still persists the api-url so subsequent commands know where |
| # to connect). |
| # |
| # Usage (from the repo root, with the chosen RC version): |
| # |
| # CTL_VERSION=0.1.5rc1 breeze shell --load-example-dags --backend sqlite \ |
| # "bash dev/verify_airflow_ctl_rc.sh" |
| # |
| # To test the exact SVN artifact instead of the PyPI RC, point CTL_WHEEL at the |
| # wheel (visible under /opt/airflow inside the container): |
| # |
| # CTL_WHEEL=/opt/airflow/dist/apache_airflow_ctl-0.1.5-py3-none-any.whl \ |
| # breeze shell --load-example-dags "bash dev/verify_airflow_ctl_rc.sh" |
| set -uo pipefail |
| |
| cd /opt/airflow || exit 1 |
| export AIRFLOW__CORE__LOAD_EXAMPLES=True |
| API_URL="http://localhost:8080" |
| |
| CTL_VERSION="${CTL_VERSION:-}" |
| CTL_WHEEL="${CTL_WHEEL:-}" |
| |
| echo "### Starting airflow standalone (background) ###" |
| airflow standalone > /tmp/standalone.log 2>&1 & |
| SA=$! |
| |
| echo "### Waiting for API server on :8080 ###" |
| up=0 |
| for i in $(seq 1 90); do |
| if curl -fsS -o /dev/null --max-time 3 "${API_URL}/api/v2/monitor/health" 2>/dev/null; then |
| echo "API healthy after ~$((i * 4))s"; up=1; break |
| fi |
| sleep 4 |
| done |
| if [[ "${up}" != "1" ]]; then |
| echo "ERROR: API server did not become healthy"; tail -40 /tmp/standalone.log; kill "${SA}" 2>/dev/null; exit 1 |
| fi |
| |
| echo "### Installing apache-airflow-ctl ###" |
| if [[ -n "${CTL_WHEEL}" ]]; then |
| pip install --force-reinstall "${CTL_WHEEL}" |
| elif [[ -n "${CTL_VERSION}" ]]; then |
| pip install --force-reinstall "apache-airflow-ctl==${CTL_VERSION}" |
| else |
| echo "ERROR: set CTL_VERSION (e.g. 0.1.5rc1) or CTL_WHEEL"; kill "${SA}" 2>/dev/null; exit 2 |
| fi |
| airflowctl version |
| |
| echo "### Authenticating (headless: token + AIRFLOW_CLI_TOKEN) ###" |
| TOKEN=$(airflowctl auth token --api-url "${API_URL}" --username admin --password admin 2>/dev/null | tail -1) |
| airflowctl auth login --api-url "${API_URL}" --api-token "${TOKEN}" --skip-keyring |
| export AIRFLOW_CLI_TOKEN="${TOKEN}" |
| |
| echo "### Exercising commands against the live API ###" |
| rc=0 |
| for cmd in "dags list" "pools list" "connections list" "variables list"; do |
| echo "--- airflowctl ${cmd} ---" |
| # shellcheck disable=SC2086 |
| if ! airflowctl ${cmd} -o json; then rc=1; fi |
| done |
| |
| kill "${SA}" 2>/dev/null || true |
| if [[ "${rc}" == "0" ]]; then |
| echo "AIRFLOW_CTL_RC_VERIFY: OK" |
| else |
| echo "AIRFLOW_CTL_RC_VERIFY: FAILED" |
| fi |
| exit "${rc}" |