megrez/services/instanceController/createInstance.go
2025-03-04 18:21:57 +08:00

101 lines
2.4 KiB
Go

package instanceController
import (
"bytes"
"encoding/json"
"errors"
"megrez/libs/crypto"
"megrez/libs/request"
"megrez/services/config"
"strconv"
)
type createInstanceReqStruct struct {
ImageName string `json:"imageName"`
ReplicaSetName string `json:"replicaSetName"`
CpuCount int `json:"cpuCount"`
GpuCount int `json:"gpuCount"`
Memory string `json:"memory"`
Binds []bindStruct `json:"binds"`
Env []string `json:"env"`
ContainerPorts []string `json:"containerPorts"`
}
func createInstance(ip string, port int, apikey string,
gpuCount, cpuCount, memorySize int, volumeName string, imageName string,
) (containerName string, err error) {
l.SetFunction("createInstance")
containerName, err = crypto.GenerateUUIDWithoutHyphen()
if err != nil {
l.Error("generate instance name error: %v", err)
return "", err
}
data := createInstanceReqStruct{
ImageName: imageName,
ReplicaSetName: containerName,
CpuCount: cpuCount,
GpuCount: gpuCount,
Memory: strconv.Itoa(memorySize) + "GB",
ContainerPorts: []string{
"22", // SSH
"80", // Nginx
"6007", // TensorBoard
"34567", // Custom Port
},
Env: []string{
"NVIDIA_DRIVER_CAPABILITIES=video,compute,utility",
"NVIDIA_VISIBLE_DEVICES=none",
},
}
if volumeName != "" {
data.Binds = []bindStruct{
{
Src: volumeName,
Dest: "/root/megrez-tmp",
},
}
}
if config.GetSystemMountDir() != "" {
data.Binds = append(data.Binds, bindStruct{
Src: config.GetSystemMountDir(),
Dest: "/root/megrez-mnt",
})
}
reqBytes, err := json.Marshal(data)
if err != nil {
l.Error("marshal request data error: %v", err)
return "", err
}
c := request.NewRequest().Post().
SetUrl("http://" + ip + ":" + strconv.Itoa(port) + apiPrefix + instancePrefix).
SetAuthorization("Bearer " + apikey).
SetUserAgent("megrez").
SetBody(bytes.NewBuffer(reqBytes))
c.Do()
if c.GetStatusCode() != 200 {
l.Error("create instance error: %d", c.GetStatusCode())
return "", errors.New("create instance request error")
}
var res resStruct
err = json.Unmarshal(c.GetBody(), &res)
if err != nil {
l.Error("unmarshal response data error: %v", err)
return "", err
}
if res.Code != 200 {
l.Error("create instance code: %d, error: %s", res.Code, res.Msg)
return "", errors.New(res.Msg)
}
return
}