package handler
import (
"encoding/json"
"fmt"
"github.com/goodrain/rainbond/api/model"
"github.com/goodrain/rainbond/api/util"
"github.com/goodrain/rainbond/db"
"github.com/goodrain/rainbond/mq/client"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
)
type TarImageHandle struct {
MQClient client.MQClient
}
var tarImageHandle *TarImageHandle
func GetTarImageHandle() *TarImageHandle {
if tarImageHandle == nil {
logrus.Error("TarImageHandle is not initialized")
}
return tarImageHandle
}
func CreateTarImageHandle(mqClient client.MQClient) {
tarImageHandle = &TarImageHandle{
MQClient: mqClient,
}
}
func (t *TarImageHandle) LoadTarImage(tenantID string, req model.LoadTarImageReq) (*model.LoadTarImageResp, *util.APIHandleError) {
loadID := uuid.New().String()
logrus.Infof("[LoadTarImage] Starting, load_id: %s, tenant_id: %s, event_id: %s, tar_file_path: %s",
loadID, tenantID, req.EventID, req.TarFilePath)
task := client.TaskStruct{
Topic: "builder",
TaskType: "load-tar-image",
TaskBody: map[string]interface{}{
"event_id": req.EventID,
"tar_file_path": req.TarFilePath,
"load_id": loadID,
"tenant_id": tenantID,
},
}
logrus.Infof("[LoadTarImage] Sending task to MQ, topic: %s, task_type: %s, task_body: %+v",
task.Topic, task.TaskType, task.TaskBody)
err := t.MQClient.SendBuilderTopic(task)
if err != nil {
logrus.Errorf("[LoadTarImage] Failed to send task to MQ: %v", err)
return nil, util.CreateAPIHandleError(500, fmt.Errorf("启动解析任务失败"))
}
logrus.Infof("[LoadTarImage] Task sent successfully to MQ, load_id: %s, event_id: %s", loadID, req.EventID)
return &model.LoadTarImageResp{
LoadID: loadID,
Status: "loading",
}, nil
}
func (t *TarImageHandle) GetTarLoadResult(loadID string) (*model.TarLoadResult, *util.APIHandleError) {
key := fmt.Sprintf("/rainbond/tarload/%s", loadID)
logrus.Infof("[GetTarLoadResult] Querying etcd for load_id: %s, key: %s", loadID, key)
res, err := db.GetManager().KeyValueDao().Get(key)
if err != nil || res == nil {
if err != nil {
logrus.Infof("[GetTarLoadResult] Key not found in etcd (task may still be processing): load_id: %s, error: %v", loadID, err)
} else {
logrus.Infof("[GetTarLoadResult] Result is nil for load_id: %s (task may still be processing)", loadID)
}
return &model.TarLoadResult{
LoadID: loadID,
Status: "loading",
Message: "正在解析中...",
}, nil
}
logrus.Infof("[GetTarLoadResult] Found result in etcd for load_id: %s, value length: %d bytes", loadID, len(res.V))
var result model.TarLoadResult
if err := json.Unmarshal([]byte(res.V), &result); err != nil {
logrus.Errorf("[GetTarLoadResult] Failed to decode result for load_id: %s, error: %v, raw_value: %s", loadID, err, res.V)
return nil, util.CreateAPIHandleError(500, fmt.Errorf("解析结果格式错误"))
}
logrus.Infof("[GetTarLoadResult] Successfully decoded result for load_id: %s, status: %s", loadID, result.Status)
return &result, nil
}