Skip to content

Commit b608c5e

Browse files
authored
Merge pull request #700 from simvue-io/wk9874/folder_409
Remove server calls in offline mode
2 parents a0966a0 + 2f9882f commit b608c5e

File tree

4 files changed

+38
-25
lines changed

4 files changed

+38
-25
lines changed

simvue/api/objects/base.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,14 @@ def __init__(
165165
)
166166
)
167167

168-
self._headers: dict[str, str] = {
169-
"Authorization": f"Bearer {self._user_config.server.token.get_secret_value()}",
170-
"User-Agent": _user_agent or f"Simvue Python client {__version__}",
171-
}
168+
self._headers: dict[str, str] = (
169+
{
170+
"Authorization": f"Bearer {self._user_config.server.token.get_secret_value()}",
171+
"User-Agent": _user_agent or f"Simvue Python client {__version__}",
172+
}
173+
if not self._offline
174+
else {}
175+
)
172176

173177
self._staging: dict[str, typing.Any] = {}
174178

@@ -424,7 +428,7 @@ def _post(self, is_json: bool = True, **kwargs) -> dict[str, typing.Any]:
424428

425429
_json_response = get_json_from_response(
426430
response=_response,
427-
expected_status=[http.HTTPStatus.OK],
431+
expected_status=[http.HTTPStatus.OK, http.HTTPStatus.CONFLICT],
428432
scenario=f"Creation of {self._label}",
429433
)
430434

simvue/config/parameters.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,23 @@
2121

2222

2323
class ServerSpecifications(pydantic.BaseModel):
24-
url: pydantic.AnyHttpUrl
25-
token: pydantic.SecretStr
24+
url: pydantic.AnyHttpUrl | None
25+
token: pydantic.SecretStr | None
2626

2727
@pydantic.field_validator("url")
2828
@classmethod
29-
def url_to_api_url(cls, v: typing.Any) -> str:
29+
def url_to_api_url(cls, v: typing.Any) -> str | None:
30+
if not v:
31+
return
3032
if f"{v}".endswith("/api"):
3133
return f"{v}"
3234
_url = URL(f"{v}") / "api"
3335
return f"{_url}"
3436

3537
@pydantic.field_validator("token")
36-
def check_token(cls, v: typing.Any) -> str:
38+
def check_token(cls, v: typing.Any) -> str | None:
39+
if not v:
40+
return
3741
value = v.get_secret_value()
3842
if not (expiry := get_expiry(value)):
3943
raise AssertionError("Failed to parse Simvue token - invalid token form")

simvue/config/user.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,10 +212,10 @@ def fetch(
212212

213213
_run_mode = mode or _config_dict["run"].get("mode") or "online"
214214

215-
if not _server_url:
215+
if not _server_url and _run_mode != "offline":
216216
raise RuntimeError("No server URL was specified")
217217

218-
if not _server_token:
218+
if not _server_token and _run_mode != "offline":
219219
raise RuntimeError("No server token was specified")
220220

221221
_config_dict["server"]["token"] = _server_token

simvue/run.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131

3232
from simvue.api.objects.alert.base import AlertBase
3333
from simvue.api.objects.alert.fetch import Alert
34-
from simvue.api.objects.folder import Folder, get_folder_from_path
35-
from simvue.exception import ObjectNotFoundError, SimvueRunError
34+
from simvue.api.objects.folder import Folder
35+
from simvue.exception import SimvueRunError
3636
from simvue.utilities import prettify_pydantic
3737

3838

@@ -185,9 +185,13 @@ def __init__(
185185
if self._user_config.metrics.resources_metrics_interval < 1
186186
else self._user_config.metrics.resources_metrics_interval
187187
)
188-
self._headers: dict[str, str] = {
189-
"Authorization": f"Bearer {self._user_config.server.token.get_secret_value()}"
190-
}
188+
self._headers: dict[str, str] = (
189+
{
190+
"Authorization": f"Bearer {self._user_config.server.token.get_secret_value()}"
191+
}
192+
if mode != "offline"
193+
else {}
194+
)
191195
self._sv_obj: RunObject | None = None
192196
self._pid: int | None = 0
193197
self._shutdown_event: threading.Event | None = None
@@ -419,7 +423,9 @@ def _create_dispatch_callback(
419423
if self._user_config.run.mode == "online" and not self._id:
420424
raise RuntimeError("Expected identifier for run")
421425

422-
if not self._user_config.server.url or not self._sv_obj:
426+
if (
427+
self._user_config.run.mode != "offline" and not self._user_config.server.url
428+
) or not self._sv_obj:
423429
raise RuntimeError("Cannot commence dispatch, run not initialised")
424430

425431
def _dispatch_callback(
@@ -625,13 +631,10 @@ def init(
625631

626632
self._term_color = not no_color
627633

628-
try:
629-
self._folder = get_folder_from_path(path=folder)
630-
except ObjectNotFoundError:
631-
self._folder = Folder.new(
632-
path=folder, offline=self._user_config.run.mode == "offline"
633-
)
634-
self._folder.commit() # type: ignore
634+
self._folder = Folder.new(
635+
path=folder, offline=self._user_config.run.mode == "offline"
636+
)
637+
self._folder.commit() # type: ignore
635638

636639
if isinstance(visibility, str) and visibility not in ("public", "tenant"):
637640
self._error(
@@ -642,7 +645,9 @@ def init(
642645
self._error("invalid mode specified, must be online, offline or disabled")
643646
return False
644647

645-
if not self._user_config.server.token or not self._user_config.server.url:
648+
if self._user_config.run.mode != "offline" and (
649+
not self._user_config.server.token or not self._user_config.server.url
650+
):
646651
self._error(
647652
"Unable to get URL and token from environment variables or config file"
648653
)

0 commit comments

Comments
 (0)