Files
cloudpods/pkg/llm/models/llm_base_pod.go

174 lines
4.4 KiB
Go

package models
import (
"context"
"fmt"
"yunion.io/x/jsonutils"
"yunion.io/x/onecloud/pkg/apis"
computeapi "yunion.io/x/onecloud/pkg/apis/compute"
api "yunion.io/x/onecloud/pkg/apis/llm"
"yunion.io/x/onecloud/pkg/mcclient"
)
const (
POD_METADATA_POST_STOP_CLEANUP_CONFIG = "post_stop_cleanup_config"
)
type PodPostStopCleanupConfig struct {
Dirs []string `json:"dirs"`
}
func GetLLMBasePodCreateInput(
ctx context.Context,
userCred mcclient.TokenCredential,
input *api.LLMBaseCreateInput,
llmBase *SLLMBase,
skuBase *SLLMSkuBase,
eip string,
) (*computeapi.ServerCreateInput, error) {
data := computeapi.ServerCreateInput{}
data.AutoStart = input.AutoStart
data.ServerConfigs = computeapi.NewServerConfigs()
data.Hypervisor = computeapi.HYPERVISOR_POD
postStopCleanupConfgi := PodPostStopCleanupConfig{
Dirs: []string{
GetTmpHostPath(llmBase.GetName()),
},
}
data.Metadata = map[string]string{
POD_METADATA_POST_STOP_CLEANUP_CONFIG: jsonutils.Marshal(postStopCleanupConfgi).String(),
}
data.VcpuCount = skuBase.Cpu
data.VmemSize = skuBase.Memory
// data.Name = input.Name + "-" + seclib.RandomPassword(6)
data.Name = input.Name
// disks
data.Disks = make([]*computeapi.DiskConfig, 0)
if skuBase.Volumes != nil && !skuBase.Volumes.IsZero() {
for idx, volume := range *skuBase.Volumes {
data.Disks = append(data.Disks, &computeapi.DiskConfig{
DiskType: "data",
Format: "raw",
Fs: "ext4",
SizeMb: volume.SizeMB,
Index: idx,
})
}
}
// isolated devices
if skuBase.Devices != nil && !skuBase.Devices.IsZero() {
data.IsolatedDevices = make([]*computeapi.IsolatedDeviceConfig, 0)
devices := *skuBase.Devices
for i := 0; i < len(devices); i++ {
isolatedDevice := &computeapi.IsolatedDeviceConfig{
DevType: devices[i].DevType,
Model: devices[i].Model,
DevicePath: devices[i].DevicePath,
}
data.IsolatedDevices = append(data.IsolatedDevices, isolatedDevice)
}
}
// port mappings
// var portRange *computeapi.GuestPortMappingPortRange
portMappings := computeapi.GuestPortMappings{}
if skuBase.PortMappings != nil && !skuBase.PortMappings.IsZero() {
// hostTcpPortRange := computeapi.GuestPortMappingPortRange{
// Start: options.Options.HostTcpPortStart,
// End: options.Options.HostTcpPortEnd,
// }
// hostUdpPortRange := computeapi.GuestPortMappingPortRange{
// Start: options.Options.HostUdpPortStart,
// End: options.Options.HostUdpPortEnd,
// }
for _, portInfo := range *skuBase.PortMappings {
remoteIps := portInfo.RemoteIps
if len(remoteIps) == 0 {
remoteIps = nil
}
// if portInfo.Protocol == "tcp" {
// portRange = &hostTcpPortRange
// } else {
// portRange = &hostUdpPortRange
// }
portMappings = append(portMappings, &computeapi.GuestPortMapping{
Port: portInfo.ContainerPort,
Protocol: computeapi.GuestPortMappingProtocol(portInfo.Protocol),
RemoteIps: remoteIps,
// HostPortRange: portRange,
Rule: &computeapi.GuestPortMappingRule{
FirstPortOffset: portInfo.FirstPortOffset,
},
Envs: portInfo.Envs,
})
}
}
var network *computeapi.NetworkConfig
if len(input.Nets) > 0 {
network = input.Nets[0]
networkCopy := *network
network = &networkCopy
network.Index = 0
}
bandwidth := input.BandwidthMB
if bandwidth == 0 && network.BwLimit != 0 {
bandwidth = network.BwLimit
}
if bandwidth == 0 && skuBase.Bandwidth != 0 {
bandwidth = skuBase.Bandwidth
}
network.BwLimit = bandwidth
if len(network.PortMappings) == 0 {
network.PortMappings = portMappings
}
data.Networks = []*computeapi.NetworkConfig{
network,
}
data.Count = 1
data.PreferHost = input.PreferHost
data.ProjectId = input.ProjectId
if len(data.ProjectId) == 0 {
data.ProjectId = userCred.GetProjectId()
data.TenantId = userCred.GetTenantId()
}
return &data, nil
}
func NewHostDev(path string) *computeapi.ContainerDevice {
return &computeapi.ContainerDevice{
Type: apis.CONTAINER_DEVICE_TYPE_HOST,
Host: &computeapi.ContainerHostDevice{
HostPath: path,
ContainerPath: path,
Permissions: "rwm",
},
}
}
func NewEnv(key, val string) *apis.ContainerKeyValue {
return &apis.ContainerKeyValue{
Key: key,
Value: val,
}
}
func GetTmpHostPath(name string) string {
return fmt.Sprintf("/tmp/%s", name)
}
func GetSvrLLMContainer(ctrs []*computeapi.PodContainerDesc) *computeapi.PodContainerDesc {
return ctrs[0]
}