示例#1
0
        def assertions(driver, task_id, sandbox_directory):
            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_FINISHED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_core_messages = [{
                'sandbox-directory': sandbox_directory,
                'task-id': task_id,
                'type': 'directory'
            }, {
                'exit-code': 0,
                'task-id': task_id
            }]
            expected_progress_messages = [{
                'progress-message': 'line count is 20',
                'progress-percent': 90,
                'progress-sequence': 1,
                'task-id': task_id
            }]
            tu.assert_messages(self, expected_core_messages,
                               expected_progress_messages, driver.messages)
示例#2
0
        def assertions(driver, task_id, sandbox_directory):
            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_KILLED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_message_0 = {
                'sandbox-directory': sandbox_directory,
                'task-id': task_id,
                'type': 'directory'
            }
            expected_message_1 = {'exit-code': -15, 'task-id': task_id}
            tu.assert_messages(self, [expected_message_0, expected_message_1],
                               [], driver.messages)
示例#3
0
        def assertions(driver, task_id, sandbox_directory):

            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_FINISHED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            logging.info('Messages: {}'.format(driver.messages))
            self.assertLess(2, len(driver.messages))

            actual_encoded_message_0 = driver.messages[0]
            expected_message_0 = {
                'sandbox-directory': sandbox_directory,
                'task-id': task_id,
                'type': 'directory'
            }
            tu.assert_message(self, expected_message_0,
                              actual_encoded_message_0)

            found_exit_message = False
            for index in range(1, len(driver.messages)):
                actual_encoded_message = driver.messages[index]
                actual_message = tu.parse_message(actual_encoded_message)
                if 'exit-code' in actual_message:
                    found_exit_message = True
                    expected_message = {'exit-code': 0, 'task-id': task_id}
                    tu.assert_message(self, expected_message,
                                      actual_encoded_message)
                    break
            self.assertTrue(found_exit_message)

            stderr_name = tu.ensure_directory('build/stderr.' + str(task_id))
            if os.path.isfile(stderr_name):
                with open(stderr_name) as f:
                    file_contents = f.read()
                    self.assertEqual(num_iterations * 25,
                                     file_contents.count('X'))
            else:
                self.fail('{} does not exist.'.format(stderr_name))
示例#4
0
        def assertions(driver, task_id, sandbox_directory):
            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_FINISHED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_core_messages = [{
                'sandbox-directory': sandbox_directory,
                'task-id': task_id,
                'type': 'directory'
            }, {
                'exit-code': 0,
                'task-id': task_id
            }]
            expected_progress_messages = [{
                'progress-message': 'Fifty percent in progress file',
                'progress-percent': 50,
                'progress-sequence': 1,
                'task-id': task_id
            }, {
                'progress-message': 'Fifty-five percent in stdout',
                'progress-percent': 55,
                'progress-sequence': 2,
                'task-id': task_id
            }, {
                'progress-message': 'Sixty percent in stderr',
                'progress-percent': 60,
                'progress-sequence': 3,
                'task-id': task_id
            }, {
                'progress-message': 'Sixty-five percent in stdout wit...',
                'progress-percent': 65,
                'progress-sequence': 4,
                'task-id': task_id
            }]
            tu.assert_messages(self, expected_core_messages,
                               expected_progress_messages, driver.messages)
示例#5
0
        def assertions(driver, task_id, sandbox_directory):

            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_FINISHED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_message_0 = {
                'sandbox-directory': sandbox_directory,
                'task-id': task_id,
                'type': 'directory'
            }
            expected_message_1 = {'exit-code': 0, 'task-id': task_id}
            tu.assert_messages(self, [expected_message_0, expected_message_1],
                               [], driver.messages)

            stdout_name = tu.ensure_directory('build/stdout.' + str(task_id))
            if os.path.isfile(stdout_name):
                with open(stdout_name) as f:
                    file_contents = f.read()
                    self.assertEqual(num_iterations * 25,
                                     file_contents.count('X'))
            else:
                self.fail('{} does not exist.'.format(stdout_name))

            stderr_name = tu.ensure_directory('build/stderr.' + str(task_id))
            if os.path.isfile(stderr_name):
                with open(stderr_name) as f:
                    file_contents = f.read()
                    self.assertEqual(num_iterations * 25,
                                     file_contents.count('X'))
            else:
                self.fail('{} does not exist.'.format(stderr_name))
示例#6
0
    def test_os_error_handler_no_permission(self):
        driver = tu.FakeMesosExecutorDriver()
        task_id = tu.get_random_task_id()
        status_updater = ce.StatusUpdater(driver, task_id)
        stop_signal = Event()
        os_error = OSError(errno.EPERM, 'No Permission')

        ce.os_error_handler(stop_signal, status_updater, os_error)

        self.assertTrue(stop_signal.isSet())
        expected_statuses = [{
            'task_id': {
                'value': task_id
            },
            'state': cook.TASK_FAILED
        }]
        tu.assert_statuses(self, expected_statuses, driver.statuses)
示例#7
0
    def test_os_error_handler_no_memory(self):
        driver = tu.FakeMesosExecutorDriver()
        task_id = tu.get_random_task_id()
        status_updater = ce.StatusUpdater(driver, task_id)
        stop_signal = Event()
        os_error = OSError(errno.ENOMEM, 'No Memory')

        ce.os_error_handler(stop_signal, status_updater, os_error)

        self.assertTrue(stop_signal.isSet())
        expected_statuses = [{
            'task_id': {
                'value': task_id
            },
            'reason': cook.REASON_CONTAINER_LIMITATION_MEMORY,
            'state': cook.TASK_FAILED
        }]
        tu.assert_statuses(self, expected_statuses, driver.statuses)
