26
26
import com .google .api .gax .retrying .RetrySettings ;
27
27
import com .google .api .gax .rpc .ApiException ;
28
28
import com .google .api .gax .rpc .ServerStream ;
29
- import com .google .auth .oauth2 .GoogleCredentials ;
29
+ import com .google .auth .oauth2 .AccessToken ;
30
+ import com .google .auth .oauth2 .OAuth2Credentials ;
30
31
import com .google .auto .value .AutoValue ;
31
32
import com .google .bigtable .v2 .Column ;
32
33
import com .google .bigtable .v2 .Family ;
59
60
import java .io .ByteArrayInputStream ;
60
61
import java .io .Closeable ;
61
62
import java .io .IOException ;
62
- import java .nio .file .Files ;
63
- import java .nio .file .Path ;
64
- import java .nio .file .Paths ;
65
63
import java .util .Iterator ;
66
64
import java .util .LinkedHashMap ;
67
65
import java .util .List ;
72
70
import java .util .regex .Matcher ;
73
71
import java .util .regex .Pattern ;
74
72
import java .util .stream .Collectors ;
75
- import javax .annotation .Nullable ;
76
73
import org .threeten .bp .Duration ;
77
74
78
75
/** Java implementation of the CBT test proxy. Used to test the Java CBT client. */
@@ -95,50 +92,13 @@ static CbtClient create(BigtableDataSettings settings, BigtableDataClient dataCl
95
92
96
93
private static final Logger logger = Logger .getLogger (CbtTestProxy .class .getName ());
97
94
98
- private CbtTestProxy (
99
- boolean encrypted ,
100
- @ Nullable String rootCerts ,
101
- @ Nullable String sslTarget ,
102
- @ Nullable String credential ) {
103
- this .encrypted = encrypted ;
104
- this .rootCerts = rootCerts ;
105
- this .sslTarget = sslTarget ;
106
- this .credential = credential ;
95
+ private CbtTestProxy () {
107
96
this .idClientMap = new ConcurrentHashMap <>();
108
97
}
109
98
110
- /**
111
- * Factory method to return a proxy instance that interacts with server unencrypted and
112
- * unauthenticated.
113
- */
114
- public static CbtTestProxy createUnencrypted () {
115
- return new CbtTestProxy (false , null , null , null );
116
- }
117
-
118
- /**
119
- * Factory method to return a proxy instance that interacts with server encrypted. Default
120
- * authority and public certificates are used if null values are passed in.
121
- *
122
- * @param rootCertsPemPath The path to a root certificate PEM file
123
- * @param sslTarget The override of SSL target name
124
- * @param credentialJsonPath The path to a credential JSON file
125
- */
126
- public static CbtTestProxy createEncrypted (
127
- @ Nullable String rootCertsPemPath ,
128
- @ Nullable String sslTarget ,
129
- @ Nullable String credentialJsonPath )
130
- throws IOException {
131
- String tmpRootCerts = null , tmpCredential = null ;
132
- if (rootCertsPemPath != null ) {
133
- Path file = Paths .get (rootCertsPemPath );
134
- tmpRootCerts = new String (Files .readAllBytes (file ), UTF_8 );
135
- }
136
- if (credentialJsonPath != null ) {
137
- Path file = Paths .get (credentialJsonPath );
138
- tmpCredential = new String (Files .readAllBytes (file ), UTF_8 );
139
- }
140
-
141
- return new CbtTestProxy (true , tmpRootCerts , sslTarget , tmpCredential );
99
+ /** Factory method to return a proxy instance. */
100
+ public static CbtTestProxy create () {
101
+ return new CbtTestProxy ();
142
102
}
143
103
144
104
/**
@@ -196,15 +156,21 @@ public synchronized void createClient(
196
156
Preconditions .checkArgument (!request .getProjectId ().isEmpty (), "project id must be provided" );
197
157
Preconditions .checkArgument (!request .getInstanceId ().isEmpty (), "instance id must be provided" );
198
158
Preconditions .checkArgument (!request .getDataTarget ().isEmpty (), "data target must be provided" );
159
+ Preconditions .checkArgument (
160
+ !request .getSecurityOptions ().getUseSsl ()
161
+ || !request .getSecurityOptions ().getSslRootCertsPemBytes ().isEmpty (),
162
+ "security_options.ssl_root_certs_pem must be provided if security_options.use_ssl is true" );
199
163
200
- if (idClientMap .contains (request .getClientId ())) {
164
+ if (idClientMap .containsKey (request .getClientId ())) {
201
165
responseObserver .onError (
202
166
Status .ALREADY_EXISTS
203
167
.withDescription ("Client " + request .getClientId () + " already exists." )
204
168
.asException ());
205
169
return ;
206
170
}
207
171
172
+ // setRefreshingChannel is needed for now.
173
+ @ SuppressWarnings ("deprecation" )
208
174
BigtableDataSettings .Builder settingsBuilder =
209
175
BigtableDataSettings .newBuilder ()
210
176
// Disable channel refreshing when not using the real server
@@ -213,9 +179,6 @@ public synchronized void createClient(
213
179
.setInstanceId (request .getInstanceId ())
214
180
.setAppProfileId (request .getAppProfileId ());
215
181
216
- settingsBuilder .stubSettings ().setEnableRoutingCookie (false );
217
- settingsBuilder .stubSettings ().setEnableRetryInfo (false );
218
-
219
182
if (request .hasPerOperationTimeout ()) {
220
183
Duration newTimeout = Duration .ofMillis (Durations .toMillis (request .getPerOperationTimeout ()));
221
184
settingsBuilder = overrideTimeoutSetting (newTimeout , settingsBuilder );
@@ -249,8 +212,13 @@ public synchronized void createClient(
249
212
settingsBuilder
250
213
.stubSettings ()
251
214
.setEndpoint (request .getDataTarget ())
252
- .setTransportChannelProvider (getTransportChannel ())
253
- .setCredentialsProvider (getCredentialsProvider ());
215
+ .setTransportChannelProvider (
216
+ getTransportChannel (
217
+ request .getSecurityOptions ().getUseSsl (),
218
+ request .getSecurityOptions ().getSslRootCertsPem (),
219
+ request .getSecurityOptions ().getSslEndpointOverride ()))
220
+ .setCredentialsProvider (
221
+ getCredentialsProvider (request .getSecurityOptions ().getAccessToken ()));
254
222
}
255
223
BigtableDataSettings settings = settingsBuilder .build ();
256
224
BigtableDataClient client = BigtableDataClient .create (settings );
@@ -780,52 +748,60 @@ private static String extractTableIdFromTableName(String fullTableName)
780
748
return matcher .group (3 );
781
749
}
782
750
783
- private InstantiatingGrpcChannelProvider getTransportChannel () throws IOException {
751
+ @ SuppressWarnings ("rawtypes" )
752
+ private InstantiatingGrpcChannelProvider getTransportChannel (
753
+ boolean encrypted , String rootCertsPem , String sslTarget ) {
784
754
if (!encrypted ) {
785
755
return EnhancedBigtableStubSettings .defaultGrpcTransportProviderBuilder ()
786
756
.setChannelConfigurator (ManagedChannelBuilder ::usePlaintext )
787
757
.build ();
788
758
}
789
759
790
- if (rootCerts == null ) {
791
- return EnhancedBigtableStubSettings .defaultGrpcTransportProviderBuilder ().build ();
760
+ final SslContext sslContext ;
761
+ if (rootCertsPem .isEmpty ()) {
762
+ sslContext = null ;
763
+ } else {
764
+ try {
765
+ sslContext =
766
+ GrpcSslContexts .forClient ()
767
+ .trustManager (new ByteArrayInputStream (rootCertsPem .getBytes (UTF_8 )))
768
+ .build ();
769
+ } catch (IOException e ) {
770
+ throw new IllegalArgumentException (e );
771
+ }
792
772
}
793
773
794
- final SslContext secureContext =
795
- GrpcSslContexts .forClient ()
796
- .trustManager (new ByteArrayInputStream (rootCerts .getBytes (UTF_8 )))
797
- .build ();
798
774
return EnhancedBigtableStubSettings .defaultGrpcTransportProviderBuilder ()
799
775
.setChannelConfigurator (
800
776
new ApiFunction <ManagedChannelBuilder , ManagedChannelBuilder >() {
801
777
@ Override
802
778
public ManagedChannelBuilder apply (ManagedChannelBuilder input ) {
803
779
NettyChannelBuilder channelBuilder = (NettyChannelBuilder ) input ;
804
- channelBuilder .sslContext (secureContext ).overrideAuthority (sslTarget );
780
+
781
+ if (sslContext != null ) {
782
+ channelBuilder .sslContext (sslContext );
783
+ }
784
+
785
+ if (!sslTarget .isEmpty ()) {
786
+ channelBuilder .overrideAuthority (sslTarget );
787
+ }
788
+
805
789
return channelBuilder ;
806
790
}
807
791
})
808
792
.build ();
809
793
}
810
794
811
- private CredentialsProvider getCredentialsProvider () throws IOException {
812
- if (credential == null ) {
795
+ private CredentialsProvider getCredentialsProvider (String accessToken ) {
796
+ if (accessToken . isEmpty () ) {
813
797
return NoCredentialsProvider .create ();
814
798
}
815
799
816
- final GoogleCredentials creds =
817
- GoogleCredentials .fromStream (new ByteArrayInputStream (credential .getBytes (UTF_8 )));
818
-
819
- return FixedCredentialsProvider .create (creds );
800
+ return FixedCredentialsProvider .create (
801
+ OAuth2Credentials .create (new AccessToken (accessToken , null )));
820
802
}
821
803
822
804
private final ConcurrentHashMap <String , CbtClient > idClientMap ;
823
- private final boolean encrypted ;
824
-
825
- // Parameters that may be needed when "encrypted" is true.
826
- private final String rootCerts ;
827
- private final String sslTarget ;
828
- private final String credential ;
829
805
830
806
private static final Pattern tablePattern =
831
807
Pattern .compile ("projects/([^/]+)/instances/([^/]+)/tables/([^/]+)" );
0 commit comments