use google_cloud_gax::conn::Channel;
use google_cloud_gax::create_request;
use google_cloud_gax::grpc::{Response, Status};
use google_cloud_gax::retry::{invoke, RetrySetting};
use google_cloud_googleapis::iam::v1::{
GetIamPolicyRequest, Policy, SetIamPolicyRequest, TestIamPermissionsRequest, TestIamPermissionsResponse,
};
use google_cloud_googleapis::longrunning::Operation as InternalOperation;
use google_cloud_googleapis::spanner::admin::database::v1::database_admin_client::DatabaseAdminClient as InternalDatabaseAdminClient;
use google_cloud_googleapis::spanner::admin::database::v1::{
Backup, CreateBackupRequest, CreateDatabaseRequest, Database, DeleteBackupRequest, DropDatabaseRequest,
GetBackupRequest, GetDatabaseDdlRequest, GetDatabaseDdlResponse, GetDatabaseRequest, ListBackupOperationsRequest,
ListBackupsRequest, ListDatabaseOperationsRequest, ListDatabasesRequest, RestoreDatabaseRequest,
UpdateBackupRequest, UpdateDatabaseDdlRequest,
};
use google_cloud_longrunning::autogen::operations_client::OperationsClient;
use google_cloud_longrunning::longrunning::Operation;
use crate::admin::default_retry_setting;
#[derive(Clone)]
pub struct DatabaseAdminClient {
inner: InternalDatabaseAdminClient<Channel>,
lro_client: OperationsClient,
}
impl DatabaseAdminClient {
pub fn new(channel: Channel, lro_client: OperationsClient) -> Self {
Self {
inner: InternalDatabaseAdminClient::new(channel).max_decoding_message_size(i32::MAX as usize),
lro_client,
}
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn list_databases(
&self,
mut req: ListDatabasesRequest,
retry: Option<RetrySetting>,
) -> Result<Vec<Database>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let parent = &req.parent;
let mut all_databases = vec![];
loop {
let action = || async {
let request = create_request(format!("parent={parent}"), req.clone());
self.inner.clone().list_databases(request).await.map(|d| d.into_inner())
};
let response = invoke(retry.clone(), action).await?;
all_databases.extend(response.databases.into_iter());
if response.next_page_token.is_empty() {
return Ok(all_databases);
}
req.page_token = response.next_page_token;
}
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn create_database(
&self,
req: CreateDatabaseRequest,
retry: Option<RetrySetting>,
) -> Result<Operation<Database>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let parent = &req.parent;
let action = || async {
let request = create_request(format!("parent={parent}"), req.clone());
self.inner.clone().create_database(request).await
};
invoke(retry, action)
.await
.map(|d| Operation::new(self.lro_client.clone(), d.into_inner()))
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn get_database(
&self,
req: GetDatabaseRequest,
retry: Option<RetrySetting>,
) -> Result<Response<Database>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let name = &req.name;
let action = || async {
let request = create_request(format!("name={name}"), req.clone());
self.inner.clone().get_database(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn update_database_ddl(
&self,
req: UpdateDatabaseDdlRequest,
retry: Option<RetrySetting>,
) -> Result<Operation<()>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let database = &req.database;
let action = || async {
let request = create_request(format!("database={database}"), req.clone());
self.inner.clone().update_database_ddl(request).await
};
invoke(retry, action)
.await
.map(|d| Operation::new(self.lro_client.clone(), d.into_inner()))
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn drop_database(
&self,
req: DropDatabaseRequest,
retry: Option<RetrySetting>,
) -> Result<Response<()>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let database = &req.database;
let action = || async {
let request = create_request(format!("database={database}"), req.clone());
self.inner.clone().drop_database(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn get_database_ddl(
&self,
req: GetDatabaseDdlRequest,
retry: Option<RetrySetting>,
) -> Result<Response<GetDatabaseDdlResponse>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let database = &req.database;
let action = || async {
let request = create_request(format!("database={database}"), req.clone());
self.inner.clone().get_database_ddl(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn set_iam_policy(
&self,
req: SetIamPolicyRequest,
retry: Option<RetrySetting>,
) -> Result<Response<Policy>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let resource = &req.resource;
let action = || async {
let request = create_request(format!("resource={resource}"), req.clone());
self.inner.clone().set_iam_policy(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn get_iam_policy(
&self,
req: GetIamPolicyRequest,
retry: Option<RetrySetting>,
) -> Result<Response<Policy>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let resource = &req.resource;
let action = || async {
let request = create_request(format!("resource={resource}"), req.clone());
self.inner.clone().get_iam_policy(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn test_iam_permissions(
&self,
req: TestIamPermissionsRequest,
retry: Option<RetrySetting>,
) -> Result<Response<TestIamPermissionsResponse>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let resource = &req.resource;
let action = || async {
let request = create_request(format!("resource={resource}"), req.clone());
self.inner.clone().test_iam_permissions(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn create_backup(
&self,
req: CreateBackupRequest,
retry: Option<RetrySetting>,
) -> Result<Operation<Backup>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let parent = &req.parent;
let action = || async {
let request = create_request(format!("parent={parent}"), req.clone());
self.inner.clone().create_backup(request).await
};
invoke(retry, action)
.await
.map(|d| Operation::new(self.lro_client.clone(), d.into_inner()))
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn get_backup(
&self,
req: GetBackupRequest,
retry: Option<RetrySetting>,
) -> Result<Response<Backup>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let name = &req.name;
let action = || async {
let request = create_request(format!("name={name}"), req.clone());
self.inner.clone().get_backup(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn update_backup(
&self,
req: UpdateBackupRequest,
retry: Option<RetrySetting>,
) -> Result<Response<Backup>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let name = &req.backup.as_ref().unwrap().name;
let action = || async {
let request = create_request(format!("backup.name={name}"), req.clone());
self.inner.clone().update_backup(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn delete_backup(
&self,
req: DeleteBackupRequest,
retry: Option<RetrySetting>,
) -> Result<Response<()>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let name = &req.name;
let action = || async {
let request = create_request(format!("name={name}"), req.clone());
self.inner.clone().delete_backup(request).await
};
invoke(retry, action).await
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn list_backups(
&self,
mut req: ListBackupsRequest,
retry: Option<RetrySetting>,
) -> Result<Vec<Backup>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let parent = &req.parent;
let mut all_backups = vec![];
loop {
let action = || async {
let request = create_request(format!("parent={parent}"), req.clone());
self.inner.clone().list_backups(request).await.map(|d| d.into_inner())
};
let response = invoke(retry.clone(), action).await?;
all_backups.extend(response.backups.into_iter());
if response.next_page_token.is_empty() {
return Ok(all_backups);
}
req.page_token = response.next_page_token;
}
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn restore_database(
&self,
req: RestoreDatabaseRequest,
retry: Option<RetrySetting>,
) -> Result<Operation<Database>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let parent = &req.parent;
let action = || async {
let request = create_request(format!("parent={parent}"), req.clone());
self.inner.clone().restore_database(request).await
};
invoke(retry, action)
.await
.map(|d| Operation::new(self.lro_client.clone(), d.into_inner()))
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn list_backup_operations(
&self,
mut req: ListBackupOperationsRequest,
retry: Option<RetrySetting>,
) -> Result<Vec<InternalOperation>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let parent = &req.parent;
let mut all_operations = vec![];
loop {
let action = || async {
let request = create_request(format!("parent={parent}"), req.clone());
self.inner
.clone()
.list_backup_operations(request)
.await
.map(|d| d.into_inner())
};
let response = invoke(retry.clone(), action).await?;
all_operations.extend(response.operations.into_iter());
if response.next_page_token.is_empty() {
return Ok(all_operations);
}
req.page_token = response.next_page_token;
}
}
#[cfg_attr(feature = "trace", tracing::instrument(skip_all))]
pub async fn list_database_operations(
&self,
mut req: ListDatabaseOperationsRequest,
retry: Option<RetrySetting>,
) -> Result<Vec<InternalOperation>, Status> {
let retry = Some(retry.unwrap_or_else(default_retry_setting));
let parent = &req.parent;
let mut all_operations = vec![];
loop {
let action = || async {
let request = create_request(format!("parent={parent}"), req.clone());
self.inner
.clone()
.list_database_operations(request)
.await
.map(|d| d.into_inner())
};
let response = invoke(retry.clone(), action).await?;
all_operations.extend(response.operations.into_iter());
if response.next_page_token.is_empty() {
return Ok(all_operations);
}
req.page_token = response.next_page_token;
}
}
}