You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cloudScheduler.go 2.2 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package scheduler
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/algo"
  6. "gitlink.org.cn/jcce-pcm/pcm-coordinator/api/internal/types"
  7. "gitlink.org.cn/jcce-pcm/pcm-coordinator/model"
  8. "io"
  9. "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
  10. "k8s.io/apimachinery/pkg/runtime"
  11. syaml "k8s.io/apimachinery/pkg/runtime/serializer/yaml"
  12. kyaml "k8s.io/apimachinery/pkg/util/yaml"
  13. )
  14. type cloudScheduler struct {
  15. }
  16. func NewCloudScheduler() *cloudScheduler {
  17. return &cloudScheduler{}
  18. }
  19. func (cs cloudScheduler) pickOptimalStrategy(task *algo.Task, providers ...*algo.Provider) (*algo.Task, error) {
  20. strategy := algo.NewK8sStrategy(task, providers...)
  21. taskResult, err := algo.ScheduleWithFullCollaboration(strategy, strategy.ProviderList)
  22. if err != nil {
  23. return nil, err
  24. }
  25. return taskResult, nil
  26. }
  27. func (cs cloudScheduler) getNewStructForDb(task *types.TaskInfo, participantIds []int64) (interface{}, error) {
  28. bytes, err := json.Marshal(task.Metadata)
  29. if err != nil {
  30. return nil, err
  31. }
  32. cloud := cs.UnMarshalK8sStruct(string(bytes), task.TaskId)
  33. cloud.YamlString = string(bytes)
  34. if len(participantIds) != 0 {
  35. cloud.ParticipantId = participantIds[0]
  36. }
  37. return cloud, nil
  38. }
  39. func (cs cloudScheduler) UnMarshalK8sStruct(yamlString string, taskId int64) model.Cloud {
  40. var cloud model.Cloud
  41. d := kyaml.NewYAMLOrJSONDecoder(bytes.NewBufferString(yamlString), 4096)
  42. var err error
  43. for {
  44. var rawObj runtime.RawExtension
  45. err = d.Decode(&rawObj)
  46. if err == io.EOF {
  47. break
  48. }
  49. if err != nil {
  50. }
  51. obj := &unstructured.Unstructured{}
  52. syaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, obj)
  53. if err != nil {
  54. }
  55. unstructuredMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
  56. if err != nil {
  57. }
  58. unstructureObj := &unstructured.Unstructured{Object: unstructuredMap}
  59. cloud = model.Cloud{
  60. TaskId: taskId,
  61. ApiVersion: unstructureObj.GetAPIVersion(),
  62. Name: unstructureObj.GetName(),
  63. Kind: unstructureObj.GetKind(),
  64. Namespace: unstructureObj.GetNamespace(),
  65. Status: "Saved",
  66. }
  67. }
  68. return cloud
  69. }

PCM is positioned as Software stack over Cloud, aiming to build the standards and ecology of heterogeneous cloud collaboration for JCC in a non intrusive and autonomous peer-to-peer manner.