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
+}