Skip to content

Commit

Permalink
Added the option to use parent project for the metadata/jobs API as well
Browse files Browse the repository at this point in the history
  • Loading branch information
davidrabinowitz committed Jan 11, 2022
1 parent c1b3f3c commit 875d23b
Show file tree
Hide file tree
Showing 11 changed files with 142 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
import com.google.api.gax.rpc.HeaderProvider;
import com.google.auth.Credentials;
import com.google.auth.oauth2.ExternalAccountCredentials;
import com.google.cloud.bigquery.storage.v1.BigQueryReadClient;
Expand Down Expand Up @@ -33,17 +34,17 @@ public class BigQueryClientFactory implements Serializable {

private final Credentials credentials;
// using the user agent as HeaderProvider is not serializable
private final UserAgentHeaderProvider userAgentHeaderProvider;
private final HeaderProvider headerProvider;
private final BigQueryConfig bqConfig;

@Inject
public BigQueryClientFactory(
BigQueryCredentialsSupplier bigQueryCredentialsSupplier,
UserAgentHeaderProvider userAgentHeaderProvider,
HeaderProvider headerProvider,
BigQueryConfig bqConfig) {
// using Guava's optional as it is serializable
this.credentials = bigQueryCredentialsSupplier.getCredentials();
this.userAgentHeaderProvider = userAgentHeaderProvider;
this.headerProvider = headerProvider;
this.bqConfig = bqConfig;
}

Expand Down Expand Up @@ -84,10 +85,10 @@ public int hashCode() {
// ExternalAccountCredentials first and then compare their hashCodes.
if (credentials instanceof ExternalAccountCredentials) {
return Objects.hashCode(
BigQueryUtil.getCredentialsByteArray(credentials), userAgentHeaderProvider, bqConfig);
BigQueryUtil.getCredentialsByteArray(credentials), headerProvider, bqConfig);
}

return Objects.hashCode(credentials, userAgentHeaderProvider, bqConfig);
return Objects.hashCode(credentials, headerProvider, bqConfig);
}

