12
12
import pytest
13
13
import tomli
14
14
import tomli_w
15
- from packaging .version import Version
16
15
from pytest_operator .plugin import OpsTest
17
16
18
17
from . import markers
@@ -100,7 +99,35 @@ async def test_upgrade_from_edge(ops_test: OpsTest, charm, continuous_writes) ->
100
99
logger .info ("Refresh the charm" )
101
100
await mysql_router_application .refresh (path = temporary_charm )
102
101
103
- logger .info ("Wait for the first unit to be refreshed and the app to move to blocked status" )
102
+ # Refresh will always be incompatible since we are downgrading the workload
103
+ # Refresh will additionally be incompatible on PR CI (not edge CI) since unrelease charm
104
+ # versions are always marked as incompatible
105
+ logger .info ("Wait for refresh to block as incompatible" )
106
+ await ops_test .model .block_until (
107
+ lambda : mysql_router_application .status == "blocked" , timeout = TIMEOUT
108
+ )
109
+ assert (
110
+ "incompatible" in mysql_router_application .status_message
111
+ ), "mysql router application status not indicating that refresh incompatible"
112
+
113
+ # Highest to lowest unit number
114
+ refresh_order = sorted (
115
+ mysql_router_application .units ,
116
+ key = lambda unit : int (unit .name .split ("/" )[1 ]),
117
+ reverse = True ,
118
+ )
119
+
120
+ logger .info ("Running force-refresh-start action with check-compatibility=false" )
121
+ await run_action (refresh_order [0 ], "force-refresh-start" , ** {"check-compatibility" : False })
122
+
123
+ logger .info ("Wait for app status to update" )
124
+ await ops_test .model .wait_for_idle (
125
+ [MYSQL_ROUTER_APP_NAME ],
126
+ idle_period = 30 ,
127
+ timeout = 60 ,
128
+ )
129
+
130
+ logger .info ("Wait for refresh to start" )
104
131
await ops_test .model .block_until (
105
132
lambda : mysql_router_application .status == "blocked" , timeout = TIMEOUT
106
133
)
@@ -116,14 +143,7 @@ async def test_upgrade_from_edge(ops_test: OpsTest, charm, continuous_writes) ->
116
143
timeout = TIMEOUT ,
117
144
)
118
145
119
- # Highest to lowest unit number
120
- refresh_order = sorted (
121
- mysql_router_application .units ,
122
- key = lambda unit : int (unit .name .split ("/" )[1 ]),
123
- reverse = True ,
124
- )
125
-
126
- logger .info ("Running resume-refresh on the mysql router leader unit" )
146
+ logger .info ("Running resume-refresh" )
127
147
await run_action (refresh_order [1 ], "resume-refresh" )
128
148
129
149
logger .info ("Waiting for upgrade to complete on all units" )
@@ -202,6 +222,7 @@ def create_valid_upgrade_charm(charm_file: typing.Union[str, pathlib.Path]) -> N
202
222
# set an old revision of the snap
203
223
versions ["snap" ]["revisions" ]["x86_64" ] = "121"
204
224
versions ["snap" ]["revisions" ]["aarch64" ] = "122"
225
+ versions ["workload" ] = "8.0.39"
205
226
206
227
with zipfile .ZipFile (charm_file , mode = "a" ) as charm_zip :
207
228
charm_zip .writestr ("refresh_versions.toml" , tomli_w .dumps (versions ))
@@ -212,9 +233,6 @@ def create_invalid_upgrade_charm(charm_file: typing.Union[str, pathlib.Path]) ->
212
233
with pathlib .Path ("refresh_versions.toml" ).open ("rb" ) as file :
213
234
versions = tomli .load (file )
214
235
215
- old_version = Version (versions ["workload" ])
216
- new_version = Version (f"{ old_version .major - 1 } .{ old_version .minor } .{ old_version .micro } " )
217
- versions ["workload" ] = str (new_version )
218
236
versions ["charm" ] = "8.0/0.0.0"
219
237
220
238
with zipfile .ZipFile (charm_file , mode = "a" ) as charm_zip :
0 commit comments