aboutsummaryrefslogtreecommitdiffstats
path: root/install.sh
blob: ad14b8e0bcde0cdefa03e5692932681d028f1962 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/bin/bash
##############################################################################
# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################

# fit for arm64
DOCKER_ARCH="$(uname -m)"

UBUNTU_PORTS_URL="http://ports.ubuntu.com/ubuntu-ports/"
UBUNTU_ARCHIVE_URL="http://archive.ubuntu.com/ubuntu/"

source_file=/etc/apt/sources.list

if [[ "${DOCKER_ARCH}" == "aarch64" ]]; then
    sed -i -e 's/^deb \([^/[]\)/deb [arch=arm64] \1/g' "${source_file}"
    DOCKER_ARCH="arm64"
    DOCKER_REPO="${UBUNTU_PORTS_URL}"
    EXTRA_ARCH="amd64"
    EXTRA_REPO="${UBUNTU_ARCHIVE_URL}"
    dpkg --add-architecture amd64
else
    sed -i -e 's/^deb \([^/[]\)/deb [arch=amd64] \1/g' "${source_file}"
    DOCKER_ARCH="amd64"
    DOCKER_REPO="${UBUNTU_ARCHIVE_URL}"
    EXTRA_ARCH="arm64"
    EXTRA_REPO="${UBUNTU_PORTS_URL}"
    dpkg --add-architecture arm64
fi

sed -i -e 's/^deb-src /# deb-src /g' "${source_file}"
echo "APT::Default-Release \"trusty\";" > /etc/apt/apt.conf.d/default-distro

sub_source_file=/etc/apt/sources.list.d/yardstick.list
touch "${sub_source_file}"

# first add xenial repo needed for installing qemu_static_user/xenial in the container
# then add complementary architecture repositories in case the cloud image is of different arch
echo -e "deb [arch="${DOCKER_ARCH}"] "${DOCKER_REPO}" xenial-updates universe
deb [arch="${EXTRA_ARCH}"] "${EXTRA_REPO}" trusty main universe multiverse restricted
deb [arch="${EXTRA_ARCH}"] "${EXTRA_REPO}" trusty-updates main universe multiverse restricted
deb [arch="${EXTRA_ARCH}"] "${EXTRA_REPO}" trusty-security main universe multiverse restricted
deb [arch="${EXTRA_ARCH}"] "${EXTRA_REPO}" trusty-proposed main universe multiverse restricted" > "${sub_source_file}"

echo "vm.mmap_min_addr = 0" > /etc/sysctl.d/mmap_min_addr.conf

# install tools
apt-get update && apt-get install -y \
    qemu-user-static/xenial \
    wget \
    expect \
    curl \
    git \
    sshpass \
    qemu-utils \
    kpartx \
    libffi-dev \
    libssl-dev \
    libzmq-dev \
    python \
    python-dev \
    libxml2-dev \
    libxslt1-dev \
    nginx \
    uwsgi \
    uwsgi-plugin-python \
    supervisor \
    python-pip \
    vim

if [[ "${DOCKER_ARCH}" != "aarch64" ]]; then
    apt-get install -y libc6:arm64
fi

apt-get -y autoremove && apt-get clean

git config --global http.sslVerify false


# install yardstick + dependencies
easy_install -U pip
pip install -r requirements.txt
pip install -e .

/bin/bash "$(pwd)/api/api-prepare.sh"

service nginx restart
uwsgi -i /etc/yardstick/yardstick.ini
*/ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
#!/usr/bin/env python

# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0

import logging
import unittest

import mock

from functest.ci import prepare_env
from functest.tests.unit import test_utils
from functest.utils.constants import CONST
from opnfv.utils import constants as opnfv_constants


