diff --git a/src/lib/charm/openstack/trilio_wlm.py b/src/lib/charm/openstack/trilio_wlm.py index dced253..722d97e 100644 --- a/src/lib/charm/openstack/trilio_wlm.py +++ b/src/lib/charm/openstack/trilio_wlm.py @@ -307,9 +307,6 @@ class TrilioWLMCharm(charms_openstack.charm.HAOpenStackCharm): TV_MOUNTS, self._encode_endpoint(ghost_share) ) - if not os.path.exists(ghost_share_path): - os.mkdir(ghost_share_path) - current_mounts = [mount[0] for mount in host.mounts()] if nfs_share_path not in current_mounts: @@ -326,4 +323,7 @@ class TrilioWLMCharm(charms_openstack.charm.HAOpenStackCharm): "ghost mountpoint ({}) already bound".format(ghost_share_path) ) + if not os.path.exists(ghost_share_path): + os.mkdir(ghost_share_path) + host.mount(nfs_share_path, ghost_share_path, options="bind") diff --git a/unit_tests/test_lib_charm_openstack_trilio_wlm.py b/unit_tests/test_lib_charm_openstack_trilio_wlm.py index ebe5112..2860cb1 100644 --- a/unit_tests/test_lib_charm_openstack_trilio_wlm.py +++ b/unit_tests/test_lib_charm_openstack_trilio_wlm.py @@ -14,6 +14,7 @@ import mock +import os import charm.openstack.trilio_wlm as trilio_wlm import charms_openstack.test_utils as test_utils @@ -70,6 +71,7 @@ class TestTrilioWLMCharmTrustActions(Helper): identity_service.service_protocol.return_value = "http" identity_service.service_host.return_value = "localhost" identity_service.service_port.return_value = "5000" + identity_service.service_tenant.return_value = "admin" self.patch_object(trilio_wlm.subprocess, "check_call") self.patch_object(trilio_wlm.hookenv, "config") self.config.return_value = "TestRegionA" @@ -89,6 +91,8 @@ class TestTrilioWLMCharmTrustActions(Helper): "8e7b72adde7f4a15a4f23620a1d0cfd1", "--os-tenant-id", "56446f91358b40d3858276fe9680f5d8", + "--os-tenant-name", + "admin", "--os-region-name", "TestRegionA", "trust-create", @@ -120,6 +124,7 @@ class TestTrilioWLMCharmLicenseActions(Helper): identity_service.service_port.return_value = "5000" identity_service.service_username.return_value = "triliowlm" identity_service.service_password.return_value = "testingpassword" + identity_service.service_tenant.return_value = "admin" self.patch_object(trilio_wlm.subprocess, "check_call") self.patch_object(trilio_wlm.hookenv, "config") self.patch_object(trilio_wlm.hookenv, "resource_get") @@ -142,6 +147,8 @@ class TestTrilioWLMCharmLicenseActions(Helper): "8e7b72adde7f4a15a4f23620a1d0cfd1", "--os-tenant-id", "56446f91358b40d3858276fe9680f5d8", + "--os-tenant-name", + "admin", "--os-region-name", "TestRegionA", "license-create", @@ -166,3 +173,58 @@ class TestTrilioWLMCharmLicenseActions(Helper): trilio_wlm_charm = trilio_wlm.TrilioWLMCharm() with self.assertRaises(trilio_wlm.IdentityServiceIncompleteException): trilio_wlm_charm.create_license(identity_service) + + +class TestTrilioWLMCharmGhostShareAction(Helper): + + _nfs_shares = "10.20.30.40:/srv/trilioshare" + _ghost_shares = "50.20.30.40:/srv/trilioshare" + + def setUp(self): + super().setUp() + self.patch_object(trilio_wlm.hookenv, "config") + self.patch_object(trilio_wlm.host, "mounts") + self.patch_object(trilio_wlm.host, "mount") + self.patch_object(trilio_wlm.os.path, "exists") + self.patch_object(trilio_wlm.os, "mkdir") + + self.trilio_wlm_charm = trilio_wlm.TrilioWLMCharm() + self._nfs_path = os.path.join( + trilio_wlm.TV_MOUNTS, + self.trilio_wlm_charm._encode_endpoint(self._nfs_shares), + ) + self._ghost_path = os.path.join( + trilio_wlm.TV_MOUNTS, + self.trilio_wlm_charm._encode_endpoint(self._ghost_shares), + ) + + def test_ghost_share(self): + self.config.return_value = self._nfs_shares + self.mounts.return_value = [ + ["/srv/nova", "/dev/sda"], + [self._nfs_path, self._nfs_shares], + ] + self.exists.return_value = False + self.trilio_wlm_charm.ghost_nfs_share(self._ghost_shares) + self.exists.assert_called_once_with(self._ghost_path) + self.mkdir.assert_called_once_with(self._ghost_path) + self.mount.assert_called_once_with( + self._nfs_path, self._ghost_path, options="bind" + ) + + def test_ghost_share_already_bound(self): + self.config.return_value = self._nfs_shares + self.mounts.return_value = [ + ["/srv/nova", "/dev/sda"], + [self._nfs_path, self._nfs_shares], + [self._ghost_path, self._nfs_shares], + ] + with self.assertRaises(trilio_wlm.GhostShareAlreadyMountedException): + self.trilio_wlm_charm.ghost_nfs_share(self._ghost_shares) + + def test_ghost_share_nfs_unmounted(self): + self.config.return_value = self._nfs_shares + self.mounts.return_value = [["/srv/nova", "/dev/sda"]] + self.exists.return_value = False + with self.assertRaises(trilio_wlm.NFSShareNotMountedException): + self.trilio_wlm_charm.ghost_nfs_share(self._ghost_shares) diff --git a/unit_tests/test_trilio_wlm_handlers.py b/unit_tests/test_trilio_wlm_handlers.py index b2363ed..d895112 100644 --- a/unit_tests/test_trilio_wlm_handlers.py +++ b/unit_tests/test_trilio_wlm_handlers.py @@ -138,7 +138,6 @@ class TestDmapiHandlers(test_utils.PatchHelper): handlers.render_config(args) wlm_charm.upgrade_if_available.assert_called_once_with((args,)) wlm_charm.render_with_interfaces.assert_called_once_with((args,)) - wlm_charm.configure_tls.assert_called_once_with() wlm_charm.assess_status.assert_called_once_with() def test_register_endpoint_notification(self):