- 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>
101 lines
2.6 KiB
Go
101 lines
2.6 KiB
Go
package tasks
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/atlasos/calypso/internal/common/database"
|
|
"github.com/atlasos/calypso/internal/common/logger"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// Handler handles task-related requests
|
|
type Handler struct {
|
|
db *database.DB
|
|
logger *logger.Logger
|
|
}
|
|
|
|
// NewHandler creates a new task handler
|
|
func NewHandler(db *database.DB, log *logger.Logger) *Handler {
|
|
return &Handler{
|
|
db: db,
|
|
logger: log,
|
|
}
|
|
}
|
|
|
|
// Task represents an async task
|
|
type Task struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"`
|
|
Status string `json:"status"`
|
|
Progress int `json:"progress"`
|
|
Message string `json:"message"`
|
|
ErrorMessage string `json:"error_message,omitempty"`
|
|
CreatedBy string `json:"created_by,omitempty"`
|
|
StartedAt *time.Time `json:"started_at,omitempty"`
|
|
CompletedAt *time.Time `json:"completed_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
}
|
|
|
|
// GetTask retrieves a task by ID
|
|
func (h *Handler) GetTask(c *gin.Context) {
|
|
taskID := c.Param("id")
|
|
|
|
// Validate UUID
|
|
if _, err := uuid.Parse(taskID); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid task ID"})
|
|
return
|
|
}
|
|
|
|
query := `
|
|
SELECT id, type, status, progress, message, error_message,
|
|
created_by, started_at, completed_at, created_at, updated_at, metadata
|
|
FROM tasks
|
|
WHERE id = $1
|
|
`
|
|
|
|
var task Task
|
|
var errorMsg, createdBy sql.NullString
|
|
var startedAt, completedAt sql.NullTime
|
|
var metadata sql.NullString
|
|
|
|
err := h.db.QueryRow(query, taskID).Scan(
|
|
&task.ID, &task.Type, &task.Status, &task.Progress,
|
|
&task.Message, &errorMsg, &createdBy,
|
|
&startedAt, &completedAt, &task.CreatedAt, &task.UpdatedAt, &metadata,
|
|
)
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "task not found"})
|
|
return
|
|
}
|
|
h.logger.Error("Failed to get task", "error", err)
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to get task"})
|
|
return
|
|
}
|
|
|
|
if errorMsg.Valid {
|
|
task.ErrorMessage = errorMsg.String
|
|
}
|
|
if createdBy.Valid {
|
|
task.CreatedBy = createdBy.String
|
|
}
|
|
if startedAt.Valid {
|
|
task.StartedAt = &startedAt.Time
|
|
}
|
|
if completedAt.Valid {
|
|
task.CompletedAt = &completedAt.Time
|
|
}
|
|
if metadata.Valid && metadata.String != "" {
|
|
json.Unmarshal([]byte(metadata.String), &task.Metadata)
|
|
}
|
|
|
|
c.JSON(http.StatusOK, task)
|
|
}
|
|
|