feat(oneos): add signed scope API client
This commit is contained in:
@@ -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 == "" {
|
||||
|
||||
Reference in New Issue
Block a user