megrez/services/instanceController/create.go
2025-02-23 22:14:27 +08:00

76 lines
2.6 KiB
Go

package instanceController
import (
"megrez/models"
"megrez/services/database"
)
func Create(instance *models.Instances) (containerName, volumeName string, err error) {
l.SetFunction("Create")
server := models.Servers{
ID: instance.ServerID,
}
result := database.DB.First(&server)
if result.Error != nil {
l.Error("query server error: %v", result.Error)
return "", "", result.Error
}
if instance.VolumeSize != 0 {
volumeName, err = createVolume(server.IP, server.Port, server.Apikey, instance.VolumeSize)
if err != nil {
l.Error("create volume error: %v", err)
return "", "", err
}
instance.VolumeName = volumeName
}
containerName, err = createInstance(server.IP, server.Port, server.Apikey, instance.GpuCount, server.CpuCountPerGpu*instance.GpuCount, server.MemoryPerGpu*instance.GpuCount, instance.VolumeName, instance.ImageName)
if err != nil {
l.Error("create instance error: %v", err)
deleteInstance(server.IP, server.Port, server.Apikey, containerName)
if instance.VolumeName != "" {
deleteVolume(server.IP, server.Port, server.Apikey, instance.VolumeName, false)
}
return "", "", err
}
instance.ContainerName = containerName
err = SetRootPassword(server.IP, server.Port, server.Apikey, containerName, instance.SshPasswd)
if err != nil {
deleteInstance(server.IP, server.Port, server.Apikey, containerName)
if instance.VolumeName != "" {
deleteVolume(server.IP, server.Port, server.Apikey, instance.VolumeName, false)
}
l.Error("set root password error: %v", err)
return "", "", err
}
go func() {
SetJupyterPassword(server.IP, server.Port, server.Apikey, containerName, instance.SshPasswd)
SetCodeServerPassword(server.IP, server.Port, server.Apikey, containerName, instance.SshPasswd)
}()
portBindings, err := GetPortForward(server.IP, server.Port, server.Apikey, containerName)
if err != nil {
deleteInstance(server.IP, server.Port, server.Apikey, containerName)
if instance.VolumeName != "" {
deleteVolume(server.IP, server.Port, server.Apikey, instance.VolumeName, false)
}
l.Error("get port forward error: %v", err)
return "", "", err
}
instance.SshAddress = server.IP + ":" + portBindings["22"]
instance.TensorBoardAddress = server.IP + ":" + portBindings["6007"]
instance.JupyterAddress = server.IP + ":" + portBindings["80"] + "/jupyter"
instance.GrafanaAddress = server.IP + ":" + portBindings["80"] + "/monitor/public-dashboards/2c510f203876465ba76617510ce3e219"
instance.CodeServerAddress = server.IP + ":" + portBindings["80"] + "/code-server/"
instance.Status = 0
result = database.DB.Save(&instance)
return containerName, volumeName, nil
}