forked from juju/juju
-
Notifications
You must be signed in to change notification settings - Fork 0
156 lines (129 loc) · 4.55 KB
/
migrate.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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