package uploadersdk import ( "fmt" "gitlink.org.cn/cloudream/common/pkgs/types" sch "gitlink.org.cn/cloudream/common/sdks/pcmscheduler" cdssdk "gitlink.org.cn/cloudream/common/sdks/storage" "gitlink.org.cn/cloudream/common/sdks/storage/cdsapi" "gitlink.org.cn/cloudream/common/utils/http2" "gitlink.org.cn/cloudream/common/utils/serder" "net/url" "strings" ) type DataScheduleReq struct { PackageID cdssdk.PackageID `json:"packageID"` DataType string `json:"dataType"` ScheduleTarget ScheduleTarget `json:"scheduleTarget"` } //type DataScheduleResp struct { // Results []sch.DataScheduleResult `json:"data"` //} type TmpDataScheduleResult struct { Cluster sch.DataDetail `json:"cluster"` PackageID cdssdk.PackageID `json:"packageID"` Status bool `json:"status"` Msg string `json:"msg"` } func (c *Client) DataSchedule(req DataScheduleReq) ([]sch.DataScheduleResult, error) { targetUrl, err := url.JoinPath(c.baseURL, "/dataSchedule") if err != nil { return nil, err } resp, err := http2.PostJSON(targetUrl, http2.RequestParam{ Body: req, }) if err != nil { return nil, err } println(resp.Body) contType := resp.Header.Get("Content-Type") if strings.Contains(contType, http2.ContentTypeJSON) { var codeResp response[[]TmpDataScheduleResult] if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil { return nil, fmt.Errorf("parsing response: %w", err) } if codeResp.Code == ResponseCodeOK { var results []sch.DataScheduleResult for _, tmpResult := range codeResp.Data { result := sch.DataScheduleResult{ PackageID: tmpResult.PackageID, Status: tmpResult.Status, Msg: tmpResult.Msg, Clusters: []sch.DataDetail{ tmpResult.Cluster, }, } results = append(results, result) } return results, nil } return nil, codeResp.ToError() } return nil, fmt.Errorf("unknow response content type: %s", contType) } type UploadReq struct { DataType string `json:"dataType"` Source UploadSource `json:"source"` Target UploadTarget `json:"target"` //StorageIDs []cdssdk.StorageID `json:"storageIDs"` } type UploadSource interface { Noop() } var UploadSourceTypeUnion = types.NewTypeUnion[UploadSource]( (*PackageSource)(nil), (*UrlSource)(nil), ) var _ = serder.UseTypeUnionInternallyTagged(&UploadSourceTypeUnion, "type") type PackageSource struct { serder.Metadata `union:"jcs"` UploadSourceBase Type string `json:"type"` PackageID cdssdk.PackageID `json:"packageID"` } type UrlSource struct { serder.Metadata `union:"url"` UploadSourceBase Type string `json:"type"` Url string `json:"url"` } type UploadSourceBase struct{} func (d *UploadSourceBase) Noop() {} type UploadTarget interface { Noop() } var UploadTargetTypeUnion = types.NewTypeUnion[UploadTarget]( (*UrlTarget)(nil), (*ApiTarget)(nil), ) var _ = serder.UseTypeUnionInternallyTagged(&UploadTargetTypeUnion, "type") type UrlTarget struct { serder.Metadata `union:"url"` UploadTargetBase Type string `json:"type"` ClusterID ClusterID `json:"clusterId"` JCSUploadInfo cdsapi.ObjectUploadInfo `form:"JCSUploadInfo"` } type ApiTarget struct { serder.Metadata `union:"api"` UploadTargetBase Type string `json:"type"` Clusters []ClusterID `json:"clusters"` } type UploadTargetBase struct{} func (d *UploadTargetBase) Noop() {} type UploadResp struct { PackageID cdssdk.PackageID `json:"packageID"` ObjectIDs []cdssdk.ObjectID `json:"objectIDs"` ClusterID ClusterID `json:"clusterID"` JsonData string `json:"jsonData"` Status bool `json:"status"` Message string `json:"message"` } func (c *Client) Upload(req UploadReq) (*UploadResp, error) { targetUrl, err := url.JoinPath(c.baseURL, "/dataUpload") if err != nil { return nil, err } resp, err := http2.PostJSON(targetUrl, http2.RequestParam{ Body: req, }) if err != nil { return nil, err } contType := resp.Header.Get("Content-Type") if strings.Contains(contType, http2.ContentTypeJSON) { var codeResp response[UploadResp] if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil { return nil, fmt.Errorf("parsing response: %w", err) } if codeResp.Code == ResponseCodeOK { return &codeResp.Data, nil } return nil, codeResp.ToError() } return nil, fmt.Errorf("unknow response content type: %s", contType) }