예제 #1
0
 def test_teardown_called_on_slave_when_no_subjobs_remain(self):
     build = Build(BuildRequest({}))
     slave = Slave('', 1)
     slave.teardown = MagicMock()
     slave.free_executor = MagicMock(return_value=0)
     build._unstarted_subjobs = Queue()
     build.execute_next_subjob_on_slave(slave)
     slave.teardown.assert_called_with()
예제 #2
0
    def test_teardown_called_on_slave_when_no_subjobs_remain(self):
        build = Build(BuildRequest({}))
        slave = Slave('', 1)
        slave.teardown = MagicMock()
        slave.free_executor = MagicMock(return_value=0)
        build._unstarted_subjobs = Queue()
        build._slaves_allocated = [slave]

        build.execute_next_subjob_on_slave(slave)

        slave.teardown.assert_called_with()
예제 #3
0
    def test_execute_next_subjob_with_empty_queue_cant_teardown_same_slave_twice(
            self):
        build = Build(BuildRequest({}))
        build._unstarted_subjobs = Queue()
        slave = Mock()
        slave.free_executor = Mock(return_value=0)
        build._slaves_allocated.append(slave)

        build.execute_next_subjob_on_slave(slave)
        build.execute_next_subjob_on_slave(slave)

        self.assertEqual(slave.teardown.call_count, 1,
                         "Teardown should only be called once")
예제 #4
0
    def test_build_doesnt_use_more_than_max_executors_per_slave(self):
        subjobs = self._create_subjobs()
        mock_project_type = self._create_mock_project_type()
        fake_setup_command = 'mock command'
        mock_slaves = [
            self._create_mock_slave(num_executors=5) for _ in range(3)
        ]
        max_executors_per_slave = 2
        expected_total_num_executors_used = 6  # We expect the build to use 2 executors on each of the 3 slaves.

        build = Build(BuildRequest({'setup': fake_setup_command}))
        build.execute_next_subjob_on_slave = MagicMock()

        build.prepare(
            subjobs, mock_project_type,
            self._create_job_config(
                max_executors_per_slave=max_executors_per_slave))
        [build.allocate_slave(mock_slave) for mock_slave in mock_slaves]

        expected_current_num_executors_used = 0
        for i in range(len(mock_slaves)):
            build.begin_subjob_executions_on_slave(mock_slaves[i])
            expected_current_num_executors_used += max_executors_per_slave
            self.assertEqual(
                build.execute_next_subjob_on_slave.call_count,
                expected_current_num_executors_used,
                'After allocating {} slaves, build with max_executors_per_slave set to {} should only be using {} '
                'executors.'.format(i + 1, max_executors_per_slave,
                                    expected_current_num_executors_used))

        self.assertEqual(
            build.execute_next_subjob_on_slave.call_count,
            expected_total_num_executors_used,
            'Build should start executing as many subjobs per slave as its max_executors_per_slave setting.'
        )
예제 #5
0
    def test_build_doesnt_use_more_than_max_executors(self):
        subjobs = self._create_subjobs()
        mock_project_type = self._create_mock_project_type()
        fake_setup_command = 'mock command'
        mock_slaves = [
            self._create_mock_slave(num_executors=5) for _ in range(3)
        ]
        expected_num_executors = 12  # We expect the build to use 12 out of 15 available executors.

        build = Build(BuildRequest({'setup': fake_setup_command}))
        build.execute_next_subjob_on_slave = MagicMock()

        build.prepare(
            subjobs, mock_project_type,
            self._create_job_config(max_executors=expected_num_executors))
        [build.allocate_slave(mock_slave) for mock_slave in mock_slaves]
        [
            build.begin_subjob_executions_on_slave(mock_slave)
            for mock_slave in mock_slaves
        ]

        self.assertEqual(
            build.execute_next_subjob_on_slave.call_count,
            expected_num_executors,
            'Build should start executing as many subjobs as its max_executors setting.'
        )
예제 #6
0
    def test_handle_result_reported_from_slave_does_nothing_when_build_is_canceled(
            self):
        build_id = 1
        slave_url = "url"
        build = Build(BuildRequest({}))
        build.handle_subjob_payload = Mock()
        build.mark_subjob_complete = Mock()
        build.execute_next_subjob_on_slave = Mock()
        master = ClusterMaster()
        master._all_builds_by_id[build_id] = build
        master._all_slaves_by_url[slave_url] = Mock()
        build._is_canceled = True

        master.handle_result_reported_from_slave(slave_url, build_id, 1)

        self.assertEqual(build.handle_subjob_payload.call_count, 0,
                         "Build is canceled, should not handle payload")
        self.assertEqual(build.mark_subjob_complete.call_count, 0,
                         "Build is canceled, should not complete subjobs")
        self.assertEqual(build.execute_next_subjob_on_slave.call_count, 0,
                         "Build is canceled, should not do next subjob")