@@ -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
):
@@ -269,6 +282,17 @@ def test_on_create_backup_failure(
269
282
event .fail .assert_called_once_with ("Failed to upload metadata to provided S3" )
270
283
self .assertTrue (isinstance (self .harness .model .unit .status , ActiveStatus ))
271
284
285
+ # test failure with _can_cluster_perform_backup
286
+ _can_cluster_perform_backup .return_value = False , "can cluster perform backup failure"
287
+ event = MagicMock ()
288
+ type(event ).params = PropertyMock (return_value = {"force" : False })
289
+ self .charm .unit .status = ActiveStatus ()
290
+
291
+ self .mysql_backups ._on_create_backup (event )
292
+ event .set_results .assert_not_called ()
293
+ event .fail .assert_called_once_with ("can cluster perform backup failure" )
294
+ self .assertTrue (isinstance (self .harness .model .unit .status , ActiveStatus ))
295
+
272
296
# test failure with _can_unit_perform_backup
273
297
_can_unit_perform_backup .return_value = False , "can unit perform backup failure"
274
298
event = MagicMock ()
@@ -309,6 +333,42 @@ def test_on_create_backup_failure(
309
333
event .fail .assert_called_once_with ("Missing relation with S3 integrator charm" )
310
334
self .assertTrue (isinstance (self .harness .model .unit .status , ActiveStatus ))
311
335
336
+ @patch ("mysql_vm_helpers.MySQL.get_cluster_status" )
337
+ def test_can_cluster_perform_backup (self , _get_cluster_status ):
338
+ """Test _can_cluster_perform_backup()."""
339
+ _get_cluster_status .return_value = {"defaultreplicaset" : {"status" : "ok" }}
340
+
341
+ success , error_message = self .mysql_backups ._can_cluster_perform_backup (force = False )
342
+ self .assertTrue (success )
343
+ self .assertIsNone (error_message )
344
+
345
+ @patch ("mysql_vm_helpers.MySQL.get_cluster_status" )
346
+ def test_can_cluster_perform_backup_failure (self , _get_cluster_status ):
347
+ """Test failure of _can_unit_perform_backup()."""
348
+ # test unknown state
349
+ _get_cluster_status .reset_mock ()
350
+ _get_cluster_status .return_value = None
351
+
352
+ success , error_message = self .mysql_backups ._can_cluster_perform_backup (force = False )
353
+ self .assertFalse (success )
354
+ self .assertEqual (error_message , "Cluster status unknown" )
355
+
356
+ # test error state (without force)
357
+ _get_cluster_status .reset_mock ()
358
+ _get_cluster_status .return_value = {"defaultreplicaset" : {"status" : "error" }}
359
+
360
+ success , error_message = self .mysql_backups ._can_cluster_perform_backup (force = False )
361
+ self .assertFalse (success )
362
+ self .assertEqual (error_message , "Cluster is not in a healthy state" )
363
+
364
+ # test error state (with force)
365
+ _get_cluster_status .reset_mock ()
366
+ _get_cluster_status .return_value = {"defaultreplicaset" : {"status" : "error" }}
367
+
368
+ success , error_message = self .mysql_backups ._can_cluster_perform_backup (force = True )
369
+ self .assertTrue (success )
370
+ self .assertEqual (error_message , None )
371
+
312
372
@patch ("mysql_vm_helpers.MySQL.offline_mode_and_hidden_instance_exists" , return_value = False )
313
373
@patch ("mysql_vm_helpers.MySQL.get_member_state" , return_value = ("online" , "replica" ))
314
374
def test_can_unit_perform_backup (
0 commit comments