From 871c3e133ebd5d3475bf1938f495c08f664919bb Mon Sep 17 00:00:00 2001 From: Chris MacNaughton Date: Thu, 6 Feb 2020 17:10:20 +0100 Subject: [PATCH] Add new CephFS tests --- .../openstack/charm_tests/ceph/fs/__init__.py | 15 +++ zaza/openstack/charm_tests/ceph/fs/tests.py | 126 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 zaza/openstack/charm_tests/ceph/fs/__init__.py create mode 100644 zaza/openstack/charm_tests/ceph/fs/tests.py diff --git a/zaza/openstack/charm_tests/ceph/fs/__init__.py b/zaza/openstack/charm_tests/ceph/fs/__init__.py new file mode 100644 index 0000000..b9ae308 --- /dev/null +++ b/zaza/openstack/charm_tests/ceph/fs/__init__.py @@ -0,0 +1,15 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Collection of code for setting up and testing ceph-fs.""" diff --git a/zaza/openstack/charm_tests/ceph/fs/tests.py b/zaza/openstack/charm_tests/ceph/fs/tests.py new file mode 100644 index 0000000..63cc492 --- /dev/null +++ b/zaza/openstack/charm_tests/ceph/fs/tests.py @@ -0,0 +1,126 @@ +# Copyright 2020 Canonical Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Encapsulate CephFS testing.""" + +from tenacity import Retrying, stop_after_attempt, wait_exponential + +import zaza.model as model +import zaza.openstack.charm_tests.glance.setup as glance_setup +import zaza.openstack.charm_tests.neutron.tests as neutron_tests +import zaza.openstack.charm_tests.nova.utils as nova_utils +import zaza.openstack.charm_tests.test_utils as test_utils +import zaza.openstack.configure.guest as guest +import zaza.openstack.utilities.openstack as openstack_utils + + +class CephFSTests(test_utils.OpenStackBaseTest): + """Encapsulate CephFS tests.""" + + RESOURCE_PREFIX = 'zaza-cephfstests' + INSTANCE_USERDATA = """#cloud-config +packages: +- ceph-fuse +- python +mounts: + - [ 'none', '/mnt/cephfs', 'fuse.ceph', 'ceph.id=admin,ceph.conf=/etc/ceph/ceph.conf,_netdev,defaults', '0', '0' ] +write_files: +- content: | +{} + path: /etc/ceph/ceph.conf +- content: | +{} + path: /etc/ceph/ceph.client.admin.keyring +""" # noqa + + @classmethod + def setUpClass(cls): + """Run class setup for running tests.""" + super(CephFSTests, cls).setUpClass() + + def test_cephfs_share(self): + """Test that CephFS shares can be accessed on two instances. + + 1. Spawn two servers + 2. mount it on both + 3. write a file on one + 4. read it on the other + 5. profit + """ + keyring = model.run_on_leader( + 'ceph-mon', 'cat /etc/ceph/ceph.client.admin.keyring')['Stdout'] + conf = model.run_on_leader( + 'ceph-mon', 'cat /etc/ceph/ceph.conf')['Stdout'] + # Spawn Servers + for attempt in Retrying( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=2, max=10)): + with attempt: + instance_1 = guest.launch_instance( + glance_setup.LTS_IMAGE_NAME, + vm_name='{}-ins-1'.format(self.RESOURCE_PREFIX), + userdata=self.INSTANCE_USERDATA.format( + _indent(conf, 8), + _indent(keyring, 8))) + + for attempt in Retrying( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=2, max=10)): + with attempt: + instance_2 = guest.launch_instance( + glance_setup.LTS_IMAGE_NAME, + vm_name='{}-ins-2'.format(self.RESOURCE_PREFIX), + userdata=self.INSTANCE_USERDATA.format( + _indent(conf, 8), + _indent(keyring, 8))) + + # Write a file on instance_1 + def verify_setup(stdin, stdout, stderr): + status = stdout.channel.recv_exit_status() + self.assertEqual(status, 0) + + fip_1 = neutron_tests.floating_ips_from_instance(instance_1)[0] + fip_2 = neutron_tests.floating_ips_from_instance(instance_2)[0] + username = guest.boot_tests['bionic']['username'] + password = guest.boot_tests['bionic'].get('password') + privkey = openstack_utils.get_private_key(nova_utils.KEYPAIR_NAME) + + for attempt in Retrying( + stop=stop_after_attempt(3), + wait=wait_exponential(multiplier=1, min=2, max=10)): + with attempt: + openstack_utils.ssh_command( + username, fip_1, 'instance-1', + 'sudo mount -a && ' + 'echo "test" | sudo tee /mnt/cephfs/test', + password=password, privkey=privkey, verify=verify_setup) + + def verify(stdin, stdout, stderr): + status = stdout.channel.recv_exit_status() + self.assertEqual(status, 0) + out = "" + for line in iter(stdout.readline, ""): + out += line + self.assertEqual(out, "test\n") + + openstack_utils.ssh_command( + username, fip_2, 'instance-2', + 'sudo mount -a && ' + 'sudo cat /mnt/cephfs/test', + password=password, privkey=privkey, verify=verify) + + +def _indent(text, amount, ch=' '): + padding = amount * ch + return ''.join(padding+line for line in text.splitlines(True))