From 8c38656efd41b58cbbaa2461f8a444f4bce1b852 Mon Sep 17 00:00:00 2001 From: Simon Pasquier Date: Mon, 13 Jun 2016 17:56:16 +0200 Subject: [PATCH] Add test for Reduced Footprint Change-Id: Ib58da4dcc3f77a4afaee5feab507ee895c04126b --- stacklight_tests/run_tests.py | 1 + .../toolchain/test_reduced_footprint.py | 156 ++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 stacklight_tests/toolchain/test_reduced_footprint.py diff --git a/stacklight_tests/run_tests.py b/stacklight_tests/run_tests.py index 587e8e2..8651a52 100644 --- a/stacklight_tests/run_tests.py +++ b/stacklight_tests/run_tests.py @@ -57,6 +57,7 @@ def import_tests(): from stacklight_tests.toolchain import test_functional # noqa from stacklight_tests.toolchain import test_network_templates # noqa from stacklight_tests.toolchain import test_post_install # noqa + from stacklight_tests.toolchain import test_reduced_footprint # noqa from stacklight_tests.toolchain import test_smoke_bvt # noqa from stacklight_tests.toolchain import test_system # noqa diff --git a/stacklight_tests/toolchain/test_reduced_footprint.py b/stacklight_tests/toolchain/test_reduced_footprint.py new file mode 100644 index 0000000..d181f55 --- /dev/null +++ b/stacklight_tests/toolchain/test_reduced_footprint.py @@ -0,0 +1,156 @@ +# Copyright 2016 Mirantis, Inc. +# +# 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. +from devops.helpers.helpers import wait +from fuelweb_test.helpers import checkers +from fuelweb_test.helpers.decorators import log_snapshot_after_test +from fuelweb_test import logger +from fuelweb_test import settings as fuelweb_settings +from proboscis import asserts +from proboscis import test + +from stacklight_tests.toolchain import api +from stacklight_tests.toolchain import toolchain_settings as settings + + +@test(groups=["plugins"]) +class TestToolchainReducedFootprint(api.ToolchainApi): + """Class for testing the LMA Toolchain plugins with Reduced Footprint. + nodes (aka Reduced Footprint). + """ + + @test(depends_on_groups=["prepare_slaves_3"], + groups=["deploy_toolchain_with_reduced_footprint", "deploy", + "toolchain", "reduced_footprint"]) + @log_snapshot_after_test + def deploy_toolchain_with_reduced_footprint(self): + """Deploy a cluster with the LMA Toolchain plugins using the Reduced + Footprint feature (aka virt nodes). + + Scenario: + 1. Enable the advanced features. + 2. Upload the LMA Toolchain plugins to the master node + 3. Install the plugins + 4. Create the cluster + 5. Add 1 node with virt role + 6. Spawn 1 virtual machine on the virt node + 7. Add 1 node with controller role + 8. Add 1 node with compute and cinder roles + 9. Assign the StackLight roles to the virtual machine + 10. Deploy the cluster + 11. Check that LMA Toolchain plugins are running + 12. Run OSTF + + Duration 60m + Snapshot deploy_toolchain_with_reduced_footprint + """ + self.check_run("deploy_toolchain_with_reduced_footprint") + + self.env.revert_snapshot("ready_with_3_slaves") + + fuel_web = self.helpers.fuel_web + nailgun_client = self.helpers.nailgun_client + checkers.enable_feature_group(self.env, "advanced") + + self.prepare_plugins() + + self.helpers.create_cluster( + name="deploy_toolchain_with_reduced_footprint", + settings={ + "net_provider": "neutron", + "net_segment_type": fuelweb_settings.NEUTRON_SEGMENT["tun"] + } + ) + + self.activate_plugins() + + self.helpers.add_nodes_to_cluster({ + "slave-03": ["virt"], + }, redeploy=False) + + initial_nodes = nailgun_client.list_nodes() + virt_node = None + for node in initial_nodes: + if "virt" in node["pending_roles"]: + virt_node = node + break + + asserts.assert_is_not_none(virt_node, + "Couldn't find any node with the virt role") + vm_ram = 2 + asserts.assert_true( + virt_node["meta"]["memory"]["total"] > vm_ram * (1024 ** 3), + "Not enough RAM on node {0}, at least {1} GB required".format( + virt_node["name"], vm_ram)) + + nailgun_client.create_vm_nodes( + virt_node["id"], + [{"id": 1, "mem": vm_ram, "cpu": 1, "vda_size": "120G"}]) + + logger.info( + "Spawning 1 virtual machine on node {}".format(virt_node["id"])) + fuel_web.spawn_vms_wait(self.helpers.cluster_id) + + logger.info("Waiting for the virtual manchine to be up...") + wait(lambda: len(nailgun_client.list_nodes()) == 4, + timeout=10 * 60, + timeout_msg=("Timeout waiting for 4 nodes to be ready, " + "current nodes:{0}\n".format('\n'.join( + ['id: {0}, name: {1}, online: {2}'. + format(i["id"], i['name'], i['online']) + for i in nailgun_client.list_nodes()])))) + vm_node = None + for node in nailgun_client.list_nodes(): + if node["id"] not in [x["id"] for x in initial_nodes]: + vm_node = node + break + asserts.assert_is_not_none(vm_node, + "Couldn't find the virtual machine node") + + logger.info( + "Assigning StackLight roles to node {}".format(vm_node["id"])) + nailgun_client.update_nodes([{ + "cluster_id": self.helpers.cluster_id, + "id": vm_node["id"], + "pending_roles": settings.stacklight_roles, + "pending_addition": True + }]) + # The mapping between the hypervisor's NICs and the virtual machine's + # NICs is defined on the Fuel node in + # /etc/puppet/modules/osnailyfacter/templates/vm_libvirt.erb. In + # practice, only the management and storage interfaces need to be + # swapped. Note that the interface names on the virtual machines are + # the legacy ones (ethX instead of enpXsY) + fuel_web.update_node_networks( + vm_node["id"], + { + "eth0": ["fuelweb_admin", "private"], + "eth1": ["public"], + "eth2": ["storage"], + "eth3": ["management"], + "eth4": [] + }) + self.helpers.deploy_cluster({ + "slave-01": ["controller"], + "slave-02": ["compute", "cinder"], + }) + # The 'hiera' and post-deployment tasks have to be re-executed + # "manually" for the virt node + self.helpers.run_tasks([virt_node], tasks=['hiera'], + start="post_deployment_start", timeout=20 * 60) + + self.check_plugins_online() + self.helpers.run_ostf() + + self.env.make_snapshot("deploy_toolchain_with_reduced_footprint", + is_make=True)