gcloud_spanner/admin/
client.rs

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