@@ -155,7 +155,12 @@ def test_on_list_backups_failure(self, _list_backups_in_s3_path, _retrieve_s3_pa
155
155
return_value = ({"path" : "/path" }, []),
156
156
)
157
157
@patch (
158
- "charms.mysql.v0.backups.MySQLBackups._can_unit_perform_backup" , return_value = (True , None )
158
+ "charms.mysql.v0.backups.MySQLBackups._can_cluster_perform_backup" ,
159
+ return_value = (True , None ),
160
+ )
161
+ @patch (
162
+ "charms.mysql.v0.backups.MySQLBackups._can_unit_perform_backup" ,
163
+ return_value = (True , None ),
159
164
)
160
165
@patch ("charms.mysql.v0.backups.upload_content_to_s3" )
161
166
@patch ("charms.mysql.v0.backups.MySQLBackups._pre_backup" , return_value = (True , None ))
@@ -170,6 +175,7 @@ def test_on_create_backup(
170
175
_pre_backup ,
171
176
_upload_content_to_s3 ,
172
177
_can_unit_perform_backup ,
178
+ _can_cluster_perform_backup ,
173
179
_retrieve_s3_parameters ,
174
180
_datetime ,
175
181
_update_status ,
@@ -191,6 +197,7 @@ def test_on_create_backup(
191
197
self .mysql_backups ._on_create_backup (event )
192
198
193
199
_retrieve_s3_parameters .assert_called_once ()
200
+ _can_cluster_perform_backup .assert_called_once ()
194
201
_can_unit_perform_backup .assert_called_once ()
195
202
_upload_content_to_s3 .assert_called_once_with (
196
203
expected_metadata , f"{ expected_backup_path } .metadata" , expected_s3_params
@@ -208,7 +215,12 @@ def test_on_create_backup(
208
215
return_value = ({"path" : "/path" }, []),
209
216
)
210
217
@patch (
211
- "charms.mysql.v0.backups.MySQLBackups._can_unit_perform_backup" , return_value = (True , None )
218
+ "charms.mysql.v0.backups.MySQLBackups._can_cluster_perform_backup" ,
219
+ return_value = (True , None ),
220
+ )
221
+ @patch (
222
+ "charms.mysql.v0.backups.MySQLBackups._can_unit_perform_backup" ,
223
+ return_value = (True , None ),
212
224
)
213
225
@patch ("charms.mysql.v0.backups.upload_content_to_s3" )
214
226
@patch ("charms.mysql.v0.backups.MySQLBackups._pre_backup" , return_value = (True , None ))
@@ -223,6 +235,7 @@ def test_on_create_backup_failure(
223
235
_pre_backup ,
224
236
_upload_content_to_s3 ,
225
237
_can_unit_perform_backup ,
238
+ _can_cluster_perform_backup ,
226
239
_retrieve_s3_parameters ,
227
240
_datetime ,
228
241
):
@@ -272,13 +285,25 @@ def test_on_create_backup_failure(
272
285
# test failure with _can_unit_perform_backup
273
286
_can_unit_perform_backup .return_value = False , "can unit perform backup failure"
274
287
event = MagicMock ()
288
+ type(event ).params = PropertyMock (return_value = {"force" : False })
275
289
self .charm .unit .status = ActiveStatus ()
276
290
277
291
self .mysql_backups ._on_create_backup (event )
278
292
event .set_results .assert_not_called ()
279
293
event .fail .assert_called_once_with ("can unit perform backup failure" )
280
294
self .assertTrue (isinstance (self .harness .model .unit .status , ActiveStatus ))
281
295
296
+ # test failure with _can_cluster_perform_backup
297
+ _can_cluster_perform_backup .return_value = False , "can cluster perform backup failure"
298
+ event = MagicMock ()
299
+ type(event ).params = PropertyMock (return_value = {"force" : False })
300
+ self .charm .unit .status = ActiveStatus ()
301
+
302
+ self .mysql_backups ._on_create_backup (event )
303
+ event .set_results .assert_not_called ()
304
+ event .fail .assert_called_once_with ("can cluster perform backup failure" )
305
+ self .assertTrue (isinstance (self .harness .model .unit .status , ActiveStatus ))
306
+
282
307
# test failure with _retrieve_s3_parameters
283
308
_retrieve_s3_parameters .return_value = False , ["bucket" ]
284
309
event = MagicMock ()
@@ -309,6 +334,32 @@ def test_on_create_backup_failure(
309
334
event .fail .assert_called_once_with ("Missing relation with S3 integrator charm" )
310
335
self .assertTrue (isinstance (self .harness .model .unit .status , ActiveStatus ))
311
336
337
+ @patch ("mysql_vm_helpers.MySQL.get_cluster_status" )
338
+ def test_can_cluster_perform_backup (self , _get_cluster_status ):
339
+ """Test _can_cluster_perform_backup()."""
340
+ _get_cluster_status .return_value = {"defaultreplicaset" : {"status" : "ok" }}
341
+
342
+ success , error_message = self .mysql_backups ._can_cluster_perform_backup ()
343
+ self .assertTrue (success )
344
+ self .assertIsNone (error_message )
345
+
346
+ @patch ("mysql_vm_helpers.MySQL.get_cluster_status" )
347
+ def test_can_cluster_perform_backup_failure (self , _get_cluster_status ):
348
+ """Test failure of _can_unit_perform_backup()."""
349
+ # test unknown state
350
+ _get_cluster_status .return_value = None
351
+
352
+ success , error_message = self .mysql_backups ._can_cluster_perform_backup ()
353
+ self .assertFalse (success )
354
+ self .assertEqual (error_message , "Cluster status unknown" )
355
+
356
+ # test error state
357
+ _get_cluster_status .return_value = {"defaultreplicaset" : {"status" : "error" }}
358
+
359
+ success , error_message = self .mysql_backups ._can_cluster_perform_backup ()
360
+ self .assertFalse (success )
361
+ self .assertEqual (error_message , "Cluster is not in a healthy state" )
362
+
312
363
@patch ("mysql_vm_helpers.MySQL.offline_mode_and_hidden_instance_exists" , return_value = False )
313
364
@patch ("mysql_vm_helpers.MySQL.get_member_state" , return_value = ("online" , "replica" ))
314
365
def test_can_unit_perform_backup (
0 commit comments