Example #1
0
    def test_delete_triggers_stopping_of_plugin_jobs(self):
        assert self.queryset.count() == 1

        notebook_job = NotebookJobFactory(project=self.object)
        notebook_job.set_status(JobLifeCycle.SCHEDULED)

        tensorboard_job = TensorboardJobFactory(project=self.object)
        tensorboard_job.set_status(JobLifeCycle.SCHEDULED)

        assert NotebookJob.objects.count() == 1
        assert TensorboardJob.objects.count() == 1

        with patch('scheduler.tasks.notebooks.'
                   'projects_notebook_stop.apply_async') as notebook_mock_stop:
            with patch(
                    'scheduler.tasks.tensorboards.'
                    'tensorboards_stop.apply_async') as tensorboard_mock_stop:
                resp = self.auth_client.delete(self.url)

        assert notebook_mock_stop.call_count == 1
        assert tensorboard_mock_stop.call_count == 1
        assert resp.status_code == status.HTTP_204_NO_CONTENT
        assert self.queryset.count() == 0
        assert ExperimentGroup.objects.count() == 0
        assert Experiment.objects.count() == 0

        # Delete does not work for other project public and private
        resp = self.auth_client.delete(self.url_other)
        assert resp.status_code in (status.HTTP_401_UNAUTHORIZED,
                                    status.HTTP_403_FORBIDDEN)
        resp = self.auth_client.delete(self.url_private)
        assert resp.status_code in (status.HTTP_401_UNAUTHORIZED,
                                    status.HTTP_403_FORBIDDEN)
Example #2
0
    def test_redirects_to_proxy_protected_url_with_extra_path(
            self, spawner_mock):
        project = ProjectFactory(user=self.auth_client.user)
        tensorboard = TensorboardJobFactory(project=project)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        deployment_name = DEPLOYMENT_NAME.format(project_uuid=project.uuid.hex,
                                                 name=self.plugin_app)
        service_url = self._get_service_url(deployment_name=deployment_name)
        mock_instance = spawner_mock.return_value
        mock_instance.get_tensorboard_url.return_value = service_url

        # To `tree?`
        response = self.auth_client.get(self._get_url(project, 'tree?'))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/{}'.format(service_url, 'tree/')
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER],
                         proxy_url)

        # To static files
        response = self.auth_client.get(
            self._get_url(project, 'static/components/something?v=4.7.0'))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/{}'.format(service_url,
                                   'static/components/something?v=4.7.0')
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER],
                         proxy_url)
Example #3
0
    def test_archive_triggers_stopping_of_plugin_jobs(self):
        assert self.queryset.count() == 1

        notebook_job = NotebookJobFactory(project=self.object)
        notebook_job.set_status(JobLifeCycle.SCHEDULED)

        tensorboard_job = TensorboardJobFactory(project=self.object)
        tensorboard_job.set_status(JobLifeCycle.SCHEDULED)

        assert NotebookJob.objects.count() == 1
        assert TensorboardJob.objects.count() == 1

        with patch('scheduler.tasks.notebooks.'
                   'projects_notebook_stop.apply_async') as notebook_mock_stop:
            with patch(
                    'scheduler.tasks.tensorboards.'
                    'tensorboards_stop.apply_async') as tensorboard_mock_stop:
                resp = self.auth_client.post(self.url + 'archive/')

        assert notebook_mock_stop.call_count == 1
        assert tensorboard_mock_stop.call_count == 1
        assert resp.status_code == status.HTTP_200_OK
        assert self.queryset.count() == 0
        assert TensorboardJob.objects.count() == 0
        assert NotebookJob.objects.count() == 0
        assert TensorboardJob.all.count() == 1
        assert NotebookJob.all.count() == 1
Example #4
0
    def test_redirects_to_proxy_protected_url_with_extra_path(
            self, spawner_mock):
        project = ProjectFactory(user=self.auth_client.user)
        with patch('scheduler.tasks.experiment_groups.'
                   'experiments_group_create.apply_async') as _:  # noqa
            group = ExperimentGroupFactory(project=project)
        tensorboard = TensorboardJobFactory(project=project,
                                            experiment_group=group)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        deployment_name = JOB_NAME.format(job_uuid=tensorboard.uuid.hex,
                                          name=self.plugin_app)
        service_url = self._get_service_url(deployment_name=deployment_name)
        mock_instance = spawner_mock.return_value
        mock_instance.get_tensorboard_url.return_value = service_url

        # To `tree?`
        response = self.auth_client.get(self._get_url(project, group, 'tree?'))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/{}'.format(service_url, 'tree/')
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER],
                         proxy_url)

        # To static files
        response = self.auth_client.get(
            self._get_url(project, group,
                          'static/components/something?v=4.7.0'))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/{}'.format(service_url,
                                   'static/components/something?v=4.7.0')
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER],
                         proxy_url)
