yasithdev opened a new pull request, #108:
URL: https://github.com/apache/airavata-portals/pull/108

   ## Summary
   
   Replaces the per-application experiment launch flow with a single 
`/workspace/launch` 3-tab wizard. Tab 1 owns app pick + interface pick + 
scalar/file inputs + file outputs (each file row with its own storage + path 
picker). Tab 2 owns runtime (compute resource + partition + walltime + nodes + 
CPUs, profile-driven from the picked project). Tab 3 fetches a server-rendered 
preview script via a new dry-run RPC and submits via the existing 
experiment-launch path.
   
   A `launcher_client.py` Python module abstracts the airavata gRPC layer so a 
stub powers tests + CI until the upstream airavata server's new-model RPCs 
land. Settings flag `LAUNCHER_CLIENT_STUB` (default True) selects between stub 
and real client; flip to False once upstream lands. `FEATURE_GENERIC_LAUNCHER` 
defaults True.
   
   ## Spec / plan
   
   - Spec: 
[`airavata-django-portal/docs/superpowers/specs/2026-04-24-generic-experiment-launcher-design.md`](airavata-django-portal/docs/superpowers/specs/2026-04-24-generic-experiment-launcher-design.md)
   - Plan: 
[`airavata-django-portal/docs/superpowers/plans/2026-04-24-generic-experiment-launcher-plan.md`](airavata-django-portal/docs/superpowers/plans/2026-04-24-generic-experiment-launcher-plan.md)
   
   ## What's included (33 commits, +7080/-1769)
   
   - **Backend**: `launcher_client.py` stub + `_RealClient` (raises 
NotImplementedError until upstream lands), DRF serializers + JSON contract 
schemas, 7 endpoints under `/api/launcher/`, `/workspace/launch` Django view, 
301 redirects from old `applications/*` URLs.
   - **Frontend**: Vue 3 + `<script setup lang="ts">` SPA mounted at 
`/workspace/launch`. Pinia `useLaunchStore` with draft, validation getters, 
FNV-1a hash, localStorage persistence + hydrate. Components: `LaunchContainer`, 
`WizardTabs`, `ExperimentMetaHeader`, `Tab1ApplicationInputs` (with 
`AppPicker`/`InterfacePicker`/`InputList`/`OutputList` and 
`ScalarInputRow`/`FileInputRow`/`FileOutputRow`), `Tab2Runtime` (with 
`RuntimeInputs`), `Tab3ReviewLaunch` (with 
`ScriptPreview`/`InvocationCommand`). Confirm prompts on app/interface/project 
change.
   - **Tests**: 32 Python (DRF views, client stub, serializers, launch view), 
58 Vitest (per-component + store + integration), 2 Playwright e2e (happy + 
error paths).
   - **Migration**: 8 in-repo call sites retargeted from 
`/workspace/applications` → `/workspace/launch`. Old 
`CreateExperimentContainer`, `EditExperimentContainer`, `ExperimentEditor`, 
`ComputationalResourceSchedulingEditor`, `QueueSettingsEditor`, 
`GroupResourceProfileSelector`, plus their entry files, deleted.
   
   ## Test plan
   
   - [ ] `python manage.py test 
django_airavata.apps.api.tests.test_launcher_client 
django_airavata.apps.api.tests.test_launcher_serializers 
django_airavata.apps.api.tests.test_launcher_views 
django_airavata.apps.workspace.tests.test_launch_view` → 32 PASS
   - [ ] `cd django_airavata/apps/workspace && npm run test` → 58 PASS
   - [ ] `npx playwright test tests/e2e/specs/launch-happy.spec.ts 
tests/e2e/specs/launch-error-paths.spec.ts -c tooling/playwright.config.ts` → 4 
PASS (with `tilt up` running and the portal rebuilt against this branch)
   - [ ] Manual: each I/O type (scalar int/string/enum + file/dir) exercised 
once
   - [ ] Manual: project switch / app switch / interface switch fire confirm 
dialogs
   - [ ] Manual: session expiry mid-flow restores draft from localStorage on 
return
   
   ## Out of scope (separate tracks)
   
   - **Airavata Java server changes** — new application model (content = 
tarball/github URL + user-defined interfaces) and 
`GenerateExperimentSubmissionScript` dry-run RPC. Confirmed not landed as of 
2026-04-25; the portal stub will remain in place until they do.
   - **App definition UI** for the new model (admins register apps with content 
+ interfaces).
   - **Experiment edit flow** under the new model.
   - **Server-side drafts** (currently localStorage per-device).
   
   ## Follow-ups (Task 28, gated)
   
   When the upstream RPCs land:
   1. Implement `_RealClient` in `launcher_client.py` (currently raises 
`NotImplementedError`).
   2. Add tests for the real client mocked at the Thrift boundary.
   3. Flip `LAUNCHER_CLIENT_STUB` default to `False`.
   4. Rerun all suites against a live airavata stack.
   
   ## Notes for reviewers
   
   - The `force_authenticate` test pattern (vs `force_login`) is intentional — 
the portal's `authz_token_middleware` calls `logout(request)` for users without 
an Airavata access token, which `force_login` doesn't provide. Will revisit 
when Task 28 wires real auth.
   - The Vite manifest must be regenerated (`cd django_airavata/apps/workspace 
&& npm run build`) for the `/workspace/launch` page to render in production. 
Tilt's HMR handles dev-mode automatically.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to