Description
Reproduced locally with the following code snippet:
BigQueryWriteClient bigQueryWriteClient =
BigQueryWriteClient.create(BigQueryWriteSettings.newBuilder()
.setQuotaProjectId(<project-id>)
.setUniverseDomain("example.com")
.build());
TableName parent = TableName.of("<project>", "<dataset>", "<table>");
TableSchema schema = TableSchema.newBuilder().build();
WriteStream writeStream = WriteStream.newBuilder().setType(
WriteStream.Type.COMMITTED).setTableSchema(schema).build();
WriteStream response = bigQueryWriteClient.createWriteStream(parent, writeStream);
Which results in the following stacktrace despite the user configured universe domain matching the underlying credential's universe domain.
com.google.api.gax.rpc.UnauthenticatedException: java.lang.Throwable: The configured universe domain (example.com) does not match the universe domain found in the credentials (googleapis.com). If you haven't configured the universe domain explicitly, `googleapis.com` is the default.
at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:116) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.ApiExceptionFactory.createException(ApiExceptionFactory.java:41) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.EndpointContext.validateUniverseDomain(EndpointContext.java:154) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.grpc.GrpcCallContext.validateUniverseDomain(GrpcCallContext.java:691) ~[gax-grpc-2.51.0.jar:2.51.0]
at com.google.api.gax.grpc.GrpcClientCalls.newCall(GrpcClientCalls.java:100) ~[gax-grpc-2.51.0.jar:2.51.0]
at com.google.api.gax.grpc.GrpcDirectCallable.futureCall(GrpcDirectCallable.java:62) ~[gax-grpc-2.51.0.jar:2.51.0]
at com.google.api.gax.grpc.GrpcUnaryRequestParamCallable.futureCall(GrpcUnaryRequestParamCallable.java:68) ~[gax-grpc-2.51.0.jar:2.51.0]
at com.google.api.gax.grpc.GrpcExceptionCallable.futureCall(GrpcExceptionCallable.java:64) ~[gax-grpc-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.AttemptCallable.call(AttemptCallable.java:86) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:78) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.RetryingCallable.futureCall(RetryingCallable.java:41) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.tracing.TracedUnaryCallable.futureCall(TracedUnaryCallable.java:75) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.UnaryCallable$1.futureCall(UnaryCallable.java:126) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.UnaryCallable.futureCall(UnaryCallable.java:87) ~[gax-2.51.0.jar:2.51.0]
at com.google.api.gax.rpc.UnaryCallable.call(UnaryCallable.java:112) ~[gax-2.51.0.jar:2.51.0]
at com.google.cloud.bigquery.storage.v1.BigQueryWriteClient.createWriteStream(BigQueryWriteClient.java:373) ~[google-cloud-bigquerystorage-3.8.0.jar:3.8.0]
at com.google.cloud.bigquery.storage.v1.BigQueryWriteClient.createWriteStream(BigQueryWriteClient.java:308) ~[google-cloud-bigquerystorage-3.8.0.jar:3.8.0]
Adding a breakpoint in the EndpointContext#validateUniverseDomain()
method shows that the getUniverseDomain() is called on QuotaProjectIdHidingCredentials which is a wrapper around the configured credentials implementation. At the moment, this class always returns googleapis.com
instead of relying on universe domain configured in the wrapped Credentials class
.
Proposed solution: Expose getUniverseDomain() of the wrapped credentials class in QuotaProjectIdHidingCredentials