Skip to content

Commit 1834540

Browse files
FlorentinDDarthMax
andcommitted
Check expiry date before connect to session
Co-authored-by: Max Kießling <max.kiessling@neo4j.com>
1 parent de9775a commit 1834540

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

graphdatascience/session/dedicated_sessions.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import hashlib
44
import warnings
5+
from datetime import datetime, timedelta, timezone
56
from typing import List, Optional
67

78
from graphdatascience.session.algorithm_category import AlgorithmCategory
@@ -50,6 +51,7 @@ def get_or_create(
5051

5152
# TODO configure session size (and check existing_session has same size)
5253
if existing_session:
54+
self._check_expiry_date(existing_session)
5355
session_id = existing_session.id
5456
else:
5557
create_details = self._create_session(session_name, dbid, db_connection.uri, password, memory)
@@ -129,6 +131,14 @@ def _construct_client(
129131
delete_fn=lambda: self.delete(session_name, dbid=AuraApi.extract_id(db_connection.uri)),
130132
)
131133

134+
def _check_expiry_date(self, session: SessionDetails) -> None:
135+
if session.is_expired():
136+
raise RuntimeError(f"Session `{session.name}` is expired. Please delete it and create a new one.")
137+
if session.expiry_date:
138+
until_expiry: timedelta = session.expiry_date - datetime.now(timezone.utc)
139+
if until_expiry < timedelta(days=1):
140+
raise Warning(f"Session `{session.name}` is expiring in less than a day.")
141+
132142
@classmethod
133143
def _fail_ambiguous_session(cls, session_name: str, sessions: List[SessionDetails]) -> None:
134144
candidates = [i.id for i in sessions]

graphdatascience/tests/unit/test_dedicated_sessions.py

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import dataclasses
22
import re
3-
from datetime import datetime
4-
from typing import List, Optional
3+
from datetime import datetime, timedelta, timezone
4+
from typing import List, Optional, cast
55

66
import pytest
77
from pytest_mock import MockerFixture
@@ -53,13 +53,20 @@ def create_session(self, name: str, dbid: str, pwd: str, memory: str) -> Session
5353
created_at=datetime.fromisoformat("2021-01-01T00:00:00+00:00"),
5454
host="foo.bar",
5555
expiry_date=None,
56+
ttl=None,
5657
)
5758

5859
self.id_counter += 1
5960
self._sessions[details.id] = details
6061

6162
return details
6263

64+
def add_session(self, session: SessionDetails) -> None:
65+
if session.id in self._sessions:
66+
raise ValueError(f"Session with id {session.id} already exists.")
67+
68+
self._sessions[session.id] = session
69+
6370
def create_instance(self, name: str, memory: str, cloud_provider: str, region: str) -> InstanceCreateDetails:
6471
id = f"ffff{self.id_counter}"
6572
create_details = InstanceCreateDetails(
@@ -236,6 +243,54 @@ def test_get_or_create_duplicate_session(aura_api: AuraApi) -> None:
236243
sessions.get_or_create("one", SessionMemory.m_8GB, DbmsConnectionInfo(db.connection_url, "", ""))
237244

238245

246+
def test_get_or_create_expired_session(aura_api: AuraApi) -> None:
247+
db = _setup_db_instance(aura_api)
248+
249+
fake_aura_api = cast(FakeAuraApi, aura_api)
250+
fake_aura_api.add_session(
251+
SessionDetails(
252+
id="ffff0-ffff1",
253+
name="one",
254+
instance_id=db.id,
255+
memory=SessionMemory.m_8GB.value,
256+
status="Expired",
257+
created_at=datetime.now(),
258+
host="foo.bar",
259+
expiry_date=None,
260+
ttl=None,
261+
)
262+
)
263+
264+
with pytest.raises(
265+
RuntimeError, match=re.escape("Session `one` is expired. Please delete it and create a new one.")
266+
):
267+
sessions = DedicatedSessions(aura_api)
268+
sessions.get_or_create("one", SessionMemory.m_8GB, DbmsConnectionInfo(db.connection_url, "", ""))
269+
270+
271+
def test_get_or_create_soon_expired_session(aura_api: AuraApi) -> None:
272+
db = _setup_db_instance(aura_api)
273+
274+
fake_aura_api = cast(FakeAuraApi, aura_api)
275+
fake_aura_api.add_session(
276+
SessionDetails(
277+
id="ffff0-ffff1",
278+
name="one",
279+
instance_id=db.id,
280+
memory=SessionMemory.m_8GB.value,
281+
status="Ready",
282+
created_at=datetime.now(),
283+
host="foo.bar",
284+
expiry_date=datetime.now(tz=timezone.utc) - timedelta(hours=23),
285+
ttl=None,
286+
)
287+
)
288+
289+
with pytest.raises(Warning, match=re.escape("Session `one` is expiring in less than a day.")):
290+
sessions = DedicatedSessions(aura_api)
291+
sessions.get_or_create("one", SessionMemory.m_8GB, DbmsConnectionInfo(db.connection_url, "", ""))
292+
293+
239294
def test_delete_session(aura_api: AuraApi) -> None:
240295
db1 = aura_api.create_instance("db1", "1GB", "aura", "leipzig").id
241296
db2 = aura_api.create_instance("db2", "1GB", "aura", "dresden").id

0 commit comments

Comments
 (0)