Exemplo n.º 1
0
    def test_can_stage_delivery(self):
        url = "/".join([
            self.API_BASE, "stage", "runfolder",
            "160930_ST-E00216_0111_BH37CWALXX"
        ])
        response = self.fetch(url, method='POST', body='')
        self.assertEqual(response.code, 202)

        response_json = json.loads(response.body)

        staging_status_links = response_json.get("staging_order_links")

        for link in staging_status_links:

            def _get_delivery_status():
                self.http_client.fetch(link, self.stop)
                status_response = self.wait()
                return json.loads(status_response.body)["status"]

            assert_eventually_equals(
                self,
                timeout=5,
                delay=1,
                f=_get_delivery_status,
                expected=StagingStatus.staging_successful.name)
Exemplo n.º 2
0
    def test_can_stage_and_deliver_batch_flowcells(self):
        with tempfile.TemporaryDirectory(dir='./tests/resources/runfolders/',
                                         prefix='160930_ST-E00216_0555_BH37CWALXX_') as tmpdir1, \
                tempfile.TemporaryDirectory(dir='./tests/resources/runfolders/',
                                            prefix='160930_ST-E00216_0556_BH37CWALXX_') as tmpdir2:
            self._create_projects_dir_with_random_data(tmpdir1, 'XYZ_123')
            self._create_projects_dir_with_random_data(tmpdir2, 'XYZ_123')

            url = "/".join(
                [self.API_BASE, "stage", "project", 'runfolders', 'XYZ_123'])
            payload = {'delivery_mode': 'BATCH'}
            response = self.fetch(url, method='POST', body=json.dumps(payload))
            self.assertEqual(response.code, 202)

            payload = {'delivery_mode': 'BATCH'}
            response_failed = self.fetch(url,
                                         method='POST',
                                         body=json.dumps(payload))
            self.assertEqual(response_failed.code, 403)

            response_json = json.loads(response.body)

            staging_status_links = response_json.get("staging_order_links")

            for project, link in staging_status_links.items():
                self.assertEqual(project, 'XYZ_123')

            assert_eventually_equals(
                self,
                timeout=5,
                delay=1,
                f=partial(self._get_delivery_status, link),
                expected=StagingStatus.staging_successful.name)
Exemplo n.º 3
0
    def test_deliver_by_staging_id(self):
        source = '/foo/bar'
        staging_target = '/staging/dir/bar'
        staging_order = StagingOrder(source=source, staging_target=staging_target)
        staging_order.status = StagingStatus.staging_successful
        self.mock_staging_service.get_stage_order_by_id.return_value = staging_order

        self.mock_staging_service.get_delivery_order_by_id.return_value = self.delivery_order

        with patch('shutil.rmtree') as mock_rmtree:
            res = yield self.dds_service.deliver_by_staging_id(
                    staging_id=1,
                    delivery_project='snpseq00001',
                    token_path='token_path',
                    md5sum_file='md5sum_file')
            mock_rmtree.assert_called_once_with(staging_target)

        def _get_delivery_order():
            return self.delivery_order.delivery_status
        assert_eventually_equals(self, 1, _get_delivery_order, DeliveryStatus.delivery_successful)
        self.mock_mover_runner.run.assert_called_with([
            'dds',
            '--token-path', 'token_path',
            '--log-file', '/foo/bar/log',
            '--no-prompt',
            'data', 'put',
            '--mount-dir', '/foo/bar/staging_dir',
            '--source', '/staging/dir/bar',
            '--project', 'snpseq00001',
            '--silent'
            ])
Exemplo n.º 4
0
    def test_stage_order(self):
        self.staging_service.stage_order(stage_order=self.staging_order1)

        def _get_stating_status():
            return self.staging_order1.status

        assert_eventually_equals(self, 1, _get_stating_status,
                                 StagingStatus.staging_successful)
Exemplo n.º 5
0
    def test_exception_in_staging_order(self):

        def raise_exception(x):
            raise Exception
        self.mock_external_runner_service.wait_for_execution = raise_exception
        self.staging_service.stage_order(stage_order=self.staging_order1)

        def _get_stating_status():
            return self.staging_order1.status

        assert_eventually_equals(self, 1, _get_stating_status, StagingStatus.staging_failed)
Exemplo n.º 6
0
    def test_stage_order(self):
        res = yield self.staging_service.stage_order(stage_order=self.staging_order1)

        def _get_stating_status():
            return self.staging_order1.status

        def _get_staging_size():
            return self.staging_order1.size

        assert_eventually_equals(self, 1, _get_stating_status, StagingStatus.staging_successful)
        self.assertEqual(self.staging_order1.size, 207707566)