@Override
Expand All @@ -101,7 +102,7 @@ public boolean equals(Object o) {

BigQueryClientFactory that = (BigQueryClientFactory) o;

if (Objects.equal(userAgentHeaderProvider, that.userAgentHeaderProvider)
if (Objects.equal(headerProvider, that.headerProvider)
&& Objects.equal(
new BigQueryClientFactoryConfig(bqConfig),
new BigQueryClientFactoryConfig(that.bqConfig))) {
Expand All @@ -122,7 +123,7 @@ private BigQueryReadClient createBigQueryReadClient(Optional<String> endpoint) {
try {
InstantiatingGrpcChannelProvider.Builder transportBuilder =
BigQueryReadSettings.defaultGrpcTransportProviderBuilder()
.setHeaderProvider(userAgentHeaderProvider);
.setHeaderProvider(headerProvider);
setProxyConfig(transportBuilder);
endpoint.ifPresent(
e -> {
Expand All @@ -143,7 +144,7 @@ private BigQueryWriteClient createBigQueryWriteClient() {
try {
InstantiatingGrpcChannelProvider.Builder transportBuilder =
BigQueryWriteSettings.defaultGrpcTransportProviderBuilder()
.setHeaderProvider(userAgentHeaderProvider);
.setHeaderProvider(headerProvider);
setProxyConfig(transportBuilder);
BigQueryWriteSettings.Builder clientSettings =
BigQueryWriteSettings.newBuilder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public class BigQueryClientFactoryConfig implements BigQueryConfig {
private final Optional<String> credentialsFile;
private final Optional<String> accessToken;
private final String parentProjectId;
private final boolean useParentProjectForMetadataOperations;
private final boolean viewsEnabled;
private final Optional<String> materializationProject;
private final Optional<String> materializationDataset;
Expand All @@ -24,6 +25,8 @@ public class BigQueryClientFactoryConfig implements BigQueryConfig {
this.credentialsFile = bigQueryConfig.getCredentialsFile();
this.accessToken = bigQueryConfig.getAccessToken();
this.parentProjectId = bigQueryConfig.getParentProjectId();
this.useParentProjectForMetadataOperations =
bigQueryConfig.useParentProjectForMetadataOperations();
this.viewsEnabled = bigQueryConfig.isViewsEnabled();
this.materializationProject = bigQueryConfig.getMaterializationProject();
this.materializationDataset = bigQueryConfig.getMaterializationDataset();
Expand Down Expand Up @@ -54,6 +57,11 @@ public String getParentProjectId() {
return parentProjectId;
}

@Override
public boolean useParentProjectForMetadataOperations() {
return useParentProjectForMetadataOperations;
}

@Override
public boolean isViewsEnabled() {
return viewsEnabled;
Expand Down Expand Up @@ -110,6 +118,8 @@ public boolean equals(Object o) {
&& Objects.equal(credentialsFile, that.credentialsFile)
&& Objects.equal(accessToken, that.accessToken)
&& Objects.equal(parentProjectId, that.parentProjectId)
&& Objects.equal(
useParentProjectForMetadataOperations, that.useParentProjectForMetadataOperations)
&& Objects.equal(materializationProject, that.materializationProject)
&& Objects.equal(materializationDataset, that.materializationDataset)
&& Objects.equal(bigQueryClientRetrySettings, that.bigQueryClientRetrySettings)
Expand All @@ -124,6 +134,7 @@ public int hashCode() {
credentialsFile,
accessToken,
parentProjectId,
useParentProjectForMetadataOperations,
viewsEnabled,
materializationProject,
materializationDataset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.google.cloud.bigquery.connector.common;

import com.google.api.gax.rpc.HeaderProvider;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.http.HttpTransportOptions;
import com.google.inject.Binder;
Expand All @@ -26,9 +27,9 @@ public class BigQueryClientModule implements com.google.inject.Module {

@Provides
@Singleton
public static UserAgentHeaderProvider createUserAgentHeaderProvider(
UserAgentProvider versionProvider) {
return new UserAgentHeaderProvider(versionProvider.getUserAgent());
public static HeaderProvider createtHeaderProvider(
BigQueryConfig config, UserAgentProvider userAgentProvider) {
return HttpUtil.createHeaderProvider(config, userAgentProvider.getUserAgent());
}

@Override
Expand Down Expand Up @@ -57,11 +58,11 @@ public BigQueryCredentialsSupplier provideBigQueryCredentialsSupplier(BigQueryCo
@Singleton
public BigQueryClient provideBigQueryClient(
BigQueryConfig config,
UserAgentHeaderProvider userAgentHeaderProvider,
HeaderProvider headerProvider,
BigQueryCredentialsSupplier bigQueryCredentialsSupplier) {
BigQueryOptions.Builder options =
BigQueryOptions.newBuilder()
.setHeaderProvider(userAgentHeaderProvider)
.setHeaderProvider(headerProvider)
.setProjectId(config.getParentProjectId())
.setCredentials(bigQueryCredentialsSupplier.getCredentials())
.setRetrySettings(config.getBigQueryClientRetrySettings());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public interface BigQueryConfig {

String getParentProjectId();

boolean useParentProjectForMetadataOperations();

boolean isViewsEnabled();

Optional<String> getMaterializationProject();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.google.cloud.bigquery.connector.common;

import com.google.api.gax.rpc.FixedHeaderProvider;
import com.google.api.gax.rpc.HeaderProvider;
import java.util.HashMap;
import java.util.Map;

public class HttpUtil {

private HttpUtil() {}

public static HeaderProvider createHeaderProvider(BigQueryConfig config, String userAgent) {
Map<String, String> headers = new HashMap<>();
if (config.useParentProjectForMetadataOperations()) {
headers.put("X-Goog-User-Project", config.getParentProjectId());
}
headers.put("user-agent", userAgent);
return FixedHeaderProvider.create(headers);
}
}

This file was deleted.

Loading

0 comments on commit 875d23b

Please sign in to comment.