示例#8
0
        def assertions(driver, task_id, sandbox_directory):
            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'reason': cook.REASON_TASK_INVALID,
                'state': cook.TASK_ERROR
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_message_0 = {
                'sandbox-directory': sandbox_directory,
                'task-id': task_id,
                'type': 'directory'
            }
            tu.assert_messages(self, [expected_message_0], [], driver.messages)
示例#9
0
        def assertions(driver, task_id, sandbox_directory):
            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_FINISHED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_core_messages = [{
                'sandbox-directory': sandbox_directory,
                'task-id': task_id,
                'type': 'directory'
            }, {
                'exit-code': 0,
                'task-id': task_id
            }]
            expected_progress_messages = [{
                'progress-message': '',
                'progress-percent': 50,
                'progress-sequence': 1,
                'task-id': task_id
            }]
            tu.assert_messages(self, expected_core_messages,
                               expected_progress_messages, driver.messages)

            stdout_name = tu.ensure_directory('build/stdout.' + str(task_id))
            if not os.path.isfile(stdout_name):
                self.fail('{} does not exist.'.format(stdout_name))
示例#10
0
    def test_update_status(self):
        driver = tu.FakeMesosExecutorDriver()
        task_id = tu.get_random_task_id()
        status_updater = ce.StatusUpdater(driver, task_id)
        task_state = "TEST_TASK_STATE"

        self.assertTrue(status_updater.update_status(cook.TASK_STARTING))
        self.assertTrue(status_updater.update_status(task_state))
        self.assertTrue(
            status_updater.update_status(cook.TASK_RUNNING, reason='Running'))
        self.assertTrue(
            status_updater.update_status(cook.TASK_FAILED,
                                         reason='Termination'))
        self.assertFalse(status_updater.update_status(cook.TASK_FINISHED))

        expected_statuses = [{
            'task_id': {
                'value': task_id
            },
            'state': cook.TASK_STARTING
        }, {
            'task_id': {
                'value': task_id
            },
            'state': task_state
        }, {
            'task_id': {
                'value': task_id
            },
            'reason': 'Running',
            'state': cook.TASK_RUNNING
        }, {
            'task_id': {
                'value': task_id
            },
            'reason': 'Termination',
            'state': cook.TASK_FAILED
        }]
        tu.assert_statuses(self, expected_statuses, driver.statuses)
示例#11
0
        def assertions(driver, task_id, _):
            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_FINISHED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_message_0 = {
                'sandbox-directory':
                '/location/to/task/sandbox/{}'.format(task_id),
                'task-id': task_id,
                'type': 'directory'
            }
            expected_message_1 = {'exit-code': 0, 'task-id': task_id}
            tu.assert_messages(self, [expected_message_0, expected_message_1],
                               [], driver.messages)

            stdout_name = tu.ensure_directory(
                'build/stdout.{}'.format(task_id))
            with open(stdout_name) as f:
                file_contents = f.read()
                self.assertTrue('FEE=FIE' in file_contents)
                self.assertTrue('FOO=BAR' in file_contents)
                self.assertTrue('PROGRESS_OUTPUT_FILE=foobar' in file_contents)
示例#12
0
    def test_executor_launch_task_and_disconnect(self):

        task_id = tu.get_random_task_id()
        stdout_name = tu.ensure_directory('build/stdout.{}'.format(task_id))
        stderr_name = tu.ensure_directory('build/stderr.{}'.format(task_id))
        output_name = tu.ensure_directory('build/output.' + str(task_id))

        tu.redirect_stdout_to_file(stdout_name)
        tu.redirect_stderr_to_file(stderr_name)

        try:
            config = cc.ExecutorConfig()
            stop_signal = Event()
            executor = ce.CookExecutor(stop_signal, config)

            driver = tu.FakeMesosExecutorDriver()
            command = 'echo "Start" >> {}; sleep 100; echo "Done." >> {}; '.format(
                output_name, output_name)
            task = {
                'task_id': {
                    'value': task_id
                },
                'data':
                pm.encode_data(
                    json.dumps({
                        'command': command
                    }).encode('utf8'))
            }

            executor.launchTask(driver, task)

            # let the process run for up to 10 seconds
            for _ in range(1000):
                time.sleep(0.01)
                if os.path.isfile(output_name):
                    with open(output_name) as f:
                        content = f.read()
                        if 'Start' in content:
                            break

            executor.disconnected(driver)
            self.assertTrue(executor.disconnect_signal.isSet())
            self.assertTrue(executor.stop_signal.isSet())

            executor.await_completion()
            logging.info('Task completed')

            if os.path.isfile(output_name):
                with open(output_name) as f:
                    file_contents = f.read()
                    self.assertTrue('Start' in file_contents)
                    self.assertTrue('Done' not in file_contents)
            else:
                self.fail('{} does not exist.'.format(stderr_name))

            expected_statuses = [{
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_STARTING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_RUNNING
            }, {
                'task_id': {
                    'value': task_id
                },
                'state': cook.TASK_KILLED
            }]
            tu.assert_statuses(self, expected_statuses, driver.statuses)

            expected_message_0 = {
                'sandbox-directory': '',
                'task-id': task_id,
                'type': 'directory'
            }
            expected_message_1 = {'exit-code': -15, 'task-id': task_id}
            tu.assert_messages(self, [expected_message_0, expected_message_1],
                               [], driver.messages)
        finally:
            tu.cleanup_output(stdout_name, stderr_name)
            tu.cleanup_file(output_name)