Skip to main content

gcloud_spanner/admin/
client.rs

1use 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}