Set tempest not ready if keystone relation gone

This ensures that init tempest will happen again if keystone
relation is removed and then rejoined.

Change-Id: Id42cd6c103091064f1c1ef509cbbef19928d223a
This commit is contained in:
Samuel Allan 2024-02-14 16:29:48 +10:30
parent c87ccc59db
commit c1d134943a
No known key found for this signature in database
GPG Key ID: 622F8E99C893BD61
2 changed files with 44 additions and 81 deletions

View File

@ -604,6 +604,11 @@ class TempestUserIdentityRelationHandler(sunbeam_rhandlers.RelationHandler):
except CleanUpError as e:
logger.warning("Clean-up failed: %s", str(e))
# If the relation is going away, then tempest is no longer ready,
# and the environment should be inited again if rejoined.
self.charm.set_tempest_ready(False)
self.callback_f(event)

View File

@ -197,6 +197,7 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
self.harness
)
self.harness.charm.set_tempest_ready = mock.Mock()
self.harness.charm.is_tempest_ready = mock.Mock(return_value=True)
self.harness.update_config({"schedule": "0 0 */7 * *"})
@ -219,11 +220,9 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
def test_config_context_schedule(self):
"""Test config context contains the schedule as expected."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
# schedule is disabled if it's not ready, so set it ready for testing
self.harness.charm.is_tempest_ready = mock.Mock(return_value=True)
@ -251,18 +250,12 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
self.harness.update_config({"schedule": schedule})
self.assertEqual(self.harness.charm.contexts().tempest.schedule, "")
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_validate_action_invalid_regex(self):
"""Test validate action with invalid regex provided."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
action_event = mock.Mock()
action_event.params = {
@ -278,18 +271,12 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
action_event.set_results.call_args.args[0]["error"],
)
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_validate_action_invalid_list(self):
"""Test validate action with invalid list provided."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
file1 = mock.Mock()
file1.name = "file_1"
@ -313,18 +300,12 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
action_event.set_results.call_args.args[0]["error"],
)
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_validate_action_success(self):
"""Test validate action with default params."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
file1 = mock.Mock()
file1.name = "file_1"
@ -354,18 +335,12 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
environment=TEST_TEMPEST_ENV,
)
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_validate_action_params(self):
"""Test validate action with more params."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
file1 = mock.Mock()
file1.name = "file_1"
@ -404,10 +379,6 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
environment=TEST_TEMPEST_ENV,
)
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_validate_action_no_params(self):
"""Test validate action with no filter params."""
test_utils.set_all_pebbles_ready(self.harness)
@ -436,11 +407,9 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
def test_get_list_action(self):
"""Test get-list action."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
file1 = mock.Mock()
file1.name = "file_1"
@ -454,18 +423,12 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
self.harness.charm._on_get_lists_action(action_event)
action_event.fail.assert_not_called()
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_get_list_action_not_ready(self):
"""Test get-list action when pebble is not ready."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
file1 = mock.Mock()
file1.name = "file_1"
@ -479,18 +442,12 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
self.harness.charm._on_get_lists_action(action_event)
action_event.fail.assert_called_with("pebble is not ready")
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_blocked_status_invalid_schedule(self):
"""Test to verify blocked status with invalid schedule config."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
self.harness.charm.is_tempest_ready = mock.Mock(return_value=True)
@ -504,18 +461,12 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
self.assertEqual(self.harness.charm.status.message(), "")
self.assertEqual(self.harness.charm.status.status.name, "active")
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_error_initing_tempest(self):
"""Test to verify blocked status if tempest init fails."""
test_utils.set_all_pebbles_ready(self.harness)
logging_rel_id = self.add_logging_relation(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
grafana_dashboard_rel_id = self.add_grafana_dashboard_relation(
self.harness
)
self.add_logging_relation(self.harness)
self.add_identity_ops_relation(self.harness)
self.add_grafana_dashboard_relation(self.harness)
self.harness.charm.peers = mock.Mock()
self.harness.charm.peers.interface.peers_rel.data = mock.MagicMock()
@ -534,10 +485,6 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
)
self.assertEqual(self.harness.charm.status.status.name, "blocked")
self.harness.remove_relation(logging_rel_id)
self.harness.remove_relation(identity_ops_rel_id)
self.harness.remove_relation(grafana_dashboard_rel_id)
def test_is_tempest_ready(self):
"""Test the tempest ready check method."""
test_utils.set_all_pebbles_ready(self.harness)
@ -647,3 +594,14 @@ class TestTempestOperatorCharm(test_utils.CharmTestCase):
self.assertEqual(
TempestEnvVariant.ADHOC.output_path(), TEMPEST_ADHOC_OUTPUT
)
def test_remove_identity_triggers_tempest_no_longer_ready(self):
"""Removing the keystone relation causes tempest no longer ready."""
test_utils.set_all_pebbles_ready(self.harness)
identity_ops_rel_id = self.add_identity_ops_relation(self.harness)
self.harness.charm.set_tempest_ready = mock.Mock()
self.harness.remove_relation(identity_ops_rel_id)
self.harness.charm.set_tempest_ready.assert_called_once_with(False)