From fa522254a4d282027a4cd60deaf0f4f907799b3b Mon Sep 17 00:00:00 2001 From: Artem Grechanichenko Date: Sun, 24 Apr 2016 19:13:21 +0300 Subject: [PATCH] template-based test for fuel installation on Centos node Add test for testing Separate master node deployment on pre-provisioned Centos 7 server Change-Id: I9b9d40a59d24f579502a38dfc9b8c142bc219a06 Closes-Bug: #1575650 --- doc/base_tests.rst | 5 + fuelweb_test/helpers/cloud_image.py | 14 +- fuelweb_test/models/environment.py | 6 + fuelweb_test/settings.py | 2 + fuelweb_test/tests/base_test_case.py | 62 ++++++ system_test/actions/base.py | 61 ++++++ system_test/core/config.py | 5 + .../tests/test_centos_master_deploy_ceph.py | 76 +++++++ .../devops_configs/centos_master.yaml | 189 ++++++++++++++++++ ...entos_master_ceph_all_on_neutron_vlan.yaml | 40 ++++ 10 files changed, 452 insertions(+), 8 deletions(-) create mode 100644 system_test/tests/test_centos_master_deploy_ceph.py create mode 100644 system_test/tests_templates/devops_configs/centos_master.yaml create mode 100644 system_test/tests_templates/tests_configs/centos_master_ceph_all_on_neutron_vlan.yaml diff --git a/doc/base_tests.rst b/doc/base_tests.rst index fadd324b2..b91727f5b 100644 --- a/doc/base_tests.rst +++ b/doc/base_tests.rst @@ -700,4 +700,9 @@ Test for ssl components Test for network outage ----------------------- .. automodule:: fuelweb_test.tests.tests_strength.test_network_outage + :members: + +Test for separate master node deployment +---------------------------------------- +.. automodule:: system_test.tests.test_centos_master_deploy_ceph :members: \ No newline at end of file diff --git a/fuelweb_test/helpers/cloud_image.py b/fuelweb_test/helpers/cloud_image.py index 74e4a4f76..e288cfb47 100644 --- a/fuelweb_test/helpers/cloud_image.py +++ b/fuelweb_test/helpers/cloud_image.py @@ -30,9 +30,9 @@ def generate_cloud_image_settings(cloud_image_settings_path, admin_network, os.makedirs(dir_path) meta_data_path = os.path.join(dir_path, - "meta_data") + "meta-data") user_data_path = os.path.join(dir_path, - "user_data") + "user-data") # create meta_data and user_data @@ -71,12 +71,12 @@ def generate_cloud_image_settings(cloud_image_settings_path, admin_network, "password": password } - user_data_content = ("#cloud-config\n" + user_data_content = ("\n#cloud-config\n" "ssh_pwauth: True\n" "chpasswd:\n" - "list: |\n" - " {user}:{password}\n" - "expire: False \n\n" + " list: |\n" + " {user}:{password}\n" + " expire: False \n\n" "runcmd:\n" " - sudo ifup {interface_name}\n" " - sudo sed -i -e '/^PermitRootLogin/s/^" @@ -98,6 +98,4 @@ def generate_cloud_image_settings(cloud_image_settings_path, admin_network, user_data_path, meta_data_path) - cmd = cmd.split() - subprocess.check_call(cmd, shell=True) diff --git a/fuelweb_test/models/environment.py b/fuelweb_test/models/environment.py index d1ad43e9e..1aaef2bf4 100644 --- a/fuelweb_test/models/environment.py +++ b/fuelweb_test/models/environment.py @@ -476,6 +476,12 @@ class EnvironmentModel(object): @logwrap def wait_for_external_config(self, timeout=120): + + wait(lambda: self.ssh_manager.exists_on_remote( + self.ssh_manager.admin_ip, + '/var/lock/wait_for_external_config'), + timeout=600) + check_cmd = 'pkill -0 -f wait_for_external_config' wait( diff --git a/fuelweb_test/settings.py b/fuelweb_test/settings.py index e48c8eee0..9dbebdbe5 100644 --- a/fuelweb_test/settings.py +++ b/fuelweb_test/settings.py @@ -655,3 +655,5 @@ GERRIT_PATCHSET_NUMBER = os.environ.get("GERRIT_PATCHSET_NUMBER") DOWNLOAD_FACTS = get_var_as_bool("DOWNLOAD_FACTS", False) TASK_BASED_ENGINE = get_var_as_bool("TASK_BASED_ENGINE", True) + +FUEL_RELEASE_PATH = os.environ.get("FUEL_RELEASE_PATH") diff --git a/fuelweb_test/tests/base_test_case.py b/fuelweb_test/tests/base_test_case.py index ae165f640..5ae30da17 100644 --- a/fuelweb_test/tests/base_test_case.py +++ b/fuelweb_test/tests/base_test_case.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +import os import time from proboscis import TestProgram @@ -31,6 +32,8 @@ from fuelweb_test.settings import MULTIPLE_NETWORKS_TEMPLATE from fuelweb_test.settings import REPLACE_DEFAULT_REPOS from fuelweb_test.settings import REPLACE_DEFAULT_REPOS_ONLY_ONCE +from gates_tests.helpers import exceptions + class TestBasic(object): """Basic test case class for all system tests. @@ -265,6 +268,65 @@ class TestBasic(object): self.env.setup_environment() self.fuel_post_install_actions() + def centos_setup_fuel(self, hostname): + logger.info("upload fuel-release packet") + if not settings.FUEL_RELEASE_PATH: + raise exceptions.FuelQAVariableNotSet('FUEL_RELEASE_PATH', '/path') + try: + ssh = SSHManager() + pack_path = '/tmp/' + full_pack_path = os.path.join(pack_path, + 'fuel-release*.noarch.rpm') + ssh.upload_to_remote( + ip=ssh.admin_ip, + source=settings.FUEL_RELEASE_PATH.rstrip('/'), + target=pack_path) + + except Exception: + logger.exception("Could not upload package") + + logger.debug("Update host information") + cmd = "echo HOSTNAME={} >> /etc/sysconfig/network".format(hostname) + ssh.execute_on_remote(ssh.admin_ip, cmd=cmd) + + cmd = "echo {0} {1} {2} >> /etc/hosts".format( + ssh.admin_ip, + hostname, + settings.FUEL_MASTER_HOSTNAME) + + ssh.execute_on_remote(ssh.admin_ip, cmd=cmd) + + cmd = "hostname {}".format(hostname) + ssh.execute_on_remote(ssh.admin_ip, cmd=cmd) + + logger.debug("setup MOS repositories") + cmd = "rpm -ivh {}".format(full_pack_path) + ssh.execute_on_remote(ssh.admin_ip, cmd=cmd) + + cmd = "yum install -y fuel-setup" + ssh.execute_on_remote(ssh.admin_ip, cmd=cmd) + + cmd = "yum install -y screen" + ssh.execute_on_remote(ssh.admin_ip, cmd=cmd) + + logger.info("Install Fuel services") + + cmd = "screen -dm bash -c 'showmenu=no wait_for_external_config=yes " \ + "bootstrap_admin_node.sh'" + ssh.execute_on_remote(ssh.admin_ip, cmd=cmd) + + self.env.wait_for_external_config() + self.env.admin_actions.modify_configs(self.env.d_env.router()) + self.env.kill_wait_for_external_config() + + self.env.wait_bootstrap() + + logger.debug("Check Fuel services") + self.env.admin_actions.wait_for_fuel_ready() + + logger.debug("post-installation configuration of Fuel services") + self.fuel_post_install_actions() + @test class SetupEnvironment(TestBasic): diff --git a/system_test/actions/base.py b/system_test/actions/base.py index 4f3cf10e1..436029eda 100644 --- a/system_test/actions/base.py +++ b/system_test/actions/base.py @@ -14,9 +14,12 @@ from __future__ import division +import os import time import itertools +from devops.helpers.helpers import wait + from proboscis import SkipTest from proboscis.asserts import assert_equal from proboscis.asserts import assert_true @@ -24,7 +27,9 @@ from proboscis.asserts import assert_true from six.moves import xrange # pylint: enable=redefined-builtin +import fuelweb_test from fuelweb_test.helpers import checkers +from fuelweb_test.helpers.cloud_image import generate_cloud_image_settings from fuelweb_test.helpers.utils import TimeStat from fuelweb_test import settings @@ -118,6 +123,62 @@ class PrepareActions(object): self.env.make_snapshot("empty", is_make=True) + @deferred_decorator([make_snapshot_if_step_fail]) + @action + def setup_centos_master(self): + """Create environment, bootstrap centos_master + and install fuel services + + Snapshot "empty_centos" + + 1. bootstrap_centos_master + 2. Download fuel_release from remote repository + 3. install fuel_setup package + 4. Install Fuel services by executing bootstrap_admin_node.sh + 5. check Fuel services + + + """ + self.check_run("empty_centos") + self.show_step(1, initialize=True) + cloud_image_settings_path = os.path.join( + os.path.dirname(fuelweb_test.__file__), + 'cloud_image_settings/cloud_settings.iso') + + admin_net_object = self.env.d_env.get_network( + name=self.env.d_env.admin_net) + admin_network = admin_net_object.ip.network + admin_netmask = admin_net_object.ip.netmask + admin_ip = str(self.env.d_env.nodes( + ).admin.get_ip_address_by_network_name(self.env.d_env.admin_net)) + interface_name = settings.iface_alias("eth0") + gateway = self.env.d_env.router() + dns = settings.DNS + dns_ext = ''.join(settings.EXTERNAL_DNS) + hostname = ''.join((settings.FUEL_MASTER_HOSTNAME, + settings.DNS_SUFFIX)) + user = settings.SSH_CREDENTIALS['login'] + password = settings.SSH_CREDENTIALS['password'] + generate_cloud_image_settings(cloud_image_settings_path, admin_network, + interface_name, admin_ip, admin_netmask, + gateway, dns, dns_ext, + hostname, user, password) + + with TimeStat("bootstrap_centos_node", is_uniq=True): + admin = self.env.d_env.nodes().admin + logger.info(cloud_image_settings_path) + admin.disk_devices.get( + device='cdrom').volume.upload(cloud_image_settings_path) + self.env.d_env.start([admin]) + logger.info("Waiting for Centos node to start up") + wait(lambda: admin.driver.node_active(admin), 60) + logger.info("Waiting for Centos node ssh ready") + self.env.wait_for_provisioning() + + self.centos_setup_fuel(hostname) + + self.env.make_snapshot("empty", is_make=True) + @deferred_decorator([make_snapshot_if_step_fail]) @action def config_release(self): diff --git a/system_test/core/config.py b/system_test/core/config.py index 0476e1378..5c85837a5 100644 --- a/system_test/core/config.py +++ b/system_test/core/config.py @@ -87,6 +87,11 @@ def define_custom_groups(): add_group(group="fuel_master_migrate", systest_group="system_test.fuel_migration", config_name="1ctrl_1comp_neutronVLAN") + add_group(group="fuel_master_migrate", systest_group="system_test.fuel_migration", config_name="1ctrl_1comp_neutronTUN") + + add_group(group="system_test.deploy_centos_master", + systest_group="system_test.centos_deploy_and_check_radosgw", + config_name="centos_master_ceph_all_on_neutron_vlan") diff --git a/system_test/tests/test_centos_master_deploy_ceph.py b/system_test/tests/test_centos_master_deploy_ceph.py new file mode 100644 index 000000000..36590b217 --- /dev/null +++ b/system_test/tests/test_centos_master_deploy_ceph.py @@ -0,0 +1,76 @@ +# 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 proboscis.asserts import assert_true + +from system_test import testcase +from system_test import action +from system_test import deferred_decorator + +from system_test.tests import ActionTest +from system_test.actions import BaseActions + +from system_test.helpers.decorators import make_snapshot_if_step_fail + + +@testcase(groups=['system_test', + 'system_test.centos_deploy_and_check_radosgw']) +class CentosDeployCheckRadosGW(ActionTest, BaseActions): + """Deploy cluster and check RadosGW + + Scenario: + 1. Bootstrap Centos node and install Fuel services + 2. Create Environment + 3. Add nodes to Environment + 4. Run network checker + 5. Deploy Environment + 6. Run network checker + 7. Check HAProxy backends + 8. Check ceph status + 9. Run OSTF + 10. Check the radosgw daemon is started + + """ + + actions_order = [ + 'setup_centos_master', + 'config_release', + 'make_slaves', + 'revert_slaves', + 'create_env', + 'add_nodes', + 'network_check', + 'deploy_cluster', + 'network_check', + 'check_haproxy', + 'check_ceph_status', + 'health_check', + 'check_rados_daemon' + ] + + @deferred_decorator([make_snapshot_if_step_fail]) + @action + def check_ceph_status(self): + """Check Ceph status in cluster""" + self.fuel_web.check_ceph_status(self.cluster_id) + + @deferred_decorator([make_snapshot_if_step_fail]) + @action + def check_rados_daemon(self): + """Check the radosgw daemon is started""" + def radosgw_started(remote): + return remote.check_call('pkill -0 radosgw')['exit_code'] == 0 + + with self.fuel_web.get_ssh_for_node('slave-01') as remote: + assert_true(radosgw_started(remote), 'radosgw daemon started') diff --git a/system_test/tests_templates/devops_configs/centos_master.yaml b/system_test/tests_templates/devops_configs/centos_master.yaml new file mode 100644 index 000000000..cc3a721e5 --- /dev/null +++ b/system_test/tests_templates/devops_configs/centos_master.yaml @@ -0,0 +1,189 @@ +--- +aliases: + + dynamic_address_pool: + - &pool_default !os_env POOL_DEFAULT, 10.109.0.0/16:24 + + default_interface_model: + - &interface_model !os_env INTERFACE_MODEL, e1000 + + rack-01-slave-interfaces: &rack-01-slave-interfaces + - label: eth0 + l2_network_device: admin # Libvirt bridge name. It is *NOT* Nailgun networks + interface_model: *interface_model + - label: eth1 + l2_network_device: public + interface_model: *interface_model + - label: eth2 + l2_network_device: storage + interface_model: *interface_model + - label: eth3 + l2_network_device: management + interface_model: *interface_model + - label: eth4 + l2_network_device: private + interface_model: *interface_model + + rack-01-slave-network_config: &rack-01-slave-network_config + eth0: + networks: + - fuelweb_admin + eth1: + networks: + - public + eth2: + networks: + - storage + eth3: + networks: + - management + eth4: + networks: + - private + + rack-01-slave-node-params: &rack-01-slave-node-params + vcpu: !os_env SLAVE_NODE_CPU, 2 + memory: !os_env SLAVE_NODE_MEMORY, 3072 + boot: + - network + - hd + volumes: + - name: system + capacity: !os_env NODE_VOLUME_SIZE, 55 + format: qcow2 + - name: cinder + capacity: !os_env NODE_VOLUME_SIZE, 55 + format: qcow2 + - name: swift + capacity: !os_env NODE_VOLUME_SIZE, 55 + format: qcow2 + interfaces: *rack-01-slave-interfaces + network_config: *rack-01-slave-network_config + + +env_name: !os_env ENV_NAME + +address_pools: +# Network pools used by the environment + fuelweb_admin-pool01: + net: *pool_default + params: + tag: 0 + public-pool01: + net: *pool_default + params: + tag: 0 + storage-pool01: + net: *pool_default + params: + tag: 101 + management-pool01: + net: *pool_default + params: + tag: 102 + private-pool01: + net: *pool_default + params: + tag: 103 + +groups: + - name: rack-01 + driver: + name: devops.driver.libvirt.libvirt_driver + params: + connection_string: !os_env CONNECTION_STRING, qemu:///system + storage_pool_name: !os_env STORAGE_POOL_NAME, default + stp: True + hpet: False + use_host_cpu: !os_env DRIVER_USE_HOST_CPU, true + + network_pools: # Address pools for OpenStack networks. + # Actual names should be used for keys + # (the same as in Nailgun, for example) + + fuelweb_admin: fuelweb_admin-pool01 + public: public-pool01 + storage: storage-pool01 + management: management-pool01 + private: private-pool01 + + l2_network_devices: # Libvirt bridges. It is *NOT* Nailgun networks + admin: + address_pool: fuelweb_admin-pool01 + dhcp: false + forward: + mode: nat + + public: + address_pool: public-pool01 + dhcp: false + forward: + mode: nat + + storage: + address_pool: storage-pool01 + dhcp: false + + management: + address_pool: management-pool01 + dhcp: false + + private: + address_pool: private-pool01 + dhcp: false + + nodes: + - name: admin # Custom name of VM for Fuel admin node + role: fuel_master # Fixed role for Fuel master node properties + params: + vcpu: !os_env ADMIN_NODE_CPU, 2 + memory: !os_env ADMIN_NODE_MEMORY, 3072 + boot: + - hd + - cdrom # for boot from usb - without 'cdrom' + volumes: + - name: system + source_image: !os_env CENTOS_CLOUD_IMAGE_PATH + format: qcow2 + - name: iso + capacity: 1 + format: raw + device: cdrom # for boot from usb - 'disk' + bus: ide # for boot from usb - 'usb' + interfaces: + - label: eth0 + l2_network_device: admin # Libvirt bridge name. It is *NOT* a Nailgun network + interface_model: *interface_model + network_config: + eth0: + networks: + - fuelweb_admin + + - name: slave-01 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-02 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-03 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-04 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-05 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-06 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-07 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-08 + role: fuel_slave + params: *rack-01-slave-node-params + - name: slave-09 + role: fuel_slave + params: *rack-01-slave-node-params + diff --git a/system_test/tests_templates/tests_configs/centos_master_ceph_all_on_neutron_vlan.yaml b/system_test/tests_templates/tests_configs/centos_master_ceph_all_on_neutron_vlan.yaml new file mode 100644 index 000000000..c8d1360cf --- /dev/null +++ b/system_test/tests_templates/tests_configs/centos_master_ceph_all_on_neutron_vlan.yaml @@ -0,0 +1,40 @@ +--- +network-config: &network-config + provider: neutron + segment-type: vlan + pubip-to-all: false + +storages-config: &storages-config + volume-lvm: false + volume-ceph: true + image-ceph: true + rados-ceph: true + ephemeral-ceph: false + replica-ceph: 1 + +nodes: &nodes + - roles: + - controller + count: 1 + - roles: + - ceph-osd + count: 2 + - roles: + - compute + count: 1 + +template: + name: 1 Controller, 1 Compute & 2 Ceph on Neutron/VLAN + slaves: 4 + devops_settings: !include devops_configs/centos_master.yaml + cluster_template: &environment-config + name: rados + release: ubuntu + settings: + components: + sahara: false + murano: false + ceilometer: false + storages: *storages-config + network: *network-config + nodes: *nodes