feat(oneos): add signed scope API client

This commit is contained in:
lingniu
2026-07-16 18:49:01 +08:00
parent 1243efc7dd
commit 46f2026c03
10 changed files with 555 additions and 41 deletions

View File

@@ -23,10 +23,6 @@ func main() {
}
func run() error {
sourceDSN, err := normalizedDSN("ONEOS_MYSQL_DSN", os.Getenv("ONEOS_MYSQL_DSN"), true)
if err != nil {
return err
}
targetDSN, err := normalizedDSN("MYSQL_DSN", os.Getenv("MYSQL_DSN"), false)
if err != nil {
return err
@@ -34,21 +30,12 @@ func run() error {
timeout := time.Duration(envInt("ONEOS_SCOPE_SYNC_TIMEOUT_SEC", 60)) * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
source, err := openDB(ctx, sourceDSN, 2)
if err != nil {
return fmt.Errorf("open OneOS read-only database: %w", err)
}
defer source.Close()
target, err := openDB(ctx, targetDSN, 4)
if err != nil {
return fmt.Errorf("open vehicle platform database: %w", err)
}
defer target.Close()
candidates, err := businessscope.ReadCandidates(ctx, source)
if err != nil {
return err
}
snapshot, err := businessscope.BuildSnapshot(candidates, time.Now())
snapshot, sourceKind, err := readSnapshot(ctx)
if err != nil {
return err
}
@@ -64,11 +51,50 @@ func run() error {
if err != nil {
return err
}
log.Printf("OneOS scope sync complete changed=%t candidates=%d accepted=%d rejected=%d version=%s",
result.Changed, snapshot.Candidates, len(snapshot.Items), len(snapshot.Rejections), snapshot.SourceVersion)
log.Printf("OneOS scope sync complete source=%s changed=%t candidates=%d accepted=%d rejected=%d version=%s",
sourceKind, result.Changed, snapshot.Candidates, len(snapshot.Items), len(snapshot.Rejections), snapshot.SourceVersion)
return nil
}
func readSnapshot(ctx context.Context) (businessscope.Snapshot, string, error) {
mode := strings.ToLower(strings.TrimSpace(os.Getenv("ONEOS_SCOPE_SOURCE")))
if mode == "" {
if strings.TrimSpace(os.Getenv("ONEOS_SCOPE_API_URL")) != "" {
mode = "api"
} else {
mode = "database"
}
}
switch mode {
case "api":
snapshot, err := businessscope.ReadAPISnapshot(ctx, businessscope.APIConfig{
URL: os.Getenv("ONEOS_SCOPE_API_URL"),
ServiceToken: os.Getenv("ONEOS_SCOPE_API_SERVICE_TOKEN"),
SigningSecret: os.Getenv("ONEOS_SCOPE_API_SIGNING_SECRET"),
MaxAttempts: envInt("ONEOS_SCOPE_API_MAX_ATTEMPTS", 3),
})
return snapshot, mode, err
case "database":
sourceDSN, err := normalizedDSN("ONEOS_MYSQL_DSN", os.Getenv("ONEOS_MYSQL_DSN"), true)
if err != nil {
return businessscope.Snapshot{}, mode, err
}
source, err := openDB(ctx, sourceDSN, 2)
if err != nil {
return businessscope.Snapshot{}, mode, fmt.Errorf("open OneOS read-only database: %w", err)
}
defer source.Close()
candidates, err := businessscope.ReadCandidates(ctx, source)
if err != nil {
return businessscope.Snapshot{}, mode, err
}
snapshot, err := businessscope.BuildSnapshot(candidates, time.Now())
return snapshot, mode, err
default:
return businessscope.Snapshot{}, mode, fmt.Errorf("ONEOS_SCOPE_SOURCE must be api or database")
}
}
func normalizedDSN(name, raw string, requireOneOSDatabase bool) (string, error) {
raw = strings.TrimSpace(raw)
if raw == "" {