diff --git a/frontend/app.py b/frontend/app.py index 4eeb72f..4cd7bda 100644 --- a/frontend/app.py +++ b/frontend/app.py @@ -346,8 +346,8 @@ async def session_list(): return JSONResponse({"sessions": []}) -@app.get("/session/analyze/result/{analysis_id}", response_class=HTMLResponse) -async def session_analyze_result( +@app.get("/session/configure/{analysis_id}", response_class=HTMLResponse) +async def session_configure( request: Request, analysis_id: str, vmid: str = "", @@ -355,16 +355,18 @@ async def session_analyze_result( vm_name: str = "", session_id: str = "", ): - """Render the analysis result after polling completes.""" + """Full page with VM configuration + disk selection after analysis.""" try: status = api.get_analysis(analysis_id) result = status.get("result") if not result: - return render("_analysis.html", request=request, - error="Analysis result not ready.") + return render("configure.html", request=request, analysis_id=analysis_id, + source_filename=source_filename, session_id=session_id, + disks=[], error="Analysis result not ready.") except ApiError as exc: - return render("_analysis.html", request=request, - error=f"Failed to fetch analysis: {exc.detail}") + return render("configure.html", request=request, analysis_id=analysis_id, + source_filename=source_filename, session_id=session_id, + disks=[], error=f"Failed: {exc.detail}") pools = [] try: @@ -376,12 +378,36 @@ async def session_analyze_result( analysis = result name = vm_name.strip() if not name: - name = (analysis.get("os_type") or "vm") + f"-{vmid}" + name = (analysis.get("os_type") or "vm") - return render("_analysis.html", request=request, - vmid=vmid, source_filename=source_filename, - vm_name=name, analysis=analysis, storage_pools=pools, - session_id=session_id) + disks = analysis.get("all_disks", []) + if not disks: + disks = [{"filename": analysis.get("filename", ""), "format": analysis.get("disk_format", ""), "size_gb": analysis.get("disk_size_gb", 0)}] + + suggested_vmid = vmid if vmid else "" + + return render("configure.html", request=request, + analysis_id=analysis_id, source_filename=source_filename, + session_id=session_id, vm_name=name, storage_pools=pools, + disks=disks, suggested_vmid=suggested_vmid) + + +@app.post("/session/configure/submit") +async def configure_submit(request: Request): + """Receive config + disk selection, submit job to backend.""" + body = await request.json() + try: + result = api.create_job(body) + return result + except ApiError as exc: + return JSONResponse({"error": exc.detail}, status_code=502) + + +@app.get("/session/status/{job_id}", response_class=HTMLResponse) +async def session_status_page(request: Request, job_id: str): + """Full page showing job progress with polling.""" + return render("job_polling.html", request=request, job_id=job_id, + vmid=0, vm_name="", session_id="") @app.post("/session/confirm", response_class=HTMLResponse) diff --git a/frontend/templates/configure.html b/frontend/templates/configure.html new file mode 100644 index 0000000..84a565e --- /dev/null +++ b/frontend/templates/configure.html @@ -0,0 +1,197 @@ +{% extends "base.html" %} +{% block content %} + +
Source: {{ source_filename }}
+| Boot | +Filename | +Format | +Size | +Resize | +
| + | {{ d.filename }} | +{{ d.format }} | +{{ d.size_gb }} GB | ++ + | +
Job: {{ job_id }} | {{ vm_name }}
+ +Waiting for backend...
+Elapsed: 0s
+ +Create another VM from this disk?
+ +