returning a BuildResponse type
BUG=b/236743685
Refactored secret manager functionality to support a new function that retrieves all secrets at once.
Change-Id: I77f461275404674753e3eab02ef64c4e9feaaa19
Reviewed-on: https://cos-review.googlesource.com/c/cos/tools/+/35175
Tested-by: Bridget Agyare <bridgetagyare@google.com>
Cloud-Build: GCB Service account <228075978874@cloudbuild.gserviceaccount.com>
Reviewed-by: Arnav Kansal <rnv@google.com>
diff --git a/src/pkg/findbuild/findbuild.go b/src/pkg/findbuild/findbuild.go
index 1befb5e..ca59885 100644
--- a/src/pkg/findbuild/findbuild.go
+++ b/src/pkg/findbuild/findbuild.go
@@ -72,6 +72,7 @@
// Definitions of column names in table.
commitSha = "commit_sha"
+ cLNumber = "cl_number"
landedInBuild = "landed_build_number"
releasedInBuild = "released_build_number"
)
@@ -614,6 +615,11 @@
}, nil
}
+type secretBundle struct {
+ name string
+ value *string
+}
+
// findReleasedBuild locates the first build that a CL was introduced in using the builds-info database
func findReleasedBuild(ctx context.Context, request *BuildRequest) (*BuildResponse, error) {
log.Debugf("Fetching first build for CL: %s", request.CL)
@@ -630,17 +636,13 @@
user = "readonly"
zone = "us-west2"
)
- dbName, err := retrieveSecret(client, projectID, findBuildDbName)
- if err != nil {
- log.Fatalf("failed to retrieve database name: %s\n%v", findBuildDbName, err)
- }
- tableName, err := retrieveSecret(client, projectID, findBuildTableName)
- if err != nil {
- log.Fatalf("failed to retrieve table name: %s\n%v", findBuildTableName, err)
- }
- password, err := retrieveSecret(client, projectID, dbPasswordSecretName)
- if err != nil {
- log.Fatalf("failed to retrieve password %s\n%v", dbPasswordSecretName, err)
+ var dbName, tableName, password string
+ if err := retrieveSecrets(client, projectID, []secretBundle{
+ {findBuildDbName, &dbName},
+ {findBuildTableName, &tableName},
+ {dbPasswordSecretName, &password},
+ }); err != nil {
+ return nil, err
}
connectionName := projectID + ":" + zone + ":" + dbName
// connect to database
@@ -649,13 +651,30 @@
log.Fatalf("Could not open db: %v", err)
}
// query database
- // SELECT release_build_number FROM DBName WHERE commit_sha = request.CL;
- _, err = db.Query("SELECT %s FROM %s WHERE %s = %s", releasedInBuild, tableName, commitSha, request.CL)
+ // SELECT release_build_number FROM DBName WHERE cLNumber = request.CL;
+ rows, err := db.Query("SELECT %s FROM %s WHERE %s = %s", releasedInBuild, tableName, cLNumber, request.CL)
if err != nil {
log.Fatalf("Could not query db: %v", err)
}
- // TODO: cast rows to BuildResponse type
- return nil, err
+ // change rows to BuildResponse type
+ defer rows.Close()
+ var releasedBuildNumber string
+ if rows.Next() {
+ if err := rows.Scan(&releasedBuildNumber); err != nil {
+ log.Errorf("Could not scan result: %v", err)
+ return nil, err
+ }
+ } else {
+ log.Errorf("No build number found")
+ return nil, nil
+ }
+ if rows.Next() {
+ log.Errorf("More than one build number found")
+ }
+ releasedBuild := BuildResponse{}
+ releasedBuild.BuildNum = releasedBuildNumber
+ releasedBuild.CLNum = request.CL
+ return &releasedBuild, err
}
func retrieveSecret(client *secretmanager.Client, projectID string, secretName string) (string, error) {
@@ -668,3 +687,14 @@
}
return string(result.Payload.Data), nil
}
+
+func retrieveSecrets(client *secretmanager.Client, projectID string, secrets []secretBundle) error {
+ for _, secret := range secrets {
+ fetchedSecret, err := retrieveSecret(client, projectID, secret.name)
+ if err != nil {
+ return err
+ }
+ secret.value = &fetchedSecret
+ }
+ return nil
+}