V4 Storage Breaking Changes
This page summarizes the storage-related breaking changes between Fuzzball V3 and V4. For step-by-step upgrade instructions, see the V3 to V4 Storage Migration Guide.
V3 used a three-tier model. V4 collapses this to two tiers:
| V3 Entity | V4 Equivalent | Notes |
|---|---|---|
| Storage Driver | Removed | Driver config is embedded in provisioner |
| Storage Class | Storage Provisioner | Provisioner includes driver config, access policies, annotations |
| Storage Volume | Storage Volume | Now linked to a provisioner instead of a storage class |
V3: StorageDriver → StorageClass → StorageVolume (3 entities)
V4: StorageProvisioner → StorageVolume (2 entities)
V4 storage drivers are built into the platform. There is no need to install, update, or manage external container-based drivers.
| V3 Command | V4 Replacement |
|---|---|
fuzzball admin storage driver install | Not needed — drivers are built-in |
fuzzball admin storage driver uninstall | Not needed |
fuzzball admin storage driver list | Not needed |
fuzzball admin storage driver update | Not needed |
fuzzball admin storage class create | fuzzball volume provisioner add |
fuzzball admin storage class delete | fuzzball volume provisioner remove |
fuzzball admin storage class list | fuzzball volume provisioner list |
fuzzball admin storage class update | fuzzball volume provisioner edit |
fuzzball storage (user-level) | fuzzball volume provisioner list |
| Command | Purpose |
|---|---|
fuzzball volume provisioner add | Create a provisioner from YAML definition |
fuzzball volume provisioner list | List provisioners |
fuzzball volume provisioner info | Get provisioner details |
fuzzball volume provisioner edit | Modify a provisioner |
fuzzball volume provisioner remove | Delete a provisioner |
fuzzball volume provisioner scan | Discover volumes on the storage backend |
fuzzball volume provisioner list-drivers | List available driver types |
fuzzball workflow upgrade | Convert a V1 workflow to V4 format |
fuzzball workflow validate | Validate a workflow definition |
The fuzzball volume info command no longer includes the reference field in its output (JSON or YAML). This legacy V3 field has been removed as of V4.1.
- The
referencefield is no longer returned in volume info responses - This affects both
fuzzball volume infoandfuzzball volume listoutput - The field is omitted from both JSON and YAML output
If your scripts or tooling previously parsed the reference field, use one of these alternatives:
| Use case | Replacement |
|---|---|
| Volume identification | Use the immutable id field (JSON output, or YAML output with --metadata) |
| Volume specification in workflows | Use the three-part scope/provisioner/name pattern or just provisioner/name for user-scoped volumes |
| CLI volume operations | Use provisioner name arguments (e.g., fuzzball volume info shared-nfs my-volume) |
Example of the new output format:
# fuzzball volume info shared-nfs project-data
project-data:
use: shared-nfs
name: project-data
size: 50 GiB
V3 workflows used the reference: field to specify volumes:
# V3 syntax (deprecated, still accepted via auto-upgrade)
version: v1
volumes:
data:
reference: volume://user/persistent
scratch:
reference: volume://user/ephemeral
V4 workflows use use:, name:, size:, and annotations::
# V4 syntax (recommended)
version: v4
volumes:
data:
use: shared-nfs
name: my-dataset
scratch:
use: shared-nfs
size: 10GB
V1 workflows are auto-upgraded to V4 at execution time. Fuzzball convertsreference:fields to the equivalentuse:/name:syntax automatically. You can also convert workflows manually withfuzzball workflow upgrade.
New workflows should use version: v4. The version: v1 format is still accepted
and auto-upgraded at execution time.
The Web UI Workflow Editor defaults to version: v4 when creating new workflows or hydrating workflow templates from the Workflow Catalog without an explicit version specified. This means:
- New workflows created via “Create New” in the Workflow Editor start with
version: v4 - Template workflows hydrated from the Workflow Catalog without a
versionfield default toversion: v4
Users who are familiar with v3 syntax and wish to create v1 workflows through the Web UI should explicitly set version: v1 in the YAML editor (press e to open it) before saving or running the workflow.
This change does not affect the CLI or existing workflows — v1 workflows continue to be supported and are auto-upgraded at execution time.
V4 uses path-keyed mounts (the mount point is the key) instead of volume-keyed mounts:
# V3 mount syntax (auto-upgraded)
jobs:
myjob:
mounts:
data:
location: /data
# V4 mount syntax
jobs:
myjob:
mounts:
/data:
volume: data
V3 used organization-level access for storage — all members of an organization could use all storage classes. V4 introduces group-based access policies on each provisioner:
| Policy | Purpose |
|---|---|
access | Controls which groups can mount existing persistent volumes |
create | Controls which groups can create new persistent volumes |
ephemeral | Controls which groups can use ephemeral volumes |
See Access Policies for details.
Newly created volumes default to 0750 (rwxr-x---) when no explicit permissions are
specified. This applies to both persistent volumes and workflow-created ephemeral volumes.
Previously, the default was 0755 (rwxr-xr-x), which allowed any user on the host to
read and traverse the volume directory. Existing volumes are unaffected — only volumes
created after the upgrade receive the new default.
V4 includes three built-in storage drivers:
| Driver | V3 Equivalent | Backend |
|---|---|---|
| NFS | NFS CSI driver container | NFS export with volume subdirectories |
| Hostpath | HostPath CSI driver container | Local filesystem directories |
| EFS | EFS CSI driver container | AWS EFS access points |
See Driver Types for configuration details.
When upgrading from V3 to V4, the storage-migrate process runs automatically during
the upgrade and:
- Creates a V4 provisioner for each V3 storage class (one per org per class)
- Links existing volumes to their new provisioner
- Backfills volume ownership (UID/GID)
The migration handles database records only. Depending on your V3 storage layout, filesystem paths may need manual adjustment. See the V3 to V4 Storage Migration Guide for complete post-upgrade steps.
On fresh V4 installations, Fuzzball automatically creates a default provisioner:
| Deployment Type | Default Driver | Default Path |
|---|---|---|
| Single-binary (compose) | Hostpath | /mnt/fuzzball-sharedfs |
| AWS Kubernetes | EFS | Configured EFS filesystem |
The default provisioner grants access: all and ephemeral: all to all groups. Its
create policy is narrower: it names the cluster owner’s group and user, because create
implies delete on that provisioner and all would let any group remove another’s volumes.
The policy is seeded from the owner email configured at deploy time, so a provisioner
created without one has no create policy at all and denies everyone — see
Storage Configuration.