diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2025-07-07 15:19:17 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2025-07-08 13:37:33 +0000 |
| commit | 7d82482808e5f450c1e75c5d2aaf9a81fac51f29 (patch) | |
| tree | 30c333fb11dba219371ebec4304c902cc97fa7a2 /syz-cluster/tools | |
| parent | 45106a5dba83f655b716a39fb66477ee3f1d430c (diff) | |
syz-cluster: move db-mgmt to tools
This will allows us to better organize the code.
Diffstat (limited to 'syz-cluster/tools')
| -rw-r--r-- | syz-cluster/tools/db-mgmt/Dockerfile | 22 | ||||
| -rw-r--r-- | syz-cluster/tools/db-mgmt/README.md | 7 | ||||
| -rw-r--r-- | syz-cluster/tools/db-mgmt/main.go | 83 | ||||
| -rw-r--r-- | syz-cluster/tools/db-mgmt/migrate-job.yaml | 25 |
4 files changed, 137 insertions, 0 deletions
diff --git a/syz-cluster/tools/db-mgmt/Dockerfile b/syz-cluster/tools/db-mgmt/Dockerfile new file mode 100644 index 000000000..bca29c3bd --- /dev/null +++ b/syz-cluster/tools/db-mgmt/Dockerfile @@ -0,0 +1,22 @@ +FROM golang:1.23-alpine AS builder + +WORKDIR /build + +# Prepare the dependencies. +COPY go.mod ./ +COPY go.sum ./ +RUN go mod download +COPY pkg/gcs/ pkg/gcs/ + +# Build the tool. +COPY syz-cluster/tools/db-mgmt/*.go syz-cluster/tools/db-mgmt/ +COPY syz-cluster/pkg/ syz-cluster/pkg/ +RUN go build -o /bin/db-mgmt /build/syz-cluster/tools/db-mgmt + +# Create the actual container. +FROM alpine:latest +WORKDIR /app + +COPY --from=builder /bin/db-mgmt /bin/db-mgmt + +ENTRYPOINT ["/bin/db-mgmt"] diff --git a/syz-cluster/tools/db-mgmt/README.md b/syz-cluster/tools/db-mgmt/README.md new file mode 100644 index 000000000..5ad156287 --- /dev/null +++ b/syz-cluster/tools/db-mgmt/README.md @@ -0,0 +1,7 @@ +How to run DB migrations locally: + +``` +cd $SYZKALLER/syz-cluster +make build-db-mgmt-dev restart-spanner +./run-local.sh db-mgmt migrate +``` diff --git a/syz-cluster/tools/db-mgmt/main.go b/syz-cluster/tools/db-mgmt/main.go new file mode 100644 index 000000000..7d362e929 --- /dev/null +++ b/syz-cluster/tools/db-mgmt/main.go @@ -0,0 +1,83 @@ +// Copyright 2024 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package main + +import ( + "context" + "fmt" + "log" + "os" + + "cloud.google.com/go/spanner" + "github.com/google/syzkaller/syz-cluster/pkg/app" + "github.com/google/syzkaller/syz-cluster/pkg/db" + "google.golang.org/api/iterator" +) + +func runSQL(ctx context.Context, uri db.ParsedURI, command string) error { + client, err := spanner.NewClient(ctx, uri.Full) + if err != nil { + return err + } + defer client.Close() + stmt := spanner.Statement{SQL: command} + iter := client.Single().Query(ctx, stmt) + defer iter.Stop() + + for { + row, err := iter.Next() + if err == iterator.Done { + break + } + if err != nil { + return err + } + cols := row.ColumnNames() + fmt.Println(cols) + for i := 0; i < len(cols); i++ { + fmt.Printf("\t%s", row.ColumnValue(i)) + } + fmt.Printf("\n") + } + return nil +} + +func main() { + ctx := context.Background() + uri, err := app.DefaultSpannerURI() + if err != nil { + app.Fatalf("failed to get Spanner URI: %v", err) + } + if os.Getenv("SPANNER_EMULATOR_HOST") != "" { + // Should only be done in the test/dev environment. + log.Printf("check if a Spanner instance is present") + err = db.CreateSpannerInstance(ctx, uri) + if err != nil { + app.Fatalf("failed to create Spanner instance: %v", err) + } + } + log.Printf("check if DB is present") + err = db.CreateSpannerDB(ctx, uri) + if err != nil { + app.Fatalf("failed to create Spanner DB: %v", err) + } + if len(os.Args) > 1 { + switch os.Args[1] { + case "migrate": + log.Printf("running schema migrations") + err = db.RunMigrations(uri.Full) + case "run": + if len(os.Args) < 3 { + app.Fatalf("second argument is the SQL query to run") + } + err = runSQL(ctx, uri, os.Args[2]) + default: + app.Fatalf("unknown command: %s", os.Args[1]) + } + if err != nil { + log.Fatal(err) + } + } + log.Printf("finished!") +} diff --git a/syz-cluster/tools/db-mgmt/migrate-job.yaml b/syz-cluster/tools/db-mgmt/migrate-job.yaml new file mode 100644 index 000000000..e10572a7d --- /dev/null +++ b/syz-cluster/tools/db-mgmt/migrate-job.yaml @@ -0,0 +1,25 @@ +# Copyright 2025 syzkaller project authors. All rights reserved. +# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +apiVersion: batch/v1 +kind: Job +metadata: + generateName: db-migrate-job- +spec: + ttlSecondsAfterFinished: 86400 + backoffLimit: 0 + template: + metadata: + labels: + app: db-mgmt + spec: + serviceAccountName: gke-db-admin-ksa + containers: + - name: migrate + image: ${IMAGE_PREFIX}db-mgmt:${IMAGE_TAG} + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: global-config-env + args: ["migrate"] + restartPolicy: Never |
