-
Notifications
You must be signed in to change notification settings - Fork 0
228 lines (189 loc) · 7.11 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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
name: "Migrate"
on:
workflow_dispatch:
workflow_call:
permissions:
contents: read
jobs:
migrate:
name: migrate from ${{ matrix.channel }} via ${{ matrix.client }} client
timeout-minutes: 30
runs-on: [self-hosted, linux, arm64, aws, xlarge]
strategy:
fail-fast: false
matrix:
# TODO: add microk8s tests
cloud: ["lxd"]
channel: ["local", "3.6/edge"]
steps:
- name: Checkout code
uses: actions/checkout@v4
- 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: |
BUILD_TAGS='minimal provider_lxd' make juju jujud jujud-controller
- 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)" \
--model-default logging-config="#migration=TRACE" \
--model-default enable-os-upgrade=false
/snap/bin/juju add-model test-migrate
/snap/bin/juju set-model-constraints arch=$(go env GOARCH)
/snap/bin/juju download ubuntu --filepath /tmp/ubuntu.charm
/snap/bin/juju deploy /tmp/ubuntu.charm
- 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)" \
--model-default logging-config="#migration=TRACE" \
--model-default enable-os-upgrade=false
juju add-model test-migrate
juju set-model-constraints arch=$(go env GOARCH)
juju download ubuntu --filepath ./ubuntu.charm
juju deploy ./ubuntu.charm
- name: Bootstrap target controller
run: |
juju version
juju bootstrap lxd target-controller \
--constraints "arch=$(go env GOARCH)" \
--model-default logging-config="#migration=TRACE" \
--model-default enable-os-upgrade=false
juju switch controller
attempt=0
until [[ $(juju status controller) ]]; do
echo "controller not found, waiting..."
juju status controller
if [[ ${attempt} -eq 10 ]]; then
exit 1
fi
sleep 1;
attempt=$((attempt+1))
done
- name: Determine which Juju client to use
shell: bash
run: |
JUJU_CLIENT='juju'
if [[ ${{ matrix.channel }} != 'local' ]]; then
JUJU_CLIENT='/snap/bin/juju'
fi
echo "JUJU_CLIENT=$JUJU_CLIENT" >> $GITHUB_ENV
- name: Wait for everything to reach a steady state
shell: bash
run: |
export JUJU_CLIENT
# Wait for source machine to start
MODEL='source-controller:test-migrate' \
QUERY='.machines."0"."juju-status".current' EXPECTED='started' \
MAX_ATTEMPTS=60 ./.github/waitfor.sh
# Wait for unit ubuntu/0 to reach idle state
MODEL='source-controller:test-migrate' \
QUERY='.applications.ubuntu.units."ubuntu/0"."juju-status".current' \
EXPECTED='idle' ./.github/waitfor.sh
# Wait for target controller machine to start
MODEL='target-controller:controller' \
QUERY='.machines."0"."machine-status".current' \
EXPECTED='running' ./.github/waitfor.sh
- name: Migrate model to target controller
shell: bash
run: |
$JUJU_CLIENT switch source-controller
$JUJU_CLIENT version
$JUJU_CLIENT status -m source-controller:test-migrate --format json || true
$JUJU_CLIENT 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"
exit 1
fi
done
# Ensure that the model is finished migrating.
attempt=0
while true; do
RES=$(juju status -m target-controller:test-migrate || true)
if [[ -n $RES ]]; then
break
fi
sleep 5
attempt=$((attempt+1))
if [ "$attempt" -eq 10 ]; then
echo "Migration timed out"
exit 1
fi
done
juju switch test-migrate
attempt=0
until [[ $(juju status ubuntu) ]]; do
echo "ubuntu not found, waiting..."
juju status ubuntu
if [[ ${attempt} -eq 10 ]]; then
exit 1
fi
sleep 1;
attempt=$((attempt+1))
done
juju deploy ubuntu yet-another-ubuntu
attempt=0
until [[ $(juju status yet-another-ubuntu) ]]; do
echo "yet-another-ubuntu not found, waiting..."
juju status yet-another-ubuntu
if [[ ${attempt} -eq 10 ]]; then
exit 1
fi
sleep 1;
attempt=$((attempt+1))
done
- name: Get debug info
if: failure()
run: |
set -x
echo " - Migration source status"
juju status -m source-controller:controller --format json || true
juju status -m source-controller:test-migrate --format json || true
echo " - Migration source controller logs"
juju debug-log -m source-controller:controller --lines 200 --no-tail || true
echo " - Migration target status"
juju status -m target-controller:controller --format json || true
juju status -m target-controller:test-migrate --format json || true
echo " - Migration target controller logs"
juju debug-log -m target-controller:controller --lines 200 --no-tail || true