Add --local flag to perf-tool.

Change-Id: I4ef99527f2a75f9bc99a9ee9946c51b15e106b34
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/303796
Reviewed-by: Joe Gregorio <jcgregorio@google.com>
diff --git a/perf/go/builders/builders.go b/perf/go/builders/builders.go
index f50ef27..a9ccfc7 100644
--- a/perf/go/builders/builders.go
+++ b/perf/go/builders/builders.go
@@ -220,9 +220,13 @@
 // the InstanceConfig.
 //
 // If local is true then we aren't running in production.
-func NewRegressionStoreFromConfig(local bool, cidl *cid.CommitIDLookup, instanceConfig *config.InstanceConfig) (regression.Store, error) {
+func NewRegressionStoreFromConfig(ctx context.Context, local bool, cidl *cid.CommitIDLookup, instanceConfig *config.InstanceConfig) (regression.Store, error) {
 	switch instanceConfig.DataStoreConfig.DataStoreType {
 	case config.GCPDataStoreType:
+		if err := initCloudDatastoreOnce(ctx, local, instanceConfig); err != nil {
+			return nil, skerr.Wrap(err)
+		}
+
 		lookup := func(ctx context.Context, c *cid.CommitID) (*cid.CommitDetail, error) {
 			details, err := cidl.Lookup(ctx, []*cid.CommitID{c})
 			if err != nil {
@@ -249,9 +253,13 @@
 
 // NewShortcutStoreFromConfig creates a new shortcut.Store from the
 // InstanceConfig.
-func NewShortcutStoreFromConfig(instanceConfig *config.InstanceConfig) (shortcut.Store, error) {
+func NewShortcutStoreFromConfig(ctx context.Context, local bool, instanceConfig *config.InstanceConfig) (shortcut.Store, error) {
 	switch instanceConfig.DataStoreConfig.DataStoreType {
 	case config.GCPDataStoreType:
+		if err := initCloudDatastoreOnce(ctx, local, instanceConfig); err != nil {
+			return nil, skerr.Wrap(err)
+		}
+
 		return dsshortcutstore.New(), nil
 	case config.SQLite3DataStoreType:
 		db, err := newSQLite3DBFromConfig(instanceConfig)
diff --git a/perf/go/builders/builders_test.go b/perf/go/builders/builders_test.go
index cb1dad4..9c61158 100644
--- a/perf/go/builders/builders_test.go
+++ b/perf/go/builders/builders_test.go
@@ -202,10 +202,10 @@
 
 func TestNewRegressionStoreFromConfig_Sqlite3_Success(t *testing.T) {
 	unittest.LargeTest(t)
-	_, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
+	ctx, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
 	defer cleanup()
 
-	store, err := NewRegressionStoreFromConfig(false, nil, instanceConfig)
+	store, err := NewRegressionStoreFromConfig(ctx, false, nil, instanceConfig)
 	require.NoError(t, err)
 
 	regressiontest.SetLowAndTriage(t, store)
@@ -213,10 +213,10 @@
 
 func TestNewRegressionStoreFromConfig_CochroachDB_Success(t *testing.T) {
 	unittest.LargeTest(t)
-	_, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
+	ctx, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
 	defer cleanup()
 
-	store, err := NewRegressionStoreFromConfig(false, nil, instanceConfig)
+	store, err := NewRegressionStoreFromConfig(ctx, false, nil, instanceConfig)
 	require.NoError(t, err)
 
 	regressiontest.SetLowAndTriage(t, store)
@@ -224,23 +224,23 @@
 
 func TestNewRegressionStoreFromConfig_InvalidDatastoreTypeIsError(t *testing.T) {
 	unittest.LargeTest(t)
-	_, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
+	ctx, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
 	defer cleanup()
 
 	const invalidDataStoreType = config.DataStoreType("not-a-valid-datastore-type")
 	instanceConfig.DataStoreConfig.DataStoreType = invalidDataStoreType
 
-	_, err := NewRegressionStoreFromConfig(false, nil, instanceConfig)
+	_, err := NewRegressionStoreFromConfig(ctx, false, nil, instanceConfig)
 	require.Error(t, err)
 	assert.Contains(t, err.Error(), invalidDataStoreType)
 }
 
 func TestNewShortcutStoreFromConfig_GCPDatastore_Success(t *testing.T) {
 	unittest.ManualTest(t)
-	_, instanceConfig, cleanup := newGCPDatastoreConfigForTest(t, ds.SHORTCUT)
+	ctx, instanceConfig, cleanup := newGCPDatastoreConfigForTest(t, ds.SHORTCUT)
 	defer cleanup()
 
-	store, err := NewShortcutStoreFromConfig(instanceConfig)
+	store, err := NewShortcutStoreFromConfig(ctx, false, instanceConfig)
 	require.NoError(t, err)
 
 	shortcuttest.InsertGet(t, store)
@@ -248,10 +248,10 @@
 
 func TestNewShortcutStoreFromConfig_Sqlite3_Success(t *testing.T) {
 	unittest.LargeTest(t)
-	_, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
+	ctx, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
 	defer cleanup()
 
-	store, err := NewShortcutStoreFromConfig(instanceConfig)
+	store, err := NewShortcutStoreFromConfig(ctx, false, instanceConfig)
 	require.NoError(t, err)
 
 	shortcuttest.InsertGet(t, store)
@@ -259,10 +259,10 @@
 
 func TestNewShortcutStoreFromConfig_CockroachDB_Success(t *testing.T) {
 	unittest.LargeTest(t)
-	_, instanceConfig, cleanup := newCockroachDBConfigForTest(t)
+	ctx, instanceConfig, cleanup := newCockroachDBConfigForTest(t)
 	defer cleanup()
 
-	store, err := NewShortcutStoreFromConfig(instanceConfig)
+	store, err := NewShortcutStoreFromConfig(ctx, false, instanceConfig)
 	require.NoError(t, err)
 
 	shortcuttest.InsertGet(t, store)
@@ -270,13 +270,13 @@
 
 func TestNewShortcutStoreFromConfig_Sqlite3_InvalidDatastoreTypeIsError(t *testing.T) {
 	unittest.LargeTest(t)
-	_, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
+	ctx, instanceConfig, cleanup := newSqlite3ConfigForTest(t)
 	defer cleanup()
 
 	const invalidDataStoreType = config.DataStoreType("not-a-valid-datastore-type")
 	instanceConfig.DataStoreConfig.DataStoreType = invalidDataStoreType
 
-	_, err := NewShortcutStoreFromConfig(instanceConfig)
+	_, err := NewShortcutStoreFromConfig(ctx, false, instanceConfig)
 	require.Error(t, err)
 	assert.Contains(t, err.Error(), invalidDataStoreType)
 }
diff --git a/perf/go/frontend/frontend.go b/perf/go/frontend/frontend.go
index 4cad8e0..aa34f35 100644
--- a/perf/go/frontend/frontend.go
+++ b/perf/go/frontend/frontend.go
@@ -368,7 +368,7 @@
 	if err != nil {
 		sklog.Fatal(err)
 	}
-	f.shortcutStore, err = builders.NewShortcutStoreFromConfig(config.Config)
+	f.shortcutStore, err = builders.NewShortcutStoreFromConfig(ctx, f.flags.Local, config.Config)
 	if err != nil {
 		sklog.Fatal(err)
 	}
@@ -385,7 +385,7 @@
 
 	f.frameRequests = dataframe.NewRunningFrameRequests(f.perfGit, f.dfBuilder, f.shortcutStore)
 	f.clusterRequests = regression.NewRunningRegressionDetectionRequests(f.perfGit, f.cidl, float32(f.flags.Interesting), f.dfBuilder, f.shortcutStore)
-	f.regStore, err = builders.NewRegressionStoreFromConfig(f.flags.Local, f.cidl, cfg)
+	f.regStore, err = builders.NewRegressionStoreFromConfig(ctx, f.flags.Local, f.cidl, cfg)
 	if err != nil {
 		sklog.Fatalf("Failed to build regression.Store: %s", err)
 	}
diff --git a/perf/go/perf-tool/main.go b/perf/go/perf-tool/main.go
index fc8bc68..f585894 100644
--- a/perf/go/perf-tool/main.go
+++ b/perf/go/perf-tool/main.go
@@ -39,6 +39,7 @@
 	traceStore     tracestore.TraceStore
 	configFilename string
 	instanceConfig *config.InstanceConfig
+	local          bool
 )
 
 // flags
@@ -58,6 +59,7 @@
 	outputFilenameFlag   string = "out"
 	inputFilenameFlag    string = "in"
 	backupToDateFlag     string = "backup_to_date"
+	databaseLocalFlag    string = "local"
 
 	regressionBatchSize = 1000
 )
@@ -93,6 +95,7 @@
 		},
 	}
 	cmd.PersistentFlags().StringVar(&configFilename, "config_filename", "", "The filename of the config file to use.")
+	cmd.PersistentFlags().BoolVar(&local, "local", true, "If true then use glcloud credentials.")
 
 	configCmd := &cobra.Command{
 		Use: "config [sub]",
@@ -285,7 +288,7 @@
 	defer util.Close(f)
 	z := zip.NewWriter(f)
 
-	alertStore, err := builders.NewAlertStoreFromConfig(ctx, true, instanceConfig)
+	alertStore, err := builders.NewAlertStoreFromConfig(ctx, local, instanceConfig)
 	if err != nil {
 		return err
 	}
@@ -340,7 +343,7 @@
 	}
 	shortcutsEncoder := gob.NewEncoder(shortcutsZipWriter)
 
-	shortcutStore, err := builders.NewShortcutStoreFromConfig(instanceConfig)
+	shortcutStore, err := builders.NewShortcutStoreFromConfig(ctx, local, instanceConfig)
 	if err != nil {
 		return err
 	}
@@ -416,7 +419,7 @@
 		return err
 	}
 	cidl := cid.New(ctx, perfGit, config.Config)
-	regressionStore, err := builders.NewRegressionStoreFromConfig(true, cidl, instanceConfig)
+	regressionStore, err := builders.NewRegressionStoreFromConfig(ctx, true, cidl, instanceConfig)
 	if err != nil {
 		return err
 	}
@@ -546,7 +549,7 @@
 	defer util.Close(z)
 
 	// Restore shortcuts.
-	shortcutStore, err := builders.NewShortcutStoreFromConfig(instanceConfig)
+	shortcutStore, err := builders.NewShortcutStoreFromConfig(ctx, local, instanceConfig)
 	if err != nil {
 		return err
 	}
@@ -603,7 +606,7 @@
 		return err
 	}
 	cidl := cid.New(ctx, perfGit, config.Config)
-	regressionStore, err := builders.NewRegressionStoreFromConfig(true, cidl, instanceConfig)
+	regressionStore, err := builders.NewRegressionStoreFromConfig(ctx, true, cidl, instanceConfig)
 	if err != nil {
 		return err
 	}