2626import com .google .api .gax .retrying .RetrySettings ;
2727import com .google .api .gax .rpc .ApiException ;
2828import 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 ;
3031import com .google .auto .value .AutoValue ;
3132import com .google .bigtable .v2 .Column ;
3233import com .google .bigtable .v2 .Family ;
5960import java .io .ByteArrayInputStream ;
6061import java .io .Closeable ;
6162import java .io .IOException ;
62- import java .nio .file .Files ;
63- import java .nio .file .Path ;
64- import java .nio .file .Paths ;
6563import java .util .Iterator ;
6664import java .util .LinkedHashMap ;
6765import java .util .List ;
7270import java .util .regex .Matcher ;
7371import java .util .regex .Pattern ;
7472import java .util .stream .Collectors ;
75- import javax .annotation .Nullable ;
7673import org .threeten .bp .Duration ;
7774
7875/** 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
9592
9693 private static final Logger logger = Logger .getLogger (CbtTestProxy .class .getName ());
9794
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 () {
10796 this .idClientMap = new ConcurrentHashMap <>();
10897 }
10998
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 ();
142102 }
143103
144104 /**
@@ -196,15 +156,21 @@ public synchronized void createClient(
196156 Preconditions .checkArgument (!request .getProjectId ().isEmpty (), "project id must be provided" );
197157 Preconditions .checkArgument (!request .getInstanceId ().isEmpty (), "instance id must be provided" );
198158 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" );
199163
200- if (idClientMap .contains (request .getClientId ())) {
164+ if (idClientMap .containsKey (request .getClientId ())) {
201165 responseObserver .onError (
202166 Status .ALREADY_EXISTS
203167 .withDescription ("Client " + request .getClientId () + " already exists." )
204168 .asException ());
205169 return ;
206170 }
207171
172+ // setRefreshingChannel is needed for now.
173+ @ SuppressWarnings ("deprecation" )
208174 BigtableDataSettings .Builder settingsBuilder =
209175 BigtableDataSettings .newBuilder ()
210176 // Disable channel refreshing when not using the real server
@@ -213,9 +179,6 @@ public synchronized void createClient(
213179 .setInstanceId (request .getInstanceId ())
214180 .setAppProfileId (request .getAppProfileId ());
215181
216- settingsBuilder .stubSettings ().setEnableRoutingCookie (false );
217- settingsBuilder .stubSettings ().setEnableRetryInfo (false );
218-
219182 if (request .hasPerOperationTimeout ()) {
220183 Duration newTimeout = Duration .ofMillis (Durations .toMillis (request .getPerOperationTimeout ()));
221184 settingsBuilder = overrideTimeoutSetting (newTimeout , settingsBuilder );
@@ -249,8 +212,13 @@ public synchronized void createClient(
249212 settingsBuilder
250213 .stubSettings ()
251214 .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 ()));
254222 }
255223 BigtableDataSettings settings = settingsBuilder .build ();
256224 BigtableDataClient client = BigtableDataClient .create (settings );
@@ -780,52 +748,60 @@ private static String extractTableIdFromTableName(String fullTableName)
780748 return matcher .group (3 );
781749 }
782750
783- private InstantiatingGrpcChannelProvider getTransportChannel () throws IOException {
751+ @ SuppressWarnings ("rawtypes" )
752+ private InstantiatingGrpcChannelProvider getTransportChannel (
753+ boolean encrypted , String rootCertsPem , String sslTarget ) {
784754 if (!encrypted ) {
785755 return EnhancedBigtableStubSettings .defaultGrpcTransportProviderBuilder ()
786756 .setChannelConfigurator (ManagedChannelBuilder ::usePlaintext )
787757 .build ();
788758 }
789759
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+ }
792772 }
793773
794- final SslContext secureContext =
795- GrpcSslContexts .forClient ()
796- .trustManager (new ByteArrayInputStream (rootCerts .getBytes (UTF_8 )))
797- .build ();
798774 return EnhancedBigtableStubSettings .defaultGrpcTransportProviderBuilder ()
799775 .setChannelConfigurator (
800776 new ApiFunction <ManagedChannelBuilder , ManagedChannelBuilder >() {
801777 @ Override
802778 public ManagedChannelBuilder apply (ManagedChannelBuilder input ) {
803779 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+
805789 return channelBuilder ;
806790 }
807791 })
808792 .build ();
809793 }
810794
811- private CredentialsProvider getCredentialsProvider () throws IOException {
812- if (credential == null ) {
795+ private CredentialsProvider getCredentialsProvider (String accessToken ) {
796+ if (accessToken . isEmpty () ) {
813797 return NoCredentialsProvider .create ();
814798 }
815799
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 )));
820802 }
821803
822804 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 ;
829805
830806 private static final Pattern tablePattern =
831807 Pattern .compile ("projects/([^/]+)/instances/([^/]+)/tables/([^/]+)" );
0 commit comments