Skip to content

Merge pull request #17156 from SimonRichardson/generate-triggers #1036

Merge pull request #17156 from SimonRichardson/generate-triggers

Merge pull request #17156 from SimonRichardson/generate-triggers #1036

Workflow file for this run

name: "Migrate"
on:
push:
branches: [2.*, 3.*, 4.*, main]
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
paths:
- '**.go'
- 'go.mod'
- 'snap/**'
- '.github/workflows/migrate.yml'
- 'scripts/dqlite/**'
- 'Makefile'
- 'make_functions.sh'
workflow_dispatch:
permissions:
contents: read
jobs:
migrate:
name: migrate from ${{ matrix.channel }} client
timeout-minutes: 30
runs-on: [self-hosted, linux, arm64, aws, xlarge]
if: github.event.pull_request.draft == false
strategy:
fail-fast: false
matrix:
# TODO: add microk8s tests
cloud: ["lxd"]
channel: ["local", "3.5/stable"]
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version-file: 'go.mod'
cache: true
- name: Set up Go env
run: |
echo "GOPATH=$(go env GOPATH)" >> $GITHUB_ENV
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
- name: Setup LXD
if: matrix.cloud == 'lxd'
uses: canonical/setup-lxd@4e959f8e0d9c5feb27d44c5e4d9a330a782edee0
- name: Wait for LXD
if: matrix.cloud == 'lxd'
run: |
while ! ip link show lxdbr0; do
echo "Waiting for lxdbr0..."
sleep 10
done
- name: Build local juju client
run: |
make juju jujud jujud-controller &>/dev/null
- name: Install Juju ${{ matrix.channel }}
if: ${{ matrix.channel != 'local' }}
run: |
mkdir -p ~/.local/share/juju
sudo snap install juju --channel ${{ matrix.channel }}
- name: Bootstrap a ${{ matrix.channel }} source controller and model
if: ${{ matrix.channel != 'local' }}
run: |
/snap/bin/juju version
/snap/bin/juju bootstrap lxd source-controller --constraints "arch=$(go env GOARCH)"
/snap/bin/juju add-model test-migrate
/snap/bin/juju set-model-constraints arch=$(go env GOARCH)
/snap/bin/juju deploy ubuntu
- name: Bootstrap a ${{ matrix.channel }} source controller and model
if: matrix.channel == 'local'
run: |
juju version
juju bootstrap lxd source-controller --constraints "arch=$(go env GOARCH)"
juju add-model test-migrate
juju set-model-constraints arch=$(go env GOARCH)
juju deploy ubuntu
- name: Bootstrap target controller
run: |
juju version
juju bootstrap lxd target-controller --constraints "arch=$(go env GOARCH)"
juju switch controller
juju wait-for application controller
- name: Migrate model to target controller
run: |
# Determine which Juju client to use
JUJU='juju'
if [[ ${{ matrix.channel }} != 'local' ]]; then
JUJU='/snap/bin/juju'
fi
$JUJU switch source-controller
# Ensure application is fully deployed
# We have to use the old client to speak to the new controller, as
# this is blocked otherwise.
$JUJU wait-for application ubuntu
# Wait a few secs for the machine status to update
# so that migration prechecks pass.
sleep 10
$JUJU version
$JUJU migrate test-migrate target-controller
- name: Check the migration was successful
run: |
set -x
juju switch target-controller
# Wait for 'test-migrate' model to come through
attempt=0
while true; do
RES=$(juju models | grep 'test-migrate' || true)
if [[ -n $RES ]]; then
break
fi
juju status -m target-controller:test-migrate || true
sleep 5
attempt=$((attempt+1))
if [ "$attempt" -eq 10 ]; then
echo "Migration timed out"
echo "-------------------"
echo " - Migration source controller logs"
juju switch source-controller
juju debug-log -m controller || true
echo " - Migration target controller logs"
juju switch target-controller
juju debug-log -m controller || true
exit 1
fi
done
juju status -m target-controller:test-migrate
juju switch test-migrate
juju wait-for application ubuntu
juju deploy ubuntu yet-another-ubuntu
juju wait-for application yet-another-ubuntu