84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
package scheduler
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/algo"
|
|
"gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types"
|
|
"gitlink.org.cn/jcce-pcm/pcm-coordinator/model"
|
|
"gitlink.org.cn/jcce-pcm/utils/tool"
|
|
"io"
|
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
syaml "k8s.io/apimachinery/pkg/runtime/serializer/yaml"
|
|
kyaml "k8s.io/apimachinery/pkg/util/yaml"
|
|
)
|
|
|
|
type cloudScheduler struct {
|
|
}
|
|
|
|
func NewCloudScheduler() *cloudScheduler {
|
|
return &cloudScheduler{}
|
|
}
|
|
|
|
func (cs *cloudScheduler) pickOptimalStrategy(task *algo.Task, providers ...*algo.Provider) (*algo.Task, error) {
|
|
//参数为空返回 nil
|
|
if len(providers) == 0 || task == nil {
|
|
return nil, nil
|
|
}
|
|
|
|
//调度算法
|
|
strategy := algo.NewK8sStrategy(task, providers...)
|
|
taskResult, err := algo.ScheduleWithFullCollaboration(strategy, strategy.ProviderList)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return taskResult, nil
|
|
}
|
|
|
|
func (cs *cloudScheduler) getNewStructForDb(task *types.TaskInfo, participantId int64) (interface{}, error) {
|
|
bytes, err := json.Marshal(task.Metadata)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cloud := cs.UnMarshalK8sStruct(string(bytes), task.TaskId)
|
|
cloud.Id = tool.GenSnowflakeID()
|
|
cloud.YamlString = string(bytes)
|
|
cloud.ParticipantId = participantId
|
|
return cloud, nil
|
|
}
|
|
|
|
func (cs *cloudScheduler) UnMarshalK8sStruct(yamlString string, taskId int64) model.Cloud {
|
|
var cloud model.Cloud
|
|
d := kyaml.NewYAMLOrJSONDecoder(bytes.NewBufferString(yamlString), 4096)
|
|
var err error
|
|
for {
|
|
var rawObj runtime.RawExtension
|
|
err = d.Decode(&rawObj)
|
|
if err == io.EOF {
|
|
break
|
|
}
|
|
if err != nil {
|
|
}
|
|
obj := &unstructured.Unstructured{}
|
|
syaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, obj)
|
|
if err != nil {
|
|
}
|
|
|
|
unstructuredMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
|
|
if err != nil {
|
|
}
|
|
|
|
unstructureObj := &unstructured.Unstructured{Object: unstructuredMap}
|
|
cloud = model.Cloud{
|
|
TaskId: taskId,
|
|
ApiVersion: unstructureObj.GetAPIVersion(),
|
|
Name: unstructureObj.GetName(),
|
|
Kind: unstructureObj.GetKind(),
|
|
Namespace: unstructureObj.GetNamespace(),
|
|
Status: "Saved",
|
|
}
|
|
}
|
|
return cloud
|
|
}
|