gcloud_spanner/admin/
client.rs1use google_cloud_gax::conn::{Channel, ConnectionManager, ConnectionOptions, Error};
2use google_cloud_longrunning::autogen::operations_client::OperationsClient;
3
4use crate::admin::database::database_admin_client::DatabaseAdminClient;
5use crate::admin::instance::instance_admin_client::InstanceAdminClient;
6use crate::admin::AdminClientConfig;
7use crate::apiv1::conn_pool::{AUDIENCE, SPANNER};
8
9#[derive(Clone)]
10pub struct Client {
11 database: DatabaseAdminClient,
12 instance: InstanceAdminClient,
13}
14
15impl Client {
16 pub async fn new(config: AdminClientConfig) -> Result<Self, Error> {
17 let (conn, lro_client) = internal_client(&config).await?;
18 let database = DatabaseAdminClient::new(conn, lro_client);
19
20 let (conn, lro_client) = internal_client(&config).await?;
21 let instance = InstanceAdminClient::new(conn, lro_client);
22 Ok(Self { database, instance })
23 }
24
25 pub fn database(&self) -> &DatabaseAdminClient {
26 &self.database
27 }
28
29 pub fn instance(&self) -> &InstanceAdminClient {
30 &self.instance
31 }
32}
33
34async fn internal_client(config: &AdminClientConfig) -> Result<(Channel, OperationsClient), Error> {
35 let conn_options = ConnectionOptions {
36 timeout: Some(config.timeout),
37 connect_timeout: Some(config.connect_timeout),
38 http2_keep_alive_interval: config.http2_keep_alive_interval,
39 keep_alive_timeout: config.keep_alive_timeout,
40 keep_alive_while_idle: config.keep_alive_while_idle,
41 };
42 let conn_pool = ConnectionManager::new(1, SPANNER, AUDIENCE, &config.environment, &conn_options).await?;
43 let conn = conn_pool.conn();
44 let lro_client = OperationsClient::new(conn).await?;
45 Ok((conn_pool.conn(), lro_client))
46}