Exemplo n.º 7
0
    def test_exception_in_staging_order(self):
        mock_external_runner_service = self.MockExternalRunnerService(
            throw=True)
        self.staging_service.external_program_service = mock_external_runner_service

        self.staging_service.stage_order(stage_order=self.staging_order1)

        def _get_stating_status():
            return self.staging_order1.status

        assert_eventually_equals(self, 1, _get_stating_status,
                                 StagingStatus.staging_failed)
Exemplo n.º 8
0
    def test_unsuccessful_staging_order(self):
        mock_external_runner_service = self.MockExternalRunnerService(
            return_status=1)
        self.staging_service.external_program_service = mock_external_runner_service

        self.staging_service.stage_order(stage_order=self.staging_order1)

        def _get_stating_status():
            return self.staging_order1.status

        assert_eventually_equals(self, 1, _get_stating_status,
                                 StagingStatus.staging_failed)
Exemplo n.º 9
0
    def test_unsuccessful_staging_order(self):
        @coroutine
        def wait_as_coroutine(x):
            return ExecutionResult(stdout="", stderr="", status_code=1)

        self.mock_external_runner_service.wait_for_execution = wait_as_coroutine

        yield self.staging_service.stage_order(stage_order=self.staging_order1)

        def _get_stating_status():
            return self.staging_order1.status

        assert_eventually_equals(self, 1, _get_stating_status, StagingStatus.staging_failed)
Exemplo n.º 10
0
    def test_can_stage_and_delivery_project_dir(self):
        # Note that this is a test which skips mover (since to_outbox is not expected to be installed on the system
        # where this runs)

        with tempfile.TemporaryDirectory(
                dir='./tests/resources/projects') as tmp_dir:

            dir_name = os.path.basename(tmp_dir)
            url = "/".join([self.API_BASE, "stage", "project", dir_name])
            response = self.fetch(url, method='POST', body='')
            self.assertEqual(response.code, 202)

            response_json = json.loads(response.body)

            staging_status_links = response_json.get("staging_order_links")

            for project, link in staging_status_links.items():
                self.assertEqual(project, dir_name)

                assert_eventually_equals(
                    self,
                    timeout=5,
                    delay=1,
                    f=partial(self._get_delivery_status, link),
                    expected=StagingStatus.staging_successful.name)

            staging_order_project_and_id = response_json.get(
                "staging_order_ids")

            for project, staging_id in staging_order_project_and_id.items():
                delivery_url = '/'.join(
                    [self.API_BASE, 'deliver', 'stage_id',
                     str(staging_id)])
                delivery_body = {
                    'delivery_project_id': 'fakedeliveryid2016',
                    'skip_mover': True
                }
                delivery_resp = self.fetch(delivery_url,
                                           method='POST',
                                           body=json.dumps(delivery_body))
                delivery_resp_as_json = json.loads(delivery_resp.body)
                delivery_link = delivery_resp_as_json['delivery_order_link']

                assert_eventually_equals(
                    self,
                    timeout=5,
                    delay=1,
                    f=partial(self._get_delivery_status, delivery_link),
                    expected=DeliveryStatus.delivery_skipped.name)
Exemplo n.º 11
0
    def test_deliver_by_staging_id(self):
        staging_order = StagingOrder(source='/foo/bar', staging_target='/staging/dir/bar')
        staging_order.status = StagingStatus.staging_successful
        self.mock_staging_service.get_stage_order_by_id.return_value = staging_order

        self.mock_staging_service.get_delivery_order_by_id.return_value = self.delivery_order

        res = yield self.mover_delivery_service.deliver_by_staging_id(staging_id=1,
                                                                      delivery_project='xyz123',
                                                                      md5sum_file='md5sum_file')

        def _get_delivery_order():
            return self.delivery_order.delivery_status
        assert_eventually_equals(self, 1, _get_delivery_order, DeliveryStatus.delivery_in_progress)
        self.mock_mover_runner.run.assert_called_once_with(['/foo/bar/to_outbox', '/foo', 'TestProj'])
