Skip to content

Commit 9bef06f

Browse files
granular conn flags for datastores
Signed-off-by: Kartikay <kartikay_2101ce32@iitp.ac.in>
1 parent d909242 commit 9bef06f

File tree

2 files changed

+159
-0
lines changed

2 files changed

+159
-0
lines changed

pkg/cmd/datastore/datastore.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ func deprecateUnifiedConnFlags(flagSet *pflag.FlagSet) {
102102
type Config struct {
103103
Engine string `debugmap:"visible"`
104104
URI string `debugmap:"sensitive"`
105+
DatastoreHost string `debugmap:"sensitive"`
106+
DatastorePort string `debugmap:"sensitive"`
107+
DatastoreUsername string `debugmap:"sensitive"`
108+
DatastorePassword string `debugmap:"sensitive"`
109+
DatastoreName string `debugmap:"sensitive"`
110+
DatastoreSSLMode string `debugmap:"sensitive"`
105111
GCWindow time.Duration `debugmap:"visible"`
106112
LegacyFuzzing time.Duration `debugmap:"visible"`
107113
RevisionQuantization time.Duration `debugmap:"visible"`
@@ -153,6 +159,9 @@ type Config struct {
153159
SpannerMinSessions uint64 `debugmap:"visible"`
154160
SpannerMaxSessions uint64 `debugmap:"visible"`
155161
SpannerDatastoreMetricsOption string `debugmap:"visible"`
162+
SpannerInstanceID string `debugmap:"sensitive"`
163+
SpannerDatabaseID string `debugmap:"sensitive"`
164+
SpannerProjectID string `debugmap:"sensitive"`
156165

157166
// MySQL
158167
TablePrefix string `debugmap:"visible"`
@@ -283,12 +292,28 @@ func RegisterDatastoreFlagsWithPrefix(flagSet *pflag.FlagSet, prefix string, opt
283292

284293
flagSet.BoolVar(&opts.ExperimentalColumnOptimization, flagName("datastore-experimental-column-optimization"), false, "enable experimental column optimization")
285294

295+
flagSet.StringVar(&opts.DatastoreHost, flagName("datastore-host"), defaults.DatastoreHost, "database host for datastore connection string")
296+
flagSet.StringVar(&opts.DatastorePort, flagName("datastore-port"), defaults.DatastorePort, "database port for datastore connection string")
297+
flagSet.StringVar(&opts.DatastoreUsername, flagName("datastore-user"), defaults.DatastoreUsername, "database username for datastore connection string")
298+
flagSet.StringVar(&opts.DatastorePassword, flagName("datastore-password"), defaults.DatastorePassword, "database password for datastore connection string")
299+
flagSet.StringVar(&opts.DatastoreName, flagName("datastore-name"), defaults.DatastoreName, "database name for datastore connection string")
300+
flagSet.StringVar(&opts.DatastoreSSLMode, flagName("datastore-ssl-mode"), defaults.DatastoreSSLMode, "database SSL mode for datastore connection string")
301+
flagSet.StringVar(&opts.SpannerProjectID, flagName("spanner-datastore-project-id"), defaults.SpannerProjectID, "spanner project-id for datastore connection string")
302+
flagSet.StringVar(&opts.SpannerInstanceID, flagName("spanner-datastore-instance-id"), defaults.SpannerInstanceID, "spanner instance-id for datastore connection string")
303+
flagSet.StringVar(&opts.SpannerDatabaseID, flagName("spanner-datastore-database-id"), defaults.SpannerDatabaseID, "spanner database-id for datastore connection string")
304+
286305
return nil
287306
}
288307

289308
func DefaultDatastoreConfig() *Config {
290309
return &Config{
291310
Engine: MemoryEngine,
311+
DatastoreHost: "",
312+
DatastorePort: "",
313+
DatastoreUsername: "",
314+
DatastorePassword: "",
315+
DatastoreName: "",
316+
DatastoreSSLMode: "",
292317
GCWindow: 24 * time.Hour,
293318
LegacyFuzzing: -1,
294319
RevisionQuantization: 5 * time.Second,
@@ -319,6 +344,9 @@ func DefaultDatastoreConfig() *Config {
319344
RequestHedgingQuantile: 0.95,
320345
SpannerCredentialsFile: "",
321346
SpannerEmulatorHost: "",
347+
SpannerInstanceID: "",
348+
SpannerDatabaseID: "",
349+
SpannerProjectID: "",
322350
TablePrefix: "",
323351
MigrationPhase: "",
324352
FollowerReadDelay: DefaultFollowerReadDelay,
@@ -343,6 +371,56 @@ func NewDatastore(ctx context.Context, options ...ConfigOption) (datastore.Datas
343371
o(opts)
344372
}
345373

374+
if opts.URI == "" && ((opts.DatastoreHost != "" && opts.DatastoreUsername != "" && opts.DatastoreName != "") || (opts.SpannerDatabaseID != "" && opts.SpannerInstanceID != "" && opts.SpannerProjectID != "")) {
375+
switch opts.Engine {
376+
case PostgresEngine, CockroachEngine:
377+
sslMode := opts.DatastoreSSLMode
378+
if sslMode == "" {
379+
sslMode = "prefer"
380+
}
381+
382+
port := opts.DatastorePort
383+
if port == "" {
384+
if opts.Engine == PostgresEngine {
385+
port = "5432"
386+
} else {
387+
port = "26257"
388+
}
389+
}
390+
391+
userPart := ""
392+
if opts.DatastoreUsername != "" {
393+
userPart = opts.DatastoreUsername
394+
if opts.DatastorePassword != "" {
395+
userPart = userPart + ":" + opts.DatastorePassword
396+
}
397+
userPart = userPart + "@"
398+
}
399+
400+
opts.URI = fmt.Sprintf("%s://%s%s:%s/%s?sslmode=%s",
401+
opts.Engine, userPart, opts.DatastoreHost, port, opts.DatastoreName, sslMode)
402+
403+
case MySQLEngine:
404+
port := opts.DatastorePort
405+
if port == "" {
406+
port = "3306"
407+
}
408+
opts.URI = fmt.Sprintf("%s:%s@(%s:%s)/%s?parseTime=True",
409+
opts.DatastoreUsername, opts.DatastorePassword, opts.DatastoreHost, port, opts.DatastoreName)
410+
411+
case SpannerEngine:
412+
if opts.SpannerDatabaseID != "" && opts.SpannerInstanceID != "" && opts.SpannerProjectID != "" {
413+
opts.URI = fmt.Sprintf("projects/%s/instances/%s/databases/%s",
414+
opts.SpannerProjectID, opts.SpannerInstanceID, opts.SpannerDatabaseID)
415+
} else {
416+
return nil, fmt.Errorf("%s engine requires host (project) and database parameters", SpannerEngine)
417+
}
418+
419+
default:
420+
return nil, fmt.Errorf("engine %s does not support connection parameter construction", opts.Engine)
421+
}
422+
}
423+
346424
if (opts.Engine == PostgresEngine || opts.Engine == MySQLEngine) && opts.FollowerReadDelay == DefaultFollowerReadDelay {
347425
// Set the default follower read delay for postgres and mysql to 0 -
348426
// this should only be set if read replicas are used.

pkg/cmd/datastore/zz_generated.options.go

Lines changed: 81 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)