diff --git a/models/Server.go b/models/Server.go index 4524eaa..fb327eb 100644 --- a/models/Server.go +++ b/models/Server.go @@ -1,7 +1,10 @@ package models import ( + "encoding/json" + "fmt" "main/configs" + "net/http" "time" ) @@ -19,6 +22,30 @@ type Server struct { UpdatedAt time.Time `json:"updated_at" gorm:"autoUpdateTime"` } +func (server *Server) CheckStatus() bool { + resp, err := http.Get(fmt.Sprintf("http://%s:%d/status", server.IP, server.Port)) + if err != nil { + return false + } + defer resp.Body.Close() + + // 解碼json + var data map[string]interface{} + if err := json.NewDecoder(resp.Body).Decode(&data); err != nil { + return false + } + + fmt.Println("data:", data) + + // 檢查服務器是否正常 + if data["status"] != "ok" { + return false + } + + // 檢查服務器是否正常 + return true +} + func init() { configs.ORMDB().AutoMigrate(&Server{}) @@ -30,4 +57,16 @@ func init() { Port: 7860, Status: "閒置", }) + + // 檢查所有服務器的狀態, 無效的服務器設置為異常 + var servers []Server + configs.ORMDB().Find(&servers) + for _, server := range servers { + if server.Status != "異常" { + if !server.CheckStatus() { + server.Status = "異常" + configs.ORMDB().Save(&server) + } + } + } } diff --git a/routers/models.go b/routers/models.go index 16784d4..117252c 100644 --- a/routers/models.go +++ b/routers/models.go @@ -138,7 +138,6 @@ func ModelItemGet(w http.ResponseWriter, r *http.Request) { } var model = models.Model{ID: utils.ParamInt(mux.Vars(r)["id"], 0)} - fmt.Println(model) if err := configs.ORMDB().Take(&model, utils.ParamInt(mux.Vars(r)["id"], 0)).Error; err != nil { w.WriteHeader(http.StatusNotFound) w.Write([]byte(err.Error())) diff --git a/routers/servers.go b/routers/servers.go index 09044b8..6c272b9 100644 --- a/routers/servers.go +++ b/routers/servers.go @@ -19,6 +19,9 @@ func ServersGet(w http.ResponseWriter, r *http.Request) { listview.PageSize = utils.ParamInt(r.URL.Query().Get("pageSize"), 10) var server_list []models.Server db := configs.ORMDB() + // 獲取服務器總數 + db.Model(&models.Server{}).Count(&listview.Total) + // 獲取服務器列表 db.Offset((listview.Page - 1) * listview.PageSize).Limit(listview.PageSize).Find(&server_list) for _, server := range server_list { // 驗證服務器狀態 diff --git a/test.sh b/test.sh index 54b6000..9d3427b 100755 --- a/test.sh +++ b/test.sh @@ -4,68 +4,82 @@ start_time=$(date +%s) rm -f data/sqlite3.db -# 流程測試, 啓動服務, 設定進程名 go_test -go run main.go -procname go_test & +# 流程測試, 啓動服務, 設定進程名 go_test, 並將日誌隱藏 +go run main.go -procname go_test > /dev/null 2>&1 & sleep 2 # 退出服務的函數 function exit_service() { pkill -f go_test && rm -f data/sqlite3.db && echo "退出服務: $1" && exit 1; } +# 驗證結果的函數 +function message() { + response=$1 + info=$2 + if [[ ${response: -3} -eq 200 ]]; then + if [[ $# -eq 3 ]] && [[ $3 == true ]]; then + echo "[測試成功] $info: $response" + else + echo "[測試成功] $info" + fi + else + pkill -f go_test && rm -f data/sqlite3.db && echo "[$info]測試失敗: $response" && exit 1 + fi +} # 創建用戶 (POST /api/users) response=$(curl -X POST -H "Content-Type: application/json" -d '{"name":"test","password":"test","email":""}' -s -w "%{http_code}" http://localhost:8080/api/users) -[[ ${response: -3} -eq 200 ]] && { echo "創建用戶成功: ${response%???}"; } || exit_service "創建用戶失敗: ${response%???}" +message "$response" "創建用戶" -## 獲取用戶列表 (GET /api/users) -#response=$(curl -X GET -H "Content-Type: application/json" -s -w "%{http_code}" http://localhost:8080/api/users) -#[[ ${response: -3} -eq 200 ]] && { echo "獲取用戶列表成功: ${response%???}"; } || exit_service "獲取用戶列表失敗: ${response%???}" +# 獲取用戶列表 (GET /api/users) +response=$(curl -X GET -H "Content-Type: application/json" -s -w "%{http_code}" http://localhost:8080/api/users) +message "$response" "用戶列表" # 登錄 (POST /api/sessions) response=$(curl -X POST -H "Content-Type: application/json" -d '{"name":"test","password":"test"}' -s -w "%{http_code}" http://localhost:8080/api/sessions) -[[ ${response: -3} -eq 200 ]] && { echo "登錄成功: ${response%???}"; } || exit_service "登錄失敗: ${response%???}" +message "$response" "登錄" # 不使用jq, 從一段json中取出id字段的值 session_id=$(echo "$response" | head -n -1 | grep -o '"id": "[^"]*' | cut -d '"' -f 4) -echo "session_id: $session_id" +#echo "session_id: $session_id" # 創建數據集, 應當在cookie中攜帶session_id (POST /api/datasets) response=$(curl -X POST -H "Content-Type: application/json" -d '{"name":"test","description":"test"}' -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/datasets) -[[ ${response: -3} -eq 200 ]] && { echo "創建數據集成功: ${response%???}"; } || exit_service "創建數據集失敗: ${response%???}" +message "$response" "創建數據集" # 取數據集id的值, 值爲 int dataset_id=$(echo "${response%???}" | grep -o '"id": [0-9]*' | awk '{print $2}') -echo "dataset_id: $dataset_id" +#echo "dataset_id: $dataset_id" -## 獲取數據集列表 (GET /api/datasets) -#response=$(curl -X GET -H "Content-Type: application/json" -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/datasets) -#[[ ${response: -3} -eq 200 ]] && { echo "獲取數據集列表成功: ${response%???}"; } || exit_service "獲取數據集列表失敗: ${response%???}" +# 獲取數據集列表 (GET /api/datasets) +response=$(curl -X GET -H "Content-Type: application/json" -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/datasets) +message "$response" "數據集列表" # 修改數據集, images 中增加 url (PATCH /api/datasets/:id) response=$(curl -X PATCH -H "Content-Type: application/json" -d '{"images":["https://img.gameui.net/article-7258-1677745322000@1x456.webp","https://img.gameui.net/article-6477-1682109454000@1x456.webp"]}' -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/datasets/$dataset_id) -[[ ${response: -3} -eq 200 ]] && { echo "修改數據集成功: ${response%???}"; } || exit_service "修改數據集失敗: ${response%???}" +message "$response" "修改數據集" -## 訓練模型 (POST /api/models) -#response=$(curl -X POST -H "Content-Type: application/json" -d '{"name":"test","type":"dreambooth","trigger_words":"miao~","base_model":"sd1.5","epochs":20,"description":"test","dataset_id":'$dataset_id'}' -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/models) -#[[ ${response: -3} -eq 200 ]] && { echo "訓練模型任務已創建: ${response%???}"; } || exit_service "訓練模型任務創建失敗: ${response%???}" -# -# -## 取模型id的值, 值爲 int -#model_id=$(echo "${response%???}" | grep -o '"id": [0-9]*' | awk '{print $2}') +# 訓練模型 (POST /api/models) +response=$(curl -X POST -H "Content-Type: application/json" -d '{"name":"test","type":"dreambooth","trigger_words":"miao~","base_model":"sd1.5","epochs":20,"description":"test","dataset_id":'$dataset_id'}' -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/models) +message "$response" "訓練模型" + + +# 取模型id的值, 值爲 int +model_id=$(echo "${response%???}" | grep -o '"id": [0-9]*' | awk '{print $2}') #echo "model_id: $model_id" -# + # 模型列表 (GET /api/models) - response=$(curl -X GET -H "Content-Type: application/json" -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/models) - [[ ${response: -3} -eq 200 ]] && { echo "獲取模型列表成功: ${response%???}"; } || exit_service "獲取模型列表失敗: ${response%???}" +response=$(curl -X GET -H "Content-Type: application/json" -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/models) +message "$response" "模型列表" true ## 獲取模型訓練進度 (GET /api/models/:id) @@ -92,7 +106,7 @@ response=$(curl -X PATCH -H "Content-Type: application/json" -d '{"images":["htt # 服務器列表 response=$(curl -X GET -b "session_id=$session_id" -s -w "%{http_code}" http://localhost:8080/api/servers) -[[ ${response: -3} -eq 200 ]] && { echo "獲取服務器列表成功: ${response%???}"; } || exit_service "獲取服務器列表失敗: ${response%???}" +message "$response" "服務器列表" true sleep 10