Skip to content

Commit 1942b69

Browse files
committed
Add inital model sidebar
1 parent 18f3f54 commit 1942b69

File tree

12 files changed

+1120
-504
lines changed

12 files changed

+1120
-504
lines changed

forager_backend/forager_backend/urls.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,17 @@
2020
urlpatterns = [
2121
path("admin/", admin.site.urls),
2222
path("api/start_cluster", views.start_cluster, name="start_cluster"),
23+
path(
24+
"api/cluster",
25+
views.get_cluster_status,
26+
name="get_cluster_status",
27+
),
2328
path(
2429
"api/cluster/<slug:cluster_id>",
2530
views.get_cluster_status,
2631
name="get_cluster_status",
2732
),
28-
path("api/stop_cluster/<slug:cluster_id>", views.stop_cluster, name="stop_cluster"),
33+
path("api/stop_cluster", views.stop_cluster, name="stop_cluster"),
2934
path("api/get_results/<slug:dataset_name>", views.get_results, name="get_results"),
3035
path("api/keep_alive", views.keep_alive, name="keep_alive"),
3136
path("api/generate_embedding", views.generate_embedding, name="generate_embedding"),

forager_backend/forager_backend_api/views.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ def start_cluster(request):
5757

5858
@api_view(["GET"])
5959
@csrf_exempt
60-
def get_cluster_status(request, cluster_id):
61-
params = {"cluster_id": cluster_id}
60+
def get_cluster_status(request, cluster_id=None):
61+
params = {}
62+
if cluster_id:
63+
params["cluster_id":cluster_id]
6264
r = requests.get(
6365
settings.EMBEDDING_SERVER_ADDRESS + "/cluster_status", params=params
6466
)
@@ -68,17 +70,15 @@ def get_cluster_status(request, cluster_id):
6870

6971
@api_view(["POST"])
7072
@csrf_exempt
71-
def stop_cluster(request, cluster_id):
72-
params = {"cluster_id": cluster_id}
73-
requests.post(
73+
def stop_cluster(request):
74+
payload = json.loads(request.body)
75+
params = dict(cluster_id=payload["cluster_id"])
76+
r = requests.post(
7477
settings.EMBEDDING_SERVER_ADDRESS + "/stop_cluster",
7578
json=params,
7679
)
77-
return JsonResponse(
78-
{
79-
"status": "success",
80-
}
81-
)
80+
response_data = r.json()
81+
return JsonResponse(response_data)
8282

8383

8484
#

forager_embedding_server/src/app.py

Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,21 @@
1616
import numpy as np
1717
import sanic.response as resp
1818
from forager_embedding_server.ais import ais_singleiter, get_fscore
19+
from forager_embedding_server.bgsplit_jobs import (BGSplitInferenceJob,
20+
BGSplitTrainingJob, Trainer)
1921
from forager_embedding_server.config import CONFIG
2022
from forager_embedding_server.embedding_jobs import EmbeddingInferenceJob
21-
from forager_embedding_server.jobs_data import (
22-
ImageList,
23-
QueryResult,
24-
load_embedding_set,
25-
load_score_set,
26-
)
23+
from forager_embedding_server.jobs_data import (ImageList, QueryResult,
24+
load_embedding_set,
25+
load_score_set)
2726
from forager_embedding_server.utils import CleanupDict
2827
from forager_knn import utils
28+
from forager_knn.clusters import TerraformModule
2929
from PIL import Image
3030
from sanic import Sanic
3131
from sklearn import svm
3232
from sklearn.metrics import precision_score, recall_score
3333

34-
BUILD_WITH_KUBE = False
35-
36-
if BUILD_WITH_KUBE:
37-
from forager_knn.clusters import TerraformModule
38-
39-
from forager_embedding_server.bgsplit_jobs import (
40-
BGSplitInferenceJob,
41-
BGSplitTrainingJob,
42-
Trainer,
43-
)
44-
4534
# Create a logger for the server
4635

4736
forager_embedding_server.log.init_logging()
@@ -179,19 +168,13 @@ async def _stop_cluster(cluster):
179168

180169

181170
# TODO(mihirg): Automatically clean up inactive clusters
182-
if BUILD_WITH_KUBE:
183-
current_clusters: CleanupDict[str, TerraformModule] = CleanupDict(
184-
_stop_cluster, app.add_task, CONFIG.CLUSTER.CLEANUP_TIME
185-
)
186-
else:
187-
current_clusters = {}
171+
current_clusters: CleanupDict[str, TerraformModule] = CleanupDict(
172+
_stop_cluster, app.add_task, CONFIG.CLUSTER.CLEANUP_TIME
173+
)
188174

189175

190176
@app.route("/start_cluster", methods=["POST"])
191177
async def start_cluster(request):
192-
if not BUILD_WITH_KUBE:
193-
return resp.json({"success": False}, status=400)
194-
195178
cluster = TerraformModule(
196179
CONFIG.CLUSTER.TERRAFORM_MODULE_PATH, copy=not CONFIG.CLUSTER.REUSE_EXISTING
197180
)
@@ -203,14 +186,32 @@ async def start_cluster(request):
203186

204187
@app.route("/cluster_status", methods=["GET"])
205188
async def cluster_status(request):
206-
cluster_id = request.args["cluster_id"][0]
207-
cluster = current_clusters.get(cluster_id)
208-
has_cluster = cluster is not None
189+
if "cluster_id" in request.args:
190+
cluster_id = request.args["cluster_id"][0]
191+
cluster = current_clusters.get(cluster_id)
192+
has_cluster = cluster is not None
193+
status = {
194+
"has_cluster": has_cluster,
195+
"ready": has_cluster and cluster.ready.is_set(),
196+
}
197+
else:
198+
status = {"clusters": []}
199+
for cluster_id, cluster in current_clusters.items():
200+
state = "creating"
201+
if cluster.ready.is_set():
202+
state = "ready"
203+
if cluster.destroying.is_set():
204+
state = "destroying"
205+
status["clusters"].append(
206+
{
207+
"id": cluster_id,
208+
"name": "tbd",
209+
"created_at": "N/A",
210+
"created_by": "N/A",
211+
"status": state,
212+
}
213+
)
209214

210-
status = {
211-
"has_cluster": has_cluster,
212-
"ready": has_cluster and cluster.ready.is_set(),
213-
}
214215
return resp.json(status)
215216

216217

@@ -226,12 +227,9 @@ async def stop_cluster(request):
226227
# Note(mihirg): These functions are out of date as of 6/25 and need to be fixed/removed.
227228
#
228229

229-
if BUILD_WITH_KUBE:
230-
current_models: CleanupDict[str, BGSplitTrainingJob] = CleanupDict(
231-
lambda job: job.stop()
232-
)
233-
else:
234-
current_models = {}
230+
current_models: CleanupDict[str, BGSplitTrainingJob] = CleanupDict(
231+
lambda job: job.stop()
232+
)
235233

236234

237235
@app.route("/start_bgsplit_job", methods=["POST"])
@@ -386,12 +384,9 @@ async def bgsplit_job_status(request):
386384
return resp.json(status)
387385

388386

389-
if BUILD_WITH_KUBE:
390-
current_model_inference_jobs: CleanupDict[str, BGSplitInferenceJob] = CleanupDict(
391-
lambda job: job.stop()
392-
)
393-
else:
394-
current_model_inference_jobs = {}
387+
current_model_inference_jobs: CleanupDict[str, BGSplitInferenceJob] = CleanupDict(
388+
lambda job: job.stop()
389+
)
395390

396391

397392
@app.route("/start_bgsplit_inference_job", methods=["POST"])
@@ -748,10 +743,9 @@ async def cleanup(app, loop):
748743

749744
@utils.log_exception_from_coro_but_return_none
750745
async def _cleanup_clusters():
751-
if BUILD_WITH_KUBE:
752-
n = len(current_clusters)
753-
await current_clusters.clear_async()
754-
print(f"- killed {n} clusters")
746+
n = len(current_clusters)
747+
await current_clusters.clear_async()
748+
print(f"- killed {n} clusters")
755749

756750

757751
if __name__ == "__main__":

forager_frontend/src/node/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
"@fortawesome/fontawesome-svg-core": "^1.2.34",
77
"@fortawesome/free-solid-svg-icons": "^5.15.2",
88
"@fortawesome/react-fontawesome": "^0.1.15",
9+
"@types/jest": "^27.0.2",
10+
"@types/node": "^16.10.2",
11+
"@types/react": "^17.0.26",
12+
"@types/react-dom": "^17.0.9",
913
"browser-image-resizer": "^2.2.0",
1014
"classnames": "^2.3.1",
1115
"dateformat": "^4.5.1",
@@ -30,6 +34,7 @@
3034
"react-useinterval": "^1.0.2",
3135
"reactstrap": "^8.7.1",
3236
"styled-components": "^5.2.1",
37+
"typescript": "^4.4.3",
3338
"use-image": "^1.0.7",
3439
"use-resize-observer": "^7.0.0",
3540
"uuid": "^8.3.2"
@@ -55,5 +60,8 @@
5560
"last 1 firefox version",
5661
"last 1 safari version"
5762
]
63+
},
64+
"devDependencies": {
65+
"prettier": "^2.4.1"
5866
}
5967
}

0 commit comments

Comments
 (0)