Exemplo n.º 12
0
    def test_possible_to_delivery_by_staging_id_and_skip_mover(self):

        staging_order = StagingOrder(source='/foo/bar', staging_target='/staging/dir/bar')
        staging_order.status = StagingStatus.staging_successful
        self.mock_staging_service.get_stage_order_by_id.return_value = staging_order

        self.mock_staging_service.get_delivery_order_by_id.return_value = self.delivery_order

        self.mover_delivery_service.deliver_by_staging_id(staging_id=1,
                                                          delivery_project='xyz123',
                                                          md5sum_file='md5sum_file',
                                                          skip_mover=True)

        def _get_delivery_order():
            return self.delivery_order.delivery_status
        assert_eventually_equals(self, 1, _get_delivery_order, DeliveryStatus.delivery_skipped)
Exemplo n.º 13
0
    def test_can_stage_and_delivery_runfolder(self):
        # Note that this is a test which skips mover (since to_outbox is not expected to be installed on the system
        # where this runs)

        url = "/".join([
            self.API_BASE, "stage", "runfolder",
            "160930_ST-E00216_0111_BH37CWALXX"
        ])
        response = self.fetch(url, method='POST', body='')
        self.assertEqual(response.code, 202)

        response_json = json.loads(response.body)

        staging_status_links = response_json.get("staging_order_links")

        for project, link in staging_status_links.items():

            self.assertEqual(project, "ABC_123")

            assert_eventually_equals(
                self,
                timeout=5,
                delay=1,
                f=partial(self._get_delivery_status, link),
                expected=StagingStatus.staging_successful.name)

            # The size of the fake project is 15 bytes
            assert_eventually_equals(self,
                                     timeout=5,
                                     delay=1,
                                     f=partial(self._get_size, link),
                                     expected=15)

        staging_order_project_and_id = response_json.get("staging_order_ids")

        for project, staging_id in staging_order_project_and_id.items():
            delivery_url = '/'.join(
                [self.API_BASE, 'deliver', 'stage_id',
                 str(staging_id)])
            delivery_body = {
                'delivery_project_id': 'fakedeliveryid2016',
                'skip_mover': True
            }
            delivery_resp = self.fetch(delivery_url,
                                       method='POST',
                                       body=json.dumps(delivery_body))
            delivery_resp_as_json = json.loads(delivery_resp.body)
            delivery_link = delivery_resp_as_json['delivery_order_link']

            assert_eventually_equals(
                self,
                timeout=5,
                delay=1,
                f=partial(self._get_delivery_status, delivery_link),
                expected=DeliveryStatus.delivery_skipped.name)
Exemplo n.º 14
0
    def test_can_stage_and_delivery_runfolder(self):
        # Note that this is a test which skips mover (since to_outbox is not expected to be installed on the system
        # where this runs)

        with tempfile.TemporaryDirectory(
                dir='./tests/resources/runfolders/',
                prefix='160930_ST-E00216_0111_BH37CWALXX_') as tmp_dir:

            dir_name = os.path.basename(tmp_dir)
            self._create_projects_dir_with_random_data(tmp_dir)
            self._create_checksums_file(tmp_dir)

            url = "/".join([self.API_BASE, "stage", "runfolder", dir_name])
            response = self.fetch(url, method='POST', body='')
            self.assertEqual(response.code, 202)

            response_json = json.loads(response.body)

            staging_status_links = response_json.get("staging_order_links")

            for project, link in staging_status_links.items():

                self.assertEqual(project, "ABC_123")

                assert_eventually_equals(
                    self,
                    timeout=5,
                    delay=1,
                    f=partial(self._get_delivery_status, link),
                    expected=StagingStatus.staging_successful.name)

                # The size of the fake project is 1024 bytes
                assert_eventually_equals(self,
                                         timeout=5,
                                         delay=1,
                                         f=partial(self._get_size, link),
                                         expected=1024)

            staging_order_project_and_id = response_json.get(
                "staging_order_ids")

            for project, staging_id in staging_order_project_and_id.items():
                delivery_url = '/'.join(
                    [self.API_BASE, 'deliver', 'stage_id',
                     str(staging_id)])
                delivery_body = {
                    'delivery_project_id': 'fakedeliveryid2016',
                    'skip_mover': True
                }
                delivery_resp = self.fetch(delivery_url,
                                           method='POST',
                                           body=json.dumps(delivery_body))
                delivery_resp_as_json = json.loads(delivery_resp.body)
                delivery_link = delivery_resp_as_json['delivery_order_link']

                assert_eventually_equals(
                    self,
                    timeout=5,
                    delay=1,
                    f=partial(self._get_delivery_status, delivery_link),
                    expected=DeliveryStatus.delivery_skipped.name)