From 0f230131bd34aa775893d6c7243589c5cb688716 Mon Sep 17 00:00:00 2001 From: Daniele Date: Tue, 30 Apr 2024 12:15:06 +0200 Subject: [PATCH 1/3] add fileType option --- README.md | 3 ++- main.go | 5 +++-- pkg/cloudsql/cloudsql.go | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ff5cb98..02e5ed0 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Exporting your database to a separate Google Cloud Storage bucket, preferrably i ```bash $ cloudsql-exporter --help -usage: cloudsql-backup --bucket=BUCKET --project=PROJECT [] +usage: cloudsql-exporter --bucket=BUCKET --project=PROJECT [] Export Cloud SQL databases to Google Cloud Storage @@ -31,6 +31,7 @@ Flags: --ensure-iam-bindings Ensure that the Cloud SQL service account has the required IAM role binding to export and validate the backup + --fileType Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) ``` ## Installation diff --git a/main.go b/main.go index cc750f1..50a6687 100644 --- a/main.go +++ b/main.go @@ -17,13 +17,14 @@ import ( ) var ( - app = kingpin.New("cloudsql-backup", "Export Cloud SQL databases to Google Cloud Storage") + app = kingpin.New("cloudsql-exporter", "Export Cloud SQL databases to Google Cloud Storage") bucket = app.Flag("bucket", "Google Cloud Storage bucket name").Required().String() project = app.Flag("project", "GCP project ID").Required().String() instance = app.Flag("instance", "Cloud SQL instance name, if not specified all within the project will be enumerated").String() compression = app.Flag("compression", "Enable compression for exported SQL files").Bool() ensureIamBindings = app.Flag("ensure-iam-bindings", "Ensure that the Cloud SQL service account has the required IAM role binding to export and validate the backup").Bool() + fileType = app.Flag("fileType", "Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV)").String() ) func main() { @@ -79,7 +80,7 @@ func main() { objectName = time.Now().Format(time.RFC3339Nano) + ".sql" } - err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName) + err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName, *fileType) if err != nil { log.Fatal(err) } diff --git a/pkg/cloudsql/cloudsql.go b/pkg/cloudsql/cloudsql.go index 19538d5..cbd2370 100644 --- a/pkg/cloudsql/cloudsql.go +++ b/pkg/cloudsql/cloudsql.go @@ -117,13 +117,13 @@ func ListDatabasesForCloudSQLInstance(ctx context.Context, sqlAdminSvc *sqladmin } // ExportCloudSQLDatabase exports a Cloud SQL database to a Google Cloud Storage bucket. -func ExportCloudSQLDatabase(ctx context.Context, sqlAdminSvc *sqladmin.Service, databases []string, projectID, instanceID, bucketName, objectName string) error { +func ExportCloudSQLDatabase(ctx context.Context, sqlAdminSvc *sqladmin.Service, databases []string, projectID, instanceID, bucketName, objectName string, fileType string) error { for _, database := range databases { log.Printf("Exporting database %s for instance %s", database, instanceID) req := &sqladmin.InstancesExportRequest{ ExportContext: &sqladmin.ExportContext{ - FileType: "SQL", + FileType: fileType, Kind: "sql#exportContext", Databases: []string{database}, Uri: fmt.Sprintf("gs://%s/%s/%s/%s/%s", bucketName, projectID, instanceID, database, objectName), From 5d6b0f073d81f5488887b059ed0a1340d19470dd Mon Sep 17 00:00:00 2001 From: Daniele Date: Tue, 30 Apr 2024 12:31:36 +0200 Subject: [PATCH 2/3] fix file extension by fileType --- README.md | 2 +- main.go | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 02e5ed0..e5a7af5 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Flags: --ensure-iam-bindings Ensure that the Cloud SQL service account has the required IAM role binding to export and validate the backup - --fileType Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) + --fileType Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) [Default SQL] ``` ## Installation diff --git a/main.go b/main.go index 50a6687..346d308 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "log" "os" "time" + "strings" "golang.org/x/oauth2/google" "google.golang.org/api/option" @@ -24,7 +25,7 @@ var ( instance = app.Flag("instance", "Cloud SQL instance name, if not specified all within the project will be enumerated").String() compression = app.Flag("compression", "Enable compression for exported SQL files").Bool() ensureIamBindings = app.Flag("ensure-iam-bindings", "Ensure that the Cloud SQL service account has the required IAM role binding to export and validate the backup").Bool() - fileType = app.Flag("fileType", "Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV)").String() + fileType = app.Flag("fileType", "Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) [Default SQL]").String() ) func main() { @@ -72,15 +73,18 @@ func main() { } } - var objectName string + var fileType string + if !*fileType { + fileType = "SQL" + } + + var objectName string = time.Now().Format(time.RFC3339Nano) + "." + strings.ToLower(fileType) if *compression { - objectName = time.Now().Format(time.RFC3339Nano) + ".sql.gz" - } else { - objectName = time.Now().Format(time.RFC3339Nano) + ".sql" + objectName = objectName + ".gz" } - err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName, *fileType) + err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName, strings.ToUpper(fileType)) if err != nil { log.Fatal(err) } From ad847f4aae0f9993149a9652023861945549b95f Mon Sep 17 00:00:00 2001 From: Daniele Date: Tue, 30 Apr 2024 12:43:22 +0200 Subject: [PATCH 3/3] fix fileType with default --- main.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 346d308..ceb43b7 100644 --- a/main.go +++ b/main.go @@ -25,7 +25,7 @@ var ( instance = app.Flag("instance", "Cloud SQL instance name, if not specified all within the project will be enumerated").String() compression = app.Flag("compression", "Enable compression for exported SQL files").Bool() ensureIamBindings = app.Flag("ensure-iam-bindings", "Ensure that the Cloud SQL service account has the required IAM role binding to export and validate the backup").Bool() - fileType = app.Flag("fileType", "Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) [Default SQL]").String() + fileType = app.Flag("fileType", "Type of file to export (SQL, SQL_FILE_TYPE_UNSPECIFIED, BAK, CSV) [Default SQL]").Default("SQL").String() ) func main() { @@ -73,18 +73,13 @@ func main() { } } - var fileType string - if !*fileType { - fileType = "SQL" - } - - var objectName string = time.Now().Format(time.RFC3339Nano) + "." + strings.ToLower(fileType) + var objectName string = time.Now().Format(time.RFC3339Nano) + "." + strings.ToLower(*fileType) if *compression { objectName = objectName + ".gz" } - err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName, strings.ToUpper(fileType)) + err := cloudsql.ExportCloudSQLDatabase(ctx, sqlAdminSvc, databases, *project, string(instance), *bucket, objectName, strings.ToUpper(*fileType)) if err != nil { log.Fatal(err) }