class PrepareEnvTesting(unittest.TestCase):

    logging.disable(logging.CRITICAL)

    def setUp(self):
        self.prepare_envparser = prepare_env.PrepareEnvParser()

    @mock.patch('functest.ci.prepare_env.logger.info')
    def test_print_separator(self, mock_logger_info):
        str = "=============================================="
        prepare_env.print_separator()
        mock_logger_info.assert_called_once_with(str)

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_missing_inst_type(self, mock_logger_warn,
                                                   mock_logger_info):
        CONST.__setattr__('INSTALLER_TYPE', None)
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")
        mock_logger_warn.assert_any_call("The env variable 'INSTALLER_TYPE'"
                                         " is not defined.")

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_missing_inst_ip(self, mock_logger_warn,
                                                 mock_logger_info):
        CONST.__setattr__('INSTALLER_IP', None)
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")
        mock_logger_warn.assert_any_call("The env variable 'INSTALLER_IP'"
                                         " is not defined. It is needed to"
                                         " fetch the OpenStack credentials."
                                         " If the credentials are not"
                                         " provided to the container as a"
                                         " volume, please add this env"
                                         " variable to the 'docker run'"
                                         " command.")

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_with_inst_ip(self, mock_logger_warn,
                                              mock_logger_info):
        CONST.__setattr__('INSTALLER_IP', mock.Mock())
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")
        mock_logger_info.assert_any_call(test_utils.
                                         SubstrMatch("    INSTALLER_IP="))

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_missing_scenario(self, mock_logger_warn,
                                                  mock_logger_info):
        CONST.__setattr__('DEPLOY_SCENARIO', None)
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")
        mock_logger_warn.assert_any_call("The env variable"
                                         " 'DEPLOY_SCENARIO' is not defined"
                                         ". Setting CI_SCENARIO=undefined.")

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_with_scenario(self, mock_logger_warn,
                                               mock_logger_info):
        CONST.__setattr__('DEPLOY_SCENARIO', 'test_scenario')
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")
        mock_logger_info.assert_any_call(test_utils.
                                         SubstrMatch("DEPLOY_SCENARIO="))

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_with_ci_debug(self, mock_logger_warn,
                                               mock_logger_info):
        CONST.__setattr__('CI_DEBUG', mock.Mock())
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")
        mock_logger_info.assert_any_call(test_utils.
                                         SubstrMatch("    CI_DEBUG="))

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_with_node(self, mock_logger_warn,
                                           mock_logger_info):
        CONST.__setattr__('NODE_NAME', mock.Mock())
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")
        mock_logger_info.assert_any_call(test_utils.
                                         SubstrMatch("    NODE_NAME="))

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_with_build_tag(self, mock_logger_warn,
                                                mock_logger_info):
        CONST.__setattr__('BUILD_TAG', mock.Mock())
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")

        mock_logger_info.assert_any_call(test_utils.
                                         SubstrMatch("    BUILD_TAG="))

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_check_env_variables_with_is_ci_run(self, mock_logger_warn,
                                                mock_logger_info):
        CONST.__setattr__('IS_CI_RUN', mock.Mock())
        prepare_env.check_env_variables()
        mock_logger_info.assert_any_call("Checking environment variables"
                                         "...")

        mock_logger_info.assert_any_call(test_utils.
                                         SubstrMatch("    IS_CI_RUN="))

    def test_get_deployment_handler_missing_const_vars(self):
        with mock.patch('functest.ci.prepare_env.'
                        'factory.Factory.get_handler') as m:
            CONST.__setattr__('INSTALLER_IP', None)
            prepare_env.get_deployment_handler()
            self.assertFalse(m.called)

            CONST.__setattr__('INSTALLER_TYPE', None)
            prepare_env.get_deployment_handler()
            self.assertFalse(m.called)

    @mock.patch('functest.ci.prepare_env.logger.debug')
    def test_get_deployment_handler_missing_print_deploy_info(self,
                                                              mock_debug):
        with mock.patch('functest.ci.prepare_env.'
                        'factory.Factory.get_handler') as m, \
            mock.patch('functest.ci.prepare_env.'
                       'ft_utils.get_parameter_from_yaml',
                       side_effect=ValueError):
            CONST.__setattr__('INSTALLER_IP', 'test_ip')
            CONST.__setattr__('INSTALLER_TYPE', 'test_inst_type')
            opnfv_constants.INSTALLERS = ['test_inst_type']
            prepare_env.get_deployment_handler()
            msg = ('Printing deployment info is not supported for '
                   'test_inst_type')
            mock_debug.assert_any_call(msg)
            self.assertFalse(m.called)

    @mock.patch('functest.ci.prepare_env.logger.debug')
    def test_get_deployment_handler_exception(self, mock_debug):
        with mock.patch('functest.ci.prepare_env.'
                        'factory.Factory.get_handler',
                        side_effect=Exception), \
            mock.patch('functest.ci.prepare_env.'
                       'ft_utils.get_parameter_from_yaml'):
            CONST.__setattr__('INSTALLER_IP', 'test_ip')
            CONST.__setattr__('INSTALLER_TYPE', 'test_inst_type')
            opnfv_constants.INSTALLERS = ['test_inst_type']
            prepare_env.get_deployment_handler()
            self.assertTrue(mock_debug.called)

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.debug')
    def test_create_directories_missing_dir(self, mock_logger_debug,
                                            mock_logger_info):
        with mock.patch('functest.ci.prepare_env.os.path.exists',
                        return_value=False), \
                mock.patch('functest.ci.prepare_env.os.makedirs') \
                as mock_method:
            prepare_env.create_directories()
            mock_logger_info.assert_any_call("Creating needed directories...")
            mock_method.assert_any_call(
                CONST.__getattribute__('dir_functest_conf'))
            mock_method.assert_any_call(
                CONST.__getattribute__('dir_functest_data'))
            mock_logger_info.assert_any_call("    %s created." %
                                             CONST.__getattribute__(
                                                 'dir_functest_conf'))
            mock_logger_info.assert_any_call("    %s created." %
                                             CONST.__getattribute__(
                                                 'dir_functest_data'))

    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.debug')
    def test_create_directories_with_dir(self, mock_logger_debug,
                                         mock_logger_info):
        with mock.patch('functest.ci.prepare_env.os.path.exists',
                        return_value=True):
            prepare_env.create_directories()
            mock_logger_info.assert_any_call("Creating needed directories...")
            mock_logger_debug.assert_any_call("   %s already exists." %
                                              CONST.__getattribute__(
                                                  'dir_functest_conf'))
            mock_logger_debug.assert_any_call("   %s already exists." %
                                              CONST.__getattribute__(
                                                  'dir_functest_data'))

    def _get_env_cred_dict(self, os_prefix=''):
        return {'OS_USERNAME': os_prefix + 'username',
                'OS_PASSWORD': os_prefix + 'password',
                'OS_AUTH_URL': 'http://test_ip:test_port/v2.0',
                'OS_TENANT_NAME': os_prefix + 'tenant_name',
                'OS_USER_DOMAIN_NAME': os_prefix + 'user_domain_name',
                'OS_PROJECT_DOMAIN_NAME': os_prefix + 'project_domain_name',
                'OS_PROJECT_NAME': os_prefix + 'project_name',
                'OS_ENDPOINT_TYPE': os_prefix + 'endpoint_type',
                'OS_REGION_NAME': os_prefix + 'region_name'}

    @mock.patch('functest.ci.prepare_env.logger.error')
    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.logger.warning')
    def test_source_rc_missing_rc_file(self, mock_logger_warn,
                                       mock_logger_info,
                                       mock_logger_error):
        with mock.patch('functest.ci.prepare_env.os.path.isfile',
                        return_value=True), \
                mock.patch('functest.ci.prepare_env.os.path.getsize',
                           return_value=0), \
                self.assertRaises(Exception):
            CONST.__setattr__('openstack_creds', 'test_creds')
            prepare_env.source_rc_file()

    def test_source_rc_missing_installer_ip(self):
        with mock.patch('functest.ci.prepare_env.os.path.isfile',
                        return_value=False), \
                self.assertRaises(Exception):
            CONST.__setattr__('INSTALLER_IP', None)
            CONST.__setattr__('openstack_creds', 'test_creds')
            prepare_env.source_rc_file()

    def test_source_rc_missing_installer_type(self):
        with mock.patch('functest.ci.prepare_env.os.path.isfile',
                        return_value=False), \
                self.assertRaises(Exception):
            CONST.__setattr__('INSTALLER_IP', 'test_ip')
            CONST.__setattr__('openstack_creds', 'test_creds')
            CONST.__setattr__('INSTALLER_TYPE', 'test_type')
            opnfv_constants.INSTALLERS = []
            prepare_env.source_rc_file()

    def test_source_rc_missing_os_credfile_ci_inst(self):
        with mock.patch('functest.ci.prepare_env.os.path.isfile',
                        return_value=False), \
                mock.patch('functest.ci.prepare_env.os.path.getsize'), \
                mock.patch('functest.ci.prepare_env.os.path.join'), \
                mock.patch('functest.ci.prepare_env.subprocess.Popen') \
                as mock_subproc_popen, \
                self.assertRaises(Exception):
            CONST.__setattr__('openstack_creds', 'test_creds')
            CONST.__setattr__('INSTALLER_IP', None)
            CONST.__setattr__('INSTALLER_TYPE', 'test_type')
            opnfv_constants.INSTALLERS = ['test_type']

            process_mock = mock.Mock()
            attrs = {'communicate.return_value': ('output', 'error'),
                     'return_code': 1}
            process_mock.configure_mock(**attrs)
            mock_subproc_popen.return_value = process_mock

            prepare_env.source_rc_file()

    @mock.patch('functest.ci.prepare_env.logger.debug')
    def test_patch_file(self, mock_logger_debug):
        with mock.patch("__builtin__.open", mock.mock_open()), \
            mock.patch('functest.ci.prepare_env.yaml.safe_load',
                       return_value={'test_scenario': {'tkey': 'tvalue'}}), \
            mock.patch('functest.ci.prepare_env.ft_utils.get_functest_yaml',
                       return_value={'tkey1': 'tvalue1'}), \
            mock.patch('functest.ci.prepare_env.os.remove') as m, \
                mock.patch('functest.ci.prepare_env.yaml.dump'):
            CONST.__setattr__('DEPLOY_SCENARIO', 'test_scenario')
            prepare_env.patch_file('test_file')
            self.assertTrue(m.called)

    @mock.patch('functest.ci.prepare_env.logger.info')
    def test_verify_deployment_error(self, mock_logger_error):
        mock_popen = mock.Mock()
        attrs = {'poll.return_value': None,
                 'stdout.readline.return_value': 'ERROR'}
        mock_popen.configure_mock(**attrs)

        with mock.patch('functest.ci.prepare_env.print_separator') as m, \
            mock.patch('functest.ci.prepare_env.subprocess.Popen',
                       return_value=mock_popen), \
                self.assertRaises(Exception) as context:
            prepare_env.verify_deployment()
            self.assertTrue(m.called)
            msg = "Problem while running 'check_os.sh'."
            mock_logger_error.assert_called_once_with('ERROR')
            self.assertTrue(msg in context)

    def _get_rally_creds(self):
        return {"type": "ExistingCloud",
                "admin": {"username": 'test_user_name',
                          "password": 'test_password',
                          "tenant": 'test_tenant'}}

    @mock.patch('functest.ci.prepare_env.os_utils.get_credentials_for_rally')
    @mock.patch('functest.ci.prepare_env.logger.info')
    @mock.patch('functest.ci.prepare_env.ft_utils.execute_command_raise')
    @mock.patch('functest.ci.prepare_env.ft_utils.execute_command')
    def test_install_rally(self, mock_exec, mock_exec_raise, mock_logger_info,
                           mock_os_utils):

        mock_os_utils.return_value = self._get_rally_creds()

        prepare_env.install_rally()

        cmd = "rally deployment destroy opnfv-rally"
        error_msg = "Deployment %s does not exist." % \
                    CONST.__getattribute__('rally_deployment_name')
        mock_logger_info.assert_any_call("Creating Rally environment...")
        mock_exec.assert_any_call(cmd, error_msg=error_msg, verbose=False)

        cmd = "rally deployment create --file=rally_conf.json --name="
        cmd += CONST.__getattribute__('rally_deployment_name')
        error_msg = "Problem while creating Rally deployment"
        mock_exec_raise.assert_any_call(cmd, error_msg=error_msg)

        cmd = "rally deployment check"
        error_msg = ("OpenStack not responding or "
                     "faulty Rally deployment.")
        mock_exec_raise.assert_any_call(cmd, error_msg=error_msg)

        cmd = "rally deployment list"
        error_msg = ("Problem while listing "
                     "Rally deployment.")
        mock_exec.assert_any_call(cmd, error_msg=error_msg)

        cmd = "rally plugin list | head -5"
        error_msg = ("Problem while showing "
                     "Rally plugins.")
        mock_exec.assert_any_call(cmd, error_msg=error_msg)

    @mock.patch('functest.ci.prepare_env.logger.debug')
    def test_install_tempest(self, mock_logger_debug):
        mock_popen = mock.Mock()
        attrs = {'poll.return_value': None,
                 'stdout.readline.return_value': '0'}
        mock_popen.configure_mock(**attrs)

        CONST.__setattr__('tempest_deployment_name', 'test_dep_name')
        with mock.patch('functest.ci.prepare_env.'
                        'ft_utils.execute_command_raise',
                        side_effect=Exception), \
            mock.patch('functest.ci.prepare_env.subprocess.Popen',
                       return_value=mock_popen), \
                self.assertRaises(Exception):
            prepare_env.install_tempest()
            mock_logger_debug.assert_any_call("Tempest test_dep_name"
                                              " does not exist")

    def test_create_flavor(self):
        with mock.patch('functest.ci.prepare_env.'
                        'os_utils.get_or_create_flavor',
                        return_value=('test_', None)), \
                self.assertRaises(Exception) as context:
            prepare_env.create_flavor()
            msg = 'Failed to create flavor'
            self.assertTrue(msg in context)

    @mock.patch('functest.ci.prepare_env.sys.exit')
    @mock.patch('functest.ci.prepare_env.logger.error')
    def test_check_environment_missing_file(self, mock_logger_error,
                                            mock_sys_exit):
        with mock.patch('functest.ci.prepare_env.os.path.isfile',
                        return_value=False), \
                self.assertRaises(Exception):
            prepare_env.check_environment()

    @mock.patch('functest.ci.prepare_env.sys.exit')
    @mock.patch('functest.ci.prepare_env.logger.error')
    def test_check_environment_with_error(self, mock_logger_error,
                                          mock_sys_exit):
        with mock.patch('functest.ci.prepare_env.os.path.isfile',
                        return_value=True), \
            mock.patch("__builtin__.open", mock.mock_open(read_data='0')), \
                self.assertRaises(Exception):
            prepare_env.check_environment()

    @mock.patch('functest.ci.prepare_env.logger.info')
    def test_check_environment_default(self, mock_logger_info):
        with mock.patch('functest.ci.prepare_env.os.path.isfile',
                        return_value=True):
            with mock.patch("__builtin__.open", mock.mock_open(read_data='1')):
                prepare_env.check_environment()
                mock_logger_info.assert_any_call("Functest environment"
                                                 " is installed.")

    @mock.patch('functest.ci.prepare_env.print_deployment_info')
    @mock.patch('functest.ci.prepare_env.check_environment')
    @mock.patch('functest.ci.prepare_env.create_flavor')
    @mock.patch('functest.ci.prepare_env.install_tempest')
    @mock.patch('functest.ci.prepare_env.install_rally')
    @mock.patch('functest.ci.prepare_env.verify_deployment')
    @mock.patch('functest.ci.prepare_env.patch_config_file')
    @mock.patch('functest.ci.prepare_env.source_rc_file')
    @mock.patch('functest.ci.prepare_env.create_directories')
    @mock.patch('functest.ci.prepare_env.get_deployment_handler')
    @mock.patch('functest.ci.prepare_env.check_env_variables')
    @mock.patch('functest.ci.prepare_env.logger.info')
    def test_main_start(self, mock_logger_info, mock_env_var, mock_dep_handler,
                        mock_create_dir, mock_source_rc, mock_patch_config,
                        mock_verify_depl, mock_install_rally,
                        mock_install_temp, mock_create_flavor,
                        mock_check_env, mock_print_info):
        with mock.patch("__builtin__.open", mock.mock_open()) as m:
            args = {'action': 'start'}
            self.assertEqual(prepare_env.main(**args), 0)
            mock_logger_info.assert_any_call("######### Preparing Functest "
                                             "environment #########\n")
            self.assertTrue(mock_env_var.called)
            self.assertTrue(mock_dep_handler.called)
            self.assertTrue(mock_create_dir.called)
            self.assertTrue(mock_source_rc.called)
            self.assertTrue(mock_patch_config.called)
            self.assertTrue(mock_verify_depl.called)
            self.assertTrue(mock_install_rally.called)
            self.assertTrue(mock_install_temp.called)
            self.assertTrue(mock_create_flavor.called)
            m.assert_called_once_with(
                CONST.__getattribute__('env_active'), "w")
            self.assertTrue(mock_check_env.called)
            self.assertTrue(mock_print_info.called)

    @mock.patch('functest.ci.prepare_env.check_environment')
    def test_main_check(self, mock_check_env):
        args = {'action': 'check'}
        self.assertEqual(prepare_env.main(**args), 0)
        self.assertTrue(mock_check_env.called)

    @mock.patch('functest.ci.prepare_env.logger.error')
    def test_main_no_arg(self, mock_logger_error):
        args = {'action': 'not_valid'}
        self.assertEqual(prepare_env.main(**args), -1)
        mock_logger_error.assert_called_once_with('Argument not valid.')


if __name__ == "__main__":
    unittest.main(verbosity=2)