Added unit tests for deploy.py
Increased unit tests coverage from 0 up to 90 % for deploy.py and removed "test" directory from the coverage report. Also fixed issue with not initialized variable in deploy.py Change-Id: If2ab0f4bd7823da6c9386179113f4736abaac3f7 Closes-Bug: #1519127 Closes-Bug: #1535930
This commit is contained in:
parent
9042c81fad
commit
f6c32531f7
|
@ -1,7 +1,10 @@
|
||||||
[run]
|
[run]
|
||||||
branch = True
|
branch = True
|
||||||
source = kolla_mesos
|
source = kolla_mesos
|
||||||
omit = kolla_mesos/openstack/*
|
omit =
|
||||||
|
kolla_mesos/openstack/*
|
||||||
|
.tox/*
|
||||||
|
kolla_mesos/tests/*
|
||||||
|
|
||||||
[report]
|
[report]
|
||||||
ignore_errors = True
|
ignore_errors = True
|
||||||
|
|
|
@ -133,8 +133,8 @@ class KollaWorker(object):
|
||||||
def gen_deployment_id(self):
|
def gen_deployment_id(self):
|
||||||
|
|
||||||
if CONF.kolla.deployment_id_prefix and CONF.kolla.deployment_id:
|
if CONF.kolla.deployment_id_prefix and CONF.kolla.deployment_id:
|
||||||
LOG.info('You cant use "deployment-id" and "deployment-id-prefix" '
|
LOG.info('You can\'t use "deployment-id" and '
|
||||||
'together. Choose one.')
|
'"deployment-id-prefix" together. Choose one.')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
uniq_name = CONF.kolla.deployment_id is not None
|
uniq_name = CONF.kolla.deployment_id is not None
|
||||||
|
@ -170,6 +170,7 @@ class KollaWorker(object):
|
||||||
zk.ensure_path(script_node)
|
zk.ensure_path(script_node)
|
||||||
source_path = common_cfg[script]['source']
|
source_path = common_cfg[script]['source']
|
||||||
|
|
||||||
|
src_file = source_path
|
||||||
if not source_path.startswith('/'):
|
if not source_path.startswith('/'):
|
||||||
src_file = file_utils.find_file(source_path)
|
src_file = file_utils.find_file(source_path)
|
||||||
with open(src_file) as fp:
|
with open(src_file) as fp:
|
||||||
|
|
|
@ -0,0 +1,221 @@
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import mock
|
||||||
|
from oslo_config import cfg
|
||||||
|
import requests_mock
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from kolla_mesos.cmd import deploy
|
||||||
|
from kolla_mesos.tests import base
|
||||||
|
|
||||||
|
|
||||||
|
CONF = cfg.CONF
|
||||||
|
CONF.import_group('kolla', 'kolla_mesos.config.kolla')
|
||||||
|
|
||||||
|
YAML_SERVICES_CONFIG = """
|
||||||
|
config:
|
||||||
|
source: "test1.yml"
|
||||||
|
keystone:
|
||||||
|
keystone-api:
|
||||||
|
keystone-api.conf:
|
||||||
|
source: ["config/keystone/templates/keystone-api.conf.j2",
|
||||||
|
"/etc/kolla/config/keystone.conf"]
|
||||||
|
dest: /etc/keystone/keystone-api.conf
|
||||||
|
owner: glance
|
||||||
|
perm: "0600"
|
||||||
|
rabbitmq:
|
||||||
|
rabbitmq-server:
|
||||||
|
rabbitmq-server.conf:
|
||||||
|
source: ["config/rabbitmq/templates/rabbitmq-server.conf.j2",
|
||||||
|
"/etc/kolla/config/rabbitmq-server.conf"]
|
||||||
|
dest: /etc/rabbitmq/rabbitmq-server.conf
|
||||||
|
mariadb:
|
||||||
|
mariadb-server:
|
||||||
|
mariadb-server.conf:
|
||||||
|
source: ["config/mariadb/templates/mariadb-server.conf.j2",
|
||||||
|
"/etc/kolla/config/mariadb-server.conf"]
|
||||||
|
dest: /etc/mariadb/mariadb-server.conf
|
||||||
|
glance:
|
||||||
|
glance-api:
|
||||||
|
glance-api.conf:
|
||||||
|
source: "/config/glance/templates/glance-api.conf.j2"
|
||||||
|
dest: /etc/glance/glance-api.conf
|
||||||
|
glance-registry:
|
||||||
|
glance-registry.conf:
|
||||||
|
source: "config/glance/templates/glance-registry.conf.j2"
|
||||||
|
dest: /etc/glance/glance-registry.conf
|
||||||
|
horizon:
|
||||||
|
horizon:
|
||||||
|
openstack-horizon.conf:
|
||||||
|
source: "/config/horizon/templates/openstack-dashboard.conf.j2"
|
||||||
|
dest: /etc/horizon/openstack-dashboard.conf
|
||||||
|
commands:
|
||||||
|
source: "/etc/test2.yaml"
|
||||||
|
glance:
|
||||||
|
glance-api:
|
||||||
|
db_sync:
|
||||||
|
run_once: True
|
||||||
|
command: kolla_extend_start
|
||||||
|
glance_api:
|
||||||
|
daemon: True
|
||||||
|
command: /usr/bin/glance-api
|
||||||
|
requires: [/kolla/1/variables/glance_database/.done,
|
||||||
|
/kolla/1/variables/glance_database_user_create/.done]
|
||||||
|
register: /kolla/1/variables/glance_setup/.done
|
||||||
|
glance-registry:
|
||||||
|
glance-registry:
|
||||||
|
daemon: True
|
||||||
|
command: /usr/bin/glance-registry
|
||||||
|
keystone:
|
||||||
|
keystone-api:
|
||||||
|
keystone-api:
|
||||||
|
daemon: True
|
||||||
|
command: /usr/bin/keystone-api
|
||||||
|
mariadb:
|
||||||
|
mariadb-server:
|
||||||
|
mariadb-server:
|
||||||
|
daemon: True
|
||||||
|
command: service mariadb-server start
|
||||||
|
rabbitmq:
|
||||||
|
rabbitmq-server:
|
||||||
|
rabbitmq-server:
|
||||||
|
daemon: True
|
||||||
|
command: service rabbitmq-server start
|
||||||
|
horizon:
|
||||||
|
horizon:
|
||||||
|
apache:
|
||||||
|
daemon: False
|
||||||
|
command: service apache2 start
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TestClient(base.BaseTestCase):
|
||||||
|
|
||||||
|
@requests_mock.mock()
|
||||||
|
def setUp(self, req_mock):
|
||||||
|
super(TestClient, self).setUp()
|
||||||
|
CONF.set_override('host', 'http://localhost:4400', group='chronos')
|
||||||
|
CONF.set_override('timeout', 5, group='chronos')
|
||||||
|
CONF.set_override('host', 'http://127.0.0.1:8080', group='marathon')
|
||||||
|
CONF.set_override('deployment_id', None, group='kolla')
|
||||||
|
CONF.set_override('deployment_id_prefix', None, group='kolla')
|
||||||
|
req_mock.get('http://127.0.0.1:8080/v2/info', json={
|
||||||
|
'version': '0.11.0'
|
||||||
|
})
|
||||||
|
|
||||||
|
self.worker = deploy.KollaWorker()
|
||||||
|
|
||||||
|
def test_create_worker(self):
|
||||||
|
self.assertIsInstance(self.worker, deploy.KollaWorker)
|
||||||
|
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.tempfile')
|
||||||
|
def test_setup_working_dir(self, mock_tmpfile):
|
||||||
|
self.worker.setup_working_dir()
|
||||||
|
parameters = mock_tmpfile.mkdtemp.call_args[1]
|
||||||
|
self.assertTrue(parameters['prefix'].startswith('kolla'))
|
||||||
|
|
||||||
|
def test_gen_deployment_id(self):
|
||||||
|
CONF.set_override('deployment_id', 'test', group='kolla')
|
||||||
|
self.worker.gen_deployment_id()
|
||||||
|
self.assertEqual(self.worker.deployment_id, 'test')
|
||||||
|
|
||||||
|
def test_gen_deployment_id_prefix(self):
|
||||||
|
CONF.set_override('deployment_id_prefix', 'test', group='kolla')
|
||||||
|
self.worker.gen_deployment_id()
|
||||||
|
self.assertIn('test', self.worker.deployment_id)
|
||||||
|
self.assertNotEqual(self.worker.deployment_id, 'test')
|
||||||
|
|
||||||
|
def test_gen_deployment_id_without_parameters(self):
|
||||||
|
self.worker.gen_deployment_id()
|
||||||
|
date = datetime.datetime.fromtimestamp(self.worker.start_time)
|
||||||
|
new_id = date.strftime('%Y-%m-%d-%H-%M-%S')
|
||||||
|
self.assertTrue(self.worker.deployment_id.startswith(new_id[:10]))
|
||||||
|
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.sys')
|
||||||
|
def test_gen_deployment_id_with_extra_parameters(self, mock_sys):
|
||||||
|
CONF.set_override('deployment_id', 'test', group='kolla')
|
||||||
|
CONF.set_override('deployment_id_prefix', 'test2', group='kolla')
|
||||||
|
self.worker.gen_deployment_id()
|
||||||
|
mock_sys.exit.assert_called_once_with(1)
|
||||||
|
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.open')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.file_utils')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.yaml')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.json')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.zk_utils')
|
||||||
|
def test_write_to_zookeeper(self, mock_utils, mock_json, mock_yaml,
|
||||||
|
mock_file_utils, mock_open):
|
||||||
|
CONF.set_override('force', True)
|
||||||
|
|
||||||
|
self.worker.get_jinja_vars = mock.MagicMock(
|
||||||
|
return_value={'image': 'test1', 'test2': ''})
|
||||||
|
mock_yaml.load = mock.MagicMock(
|
||||||
|
return_value=yaml.load(YAML_SERVICES_CONFIG))
|
||||||
|
mock_file_utils = mock.MagicMock()
|
||||||
|
mock_file_utils.find_file = mock.MagicMock(spec=file)
|
||||||
|
mock_open.return_value = mock.MagicMock(spec=file)
|
||||||
|
|
||||||
|
self.worker.setup_working_dir()
|
||||||
|
self.worker.gen_deployment_id()
|
||||||
|
self.worker.write_to_zookeeper()
|
||||||
|
|
||||||
|
self.assertTrue(len(mock_utils.mock_calls) > 1)
|
||||||
|
expected_calls = ['set', 'delete', 'ensure_path', 'exists']
|
||||||
|
for call in mock_utils.mock_calls:
|
||||||
|
methods = str(call).split('.')
|
||||||
|
if len(methods) > 3:
|
||||||
|
function_name = methods[3].split('(')[0]
|
||||||
|
self.assertIn(function_name, expected_calls)
|
||||||
|
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.open')
|
||||||
|
def test_write_openrc(self, mock_open):
|
||||||
|
mock_open.return_value = mock.MagicMock(spec=file)
|
||||||
|
file_handle = mock_open.return_value.__enter__.return_value
|
||||||
|
|
||||||
|
self.worker.write_openrc()
|
||||||
|
|
||||||
|
mock_open.assert_called_once_with('openrc', 'w')
|
||||||
|
self.assertEqual(file_handle.write.call_count, 1)
|
||||||
|
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.json')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.open')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.os')
|
||||||
|
def test_start(self, mock_os, mock_open, mock_json):
|
||||||
|
self.worker._start_chronos_job = mock.MagicMock()
|
||||||
|
self.worker._start_marathon_app = mock.MagicMock()
|
||||||
|
mock_os.path = mock.MagicMock()
|
||||||
|
mock_os.walk = mock.MagicMock(
|
||||||
|
return_value=[('/', ('tmp1', 'tmp2'), ('file1', )),
|
||||||
|
('/', ('mdir', ), ('marathon', 'marathon2'))])
|
||||||
|
|
||||||
|
self.worker.setup_working_dir()
|
||||||
|
self.worker.gen_deployment_id()
|
||||||
|
self.worker.start()
|
||||||
|
|
||||||
|
self.assertEqual(self.worker._start_chronos_job.call_count, 1)
|
||||||
|
self.assertEqual(self.worker._start_marathon_app.call_count, 2)
|
||||||
|
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.jinja_utils')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.yaml')
|
||||||
|
@mock.patch('kolla_mesos.cmd.deploy.open')
|
||||||
|
def test_get_jinja_vars(self, mock_open, mock_yaml, mock_jutils):
|
||||||
|
CONF.set_override('deployment_id', 'test', group='kolla')
|
||||||
|
mock_yaml.load = mock.MagicMock(return_value={})
|
||||||
|
self.worker.setup_working_dir()
|
||||||
|
self.worker.gen_deployment_id()
|
||||||
|
result = self.worker.get_jinja_vars()
|
||||||
|
|
||||||
|
self.assertIsInstance(result, dict)
|
||||||
|
self.assertEqual(result['deployment_id'], 'test')
|
||||||
|
self.assertEqual(result['node_config_directory'], '')
|
Loading…
Reference in New Issue