feat: add resource_sync_all and resource_sync_one task types
This commit is contained in:
parent
559fd2c85c
commit
1ff391f055
@ -36,6 +36,7 @@ type TaskService struct {
|
|||||||
repo TaskRepository
|
repo TaskRepository
|
||||||
models *storage.ModelsRepo
|
models *storage.ModelsRepo
|
||||||
modelsDir string
|
modelsDir string
|
||||||
|
resources *storage.ResourcesRepo
|
||||||
stateRepo DeviceConfigStateRepository
|
stateRepo DeviceConfigStateRepository
|
||||||
auditRepo AuditLogRepository
|
auditRepo AuditLogRepository
|
||||||
tasks map[string]*models.Task
|
tasks map[string]*models.Task
|
||||||
@ -66,6 +67,13 @@ func (s *TaskService) SetStandardModels(models *storage.ModelsRepo, dir string)
|
|||||||
s.modelsDir = filepath.Clean(dir)
|
s.modelsDir = filepath.Clean(dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *TaskService) SetStandardResources(repo *storage.ResourcesRepo) {
|
||||||
|
if s == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.resources = repo
|
||||||
|
}
|
||||||
|
|
||||||
func NewTaskService(cfg *config.Config, agent *AgentClient, registry *RegistryService, repo ...TaskRepository) *TaskService {
|
func NewTaskService(cfg *config.Config, agent *AgentClient, registry *RegistryService, repo ...TaskRepository) *TaskService {
|
||||||
var taskRepo TaskRepository
|
var taskRepo TaskRepository
|
||||||
if len(repo) > 0 {
|
if len(repo) > 0 {
|
||||||
@ -399,6 +407,22 @@ func (s *TaskService) executeOnDevice(task *models.Task, did string) {
|
|||||||
s.updateDeviceStatus(task.ID, did, models.TaskSuccess, 1.0, "")
|
s.updateDeviceStatus(task.ID, did, models.TaskSuccess, 1.0, "")
|
||||||
s.appendAuditLog(task, did, models.TaskSuccess, "")
|
s.appendAuditLog(task, did, models.TaskSuccess, "")
|
||||||
|
|
||||||
|
case "resource_sync_one":
|
||||||
|
if err := s.syncResourceToDevice(task, dev, did, false); err != nil {
|
||||||
|
s.updateDeviceStatus(task.ID, did, models.TaskFailed, 0, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.updateDeviceStatus(task.ID, did, models.TaskSuccess, 1.0, "")
|
||||||
|
s.appendAuditLog(task, did, models.TaskSuccess, "")
|
||||||
|
|
||||||
|
case "resource_sync_all":
|
||||||
|
if err := s.syncResourceToDevice(task, dev, did, true); err != nil {
|
||||||
|
s.updateDeviceStatus(task.ID, did, models.TaskFailed, 0, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
s.updateDeviceStatus(task.ID, did, models.TaskSuccess, 1.0, "")
|
||||||
|
s.appendAuditLog(task, did, models.TaskSuccess, "")
|
||||||
|
|
||||||
default:
|
default:
|
||||||
s.updateDeviceStatus(task.ID, did, models.TaskFailed, 0, "unsupported task type")
|
s.updateDeviceStatus(task.ID, did, models.TaskFailed, 0, "unsupported task type")
|
||||||
}
|
}
|
||||||
@ -460,6 +484,62 @@ func (s *TaskService) syncModelToDevice(task *models.Task, dev *models.Device, d
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *TaskService) syncResourceToDevice(task *models.Task, dev *models.Device, did string, syncAll bool) error {
|
||||||
|
if s.resources == nil {
|
||||||
|
return fmt.Errorf("resources repo is not configured")
|
||||||
|
}
|
||||||
|
items, err := s.resources.List()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(items) == 0 {
|
||||||
|
return fmt.Errorf("no standard resources configured")
|
||||||
|
}
|
||||||
|
targets := items[:0]
|
||||||
|
if syncAll {
|
||||||
|
targets = append(targets, items...)
|
||||||
|
} else {
|
||||||
|
payload, _ := task.Payload.(map[string]any)
|
||||||
|
targetName := strings.TrimSpace(stringAny(payload["resource_name"]))
|
||||||
|
if targetName == "" {
|
||||||
|
return fmt.Errorf("resource_name is required")
|
||||||
|
}
|
||||||
|
for _, item := range items {
|
||||||
|
if strings.TrimSpace(item.Name) == targetName {
|
||||||
|
targets = append(targets, item)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(targets) == 0 {
|
||||||
|
return fmt.Errorf("standard resource %q not found", targetName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, item := range targets {
|
||||||
|
if strings.TrimSpace(item.FilePath) == "" {
|
||||||
|
continue // metadata-only resource, nothing to push
|
||||||
|
}
|
||||||
|
file, err := os.Open(item.FilePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
stat, err := file.Stat()
|
||||||
|
if err != nil {
|
||||||
|
file.Close()
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
agentPath := fmt.Sprintf("/v1/resources/%s/%s", item.ResourceType, item.Name)
|
||||||
|
resp, code, err := s.agent.DoStream("PUT", dev.IP, dev.AgentPort, agentPath, file, "application/octet-stream", stat.Size())
|
||||||
|
file.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if code >= 400 {
|
||||||
|
return fmt.Errorf("agent error: %d %s", code, strings.TrimSpace(string(resp)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *TaskService) updateDeviceStatus(taskID, did string, status models.TaskStatus, progress float64, errStr string) {
|
func (s *TaskService) updateDeviceStatus(taskID, did string, status models.TaskStatus, progress float64, errStr string) {
|
||||||
s.mu.RLock()
|
s.mu.RLock()
|
||||||
task, ok := s.tasks[taskID]
|
task, ok := s.tasks[taskID]
|
||||||
|
|||||||
@ -252,6 +252,8 @@ func NewUI(discovery *service.DiscoveryService, registry *service.RegistryServic
|
|||||||
return "批量服务"
|
return "批量服务"
|
||||||
case "reload", "rollback":
|
case "reload", "rollback":
|
||||||
return "设备操作"
|
return "设备操作"
|
||||||
|
case "resource_sync_one", "resource_sync_all":
|
||||||
|
return "资源同步"
|
||||||
default:
|
default:
|
||||||
return "其他任务"
|
return "其他任务"
|
||||||
}
|
}
|
||||||
@ -264,6 +266,10 @@ func NewUI(discovery *service.DiscoveryService, registry *service.RegistryServic
|
|||||||
return "更新单个模型"
|
return "更新单个模型"
|
||||||
case "model_sync_all":
|
case "model_sync_all":
|
||||||
return "更新全部模型"
|
return "更新全部模型"
|
||||||
|
case "resource_sync_one":
|
||||||
|
return "同步单个资源"
|
||||||
|
case "resource_sync_all":
|
||||||
|
return "同步全部资源"
|
||||||
case "reload":
|
case "reload":
|
||||||
return "重载识别服务"
|
return "重载识别服务"
|
||||||
case "rollback":
|
case "rollback":
|
||||||
@ -284,6 +290,8 @@ func NewUI(discovery *service.DiscoveryService, registry *service.RegistryServic
|
|||||||
return "pill run"
|
return "pill run"
|
||||||
case "model_sync_one", "model_sync_all":
|
case "model_sync_one", "model_sync_all":
|
||||||
return "pill warn"
|
return "pill warn"
|
||||||
|
case "resource_sync_one", "resource_sync_all":
|
||||||
|
return "pill warn"
|
||||||
case "media_start", "media_restart", "media_stop":
|
case "media_start", "media_restart", "media_stop":
|
||||||
return "pill ok"
|
return "pill ok"
|
||||||
case "reload", "rollback":
|
case "reload", "rollback":
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user