# Copyright 2013 Rackspace Australia # # 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 os import time import base import fakes class TestWorkerServer(base.TestWithGearman): def test_jobs_load_from_legacy_plugins(self): "Test the configured plugins are loaded from legacy config.yaml layout" self.start_server() self.assertFalse(self.worker_server.stopped()) self.assertEqual(3, len(self.worker_server.jobs)) expected_jobs = { 'build:real-db-upgrade_nova_mysql_devstack_131007': { "name": "build:real-db-upgrade_nova_mysql_devstack_131007", "plugin": "real_db_upgrade", "runner_module_name": "turbo_hipster.task_plugins." "real_db_upgrade.task", "plugin_config": { "name": "real_db_upgrade", "datasets_dir": "/var/lib/turbo-hipster/" "datasets_devstack_131007", "function": "build:real-db-upgrade_nova_mysql_devstack_" "131007" }, }, 'build:real-db-upgrade_nova_mysql_user_001': { "name": "build:real-db-upgrade_nova_mysql_user_001", "plugin": "real_db_upgrade", "runner_module_name": "turbo_hipster.task_plugins." "real_db_upgrade.task", "plugin_config": { "name": "real_db_upgrade", "datasets_dir": "/var/lib/turbo-hipster/datasets_user_001", "function": "build:real-db-upgrade_nova_mysql_user_001" }, }, 'build:do_something_shelly': { "name": "build:do_something_shelly", "plugin": "shell_script", "runner_module_name": "turbo_hipster.task_plugins." "shell_script.task", "job_config": { "name": "build:do_something_shelly", "shell_script": "ls -lah && echo", }, }, } for job_name, job in self.worker_server.jobs.items(): self.assertEqual(expected_jobs[job_name]['name'], job['name']) self.assertEqual(expected_jobs[job_name]['plugin'], job['plugin']) if 'plugin_config' in job: self.assertEqual(expected_jobs[job_name]['plugin_config'], job['plugin_config']) if 'job_config' in job: self.assertEqual(expected_jobs[job_name]['job_config'], job['job_config']) self.assertEqual( expected_jobs[job_name]['runner_module_name'], job['runner'].__module__ ) def test_job_configuration(self): "Test config.yaml job layout" self._load_config_fixture('config.yaml') self.start_server() self.assertFalse(self.worker_server.stopped()) self.assertEqual(3, len(self.worker_server.jobs)) expected_jobs = { 'build:real-db-upgrade_nova_mysql': { "name": "build:real-db-upgrade_nova_mysql", "plugin": "real_db_upgrade", "runner_module_name": "turbo_hipster.task_plugins." "real_db_upgrade.task", "job_config": { "name": "build:real-db-upgrade_nova_mysql", "plugin": "real_db_upgrade", "datasets_dir": "/home/josh/var/lib/turbo-hipster/datasets" }, }, 'build:real-db-upgrade_nova_mysql_user_001': { "name": "build:real-db-upgrade_nova_mysql_user_001", "plugin": "real_db_upgrade", "runner_module_name": "turbo_hipster.task_plugins." "real_db_upgrade.task", "plugin_config": { "name": "real_db_upgrade", "datasets_dir": "/var/lib/turbo-hipster/datasets_user_001", "function": "build:real-db-upgrade_nova_mysql_user_001", }, }, 'build:some_shell_job': { "name": "build:some_shell_job", "plugin": "shell_script", "runner_module_name": "turbo_hipster.task_plugins." "shell_script.task", "job_config": { "name": "build:some_shell_job", "shell_script": "/dev/null", }, }, } for job_name, job in self.worker_server.jobs.items(): self.assertEqual(expected_jobs[job_name]['name'], job['name']) self.assertEqual(expected_jobs[job_name]['plugin'], job['plugin']) if 'plugin_config' in job: self.assertEqual(expected_jobs[job_name]['plugin_config'], job['plugin_config']) if 'job_config' in job: self.assertEqual(expected_jobs[job_name]['job_config'], job['job_config']) self.assertEqual( expected_jobs[job_name]['runner_module_name'], job['runner'].__module__ ) def test_zuul_client_started(self): "Test the zuul client has been started" self.start_server() self.assertFalse(self.worker_server.zuul_client.stopped()) def test_zuul_manager_started(self): "Test the zuul manager has been started" self.start_server() self.assertFalse(self.worker_server.zuul_manager.stopped()) class TestZuulClient(base.TestWithGearman): def test_setup_gearman_worker(self): "Make sure the client is registered as a worker with gearman" pass def test_registered_functions(self): "Test the correct functions are registered with gearman" self.start_server() # The client should have all of the functions defined in the config # registered with gearman # We need to wait for all the functions to register with the server.. # We'll give it up to 10seconds to do so t0 = time.time() failed = True while time.time() - t0 < 10: # There should be 4 functions. 1 for each plugin + 1 for the # manager if len(self.gearman_server.functions) == 4: failed = False break time.sleep(0.01) if failed: self.log.debug(self.gearman_server.functions) self.fail("The correct number of functions haven't registered with" " gearman") self.assertIn('build:real-db-upgrade_nova_mysql_devstack_131007', self.gearman_server.functions) self.assertIn('build:real-db-upgrade_nova_mysql_user_001', self.gearman_server.functions) self.assertIn('build:do_something_shelly', self.gearman_server.functions) def test_waiting_for_job(self): "Make sure the client waits for jobs as expected" pass def test_stop(self): "Test sending a stop signal to the client exists correctly" pass def test_job_can_shutdown_th(self): self._load_config_fixture('shutdown-config.yaml') self.start_server() zuul = fakes.FakeZuul(self.config['zuul_server']['gearman_host'], self.config['zuul_server']['gearman_port']) # First check we can run a job that /doesn't/ shut down turbo-hipster data_req = zuul.make_zuul_data() zuul.submit_job('build:demo_job_clean', data_req) zuul.wait_for_completion() self.assertTrue(zuul.job.complete) self.assertFalse(self.worker_server.stopped()) # Now run a job that leaves the environment dirty and /should/ shut # down turbo-hipster zuul.job = None zuul.submit_job('build:demo_job_dirty', data_req) zuul.wait_for_completion() self.assertTrue(zuul.job.complete) # Give the server a second to shutdown time.sleep(1) self.assertTrue(self.worker_server.stopped()) class TestZuulManager(base.TestWithGearman): def test_registered_functions(self): "Test the correct functions are registered with gearman" self.start_server() # We need to wait for all the functions to register with the server.. # We'll give it up to 10seconds to do so t0 = time.time() failed = True while time.time() - t0 < 10: # There should be 4 functions. 1 for each plugin + 1 for the # manager if len(self.gearman_server.functions) == 4: failed = False break time.sleep(0.01) if failed: self.log.debug(self.gearman_server.functions) self.fail("The correct number of functions haven't registered with" " gearman") hostname = os.uname()[1] self.assertIn('stop:turbo-hipster-manager-%s' % hostname, self.gearman_server.functions)