aboutsummaryrefslogtreecommitdiffstats
path: root/syz-cluster/tools
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2025-07-07 15:19:17 +0200
committerAleksandr Nogikh <nogikh@google.com>2025-07-08 13:37:33 +0000
commit7d82482808e5f450c1e75c5d2aaf9a81fac51f29 (patch)
tree30c333fb11dba219371ebec4304c902cc97fa7a2 /syz-cluster/tools
parent45106a5dba83f655b716a39fb66477ee3f1d430c (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/Dockerfile22
-rw-r--r--syz-cluster/tools/db-mgmt/README.md7
-rw-r--r--syz-cluster/tools/db-mgmt/main.go83
-rw-r--r--syz-cluster/tools/db-mgmt/migrate-job.yaml25
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