feat(delivery): sync mysql service ledger and credentials

This commit is contained in:
mac
2026-07-30 16:09:13 +08:00
parent f41abfd609
commit 1aa984c7e5
15 changed files with 1322 additions and 262 deletions
+36
View File
@@ -1,6 +1,7 @@
package service
import (
"encoding/base64"
"encoding/json"
"testing"
"time"
@@ -88,6 +89,18 @@ func TestValidateDeliveryInput(t *testing.T) {
}
}
func TestParseMySQLInspectResults(t *testing.T) {
payload := `[{"id":7,"task_id":"task-1","instance_name":"mysql-01","host":"k8s-01","status":"running","port_listening":true}]`
stdout := `ok: [k8s-01] => {"msg": "XINFRA_MYSQL_INSPECT_RESULT_B64=` + base64.StdEncoding.EncodeToString([]byte(payload)) + `"}`
items := parseMySQLInspectResults(stdout)
if len(items) != 1 {
t.Fatalf("len(items) = %d, want 1", len(items))
}
if items[0].ID != 7 || items[0].Status != "running" || !items[0].PortListening {
t.Fatalf("unexpected inspect result: %+v", items[0])
}
}
func TestFirstFreeHost(t *testing.T) {
hosts := []targetHost{{Name: "node-a"}, {Name: "node-b"}}
if h := firstFreeHost(hosts, nil, 1); h == nil || h.Name != "node-a" {
@@ -164,6 +177,29 @@ func TestBuildCloudDMRegisterRequest(t *testing.T) {
}
}
func TestCloudDMDataSourceIDFromResponse(t *testing.T) {
tests := []struct {
name string
body string
want uint64
ok bool
}{
{name: "direct data", body: `{"data":123}`, want: 123, ok: true},
{name: "nested data source id", body: `{"code":0,"data":{"dataSourceId":456}}`, want: 456, ok: true},
{name: "nested id", body: `{"success":true,"data":{"id":789}}`, want: 789, ok: true},
{name: "string ds id", body: `{"dsId":"321"}`, want: 321, ok: true},
{name: "missing", body: `{"code":0,"message":"ok"}`, want: 0, ok: false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, ok := cloudDMDataSourceIDFromResponse([]byte(tt.body))
if got != tt.want || ok != tt.ok {
t.Fatalf("cloudDMDataSourceIDFromResponse() = %d, %v; want %d, %v", got, ok, tt.want, tt.ok)
}
})
}
}
func TestRollbackExtraVarsTargetsOnlyTheAllocatedInstance(t *testing.T) {
task := &model.DeliveryTask{ID: "task-1", TargetHost: "db-01"}
payload := deliveryPayload{MySQLDeliveryInput: MySQLDeliveryInput{InstanceName: "mysql-a", DataDisk: "/disk1"}}