Sfoglia il codice sorgente

orchestrator functionality update

spacexerq 2 settimane fa
parent
commit
263f339221

+ 15 - 0
apps/gui/src/clients/orchestrator_client.py

@@ -153,6 +153,21 @@ class OrchestratorClient:
             raise OrchestratorError(r.text, status_code=r.status_code)
         return r.json()["job_id"]
 
+    def get_task_registry(self) -> list[str]:
+        """Return names of all registered task functions."""
+        data = self._get("/tasks")
+        return data.get("tasks", [])
+
+    def create_scenario(self, steps: list[dict]) -> str:
+        """
+        Create a job from an inline step list (no template required).
+
+        steps: [{"name": "start_measurement", "params": {...}}, ...]
+        Returns job_id.
+        """
+        data = self._post("/scenario/create", json={"steps": steps})
+        return data["job_id"]
+
     def get_mode(self) -> str:
         """Return the current orchestrator mode ('real' or 'plug')."""
         data = self._get("/mode")

+ 7 - 3
services/orchestrator/orchestrator/clients/spec_cl.py

@@ -73,13 +73,17 @@ class SpectrometerClient:
                 raise TimeoutError(f"Timeout waiting data_ready for measurement {meas_id}. Last state: {st}")
             time.sleep(poll_s)
 
-    def get_data(self, meas_id: Union[int, str]) -> Dict[str, Any]:
-        # 1) detail: /api/measure/{id}/data/
+    def get_data(self, meas_id: Union[int, str]) -> Any:
+        """
+        GET /api/measure/{id}/data/
+        Returns a list of measurement_data records (serializer uses many=True).
+        Falls back to /api/mdata/?measure={id} if the action endpoint returns 404.
+        """
         url1 = f"{self.url_measure_coll}{meas_id}/data/"
         r1 = self._get_any(url1)
         if r1 is not None:
             return r1
-        # 2) collection: /api/mdata/?measure={id}
+        # fallback: mdata collection filtered by measurement id
         return self._get_json(self.url_mdata_coll, params={"measure": meas_id})
 
     # --------------- low-level ---------------

+ 10 - 7
services/orchestrator/orchestrator/tasks_real.py

@@ -36,13 +36,16 @@ def wait_data_ready(measurement_id=None, **kwargs):
 def fetch_data(measurement_id=None, **kwargs):
     if measurement_id is None:
         raise ValueError("fetch_data: measurement_id is required (не пришёл из предыдущего шага)")
-    data = spec.get_data(measurement_id)
-    # Попробуем угадать полезное поле для следующего шага (URL или id файла)
-    raw_url = data.get("raw_h5") or data.get("file_url") or data.get("raw_file") or None
-    out = {"data": data}
-    if raw_url:
-        out["raw_file"] = raw_url
-    return out
+    # GET /api/measure/{id}/data/ → список measurement_data (many=True)
+    raw = spec.get_data(measurement_id)
+    # Нормализация: DRF с пагинацией вернёт {"results": [...]}, без — список
+    if isinstance(raw, dict) and "results" in raw:
+        data_list = raw["results"]
+    elif isinstance(raw, list):
+        data_list = raw
+    else:
+        data_list = [raw]
+    return {"data": data_list, "measurement_id": measurement_id}
 
 # Шаг 4: реконструкция
 def run_reconstruction(raw_file=None, **kwargs):