google-cloud-java icon indicating copy to clipboard operation
google-cloud-java copied to clipboard

FR - Consistent programmatic configurations to use Emulators

Open saturnism opened this issue 5 years ago • 1 comments

Is your feature request related to a problem? Please describe. Client libraries currently can use emulators by configuring respective environmental variables. However, in the case of dynamically launching emulators during unit/integration tests using JUnit and Testcontainers, each client library needs to be configured programatically. For all of the supported emulators, client library configurations are very different from each other, and mostly not well documented.

See examples:

  • https://github.com/testcontainers/testcontainers-java/tree/master/modules/gcloud/src/test/java/org/testcontainers/containers
  • https://github.com/testcontainers/testcontainers-java/pull/3466/files#diff-b3bfaf3d049552632101b023cb90f94ae35a3c6eed6de082c99f3f8e2c7be2e4
Client Library Configure Endpoint
Datastore setHost(hostport) + setCredentials
Firestore setHost(hostport) + setCredentials
Spanner setEmulatorHost(hostport)
Pub/Sub setChannelProvider + setCredentialsProvider
Bigtable setChannelProvider + setCredentialsProvider and also newBuilderForEmulator(host, port)

Describe the solution you'd like A consistent way of setting emulator host and auto configures the emulator credentials. Spanner is the cleanest/best example of this, which is simply setEmulatorHost(hostport).

Describe alternatives you've considered

Additional context https://github.com/spring-cloud/spring-cloud-gcp/issues/2589

saturnism avatar Nov 13 '20 07:11 saturnism

Additional question regarding this. Pub/Sub Subscriber and Publisher both have a setEndpoint method now. But both are not really useful, since the emulator needs plaintext. Is there any chance to set this NegotiationType on the Builders too? Configuring a channelProvider is not really great. The prod code will not set the channelProvider, so I need to introduce such a bean injection just for the test case, and null for the prod case.

PeterUlb avatar Mar 31 '21 10:03 PeterUlb