mirror of
https://github.com/XShengTech/MEGREZ.git
synced 2026-01-14 00:57:17 +08:00
102 lines
2.8 KiB
Go
102 lines
2.8 KiB
Go
package instanceController
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"megrez/libs/request"
|
|
"megrez/models"
|
|
"megrez/services/database"
|
|
"strconv"
|
|
)
|
|
|
|
func Restart(instance *models.Instances) (err error) {
|
|
l.SetFunction("Restart")
|
|
|
|
if instance.Status == models.InstanceStatusStopped || instance.Status == models.InstanceStatusPaused {
|
|
instance.Status = models.InstanceStatusStarting
|
|
} else {
|
|
instance.Status = models.InstanceStatusRestarting
|
|
}
|
|
result := database.DB.Save(&instance)
|
|
if result.Error != nil {
|
|
l.Error("save instance error: %v", result.Error)
|
|
return result.Error
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
err = restartInstance(server.IP, server.Port, server.Apikey, instance.ContainerName)
|
|
if err != nil {
|
|
l.Error("restart instance error: %v", err)
|
|
return err
|
|
}
|
|
|
|
err = SetRootPassword(server.IP, server.Port, server.Apikey, instance.ContainerName, instance.SshPasswd)
|
|
if err != nil {
|
|
l.Error("set root password error: %v", err)
|
|
return err
|
|
}
|
|
|
|
go func() {
|
|
SetJupterPassword(server.IP, server.Port, server.Apikey, instance.ContainerName, instance.SshPasswd)
|
|
SetCodeServerPassword(server.IP, server.Port, server.Apikey, instance.ContainerName, instance.SshPasswd)
|
|
}()
|
|
|
|
portBindings, err := GetPortForward(server.IP, server.Port, server.Apikey, instance.ContainerName)
|
|
if err != nil {
|
|
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["8888"]
|
|
instance.GrafanaAddress = server.IP + ":" + portBindings["3000"]
|
|
instance.CodeServerAddress = server.IP + ":" + portBindings["8080"]
|
|
|
|
instance.Status = models.InstanceStatusRunning
|
|
result = database.DB.Save(&instance)
|
|
if result.Error != nil {
|
|
l.Error("save instance error: %v", result.Error)
|
|
return result.Error
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func restartInstance(ip string, port int, apikey, containerName string) (err error) {
|
|
l.SetFunction("restartInstance")
|
|
|
|
c := request.NewRequest().Patch().
|
|
SetUrl("http://" + ip + ":" + strconv.Itoa(port) + apiPrefix + instancePrefix + "/" + containerName + instanceRestart).
|
|
SetAuthorization("Bearer " + apikey).
|
|
SetUserAgent("megrez")
|
|
c.Do()
|
|
|
|
if c.GetStatusCode() != 200 {
|
|
l.Error("restart instance error: %v", c.GetBody())
|
|
return errors.New("restart 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("restart instance error: %v", res.Msg)
|
|
return errors.New(res.Msg)
|
|
}
|
|
|
|
return nil
|
|
}
|