3.5 KiB
3.5 KiB
Dataset Mountpoint Validation
Issue
User meminta validasi bahwa mount point untuk dataset dan volume harus berada di dalam directory pool yang terkait.
Solution
Menambahkan validasi untuk memastikan mount point dataset berada di dalam pool mount point directory (/opt/calypso/data/pool/<pool-name>/).
Changes Made
Updated backend/internal/storage/zfs.go
File: backend/internal/storage/zfs.go (line 728-814)
Key Changes:
-
Mount Point Validation
- Validasi bahwa mount point yang user berikan harus berada di dalam pool directory
- Menggunakan
filepath.Rel()untuk memastikan mount point tidak keluar dari pool directory
-
Default Mount Point
- Jika mount point tidak disediakan, set default ke
/opt/calypso/data/pool/<pool-name>/<dataset-name>/ - Memastikan semua dataset mount point berada di dalam pool directory
- Jika mount point tidak disediakan, set default ke
-
Mount Point Always Set
- Untuk filesystem datasets, mount point selalu di-set (baik user-provided atau default)
- Tidak lagi conditional pada
req.MountPoint != ""
Before:
if req.Type == "filesystem" && req.MountPoint != "" {
mountPath := filepath.Clean(req.MountPoint)
// ... create directory ...
}
// Later:
if req.Type == "filesystem" && req.MountPoint != "" {
args = append(args, "-o", fmt.Sprintf("mountpoint=%s", req.MountPoint))
}
After:
poolMountPoint := fmt.Sprintf("/opt/calypso/data/pool/%s", poolName)
var mountPath string
if req.Type == "filesystem" {
if req.MountPoint != "" {
// Validate mount point is within pool directory
mountPath = filepath.Clean(req.MountPoint)
// ... validation logic ...
} else {
// Use default mount point
mountPath = filepath.Join(poolMountPoint, req.Name)
}
// ... create directory ...
}
// Later:
if req.Type == "filesystem" {
args = append(args, "-o", fmt.Sprintf("mountpoint=%s", mountPath))
}
Mount Point Structure
Pool Mount Point
/opt/calypso/data/pool/<pool-name>/
Dataset Mount Point (Default)
/opt/calypso/data/pool/<pool-name>/<dataset-name>/
Dataset Mount Point (Custom - must be within pool)
/opt/calypso/data/pool/<pool-name>/<custom-path>/
Validation Rules
-
User-provided mount point:
- Must be within
/opt/calypso/data/pool/<pool-name>/ - Cannot use
..to escape pool directory - Must be a valid directory path
- Must be within
-
Default mount point:
- Automatically set to
/opt/calypso/data/pool/<pool-name>/<dataset-name>/ - Always within pool directory
- Automatically set to
-
Volumes:
- Volumes cannot have mount points (already validated in handler)
Error Messages
mount point must be within pool directory: <path> (pool mount: <pool-mount>)- Jika mount point di luar pool directorymount point path exists but is not a directory: <path>- Jika path sudah ada tapi bukan directoryfailed to create mount directory <path>- Jika gagal membuat directory
Testing
-
Create dataset without mount point:
- Should use default:
/opt/calypso/data/pool/<pool-name>/<dataset-name>/
- Should use default:
-
Create dataset with valid mount point:
- Mount point:
/opt/calypso/data/pool/<pool-name>/custom-path/ - Should succeed
- Mount point:
-
Create dataset with invalid mount point:
- Mount point:
/opt/calypso/data/other-path/ - Should fail with validation error
- Mount point:
-
Create volume:
- Should not set mount point (volumes don't have mount points)
Status
✅ COMPLETED - Mount point validation untuk dataset sudah diterapkan
Date
2026-01-09