Exemple #1
0
def test_session_auth_token():
    s = SessionFactory()

    # Calling environment should generate an auth token for the creator
    assert s.auth_token is None

    _ = s.environment

    assert s.auth_token.user == s.creator
    assert s.auth_token.expiry == s.expires_at + timedelta(
        minutes=WORKSTATIONS_GRACE_MINUTES)

    # old tokens should be deleted
    old_pk = s.auth_token.pk

    _ = s.environment

    assert s.auth_token.pk != old_pk

    # expiry should stay in sync
    s.maximum_duration = timedelta(days=1)
    s.save()

    assert s.auth_token.expiry == s.expires_at + timedelta(
        minutes=WORKSTATIONS_GRACE_MINUTES)
def test_session_start(http_image, docker_client, settings):
    path, sha256 = http_image

    wsi = WorkstationImageFactory(image__from_path=path,
                                  image_sha256=sha256,
                                  ready=True)

    # Execute the celery in place
    settings.task_eager_propagates = (True, )
    settings.task_always_eager = (True, )

    with capture_on_commit_callbacks(execute=True):
        s = SessionFactory(workstation_image=wsi)

    try:
        assert s.service.container

        s.refresh_from_db()
        assert s.status == s.STARTED

        container = s.service.container

        assert container.labels["traefik.enable"] == "true"
        assert container.labels[
            f"traefik.http.services.{s.hostname}-http.loadbalancer.server.port"] == str(
                s.workstation_image.http_port)
        assert container.labels[
            f"traefik.http.services.{s.hostname}-websocket.loadbalancer.server.port"] == str(
                s.workstation_image.websocket_port)

        networks = container.attrs.get("NetworkSettings")["Networks"]
        assert len(networks) == 1
        assert settings.WORKSTATIONS_NETWORK_NAME in networks

        with capture_on_commit_callbacks(execute=True):
            s.user_finished = True
            s.save()

        with pytest.raises(NotFound):
            # noinspection PyStatementEffect
            s.service.container
    finally:
        stop_all_sessions()
Exemple #3
0
def test_session_start(http_image, docker_client, settings):
    path, sha256 = http_image

    wsi = WorkstationImageFactory(
        image__from_path=path, image_sha256=sha256, ready=True
    )

    # Execute the celery in place
    settings.task_eager_propagates = (True,)
    settings.task_always_eager = (True,)

    s = SessionFactory(workstation_image=wsi)

    try:
        assert s.service.container

        s.refresh_from_db()
        assert s.status == s.STARTED

        container = s.service.container

        assert container.labels["traefik.enable"] == "true"
        assert container.labels["traefik.http.port"] == str(
            s.workstation_image.http_port
        )
        assert container.labels["traefik.websocket.port"] == str(
            s.workstation_image.websocket_port
        )

        networks = container.attrs.get("NetworkSettings")["Networks"]
        assert len(networks) == 1
        assert settings.WORKSTATIONS_NETWORK_NAME in networks

        s.user_finished = True
        s.save()

        with pytest.raises(NotFound):
            # noinspection PyStatementEffect
            s.service.container
    finally:
        s.stop()
Exemple #4
0
def test_session_keep_alive_limit(client, settings):
    user = UserFactory()
    s = SessionFactory(creator=user)

    assert s.maximum_duration == timedelta(minutes=10)

    s.created = now() - timedelta(days=1)
    s.save()

    response = get_view_for_user(
        client=client,
        method=client.patch,
        viewname="api:session-keep-alive",
        reverse_kwargs={"pk": s.pk},
        user=user,
        content_type="application/json",
    )

    assert response.status_code == 400

    s.refresh_from_db()
    assert s.maximum_duration == timedelta(
        seconds=settings.WORKSTATIONS_SESSION_DURATION_LIMIT)