From 1e98ed467afa49b543f22a0fb8ad44306a30c3b8 Mon Sep 17 00:00:00 2001 From: Andrew James <59655451+andrew-james-dev@users.noreply.github.com> Date: Mon, 12 Aug 2024 02:16:08 +0100 Subject: [PATCH] Directly authenticate Spanner Admin Client (#295) --- spanner/src/admin/mod.rs | 38 ++++++++++++++++++++++++++++++++++++++ spanner/src/reader.rs | 5 +++++ 2 files changed, 43 insertions(+) diff --git a/spanner/src/admin/mod.rs b/spanner/src/admin/mod.rs index 7c748cfb..3aa0001f 100644 --- a/spanner/src/admin/mod.rs +++ b/spanner/src/admin/mod.rs @@ -31,6 +31,44 @@ impl Default for AdminClientConfig { } } +#[cfg(feature = "auth")] +pub use google_cloud_auth; + +#[cfg(feature = "auth")] +impl AdminClientConfig { + pub async fn with_auth(mut self) -> Result { + if let Environment::GoogleCloud(_) = self.environment { + let ts = google_cloud_auth::token::DefaultTokenSourceProvider::new(Self::auth_config()).await?; + self.environment = Environment::GoogleCloud(Box::new(ts)) + } + Ok(self) + } + + pub async fn with_credentials( + mut self, + credentials: google_cloud_auth::credentials::CredentialsFile, + ) -> Result { + if let Environment::GoogleCloud(_) = self.environment { + let ts = google_cloud_auth::token::DefaultTokenSourceProvider::new_with_credentials( + Self::auth_config(), + Box::new(credentials), + ) + .await?; + self.environment = Environment::GoogleCloud(Box::new(ts)) + } + Ok(self) + } + + fn auth_config() -> google_cloud_auth::project::Config<'static> { + google_cloud_auth::project::Config { + audience: Some(crate::apiv1::conn_pool::AUDIENCE), + scopes: Some(&crate::apiv1::conn_pool::SCOPES), + sub: None, + ..Default::default() + } + } +} + pub fn default_retry_setting() -> RetrySetting { RetrySetting { from_millis: 50, diff --git a/spanner/src/reader.rs b/spanner/src/reader.rs index 7b0d9a3f..ed798366 100644 --- a/spanner/src/reader.rs +++ b/spanner/src/reader.rs @@ -248,6 +248,11 @@ where } } + /// Return metadata for all columns + pub fn columns_metadata(&self) -> &Arc> { + &self.rs.fields + } + pub fn column_metadata(&self, column_name: &str) -> Option<(usize, Field)> { for (i, val) in self.rs.fields.iter().enumerate() { if val.name == column_name {