package app import ( "fmt" "sort" "github.com/seaweedfs/seaweedfs/weed/admin/maintenance" "github.com/seaweedfs/seaweedfs/weed/storage/erasure_coding" ) // sortedKeys returns the sorted keys for a string map func sortedKeys(m map[string]string) []string { keys := make([]string, 0, len(m)) for k := range m { keys = append(keys, k) } sort.Strings(keys) return keys } templ TaskDetail(data *maintenance.TaskDetailData) {

Task Detail: {data.Task.ID}

Task Overview
Task ID:
{data.Task.ID}
Type:
{string(data.Task.Type)}
Status:
if data.Task.Status == maintenance.TaskStatusPending { Pending } else if data.Task.Status == maintenance.TaskStatusAssigned { Assigned } else if data.Task.Status == maintenance.TaskStatusInProgress { In Progress } else if data.Task.Status == maintenance.TaskStatusCompleted { Completed } else if data.Task.Status == maintenance.TaskStatusFailed { Failed } else if data.Task.Status == maintenance.TaskStatusCancelled { Cancelled }
Priority:
if data.Task.Priority == maintenance.PriorityHigh { High } else if data.Task.Priority == maintenance.PriorityCritical { Critical } else if data.Task.Priority == maintenance.PriorityNormal { Normal } else { Low }
if data.Task.Reason != "" {
Reason:
{data.Task.Reason}
}
Task Timeline
Created {data.Task.CreatedAt.Format("01-02 15:04:05")}
if data.Task.StartedAt != nil {
} else {
}
Scheduled {data.Task.ScheduledAt.Format("01-02 15:04:05")}
if data.Task.StartedAt != nil {
} else {
} if data.Task.CompletedAt != nil {
} else {
}
Started if data.Task.StartedAt != nil { {data.Task.StartedAt.Format("01-02 15:04:05")} } else { — }
if data.Task.CompletedAt != nil {
if data.Task.Status == maintenance.TaskStatusCompleted { } else if data.Task.Status == maintenance.TaskStatusFailed { } else { }
} else {
}
if data.Task.Status == maintenance.TaskStatusCompleted { Completed } else if data.Task.Status == maintenance.TaskStatusFailed { Failed } else if data.Task.Status == maintenance.TaskStatusCancelled { Cancelled } else { Pending } if data.Task.CompletedAt != nil { {data.Task.CompletedAt.Format("01-02 15:04:05")} } else { — }
if data.Task.WorkerID != "" {
Worker:
{data.Task.WorkerID}
}
if data.Task.TypedParams != nil && data.Task.TypedParams.VolumeSize > 0 {
Volume Size:
{formatBytes(int64(data.Task.TypedParams.VolumeSize))}
} if data.Task.TypedParams != nil && data.Task.TypedParams.Collection != "" {
Collection:
{data.Task.TypedParams.Collection}
} if data.Task.TypedParams != nil && data.Task.TypedParams.DataCenter != "" {
Data Center:
{data.Task.TypedParams.DataCenter}
} if data.Task.Progress > 0 {
Progress:
{fmt.Sprintf("%.1f%%", data.Task.Progress)}
}
if data.Task.DetailedReason != "" {
Detailed Reason:

{data.Task.DetailedReason}

} if data.Task.Error != "" {
Error:
{data.Task.Error}
}
if data.Task.TypedParams != nil {
Task Configuration
if len(data.Task.TypedParams.Sources) > 0 {
Source Servers {fmt.Sprintf("%d", len(data.Task.TypedParams.Sources))}
for i, source := range data.Task.TypedParams.Sources {
{fmt.Sprintf("#%d", i+1)} {source.Node}
if source.DataCenter != "" { {source.DataCenter} }
if source.Rack != "" { {source.Rack} }
if source.VolumeId > 0 { Vol:{fmt.Sprintf("%d", source.VolumeId)} }
if len(source.ShardIds) > 0 { Shards: for j, shardId := range source.ShardIds { if j > 0 { , } if shardId < erasure_coding.DataShardsCount { {fmt.Sprintf("%d", shardId)} } else { {fmt.Sprintf("P%d", shardId-erasure_coding.DataShardsCount)} } } }
}
} if len(data.Task.TypedParams.Sources) > 0 || len(data.Task.TypedParams.Targets) > 0 {

Task: {string(data.Task.Type)}
} if len(data.Task.TypedParams.Targets) > 0 {
Target Servers {fmt.Sprintf("%d", len(data.Task.TypedParams.Targets))}
for i, target := range data.Task.TypedParams.Targets {
{fmt.Sprintf("#%d", i+1)} {target.Node}
if target.DataCenter != "" { {target.DataCenter} }
if target.Rack != "" { {target.Rack} }
if target.VolumeId > 0 { Vol:{fmt.Sprintf("%d", target.VolumeId)} }
if len(target.ShardIds) > 0 { Shards: for j, shardId := range target.ShardIds { if j > 0 { , } if shardId < erasure_coding.DataShardsCount { {fmt.Sprintf("%d", shardId)} } else { {fmt.Sprintf("P%d", shardId-erasure_coding.DataShardsCount)} } } }
}
}
} if data.WorkerInfo != nil {
Worker Information
Worker ID:
{data.WorkerInfo.ID}
Address:
{data.WorkerInfo.Address}
Status:
if data.WorkerInfo.Status == "active" { Active } else if data.WorkerInfo.Status == "busy" { Busy } else { Inactive }
Last Heartbeat:
{data.WorkerInfo.LastHeartbeat.Format("2006-01-02 15:04:05")}
Current Load:
{fmt.Sprintf("%d/%d", data.WorkerInfo.CurrentLoad, data.WorkerInfo.MaxConcurrent)}
Capabilities:
for _, capability := range data.WorkerInfo.Capabilities { {string(capability)} }
} if len(data.AssignmentHistory) > 0 {
Assignment History
for _, assignment := range data.AssignmentHistory { }
Worker ID Worker Address Assigned At Unassigned At Reason
{assignment.WorkerID} {assignment.WorkerAddress} {assignment.AssignedAt.Format("2006-01-02 15:04:05")} if assignment.UnassignedAt != nil { {assignment.UnassignedAt.Format("2006-01-02 15:04:05")} } else { } {assignment.Reason}
} if len(data.ExecutionLogs) > 0 {
Execution Logs
for _, log := range data.ExecutionLogs { }
Timestamp Level Message Details
{log.Timestamp.Format("15:04:05")} if log.Level == "error" { {log.Level} } else if log.Level == "warn" { {log.Level} } else if log.Level == "info" { {log.Level} } else { {log.Level} } {log.Message} if log.Fields != nil && len(log.Fields) > 0 { for _, k := range sortedKeys(log.Fields) { {k}={log.Fields[k]} } } else if log.Progress != nil || log.Status != "" { if log.Progress != nil { progress={fmt.Sprintf("%.0f%%", *log.Progress)} } if log.Status != "" { status={log.Status} } } else { - }
} if len(data.RelatedTasks) > 0 {
Related Tasks
for _, relatedTask := range data.RelatedTasks { }
Task ID Type Status Volume ID Server Created
{relatedTask.ID} {string(relatedTask.Type)} if relatedTask.Status == maintenance.TaskStatusCompleted { Completed } else if relatedTask.Status == maintenance.TaskStatusFailed { Failed } else if relatedTask.Status == maintenance.TaskStatusInProgress { In Progress } else { {string(relatedTask.Status)} } if relatedTask.VolumeID != 0 { {fmt.Sprintf("%d", relatedTask.VolumeID)} } else { - } if relatedTask.Server != "" { {relatedTask.Server} } else { - } {relatedTask.CreatedAt.Format("2006-01-02 15:04:05")}
}
Actions
if data.Task.Status == maintenance.TaskStatusPending || data.Task.Status == maintenance.TaskStatusAssigned { } if data.Task.WorkerID != "" { }
}