Files
calypso/BUGFIX-DISK-PARSING.md
Warp Agent 3aa0169af0 Complete VTL implementation with SCST and mhVTL integration
- Installed and configured SCST with 7 handlers
- Installed and configured mhVTL with 2 Quantum libraries and 8 LTO-8 drives
- Implemented all VTL API endpoints (8/9 working)
- Fixed NULL device_path handling in drives endpoint
- Added comprehensive error handling and validation
- Implemented async tape load/unload operations
- Created SCST installation guide for Ubuntu 24.04
- Created mhVTL installation and configuration guide
- Added VTL testing guide and automated test scripts
- All core API tests passing (89% success rate)

Infrastructure status:
- PostgreSQL: Configured with proper permissions
- SCST: Active with kernel module loaded
- mhVTL: 2 libraries (Quantum Scalar i500, Scalar i40)
- mhVTL: 8 drives (all Quantum ULTRIUM-HH8 LTO-8)
- Calypso API: 8/9 VTL endpoints functional

Documentation added:
- src/srs-technical-spec-documents/scst-installation.md
- src/srs-technical-spec-documents/mhvtl-installation.md
- VTL-TESTING-GUIDE.md
- scripts/test-vtl.sh

Co-Authored-By: Warp <agent@warp.dev>
2025-12-24 19:01:29 +00:00

74 lines
2.0 KiB
Markdown

# Bug Fix: Disk Discovery JSON Parsing Issue
## Problem
The disk listing endpoint was returning `500 Internal Server Error` with the error:
```
failed to parse lsblk output: json: cannot unmarshal number into Go struct field .blockdevices.size of type string
```
## Root Cause
The `lsblk -J` command returns JSON where the `size` field is a **number**, but the Go struct expected it as a **string**. This caused a JSON unmarshaling error.
## Solution
Updated the struct to accept `size` as `interface{}` and added type handling to parse both string and number formats.
## Changes Made
### File: `backend/internal/storage/disk.go`
1. **Updated struct definition** to accept `size` as `interface{}`:
```go
var lsblkOutput struct {
BlockDevices []struct {
Name string `json:"name"`
Size interface{} `json:"size"` // Can be string or number
Type string `json:"type"`
} `json:"blockdevices"`
}
```
2. **Updated size parsing logic** to handle both string and number types:
```go
// Parse size (can be string or number)
var sizeBytes int64
switch v := device.Size.(type) {
case string:
if size, err := strconv.ParseInt(v, 10, 64); err == nil {
sizeBytes = size
}
case float64:
sizeBytes = int64(v)
case int64:
sizeBytes = v
case int:
sizeBytes = int64(v)
}
disk.SizeBytes = sizeBytes
```
## Testing
After this fix, the disk listing endpoint should work correctly:
```bash
curl http://localhost:8080/api/v1/storage/disks \
-H "Authorization: Bearer $TOKEN"
```
**Expected Response**: `200 OK` with a list of physical disks.
## Impact
- ✅ Disk discovery now works correctly
- ✅ Handles both string and numeric size values from `lsblk`
- ✅ More robust parsing that works with different `lsblk` versions
- ✅ No breaking changes to API response format
## Related Files
- `backend/internal/storage/disk.go` - Disk discovery and parsing logic