Example #5
0
    def test_redirects_to_proxy_protected_url_with_extra_path(self, spawner_mock):
        project = ProjectFactory(user=self.auth_client.user)
        tensorboard = TensorboardJobFactory(project=project)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        deployment_name = JOB_NAME.format(
            job_uuid=tensorboard.uuid.hex, name=self.plugin_app)
        service_url = self._get_service_url(deployment_name=deployment_name)
        mock_instance = spawner_mock.return_value
        mock_instance.get_tensorboard_url.return_value = service_url

        # To `tree?`
        response = self.auth_client.get(self._get_url(project, 'tree?'))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/{}'.format(
            service_url,
            'tree/'
        )
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER], proxy_url)

        # To static files
        response = self.auth_client.get(
            self._get_url(project, 'static/components/something?v=4.7.0'))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/{}'.format(
            service_url,
            'static/components/something?v=4.7.0'
        )
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER], proxy_url)
Example #6
0
 def setUp(self):
     super().setUp()
     self.object = self.factory_class(user=self.auth_client.user)
     tensorboard = TensorboardJobFactory(project=self.object)
     tensorboard.set_status(status=JobLifeCycle.RUNNING)
     self.url = '/{}/{}/{}/tensorboard/stop'.format(
         API_V1, self.object.user.username, self.object.name)
     self.queryset = TensorboardJob.objects.all()
Example #7
0
    def test_project_requests_tensorboard_url(self):
        project = ProjectFactory(user=self.auth_client.user)
        tensorboard = TensorboardJobFactory(project=project)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        with patch('scheduler.tensorboard_scheduler.get_tensorboard_url') as mock_fct:
            response = self.auth_client.get(self._get_url(project))

        assert mock_fct.call_count == 1
        assert response.status_code == 200
Example #8
0
    def test_project_requests_tensorboard_url(self):
        project = ProjectFactory(user=self.auth_client.user)
        tensorboard = TensorboardJobFactory(project=project)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        with patch('scheduler.tensorboard_scheduler.get_tensorboard_url') as mock_fct:
            response = self.auth_client.get(self._get_url(project))

        assert mock_fct.call_count == 1
        assert response.status_code == 200
Example #9
0
 def setUp(self):
     super().setUp()
     self.object = self.factory_class(user=self.auth_client.user)
     tensorboard = TensorboardJobFactory(project=self.object)
     tensorboard.set_status(status=JobLifeCycle.RUNNING)
     self.url = '/{}/{}/{}/tensorboard/stop'.format(
         API_V1,
         self.object.user.username,
         self.object.name)
     self.queryset = TensorboardJob.objects.all()
Example #10
0
 def test_status_update_results_in_new_updated_at_datetime_tensorboard(self):
     project = ProjectFactory()
     job = TensorboardJobFactory(project=project)
     updated_at = job.updated_at
     # Create new status
     TensorboardJobStatus.objects.create(job=job, status=JobLifeCycle.BUILDING)
     job.refresh_from_db()
     assert updated_at < job.updated_at
     updated_at = job.updated_at
     # Create status Using set_status
     job.set_status(JobLifeCycle.RUNNING)
     job.refresh_from_db()
     assert updated_at < job.updated_at
Example #11
0
 def setUp(self):
     super().setUp()
     self.project = ProjectFactory(user=self.auth_client.user)
     with patch('scheduler.tasks.experiment_groups.'
                'experiments_group_create.apply_async') as _:  # noqa
         self.object = self.factory_class(user=self.auth_client.user,
                                          project=self.project)
     tensorboard = TensorboardJobFactory(project=self.project,
                                         experiment_group=self.object)
     tensorboard.set_status(status=JobLifeCycle.RUNNING)
     self.url = '/{}/{}/{}/groups/{}/tensorboard/stop'.format(
         API_V1, self.project.user.username, self.project.name,
         self.object.id)
     self.queryset = TensorboardJob.objects.all()
Example #12
0
    def test_project_requests_tensorboard_url(self):
        project = ProjectFactory(user=self.auth_client.user)
        with patch('scheduler.tasks.experiment_groups.'
                   'experiments_group_create.apply_async') as _:  # noqa
            group = ExperimentGroupFactory(project=project)
        tensorboard = TensorboardJobFactory(project=project,
                                            experiment_group=group)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        with patch('scheduler.tensorboard_scheduler.get_tensorboard_url'
                   ) as mock_fct:
            response = self.auth_client.get(self._get_url(project, group))

        assert mock_fct.call_count == 1
        assert response.status_code == 200
Example #13
0
    def test_redirects_to_proxy_protected_url(self, spawner_mock):
        project = ProjectFactory(user=self.auth_client.user)
        tensorboard = TensorboardJobFactory(project=project)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        deployment_name = JOB_NAME.format(
            job_uuid=tensorboard.uuid.hex, name=self.plugin_app)
        service_url = self._get_service_url(deployment_name=deployment_name)
        mock_instance = spawner_mock.return_value
        mock_instance.get_tensorboard_url.return_value = service_url

        response = self.auth_client.get(self._get_url(project))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/'.format(service_url)
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER], proxy_url)
Example #14
0
    def test_redirects_to_proxy_protected_url(self, spawner_mock):
        project = ProjectFactory(user=self.auth_client.user)
        tensorboard = TensorboardJobFactory(project=project)
        tensorboard.set_status(status=JobLifeCycle.RUNNING)
        deployment_name = DEPLOYMENT_NAME.format(
            job_uuid=tensorboard.uuid.hex, name=self.plugin_app)
        service_url = self._get_service_url(deployment_name=deployment_name)
        mock_instance = spawner_mock.return_value
        mock_instance.get_tensorboard_url.return_value = service_url

        response = self.auth_client.get(self._get_url(project))
        assert response.status_code == 200
        self.assertTrue(ProtectedView.NGINX_REDIRECT_HEADER in response)
        proxy_url = '{}/'.format(service_url)
        self.assertEqual(response[ProtectedView.NGINX_REDIRECT_HEADER], proxy_url)