llm_pod.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package models
  2. import (
  3. "context"
  4. "yunion.io/x/jsonutils"
  5. "yunion.io/x/pkg/errors"
  6. computeapi "yunion.io/x/onecloud/pkg/apis/compute"
  7. api "yunion.io/x/onecloud/pkg/apis/llm"
  8. llmutil "yunion.io/x/onecloud/pkg/llm/utils"
  9. "yunion.io/x/onecloud/pkg/mcclient"
  10. "yunion.io/x/onecloud/pkg/mcclient/auth"
  11. "yunion.io/x/onecloud/pkg/mcclient/modules/compute"
  12. )
  13. func GetLLMPodCreateInput(
  14. ctx context.Context,
  15. userCred mcclient.TokenCredential,
  16. input *api.LLMCreateInput,
  17. llm *SLLM,
  18. sku *SLLMSku,
  19. llmImage *SLLMImage,
  20. eip string,
  21. ) (*computeapi.ServerCreateInput, error) {
  22. data, err := GetLLMBasePodCreateInput(ctx, userCred, &input.LLMBaseCreateInput, &llm.SLLMBase, &sku.SLLMSkuBase, eip)
  23. if err != nil {
  24. return nil, errors.Wrap(err, "GetLLMBasePodCreateInput: ")
  25. }
  26. // generate post overlay info
  27. {
  28. err = llm.UpdateMountedModelFullNames(ctx, userCred, nil, true, input.LLMImageId, input.LLMSkuId)
  29. if err != nil {
  30. return nil, errors.Wrap(err, "UpdateMountedModelFullNames")
  31. }
  32. }
  33. lcd := llm.GetLLMContainerDriver()
  34. containers := GetDriverPodContainers(ctx, lcd, llm, llmImage, sku, nil, nil, "")
  35. data.Pod = &computeapi.PodCreateInput{
  36. HostIPC: true,
  37. Containers: containers,
  38. }
  39. return data, nil
  40. }
  41. func GetLLMContainers(ctx context.Context, llm *SLLM) ([]*computeapi.SContainer, error) {
  42. admSession := auth.GetAdminSession(ctx, "")
  43. resp, err := compute.Containers.List(admSession, jsonutils.Marshal(map[string]string{"guest_id": llm.CmpId, "scope": "max"}))
  44. if err != nil {
  45. return nil, errors.Wrap(err, "Containers.List")
  46. }
  47. ctrs := make([]*computeapi.SContainer, 0)
  48. for _, c := range resp.Data {
  49. container := computeapi.SContainer{}
  50. if err := c.Unmarshal(&container); err != nil {
  51. return nil, errors.Wrap(err, "Unmarshal")
  52. }
  53. ctrs = append(ctrs, &container)
  54. }
  55. return ctrs, nil
  56. }
  57. func UpdateContainerIfNeeded(ctx context.Context, userCred mcclient.TokenCredential, ctrId string, input *computeapi.PodContainerCreateInput) (*computeapi.SContainer, error) {
  58. ctr, err := llmutil.UpdateContainer(ctx, ctrId, func(ctr *computeapi.SContainer) *computeapi.ContainerSpec {
  59. return &input.ContainerSpec
  60. })
  61. if err != nil {
  62. return nil, errors.Wrapf(err, "UpdateContainer %s", ctrId)
  63. }
  64. return ctr, nil
  65. }
  66. func GetContainersToUpdate(
  67. drv ILLMContainerDriver,
  68. ctx context.Context,
  69. input *ContainersToUpdateInput,
  70. ) (map[string]*computeapi.PodContainerCreateInput, error) {
  71. podCtrs := GetDriverPodContainers(ctx, drv, input.LLM, input.Image, input.Sku, input.Input.Property, input.ServerDetails.IsolatedDevices, input.Disk.Id)
  72. ret := make(map[string]*computeapi.PodContainerCreateInput)
  73. for i := range input.Containers {
  74. currentCtr := input.Containers[i]
  75. podCtr, err := drv.MatchContainerToUpdate(currentCtr, podCtrs)
  76. if err != nil {
  77. return nil, errors.Wrapf(err, "match container %s to update", currentCtr.Name)
  78. }
  79. ret[currentCtr.Id] = podCtr
  80. }
  81. return ret, nil
  82. }