Storage Connection Test (S3, Azure, GCS, FTP)
Version: 3.1.0 Date: 2026-06-12
Goal: Let operators validate storage credentials before saving a configuration, reducing failed protect jobs due to misconfigured storages.
Solution: Backend upload probe (_bcyip_iptower_/upload_test_<timestamp>.txt) per provider, exposed via POST /config/storage/test-connection. UI test button on editor and summary views; Save disabled until the current form config passes.
Features:
- Test connection button on storage editor with success/fail feedback (icon + floating error popper)
- Save disabled until test passes for the current configuration snapshot
- Read-only storage summary page at
/storages/:namewith inline test, Edit, and Delete - GCP credentials required before test (inline error under upload field)
- Storage list cards navigate to summary; Edit goes to
/storages/:name/edit - Task detail pages link source → workflow and destination → storage
Implementation Details:
- GCS accepts inline
credFileContentor existingkeyPathon edit - FTP errors propagate SDK message instead of generic wrapper
- API returns
BadRequestExceptionwith provider error message on failure
Files Modified:
src/config.dto.ts-TestStorageConnectionDtoseparate fromCreateStorageDto(keyPath optional, GCS creds optional)src/app.controller.ts-POST config/storage/test-connectionendpointsrc/protocol/storage/storage.service.ts-testConnectiondispatchersrc/protocol/storage/amazon-s3/amazon-s3.service.ts- S3 probe uploadsrc/protocol/storage/azureBlobStorage/azure-blob-storage.service.ts- Azure probe uploadsrc/protocol/storage/google-cloud-storage/google-cloud-storage.service.ts- GCS probe + inline credentialssrc/protocol/storage/ftp/ftp.storage.service.ts- FTP probe uploadsrc/protocol/capacities/ftp-capacity/ftp-capacity.service.ts- propagate FTP SDK errorsui/src/protocol/tower.api.ts-testStorageConnectionclientui/src/pages/storages/StorageEditor.tsx- test UX, GCP validation, Save gate, FTP layoutui/src/pages/storages/StorageSummary.tsx- read-only view + test connectionui/src/pages/storages/StorageConnectionError.tsx- shared error displayui/src/pages/storages/StorageItem.tsx- card navigation to summary/editui/src/routes.tsx-/storages/:namesummary,/storages/:name/editeditorui/src/pages/dashboard/taskDetails/GitTaskDetails.tsx- links to workflow/storageui/src/pages/dashboard/taskDetails/FtpTaskDetails.tsx- links to workflow/storagesrc/protocol/storage/*/*.service.spec.ts- unit tests fortestConnectionper provider