fred-oss 0.31.0__tar.gz → 0.33.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {fred_oss-0.31.0/src/main/fred_oss.egg-info → fred_oss-0.33.0}/PKG-INFO +1 -1
- fred_oss-0.33.0/src/main/fred/version +1 -0
- fred_oss-0.33.0/src/main/fred/worker/runner/rest/routers/_runner.py +122 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/rest/routers/interface.py +21 -1
- {fred_oss-0.31.0 → fred_oss-0.33.0/src/main/fred_oss.egg-info}/PKG-INFO +1 -1
- fred_oss-0.31.0/src/main/fred/version +0 -1
- fred_oss-0.31.0/src/main/fred/worker/runner/rest/routers/_runner.py +0 -40
- {fred_oss-0.31.0 → fred_oss-0.33.0}/MANIFEST.in +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/NOTICE.txt +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/README.md +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/requirements.txt +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/setup.cfg +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/setup.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/cli/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/cli/__main__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/cli/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/cli/main.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/comp/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/comp/_keyval.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/comp/_queue.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/comp/catalog.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/comp/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/service/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/service/_redis.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/service/_stdlib.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/service/catalog.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/service/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/dao/service/utils.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/callback/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/callback/_function.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/callback/catalog.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/callback/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/impl.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/result.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/settings.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/future/utils.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/cli_ext.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/runtime.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/runtimes/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/runtimes/scanner.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/runtimes/sync.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/wrappers/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/wrappers/dbutils.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/runpod/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/runpod/cli_ext.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/runpod/helper.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/maturity.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/monad/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/monad/_either.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/monad/catalog.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/monad/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/settings.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/utils/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/utils/dateops.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/utils/runtime.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/version.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/backend.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/client.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/handler.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/info.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/model/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/model/_handler.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/model/_item.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/model/_request.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/model/_runner_spec.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/model/catalog.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/model/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/plugins/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/plugins/_local.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/plugins/catalog.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/plugins/interface.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/rest/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/rest/cli_ext.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/rest/routers/__init__.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/rest/routers/catalog.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/rest/server.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/settings.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/signal.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/status.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/worker/runner/utils.py +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred_oss.egg-info/SOURCES.txt +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred_oss.egg-info/dependency_links.txt +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred_oss.egg-info/entry_points.txt +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred_oss.egg-info/requires.txt +0 -0
- {fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred_oss.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.33.0
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
from fred.settings import logger_manager
|
|
4
|
+
from fred.utils.dateops import datetime_utcnow
|
|
5
|
+
from fred.worker.runner.rest.routers.interface import RouterInterface
|
|
6
|
+
|
|
7
|
+
logger = logger_manager.get_logger(name=__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RunnerRouterMethods:
|
|
11
|
+
|
|
12
|
+
def handler_exists(self, classname: str, classpath: str) -> dict:
|
|
13
|
+
from fred.worker.runner.handler import RunnerHandler
|
|
14
|
+
from fred.worker.interface import HandlerInterface
|
|
15
|
+
|
|
16
|
+
result_payload = {
|
|
17
|
+
"handler_classname": classname,
|
|
18
|
+
"handler_classpath": classpath,
|
|
19
|
+
"exists": False,
|
|
20
|
+
"is_runner_handler": False,
|
|
21
|
+
"metadata": {}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
handler = HandlerInterface.find_handler(
|
|
26
|
+
import_pattern=classpath,
|
|
27
|
+
handler_classname=classname,
|
|
28
|
+
)
|
|
29
|
+
result_payload["is_runner_handler"] = isinstance(handler, RunnerHandler)
|
|
30
|
+
result_payload["exists"] = True
|
|
31
|
+
return result_payload
|
|
32
|
+
except Exception as e:
|
|
33
|
+
result_payload["metadata"]["error"] = str(e)
|
|
34
|
+
return result_payload
|
|
35
|
+
|
|
36
|
+
def qlen(self, queue_slug: str) -> dict:
|
|
37
|
+
|
|
38
|
+
snapshot_at = datetime_utcnow().isoformat()
|
|
39
|
+
req_queue = self.runner_backend.queue(f"req:{queue_slug}")
|
|
40
|
+
res_queue = self.runner_backend.queue(f"res:{queue_slug}")
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
"snapshot_at": snapshot_at,
|
|
44
|
+
"queue_slug": queue_slug,
|
|
45
|
+
"req": req_queue.size(),
|
|
46
|
+
"res": res_queue.size(),
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
def runner_start(self, payload: dict) -> dict:
|
|
50
|
+
from fred.worker.runner.model.catalog import RunnerModelCatalog
|
|
51
|
+
from fred.worker.runner.plugins.catalog import PluginCatalog
|
|
52
|
+
# Determine which plugin to use; default to LOCAL if not specified
|
|
53
|
+
plugin_name: str = payload.pop("plugin", "LOCAL")
|
|
54
|
+
wait_for_exec: bool = payload.pop("wait_for_exec", False)
|
|
55
|
+
# Create the RunnerSpec from the provided payload
|
|
56
|
+
# TODO: Instead on depending on parsing a dict... Can we implement a base-model to facilitate fast-api validation?
|
|
57
|
+
runner_spec = RunnerModelCatalog.RUNNER_SPEC.value.from_payload(payload=payload)
|
|
58
|
+
# Instantiate the plugin and execute the runner
|
|
59
|
+
plugin = PluginCatalog[plugin_name.upper()]()
|
|
60
|
+
return {
|
|
61
|
+
"runner_id": plugin.execute(runner_spec, wait_for_exec=wait_for_exec).runner_id,
|
|
62
|
+
"queue_slug": runner_spec.queue_slug,
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
def runner_execute(self, payload: dict) -> dict:
|
|
66
|
+
from fred.worker.runner.model.catalog import RunnerModelCatalog
|
|
67
|
+
|
|
68
|
+
request_id = payload.pop("request_id", None)
|
|
69
|
+
queue_slug = payload.pop("queue_slug", None) or (
|
|
70
|
+
logger.error("No 'queue_slug' value provided; defaulting to 'demo'.")
|
|
71
|
+
or "demo"
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
item = RunnerModelCatalog.ITEM.value.uuid(payload=payload, uuid_hash=False)
|
|
75
|
+
request = item.as_request(use_hash=False, request_id=request_id)
|
|
76
|
+
request.dispatch(
|
|
77
|
+
request_queue=self.runner_backend.queue(f"req:{queue_slug}")
|
|
78
|
+
)
|
|
79
|
+
return {
|
|
80
|
+
"item_id": item.item_id,
|
|
81
|
+
"request_id": request.request_id,
|
|
82
|
+
"queue_slug": queue_slug,
|
|
83
|
+
"dispatched_at": datetime_utcnow().isoformat(),
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@dataclass(frozen=True, slots=False)
|
|
88
|
+
class RunnerRouter(RouterInterface.with_backend(), RunnerRouterMethods):
|
|
89
|
+
|
|
90
|
+
def __post_init__(self):
|
|
91
|
+
self.router.add_api_route(
|
|
92
|
+
"/handler_exists",
|
|
93
|
+
self.handler_exists,
|
|
94
|
+
methods=["GET"],
|
|
95
|
+
tags=["Runner"],
|
|
96
|
+
summary="Check if a handler class exists and is a RunnerHandler.",
|
|
97
|
+
response_description="Details about the handler class.",
|
|
98
|
+
)
|
|
99
|
+
self.router.add_api_route(
|
|
100
|
+
"/qlen/{queue_slug}",
|
|
101
|
+
self.qlen,
|
|
102
|
+
methods=["GET"],
|
|
103
|
+
tags=["Runner"],
|
|
104
|
+
summary="Get the length of the request and response queues for a given queue slug.",
|
|
105
|
+
response_description="The lengths of the request and response queues.",
|
|
106
|
+
)
|
|
107
|
+
self.router.add_api_route(
|
|
108
|
+
"/start",
|
|
109
|
+
self.runner_start,
|
|
110
|
+
methods=["POST"],
|
|
111
|
+
tags=["Runner"],
|
|
112
|
+
summary="Start a runner using the specified plugin.",
|
|
113
|
+
response_description="The ID of the started runner.",
|
|
114
|
+
)
|
|
115
|
+
self.router.add_api_route(
|
|
116
|
+
"/execute",
|
|
117
|
+
self.runner_execute,
|
|
118
|
+
methods=["POST"],
|
|
119
|
+
tags=["Runner"],
|
|
120
|
+
summary="Execute a task by dispatching a request to the specified queue.",
|
|
121
|
+
response_description="Details about the dispatched request.",
|
|
122
|
+
)
|
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
2
|
from typing import Optional
|
|
3
3
|
|
|
4
|
+
from fred.worker.runner.backend import RunnerBackend
|
|
5
|
+
from fred.worker.runner.settings import FRD_RUNNER_BACKEND
|
|
6
|
+
|
|
4
7
|
from fastapi import APIRouter
|
|
5
8
|
|
|
6
9
|
|
|
10
|
+
class RouterInterfaceBackendMixin:
|
|
11
|
+
"""Base class for router interfaces that require a backend service."""
|
|
12
|
+
runner_backend: RunnerBackend
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def with_backend(cls, service_name: Optional[str] = None, **kwargs) -> type["RouterInterfaceBackendMixin"]:
|
|
16
|
+
# Avoid re-initializing if already set
|
|
17
|
+
if getattr(cls, "runner_backend", None):
|
|
18
|
+
return cls
|
|
19
|
+
# Initialize the backend once and assign to the class attribute
|
|
20
|
+
cls.runner_backend = RunnerBackend.auto(
|
|
21
|
+
service_name=service_name or FRD_RUNNER_BACKEND,
|
|
22
|
+
**kwargs,
|
|
23
|
+
)
|
|
24
|
+
return cls
|
|
25
|
+
|
|
26
|
+
|
|
7
27
|
@dataclass(frozen=True, slots=False)
|
|
8
|
-
class RouterInterface:
|
|
28
|
+
class RouterInterface(RouterInterfaceBackendMixin):
|
|
9
29
|
router: APIRouter
|
|
10
30
|
router_configs: dict
|
|
11
31
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.31.0
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from fred.worker.runner.rest.routers.interface import RouterInterface
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
@dataclass(frozen=True, slots=False)
|
|
6
|
-
class RunnerRouter(RouterInterface):
|
|
7
|
-
|
|
8
|
-
def __post_init__(self):
|
|
9
|
-
self.router.add_api_route(
|
|
10
|
-
"/handler_exists",
|
|
11
|
-
self.handler_exists,
|
|
12
|
-
methods=["GET"],
|
|
13
|
-
tags=["Runner"],
|
|
14
|
-
summary="Check if a handler class exists and is a RunnerHandler.",
|
|
15
|
-
response_description="Details about the handler class.",
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
def handler_exists(self, classname: str, classpath: str) -> dict:
|
|
19
|
-
from fred.worker.runner.handler import RunnerHandler
|
|
20
|
-
from fred.worker.interface import HandlerInterface
|
|
21
|
-
|
|
22
|
-
result_payload = {
|
|
23
|
-
"handler_classname": classname,
|
|
24
|
-
"handler_classpath": classpath,
|
|
25
|
-
"exists": False,
|
|
26
|
-
"is_runner_handler": False,
|
|
27
|
-
"metadata": {}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
try:
|
|
31
|
-
handler = HandlerInterface.find_handler(
|
|
32
|
-
import_pattern=classpath,
|
|
33
|
-
handler_classname=classname,
|
|
34
|
-
)
|
|
35
|
-
result_payload["is_runner_handler"] = isinstance(handler, RunnerHandler)
|
|
36
|
-
result_payload["exists"] = True
|
|
37
|
-
return result_payload
|
|
38
|
-
except Exception as e:
|
|
39
|
-
result_payload["metadata"]["error"] = str(e)
|
|
40
|
-
return result_payload
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/runtimes/__init__.py
RENAMED
|
File without changes
|
{fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/runtimes/scanner.py
RENAMED
|
File without changes
|
|
File without changes
|
{fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/wrappers/__init__.py
RENAMED
|
File without changes
|
{fred_oss-0.31.0 → fred_oss-0.33.0}/src/main/fred/integrations/databricks/wrappers/dbutils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|