From f6c32531f75f679f11cd71709fe8d8976e1ec5c2 Mon Sep 17 00:00:00 2001 From: Timur Nurlygayanov Date: Tue, 19 Jan 2016 20:10:36 +0300 Subject: [PATCH] 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 --- .coveragerc | 5 +- kolla_mesos/cmd/deploy.py | 5 +- kolla_mesos/tests/test_deploy.py | 221 +++++++++++++++++++++++++++++++ 3 files changed, 228 insertions(+), 3 deletions(-) create mode 100644 kolla_mesos/tests/test_deploy.py diff --git a/.coveragerc b/.coveragerc index da883905..28bc5927 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,7 +1,10 @@ [run] branch = True source = kolla_mesos -omit = kolla_mesos/openstack/* +omit = + kolla_mesos/openstack/* + .tox/* + kolla_mesos/tests/* [report] ignore_errors = True diff --git a/kolla_mesos/cmd/deploy.py b/kolla_mesos/cmd/deploy.py index 6920fdbd..1337f813 100755 --- a/kolla_mesos/cmd/deploy.py +++ b/kolla_mesos/cmd/deploy.py @@ -133,8 +133,8 @@ class KollaWorker(object): def gen_deployment_id(self): if CONF.kolla.deployment_id_prefix and CONF.kolla.deployment_id: - LOG.info('You cant use "deployment-id" and "deployment-id-prefix" ' - 'together. Choose one.') + LOG.info('You can\'t use "deployment-id" and ' + '"deployment-id-prefix" together. Choose one.') sys.exit(1) uniq_name = CONF.kolla.deployment_id is not None @@ -170,6 +170,7 @@ class KollaWorker(object): zk.ensure_path(script_node) source_path = common_cfg[script]['source'] + src_file = source_path if not source_path.startswith('/'): src_file = file_utils.find_file(source_path) with open(src_file) as fp: diff --git a/kolla_mesos/tests/test_deploy.py b/kolla_mesos/tests/test_deploy.py new file mode 100644 index 00000000..3a1dedd2 --- /dev/null +++ b/kolla_mesos/tests/test_deploy.py @@ -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'], '')