gcloud_spanner/admin/
client.rs1use 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}