diff --git a/google/cloud/odbc/bq_client_interface/odbc_authentication.cc b/google/cloud/odbc/bq_client_interface/odbc_authentication.cc index 0f584a9f0e..aa976fe26d 100644 --- a/google/cloud/odbc/bq_client_interface/odbc_authentication.cc +++ b/google/cloud/odbc/bq_client_interface/odbc_authentication.cc @@ -171,9 +171,9 @@ StatusRecordOr CreateJsonCredsObject( } StatusRecordOr> -CreateExternalAccountAuthenticationBYOID(Oauth const& oauth, +CreateExternalAccountAuthenticationBYOID(ConnProps const& conn_props, Options const& options) { - if (!IsBYOIDPropsSet(oauth)) { + if (!IsBYOIDPropsSet(conn_props)) { LOG(ERROR) << "CreateExternalAccountAuthenticationBYOID:: Unable to create " "external auth credentials: Required BYOID Properties are not set "; @@ -182,8 +182,9 @@ CreateExternalAccountAuthenticationBYOID(Oauth const& oauth, "BYOID Properties are not set "}; } StatusRecordOr json_creds = CreateJsonCredsObject( - oauth.byoid_aud_url, oauth.byoid_creds_src, oauth.byoid_pool_user_project, - oauth.byoid_subj_token_type, oauth.byoid_token_url); + conn_props.byoid_aud_url, conn_props.byoid_creds_src, + conn_props.byoid_pool_user_project, conn_props.byoid_subj_token_type, + conn_props.byoid_token_url); if (!json_creds) { LOG(ERROR) << "CreateExternalAccountAuthenticationBYOID::CreateJsonCredsObject:: " @@ -195,29 +196,31 @@ CreateExternalAccountAuthenticationBYOID(Oauth const& oauth, } StatusRecordOr> CreateCredentials( - Oauth const& oauth, Options const& options) { - switch (oauth.auth_mechanism) { + ConnProps const& conn_props, Options const& options) { + switch (conn_props.auth_mechanism) { case OauthMechanism::kServiceAccount: - return CreateServiceCredentials(oauth.credentials_file_path, options); + return CreateServiceCredentials(conn_props.credentials_file_path, + options); case OauthMechanism::kUserAccount: - return CreateUserCredentials(oauth.credentials_file_path, options); + return CreateUserCredentials(conn_props.credentials_file_path, options); case OauthMechanism::kApplicationDefault: return CreateApplicationDefaultCredentials(options); case OauthMechanism::kExternalUser: { - if (oauth.credentials_file_path.empty() && !IsBYOIDPropsSet(oauth)) { + if (conn_props.credentials_file_path.empty() && + !IsBYOIDPropsSet(conn_props)) { LOG(ERROR) << "CreateCredentials:: The path to the external auth JSON " "file can't be empty"; return StatusRecord{ SQLStates::k_HY000(), "The path to the external auth JSON file can't be empty"}; } - if (!oauth.credentials_file_path.empty()) { + if (!conn_props.credentials_file_path.empty()) { // Call creation of external auth via JSON file - return CreateExternalAuthCredentialsJSON(oauth.credentials_file_path, - options); + return CreateExternalAuthCredentialsJSON( + conn_props.credentials_file_path, options); } // Call creation of external auth via BYOID properties. - return CreateExternalAccountAuthenticationBYOID(oauth, options); + return CreateExternalAccountAuthenticationBYOID(conn_props, options); } } LOG(ERROR) << "CreateCredentials:: OauthMechanism enum is invalid"; diff --git a/google/cloud/odbc/bq_client_interface/odbc_authentication.h b/google/cloud/odbc/bq_client_interface/odbc_authentication.h index bdfd00affb..721c2db089 100644 --- a/google/cloud/odbc/bq_client_interface/odbc_authentication.h +++ b/google/cloud/odbc/bq_client_interface/odbc_authentication.h @@ -64,7 +64,7 @@ struct GCD { std::string universe_domain; }; -struct Oauth { +struct ConnProps { OauthMechanism auth_mechanism; std::string credentials_file_path; ///////////////////////////////////////////////////////////////// @@ -84,6 +84,7 @@ struct Oauth { // The URI used to generate authentication tokens. Defaults to // https://sts.googleapis.com/v1/token. std::string byoid_token_url; + std::string quota_project_id; SslCredentials ssl_credentials; ProxyOptions proxy_options; std::string kms_key_name; @@ -92,13 +93,14 @@ struct Oauth { }; // Returns true if all required BYOID properties are set. -inline bool IsBYOIDPropsSet(Oauth const& oauth) { - return (!oauth.byoid_aud_url.empty() && !oauth.byoid_creds_src.empty()); +inline bool IsBYOIDPropsSet(ConnProps const& conn_props) { + return (!conn_props.byoid_aud_url.empty() && + !conn_props.byoid_creds_src.empty()); } /// Creates an object of UnifiedCredentials depending on the input arguments. odbc_internal::StatusRecordOr> CreateCredentials( - Oauth const& oauth, + ConnProps const& conn_props, ::google::cloud::Options const& options = ::google::cloud::Options{}); /// Creates OAuth2 access_token diff --git a/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc b/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc index 0156ec1538..278ad95bbd 100644 --- a/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc +++ b/google/cloud/odbc/bq_client_interface/odbc_bq_client.cc @@ -21,6 +21,7 @@ #include "google/cloud/odbc/bq_client_interface/tables.h" #include "google/cloud/odbc/internal/status_record_or.h" #include "google/cloud/odbc/internal/version.h" +#include "google/cloud/common_options.h" #include "google/cloud/completion_queue.h" #include "google/cloud/credentials.h" #include "google/cloud/grpc_options.h" @@ -154,13 +155,14 @@ google::cloud::ProxyConfig CreateProxyConfig(std::string hostname, } // namespace StatusRecordOr> ODBCBQClient::CreateBQClient( - Oauth const& oauth) { + ConnProps const& conn_props) { // 1. Initialize Options and set Proxy/SSL settings FIRST google::cloud::Options options; - std::string pem_file = oauth.ssl_credentials.pem_root_certs; + std::string pem_file = conn_props.ssl_credentials.pem_root_certs; #ifdef _WIN32 - bool use_system_trust_store = oauth.ssl_credentials.use_system_trust_store; + bool use_system_trust_store = + conn_props.ssl_credentials.use_system_trust_store; std::string pem_path; if (use_system_trust_store == true) { auto pem_path_or = ExportWindowsSystemCertsToPem(); @@ -184,17 +186,17 @@ StatusRecordOr> ODBCBQClient::CreateBQClient( // Set Proxy options.set( ProxyConfig() - .set_hostname(oauth.proxy_options.hostname) - .set_port(oauth.proxy_options.port) - .set_username(oauth.proxy_options.username) - .set_password(oauth.proxy_options.password) + .set_hostname(conn_props.proxy_options.hostname) + .set_port(conn_props.proxy_options.port) + .set_username(conn_props.proxy_options.username) + .set_password(conn_props.proxy_options.password) .set_scheme("http")); options.set( {"Google-Bigquery-ODBC/" + std::string(DRIVER_VERSION)}); StatusRecordOr> credentials = - CreateCredentials(oauth, options); + CreateCredentials(conn_props, options); if (!credentials.Ok()) { LOG(ERROR) << "CreateBQClient::CreateCredentials:: " << credentials.GetStatusRecord().message; @@ -210,17 +212,22 @@ StatusRecordOr> ODBCBQClient::CreateBQClient( options.set(*credentials); - if (oauth.gcd.enable_gcd && oauth.gcd.universe_domain != "googleapis.com") { + if (!conn_props.quota_project_id.empty()) { + options.set(conn_props.quota_project_id); + } + + if (conn_props.gcd.enable_gcd && + conn_props.gcd.universe_domain != "googleapis.com") { options.set( - oauth.gcd.universe_domain); + conn_props.gcd.universe_domain); } // Handle Private Service Connect URIs std::string bigquery_endpoint; std::string readapi_endpoint; - if (!oauth.psc.empty()) { - std::stringstream ss(oauth.psc); + if (!conn_props.psc.empty()) { + std::stringstream ss(conn_props.psc); std::string token; while (std::getline(ss, token, ',')) { auto pos = token.find('='); diff --git a/google/cloud/odbc/bq_client_interface/odbc_bq_client.h b/google/cloud/odbc/bq_client_interface/odbc_bq_client.h index 6beadb48c1..521c7912d1 100644 --- a/google/cloud/odbc/bq_client_interface/odbc_bq_client.h +++ b/google/cloud/odbc/bq_client_interface/odbc_bq_client.h @@ -57,7 +57,7 @@ odbc_internal::StatusRecordOr ExportWindowsSystemCertsToPem(); class ODBCBQClient { public: static odbc_internal::StatusRecordOr> - CreateBQClient(Oauth const& oauth); + CreateBQClient(ConnProps const& conn_props); ~ODBCBQClient() = default; ODBCBQClient(ODBCBQClient const&) = default; diff --git a/google/cloud/odbc/bq_driver/internal/driver_form.cc b/google/cloud/odbc/bq_driver/internal/driver_form.cc index facf78c229..3a3984450a 100644 --- a/google/cloud/odbc/bq_driver/internal/driver_form.cc +++ b/google/cloud/odbc/bq_driver/internal/driver_form.cc @@ -26,7 +26,7 @@ #pragma comment(lib, "Comctl32.lib") // Link with Comctl32.lib namespace google::cloud::odbc_bq_driver_internal { -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_bq_driver::SQLDriverConnectInternal; @@ -765,12 +765,12 @@ void EvaluateFields(HWND hwnd) { } void PopulateDropdown(HWND h_dataset_box, std::string text, - std::string key_file, std::string oauth, + std::string key_file, std::string conn_props, std::string catalog) { SendMessage(h_dataset_box, CB_RESETCONTENT, 0, 0); StatusRecordOr status_record = - DriverForm::GetCatalogAndDataset(text, key_file, oauth, catalog); + DriverForm::GetCatalogAndDataset(text, key_file, conn_props, catalog); if (!status_record.Ok()) { MessageBox(h_dataset_box, status_record.GetStatusRecord().message.c_str(), diff --git a/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.cc b/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.cc index 890a2c15f4..7902a16609 100644 --- a/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.cc +++ b/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.cc @@ -86,6 +86,7 @@ void ConnectionHandle::SetUp(Section& dsn_section, dsn_.description = dsn_section["DESCRIPTION"]; dsn_.driver = dsn_section["DRIVER"]; dsn_.catalog = dsn_section["CATALOG"]; + dsn_.quota_project_id = dsn_section["QUOTAPROJECTID"]; dsn_.default_dataset = dsn_section["DEFAULTDATASET"]; std::string filter_tables = dsn_section["FILTERTABLESONDEFAULTDATASET"]; if (!filter_tables.empty()) { @@ -276,16 +277,16 @@ ConnectionHandle& ConnectionHandle::operator=( StatusRecord ConnectionHandle::ValidateExternalUser( Authentication const& auth) { - if (auth.oauth.auth_mechanism == OauthMechanism::kExternalUser) { - if (!auth.oauth.credentials_file_path.empty()) { + if (auth.conn_props.auth_mechanism == OauthMechanism::kExternalUser) { + if (!auth.conn_props.credentials_file_path.empty()) { // KeyFilePath takes precedence. return StatusRecord::Ok(); } // Validate BYOID properties. - return ValidateBYOIDProperties(auth.oauth.byoid_aud_url, - auth.oauth.byoid_creds_src, - auth.oauth.byoid_subj_token_type); + return ValidateBYOIDProperties(auth.conn_props.byoid_aud_url, + auth.conn_props.byoid_creds_src, + auth.conn_props.byoid_subj_token_type); } return StatusRecord::Ok(); } @@ -299,7 +300,7 @@ StatusRecord ConnectionHandle::Connect(Authentication& auth) { return validation_status; } StatusRecordOr> response = - ODBCBQClient::CreateBQClient(auth.oauth); + ODBCBQClient::CreateBQClient(auth.conn_props); if (!response) { LOG(ERROR) << "ConnectionHandle::Connect::CreateBQClient:: " << response.GetStatusRecord().message; diff --git a/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.h b/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.h index 5cc9a1c635..6d919052ef 100644 --- a/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.h +++ b/google/cloud/odbc/bq_driver/internal/odbc_conn_handle.h @@ -25,7 +25,7 @@ namespace google::cloud::odbc_bq_driver_internal { -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; @@ -35,7 +35,7 @@ inline std::uint32_t const kDefaultMaxRetries = 6; // Details of authentication provided in the odbc.ini/Windows Registry struct Authentication { - Oauth oauth; + ConnProps conn_props; // TODO(jsrinnn): Remove this if it is not being used. std::string email; // TODO(jsrinnn): Remove this if it is not being used. @@ -48,6 +48,7 @@ struct Dsn { std::string description; std::string driver; std::string catalog; + std::string quota_project_id; std::string default_dataset; std::string dsn_name; std::string key_file_path; diff --git a/google/cloud/odbc/bq_driver/internal/odbc_conn_handle_test.cc b/google/cloud/odbc/bq_driver/internal/odbc_conn_handle_test.cc index 393ace6147..c2796176c7 100644 --- a/google/cloud/odbc/bq_driver/internal/odbc_conn_handle_test.cc +++ b/google/cloud/odbc/bq_driver/internal/odbc_conn_handle_test.cc @@ -630,12 +630,12 @@ TEST(ConnectionHandle, SetAttributeSetTwice) { TEST(ConnectionHandle, ValidateExternalUserSuccessByoidWithPoolUser) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.byoid_aud_url = "test-aud"; - auth.oauth.byoid_creds_src = "test-creds"; - auth.oauth.byoid_subj_token_type = kSubTokenTypeDefault; - auth.oauth.byoid_pool_user_project = "test-pool-user-project"; - auth.oauth.byoid_token_url = kDefaultTokenUrl; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.byoid_aud_url = "test-aud"; + auth.conn_props.byoid_creds_src = "test-creds"; + auth.conn_props.byoid_subj_token_type = kSubTokenTypeDefault; + auth.conn_props.byoid_pool_user_project = "test-pool-user-project"; + auth.conn_props.byoid_token_url = kDefaultTokenUrl; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_TRUE(status.ok()); @@ -643,11 +643,11 @@ TEST(ConnectionHandle, ValidateExternalUserSuccessByoidWithPoolUser) { TEST(ConnectionHandle, ValidateExternalUserSuccessByoidWithoutPoolUser) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.byoid_aud_url = "test-aud"; - auth.oauth.byoid_creds_src = "test-creds"; - auth.oauth.byoid_subj_token_type = kSubTokenTypeDefault; - auth.oauth.byoid_token_url = kDefaultTokenUrl; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.byoid_aud_url = "test-aud"; + auth.conn_props.byoid_creds_src = "test-creds"; + auth.conn_props.byoid_subj_token_type = kSubTokenTypeDefault; + auth.conn_props.byoid_token_url = kDefaultTokenUrl; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_TRUE(status.ok()); @@ -655,8 +655,8 @@ TEST(ConnectionHandle, ValidateExternalUserSuccessByoidWithoutPoolUser) { TEST(ConnectionHandle, ValidateExternalUserSuccessJson) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.credentials_file_path = "path-to-file"; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.credentials_file_path = "path-to-file"; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_TRUE(status.ok()); @@ -664,7 +664,7 @@ TEST(ConnectionHandle, ValidateExternalUserSuccessJson) { TEST(ConnectionHandle, ValidateExternalUserSuccessNotExternalUser) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kServiceAccount; + auth.conn_props.auth_mechanism = OauthMechanism::kServiceAccount; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_TRUE(status.ok()); @@ -672,11 +672,11 @@ TEST(ConnectionHandle, ValidateExternalUserSuccessNotExternalUser) { TEST(ConnectionHandle, ValidateExternalUserFailByoid) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.byoid_aud_url = "test-aud"; - auth.oauth.byoid_creds_src = "test-creds"; - auth.oauth.byoid_subj_token_type = "invalid"; - auth.oauth.byoid_token_url = kDefaultTokenUrl; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.byoid_aud_url = "test-aud"; + auth.conn_props.byoid_creds_src = "test-creds"; + auth.conn_props.byoid_subj_token_type = "invalid"; + auth.conn_props.byoid_token_url = kDefaultTokenUrl; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_FALSE(status.ok()); @@ -685,7 +685,7 @@ TEST(ConnectionHandle, ValidateExternalUserFailByoid) { TEST(ConnectionHandle, ValidateExternalUserFailJson) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_FALSE(status.ok()); @@ -695,13 +695,13 @@ TEST(ConnectionHandle, ValidateExternalUserFailJson) { TEST(ConnectionHandle, ValidateExternalUserSuccessJsonWithIncorrectByoidProperties) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.credentials_file_path = "path-to-file"; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.credentials_file_path = "path-to-file"; // KeyFilePath takes precedence, so these incorrect/empty BYOID properties // should be ignored. - auth.oauth.byoid_aud_url = ""; - auth.oauth.byoid_creds_src = ""; - auth.oauth.byoid_subj_token_type = "invalid"; + auth.conn_props.byoid_aud_url = ""; + auth.conn_props.byoid_creds_src = ""; + auth.conn_props.byoid_subj_token_type = "invalid"; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_TRUE(status.ok()); @@ -709,9 +709,9 @@ TEST(ConnectionHandle, TEST(ConnectionHandle, ValidateExternalUserFailByoidAudienceNotSet) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.byoid_creds_src = "test-creds"; - auth.oauth.byoid_subj_token_type = kSubTokenTypeDefault; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.byoid_creds_src = "test-creds"; + auth.conn_props.byoid_subj_token_type = kSubTokenTypeDefault; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_FALSE(status.ok()); @@ -720,9 +720,9 @@ TEST(ConnectionHandle, ValidateExternalUserFailByoidAudienceNotSet) { TEST(ConnectionHandle, ValidateExternalUserFailByoidCredSourceNotSet) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.byoid_aud_url = "test-aud"; - auth.oauth.byoid_subj_token_type = kSubTokenTypeDefault; + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.byoid_aud_url = "test-aud"; + auth.conn_props.byoid_subj_token_type = kSubTokenTypeDefault; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); EXPECT_FALSE(status.ok()); @@ -731,10 +731,10 @@ TEST(ConnectionHandle, ValidateExternalUserFailByoidCredSourceNotSet) { TEST(ConnectionHandle, ValidateExternalUserSuccessByoidJwtToken) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.byoid_aud_url = "test-aud"; - auth.oauth.byoid_creds_src = "test-creds"; - auth.oauth.byoid_subj_token_type = + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.byoid_aud_url = "test-aud"; + auth.conn_props.byoid_creds_src = "test-creds"; + auth.conn_props.byoid_subj_token_type = odbc_bigquery_client_interface::kSubTokenTypeJWT; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); @@ -743,10 +743,10 @@ TEST(ConnectionHandle, ValidateExternalUserSuccessByoidJwtToken) { TEST(ConnectionHandle, ValidateExternalUserSuccessByoidSaml2Token) { Authentication auth; - auth.oauth.auth_mechanism = OauthMechanism::kExternalUser; - auth.oauth.byoid_aud_url = "test-aud"; - auth.oauth.byoid_creds_src = "test-creds"; - auth.oauth.byoid_subj_token_type = + auth.conn_props.auth_mechanism = OauthMechanism::kExternalUser; + auth.conn_props.byoid_aud_url = "test-aud"; + auth.conn_props.byoid_creds_src = "test-creds"; + auth.conn_props.byoid_subj_token_type = odbc_bigquery_client_interface::kSubTokenTypeSaml2; StatusRecord status = ConnectionHandle::ValidateExternalUser(auth); @@ -782,4 +782,36 @@ TEST(ConnectionHandle, DsnSetupQueryPropertiesEmptyString) { EXPECT_TRUE(handle.GetDsn().connection_properties.empty()); } + +TEST(ConnectionHandle, DsnSetupQuotaProjectIdSpecified) { + Section dsn_section; + dsn_section["CATALOG"] = "my-project"; + dsn_section["QUOTAPROJECTID"] = "my-quota-project"; + + ConnectionHandle handle; + handle.SetUp(dsn_section, "TestDSN"); + + EXPECT_EQ(handle.GetDsn().quota_project_id, "my-quota-project"); +} + +TEST(ConnectionHandle, DsnSetupQuotaProjectIdNotSpecified) { + Section dsn_section; + dsn_section["CATALOG"] = "my-project"; + + ConnectionHandle handle; + handle.SetUp(dsn_section, "TestDSN"); + + EXPECT_EQ(handle.GetDsn().quota_project_id, ""); +} + +TEST(ConnectionHandle, DsnSetupQuotaProjectIdExplicitlyEmpty) { + Section dsn_section; + dsn_section["CATALOG"] = "my-project"; + dsn_section["QUOTAPROJECTID"] = ""; + + ConnectionHandle handle; + handle.SetUp(dsn_section, "TestDSN"); + + EXPECT_EQ(handle.GetDsn().quota_project_id, ""); +} } // namespace google::cloud::odbc_bq_driver_internal diff --git a/google/cloud/odbc/bq_driver/internal/odbc_internal_commons.cc b/google/cloud/odbc/bq_driver/internal/odbc_internal_commons.cc index 1b933dd91e..c6ce4db612 100644 --- a/google/cloud/odbc/bq_driver/internal/odbc_internal_commons.cc +++ b/google/cloud/odbc/bq_driver/internal/odbc_internal_commons.cc @@ -1304,7 +1304,8 @@ odbc_internal::StatusRecord ValidateAllowedAttributes( {"OAUTHMECHANISM", dsn_fields.o_auth_mechanism}, {"DEFAULTDATASET", dsn_fields.default_dataset}, {"FILTERTABLESONDEFAULTDATASET", - dsn_fields.filter_tables_on_default_dataset ? "1" : ""}}; + dsn_fields.filter_tables_on_default_dataset ? "1" : ""}, + {"QUOTAPROJECTID", dsn_fields.quota_project_id}}; for (auto const& [key, _] : attributes) { auto it = dsn_map.find(key); diff --git a/google/cloud/odbc/bq_driver/odbc_connection.cc b/google/cloud/odbc/bq_driver/odbc_connection.cc index 96646b9efa..b42cc64168 100644 --- a/google/cloud/odbc/bq_driver/odbc_connection.cc +++ b/google/cloud/odbc/bq_driver/odbc_connection.cc @@ -69,28 +69,29 @@ Authentication CreateAuth(Dsn const& dsn) { LOG(ERROR) << "CreateAuth:: " << ex.what(); auth_int = 0; } - auth.oauth.auth_mechanism = static_cast(auth_int); - auth.oauth.credentials_file_path = dsn.key_file_path; + auth.conn_props.auth_mechanism = static_cast(auth_int); + auth.conn_props.credentials_file_path = dsn.key_file_path; auth.refresh_token = dsn.refresh_token; // Populate BYOID Properties from Dsn. - auth.oauth.byoid_aud_url = dsn.byoid_aud_url; - auth.oauth.byoid_creds_src = dsn.byoid_creds_src; - auth.oauth.byoid_pool_user_project = dsn.byoid_pool_user_project; - auth.oauth.byoid_subj_token_type = dsn.byoid_subj_token_type; - auth.oauth.byoid_token_url = dsn.byoid_token_url; - auth.oauth.ssl_credentials.pem_root_certs = + auth.conn_props.byoid_aud_url = dsn.byoid_aud_url; + auth.conn_props.byoid_creds_src = dsn.byoid_creds_src; + auth.conn_props.byoid_pool_user_project = dsn.byoid_pool_user_project; + auth.conn_props.byoid_subj_token_type = dsn.byoid_subj_token_type; + auth.conn_props.byoid_token_url = dsn.byoid_token_url; + auth.conn_props.quota_project_id = dsn.quota_project_id; + auth.conn_props.ssl_credentials.pem_root_certs = (!dsn.pem_file.empty()) ? dsn.pem_file : GetDefaultPemFile(); #ifdef _WIN32 - auth.oauth.ssl_credentials.use_system_trust_store = dsn.use_trust_store; + auth.conn_props.ssl_credentials.use_system_trust_store = dsn.use_trust_store; #endif - auth.oauth.proxy_options.hostname = dsn.proxy_options.hostname; - auth.oauth.proxy_options.port = dsn.proxy_options.port; - auth.oauth.proxy_options.username = dsn.proxy_options.username; - auth.oauth.proxy_options.password = dsn.proxy_options.password; - auth.oauth.kms_key_name = dsn.kms_key_name; - auth.oauth.psc = dsn.psc; - auth.oauth.gcd.enable_gcd = dsn.enable_gcd; - auth.oauth.gcd.universe_domain = dsn.universe_domain; + auth.conn_props.proxy_options.hostname = dsn.proxy_options.hostname; + auth.conn_props.proxy_options.port = dsn.proxy_options.port; + auth.conn_props.proxy_options.username = dsn.proxy_options.username; + auth.conn_props.proxy_options.password = dsn.proxy_options.password; + auth.conn_props.kms_key_name = dsn.kms_key_name; + auth.conn_props.psc = dsn.psc; + auth.conn_props.gcd.enable_gcd = dsn.enable_gcd; + auth.conn_props.gcd.universe_domain = dsn.universe_domain; return auth; } diff --git a/google/cloud/odbc/integration_tests/bq_apis/cancel_job_test.cc b/google/cloud/odbc/integration_tests/bq_apis/cancel_job_test.cc index 8b1b548251..fe7156a8a6 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/cancel_job_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/cancel_job_test.cc @@ -31,7 +31,7 @@ using bigquery_v2_minimal_internal::JobClient; using bigquery_v2_minimal_internal::JobConfiguration; using bigquery_v2_minimal_internal::JobConfigurationQuery; using bigquery_v2_minimal_internal::MakeBigQueryJobConnection; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -76,10 +76,10 @@ TEST(CancelJob, ExternalAccountAuth_JSONFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); // Cancelling previous Job via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr cancel_job_response = @@ -101,8 +101,8 @@ TEST(CancelJob, ExternalAccountAuth_BYOID_Workload) { std::string project_id = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr cancel_job_response = @@ -124,8 +124,8 @@ TEST(CancelJob, ExternalAccountAuth_BYOID_Workforce) { std::string project_id = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr cancel_job_response = @@ -173,10 +173,10 @@ TEST(ODBCBQClient_CancelJob, UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); // Cancelling previous Job via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr cancel_job_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/get_dataset_test.cc b/google/cloud/odbc/integration_tests/bq_apis/get_dataset_test.cc index ec948ccfbf..65804576cc 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/get_dataset_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/get_dataset_test.cc @@ -27,7 +27,7 @@ using bigquery_v2_minimal_internal::Dataset; using bigquery_v2_minimal_internal::DatasetClient; using bigquery_v2_minimal_internal::GetDatasetRequest; using bigquery_v2_minimal_internal::MakeDatasetConnection; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using ::google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -72,10 +72,10 @@ TEST(GetDataset, ExternalAccountAuth_JSONFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); // Retrieving dataset via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr dataset_response = @@ -96,8 +96,8 @@ TEST(GetDataset, ExternalAccountAuth_BYOID_Workload) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_BIGQUERY_DATASET"); // Retrieving dataset via ODBC BQ Client - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr dataset_response = @@ -118,8 +118,8 @@ TEST(GetDataset, ExternalAccountAuth_BYOID_Workforce) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_BIGQUERY_DATASET"); // Retrieving dataset via ODBC BQ Client - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr dataset_response = @@ -163,10 +163,10 @@ TEST(ODBCBQClient_GetDataset, UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); // Retrieving dataset via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr dataset_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/get_job_test.cc b/google/cloud/odbc/integration_tests/bq_apis/get_job_test.cc index 1e99d19059..ac387e3d19 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/get_job_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/get_job_test.cc @@ -31,7 +31,7 @@ using bigquery_v2_minimal_internal::JobClient; using bigquery_v2_minimal_internal::JobConfiguration; using bigquery_v2_minimal_internal::JobConfigurationQuery; using bigquery_v2_minimal_internal::MakeBigQueryJobConnection; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -72,11 +72,11 @@ TEST(GetJob, ExternalAccountAuth_JsonFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); std::string path_to_file_with_credentials = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr get_job_response = @@ -96,9 +96,9 @@ TEST(GetJob, ExternalAccountAuth_BYOID_Workload) { std::string project_id = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr get_job_response = @@ -118,9 +118,9 @@ TEST(GetJob, ExternalAccountAuth_BYOID_Workforce) { std::string project_id = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr get_job_response = @@ -164,11 +164,11 @@ TEST(ODBCBQClient_GetJob, UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); std::string path_to_file_with_credentials = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr get_job_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/get_table_test.cc b/google/cloud/odbc/integration_tests/bq_apis/get_table_test.cc index 5c51edbd72..5a7a76347b 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/get_table_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/get_table_test.cc @@ -28,7 +28,7 @@ using bigquery_v2_minimal_internal::MakeTableConnection; using bigquery_v2_minimal_internal::Table; using bigquery_v2_minimal_internal::TableClient; using bigquery_v2_minimal_internal::TableMetadataView; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_bigquery_client_interface::TableFilter; @@ -75,10 +75,10 @@ TEST(GetTable, ExternalAccountAuth_JSONFile) { // Retrieving table via ODBCBQClient. TableFilter filter{{}, TableMetadataView::Full()}; - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr table_response = @@ -106,8 +106,8 @@ TEST(GetTable, ExternalAccountAuth_BYOID_Workload) { // Retrieving table via ODBCBQClient. TableFilter filter{{}, TableMetadataView::Full()}; - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr
table_response = @@ -135,8 +135,8 @@ TEST(GetTable, ExternalAccountAuth_BYOID_Workforce) { // Retrieving table via ODBCBQClient. TableFilter filter{{}, TableMetadataView::Full()}; - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr
table_response = @@ -188,10 +188,10 @@ TEST(ODBCBQClient_GetTable, UserAccountAuth) { // Retrieving table via ODBCBQClient. TableFilter filter{{}, TableMetadataView::Full()}; - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr
table_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/insert_job_test.cc b/google/cloud/odbc/integration_tests/bq_apis/insert_job_test.cc index 1fcadaecb8..a109ac9bcc 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/insert_job_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/insert_job_test.cc @@ -33,7 +33,7 @@ using bigquery_v2_minimal_internal::JobConfiguration; using bigquery_v2_minimal_internal::JobConfigurationQuery; using bigquery_v2_minimal_internal::MakeBigQueryJobConnection; using bigquery_v2_minimal_internal::QueryParameter; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -98,11 +98,11 @@ TEST(InsertJob, ExternalAccountAuth_JSONFile) { job_configuration.query = job_configuration_query; job.configuration = job_configuration; - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; // Insert Job using BQ Client - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr job_response = @@ -153,9 +153,9 @@ TEST(InsertJob, ExternalAccountAuth_BYOIDWorkload) { job_configuration.query = job_configuration_query; job.configuration = job_configuration; - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); // Insert Job using BQ Client - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr job_response = @@ -206,9 +206,9 @@ TEST(InsertJob, ExternalAccountAuth_BYOIDWorkforce) { job_configuration.query = job_configuration_query; job.configuration = job_configuration; - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); // Insert Job using BQ Client - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr job_response = @@ -313,11 +313,11 @@ TEST(ODBCBQClient_InsertJob, UserAccountAuth) { job_configuration.query = job_configuration_query; job.configuration = job_configuration; - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; // Insert Job using BQ Client - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr job_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/list_dataset_test.cc b/google/cloud/odbc/integration_tests/bq_apis/list_dataset_test.cc index 00f746d320..682d015de9 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/list_dataset_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/list_dataset_test.cc @@ -27,7 +27,7 @@ using bigquery_v2_minimal_internal::DatasetClient; using bigquery_v2_minimal_internal::ListDatasetsRequest; using bigquery_v2_minimal_internal::ListFormatDataset; using bigquery_v2_minimal_internal::MakeDatasetConnection; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using ::google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -72,10 +72,10 @@ TEST(ListDatasets, ExternalAccountAuth_JSONFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); // Retrieving datasets via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> datasets_response = @@ -103,8 +103,8 @@ TEST(ListDatasets, ExternalAccountAuth_BYOID_Workload) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_BIGQUERY_DATASET"); // Retrieving datasets via ODBC BQ Client - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> datasets_response = @@ -132,8 +132,8 @@ TEST(ListDatasets, ExternalAccountAuth_BYOID_Workforce) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_BIGQUERY_DATASET"); // Retrieving datasets via ODBC BQ Client - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> datasets_response = @@ -192,10 +192,10 @@ TEST(ODBCBQClient_ListDatasets, UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); // Retrieving datasets via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> datasets_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/list_job_test.cc b/google/cloud/odbc/integration_tests/bq_apis/list_job_test.cc index da9781b2f4..4577625931 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/list_job_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/list_job_test.cc @@ -31,8 +31,8 @@ using bigquery_v2_minimal_internal::ListJobsRequest; using bigquery_v2_minimal_internal::MakeBigQueryJobConnection; using bigquery_v2_minimal_internal::Projection; using bigquery_v2_minimal_internal::StateFilter; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::CreateCredentials; -using google::cloud::odbc_bigquery_client_interface::Oauth; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -76,10 +76,10 @@ TEST(ListJobs, DISABLED_ExternalAccountAuth_JSONFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); std::string path_to_file_with_credentials = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> list_jobs_response = @@ -100,8 +100,8 @@ TEST(ListJobs, DISABLED_ExternalAccountAuth_BYOID_Workload) { std::string project_id = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> list_jobs_response = @@ -122,8 +122,8 @@ TEST(ListJobs, DISABLED_ExternalAccountAuth_BYOID_Workforce) { std::string project_id = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> list_jobs_response = @@ -174,10 +174,10 @@ TEST(ODBCBQClient_ListJobs, DISABLED_UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_GOOGLE_CLOUD_PROJECT"); std::string path_to_file_with_credentials = GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> list_jobs_response = @@ -201,10 +201,10 @@ TEST(ODBCBQClient_ListAllJobs, DISABLED_UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); StatusOr parent_job_id = InsertJob(job_client); ASSERT_FALSE(parent_job_id->empty()) << parent_job_id.status().message(); - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> list_jobs_response = @@ -412,10 +412,10 @@ TEST(ODBCBQClient_ListAllJobs, DISABLED_ServiceAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_SERVICE_ACCOUNT_AUTH_KEY"); StatusOr parent_job_id = InsertJob(job_client); ASSERT_FALSE(parent_job_id->empty()) << parent_job_id.status().message(); - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> list_jobs_response = (*odbc_bq_client) diff --git a/google/cloud/odbc/integration_tests/bq_apis/list_project_test.cc b/google/cloud/odbc/integration_tests/bq_apis/list_project_test.cc index 041086f44b..c50dbab9a3 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/list_project_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/list_project_test.cc @@ -27,7 +27,7 @@ using bigquery_v2_minimal_internal::MakeProjectConnection; using bigquery_v2_minimal_internal::Project; using bigquery_v2_minimal_internal::ProjectClient; using google::cloud::internal::GetEnv; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -68,10 +68,10 @@ TEST(ListAllProjects, ExternalAccountAuth_JSONFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); // List projects via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> projects_response = @@ -87,8 +87,8 @@ TEST(ListAllProjects, ExternalAccountAuth_BYOID_Workload) { ProjectClient(MakeProjectConnection(std::move(*options))); // List projects via ODBC BQ Client - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> projects_response = @@ -104,8 +104,8 @@ TEST(ListAllProjects, ExternalAccountAuth_BYOID_Workforce) { ProjectClient(MakeProjectConnection(std::move(*options))); // List projects via ODBC BQ Client - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> projects_response = @@ -143,10 +143,10 @@ TEST(ODBCBQClient_ListAllProjects, UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); // List projects via ODBC BQ Client - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr> projects_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/list_table_test.cc b/google/cloud/odbc/integration_tests/bq_apis/list_table_test.cc index 076bd642a9..dd5d816d0f 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/list_table_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/list_table_test.cc @@ -26,7 +26,7 @@ using bigquery_v2_minimal_internal::ListFormatTable; using bigquery_v2_minimal_internal::ListTablesRequest; using bigquery_v2_minimal_internal::MakeTableConnection; using bigquery_v2_minimal_internal::TableClient; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_bigquery_client_interface::TableFilter; @@ -71,10 +71,10 @@ TEST(ListAllTables, ExternalAccountAuth_JSONFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); // Retrieving tables via ODBCBQClient. - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr > tables_response = @@ -104,8 +104,8 @@ TEST(ListAllTables, ExternalAccountAuth_BYOID_Workload) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_BIGQUERY_DATASET"); // Retrieving tables via ODBCBQClient. - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr > tables_response = @@ -135,8 +135,8 @@ TEST(ListAllTables, ExternalAccountAuth_BYOID_Workforce) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_BIGQUERY_DATASET"); // Retrieving tables via ODBCBQClient. - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr > tables_response = @@ -192,10 +192,10 @@ TEST(ODBCBQClient_ListAllTables, UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); // Retrieving tables via ODBCBQClient. - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr > tables_response = diff --git a/google/cloud/odbc/integration_tests/bq_apis/query_test.cc b/google/cloud/odbc/integration_tests/bq_apis/query_test.cc index a737f14e56..08f82539be 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/query_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/query_test.cc @@ -32,7 +32,7 @@ using bigquery_v2_minimal_internal::PostQueryRequest; using bigquery_v2_minimal_internal::PostQueryResults; using bigquery_v2_minimal_internal::QueryParameter; using bigquery_v2_minimal_internal::QueryRequest; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::StatusRecordOr; @@ -82,10 +82,10 @@ TEST(Query, ExternalAccountAuth_JSONFile) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY"); // Query via ODBCBQClient - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::string full_table_name = absl::StrCat(dataset_id, ".", table_name); @@ -136,8 +136,8 @@ TEST(Query, ExternalAccountAuth_BYOID_Workload) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_COLUMN_NAME_NAME"); // Query via ODBCBQClient - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::string full_table_name = absl::StrCat(dataset_id, ".", table_name); @@ -188,8 +188,8 @@ TEST(Query, ExternalAccountAuth_BYOID_Workforce) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_COLUMN_NAME_NAME"); // Query via ODBCBQClient - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::string full_table_name = absl::StrCat(dataset_id, ".", table_name); @@ -290,10 +290,10 @@ TEST(ODBCBQClient_Query, UserAccountAuth) { GetRequiredEnvVar("CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY"); // Query via ODBCBQClient - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::string full_table_name = absl::StrCat(dataset_id, ".", table_name); diff --git a/google/cloud/odbc/integration_tests/bq_apis/rm_project_test.cc b/google/cloud/odbc/integration_tests/bq_apis/rm_project_test.cc index f55a530211..02990d8c5d 100644 --- a/google/cloud/odbc/integration_tests/bq_apis/rm_project_test.cc +++ b/google/cloud/odbc/integration_tests/bq_apis/rm_project_test.cc @@ -23,7 +23,7 @@ namespace google::cloud::odbc_integration_tests_apis { using google::cloud::internal::GetEnv; -using google::cloud::odbc_bigquery_client_interface::Oauth; +using google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_bigquery_client_interface::ODBCBQClient; using google::cloud::odbc_internal::SQLStates; @@ -83,8 +83,8 @@ TEST(ResourceManager, ExternalAccountAuth_GetProjectRM_BYOID_Workload) { StatusOr options = CreateExternalAuthenticationBYOIDWorkload(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr< ::google::cloud::bigquery_v2_minimal_internal::Project> @@ -99,8 +99,8 @@ TEST(ResourceManager, ExternalAccountAuth_GetProjectRM_BYOID_Workforce) { StatusOr options = CreateExternalAuthenticationBYOIDWorkforce(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); StatusRecordOr< ::google::cloud::bigquery_v2_minimal_internal::Project> @@ -132,8 +132,8 @@ TEST(ResourceManager, ExternalAccountAuth_ListProjectsRM_BYOID_Workload) { StatusOr options = CreateExternalAuthenticationBYOIDWorkload(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); auto projects_status = @@ -146,8 +146,8 @@ TEST(ResourceManager, ExternalAccountAuth_ListProjectsRM_BYOID_Workforce) { StatusOr options = CreateExternalAuthenticationBYOIDWorkforce(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); auto projects_status = @@ -176,8 +176,8 @@ TEST(ResourceManager, ExternalAccountAuth_SearchProjectsRM_BYOID_Workload) { StatusOr options = CreateExternalAuthenticationBYOIDWorkload(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); auto projects_status = @@ -189,8 +189,8 @@ TEST(ResourceManager, ExternalAccountAuth_SearchProjectsRM_BYOID_Workforce) { StatusOr options = CreateExternalAuthenticationBYOIDWorkforce(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); auto projects_status = @@ -225,8 +225,8 @@ TEST(ResourceManager, ExternalAccountAuth_FilterProjectsRMList_BYOIDWorkload) { StatusOr options = CreateExternalAuthenticationBYOIDWorkload(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::vector project_ids = {kRMProjectWithoutPrefix}; @@ -245,8 +245,8 @@ TEST(ResourceManager, ExternalAccountAuth_FilterProjectsRMList_BYOIDWorkforce) { StatusOr options = CreateExternalAuthenticationBYOIDWorkforce(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::vector project_ids = {kRMProjectWithoutPrefix}; @@ -290,8 +290,8 @@ TEST(ResourceManager, StatusOr options = CreateExternalAuthenticationBYOIDWorkload(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkload(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkload(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::vector project_ids = {"app1", kRMProjectWithoutPrefix}; @@ -312,8 +312,8 @@ TEST(ResourceManager, StatusOr options = CreateExternalAuthenticationBYOIDWorkforce(); ASSERT_STATUS_OK(options); - Oauth oauth = CreateExternalUserOauthBYOIDWorkforce(); - auto odbc_bq_client = ODBCBQClient::CreateBQClient(oauth); + ConnProps conn_props = CreateExternalUserOauthBYOIDWorkforce(); + auto odbc_bq_client = ODBCBQClient::CreateBQClient(conn_props); ASSERT_STATUS_RECORD_OK(odbc_bq_client); std::vector project_ids = {"app1", kRMProjectWithoutPrefix}; diff --git a/google/cloud/odbc/integration_tests/odbc_driver_tests/connection_test.cc b/google/cloud/odbc/integration_tests/odbc_driver_tests/connection_test.cc index 253438fdca..c584b83122 100644 --- a/google/cloud/odbc/integration_tests/odbc_driver_tests/connection_test.cc +++ b/google/cloud/odbc/integration_tests/odbc_driver_tests/connection_test.cc @@ -982,6 +982,54 @@ TEST(ConnectionTest, SuccessForExternalAuthWithBYOIDProperties) { EXPECT_EQ(Connect(conn_str, conn, 30, false), SQL_SUCCESS); EXPECT_EQ(Disconnect(conn), SQL_SUCCESS); } + +TEST(ConnectionTest, VerifyQuotaProjectId) { + // 1. Sad Path: Connect with invalid quota project ID and verify query fails + { + auto conn = std::make_shared(); + std::string connectionstring = + kDefaultConnectionString + + ";QuotaProjectId=invalid-quota-project-12345;"; + + EXPECT_EQ(Connect(connectionstring, conn), SQL_SUCCESS); + + SQLRETURN status = + SQLExecDirect(conn->hstmt, (SQLCHAR*)"SELECT 1", SQL_NTS); + EXPECT_EQ(status, SQL_ERROR); + + SQLCHAR sqlstate[6]; + SQLINTEGER native_error; + SQLCHAR message_text[256]; + SQLSMALLINT text_length; + SQLRETURN diag_status = + SQLGetDiagRec(SQL_HANDLE_STMT, conn->hstmt, 1, sqlstate, &native_error, + message_text, sizeof(message_text), &text_length); + if (diag_status == SQL_SUCCESS || diag_status == SQL_SUCCESS_WITH_INFO) { + EXPECT_THAT( + reinterpret_cast(message_text), + HasSubstr( + "Project 'projects/invalid-quota-project-12345' not found")); + } + + EXPECT_EQ(Disconnect(conn), SQL_SUCCESS); + } + + // 2. Happy Path: Connect with valid quota project ID and verify query + // succeeds + { + auto conn = std::make_shared(); + std::string connectionstring = + kDefaultConnectionString + ";QuotaProjectId=bigquery-devtools-drivers;"; + + EXPECT_EQ(Connect(connectionstring, conn), SQL_SUCCESS); + + SQLRETURN status = + SQLExecDirect(conn->hstmt, (SQLCHAR*)"SELECT 1", SQL_NTS); + EXPECT_EQ(status, SQL_SUCCESS); + + EXPECT_EQ(Disconnect(conn), SQL_SUCCESS); + } +} #endif // BQ_DRIVER_INTEGRATION_TESTS TEST(ConnectionTest, SQLConnect_WithDSN) { diff --git a/google/cloud/odbc/testing/client_library_utils/authentication.cc b/google/cloud/odbc/testing/client_library_utils/authentication.cc index 9969b18ed2..dd211ba579 100644 --- a/google/cloud/odbc/testing/client_library_utils/authentication.cc +++ b/google/cloud/odbc/testing/client_library_utils/authentication.cc @@ -23,10 +23,10 @@ namespace google::cloud::odbc_testing_client_library_utils { using google::cloud::internal::GetEnv; +using ::google::cloud::odbc_bigquery_client_interface::ConnProps; using google::cloud::odbc_bigquery_client_interface::CreateCredentials; using google::cloud::odbc_bigquery_client_interface::kDefaultTokenUrl; using google::cloud::odbc_bigquery_client_interface::kSubTokenTypeJWT; -using ::google::cloud::odbc_bigquery_client_interface::Oauth; using ::google::cloud::odbc_bigquery_client_interface::OauthMechanism; using google::cloud::odbc_internal::StatusRecord; using google::cloud::odbc_internal::StatusRecordOr; @@ -39,10 +39,11 @@ StatusOr CreateUserAccountAuthentication() { "CPP_BIGQUERY_ODBC_TEST_USER_ACCOUNT_AUTH_KEY environment " "variable is not set"); } - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kServiceAccount; - oauth.credentials_file_path = path_to_file_with_credentials; - StatusRecordOr> creds = CreateCredentials(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kServiceAccount; + conn_props.credentials_file_path = path_to_file_with_credentials; + StatusRecordOr> creds = + CreateCredentials(conn_props); if (!creds) { return Status(StatusCode::kInternal, "Unable to create User credentials"); } @@ -66,9 +67,10 @@ StatusOr CreateServiceAccountAuthentication() { } StatusOr CreateApplicationDefaultAuthentication() { - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kApplicationDefault; - StatusRecordOr> creds = CreateCredentials(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kApplicationDefault; + StatusRecordOr> creds = + CreateCredentials(conn_props); if (!creds) { return Status(StatusCode::kInternal, "Unable to create ADC credentials"); } @@ -135,10 +137,11 @@ StatusOr CreateExternalAuthenticationJSONFile() { "CPP_BIGQUERY_ODBC_TEST_EXTERNAL_ACCOUNT_AUTH_KEY environment " "variable is not set"); } - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.credentials_file_path = path_to_file_with_credentials; - StatusRecordOr> creds = CreateCredentials(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.credentials_file_path = path_to_file_with_credentials; + StatusRecordOr> creds = + CreateCredentials(conn_props); if (!creds) { return Status(StatusCode::kInternal, "Unable to create external credentials from JSON file"); @@ -152,14 +155,15 @@ StatusOr CreateExternalAuthenticationBYOID( std::string const& byoid_pool_user_project, std::string const& byoid_sub_token_type, std::string const& byoid_token_url) { - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.byoid_aud_url = byoid_aud_url; - oauth.byoid_creds_src = byoid_creds_source; - oauth.byoid_pool_user_project = byoid_pool_user_project; - oauth.byoid_subj_token_type = byoid_sub_token_type; - oauth.byoid_token_url = byoid_token_url; - StatusRecordOr> creds = CreateCredentials(oauth); + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.byoid_aud_url = byoid_aud_url; + conn_props.byoid_creds_src = byoid_creds_source; + conn_props.byoid_pool_user_project = byoid_pool_user_project; + conn_props.byoid_subj_token_type = byoid_sub_token_type; + conn_props.byoid_token_url = byoid_token_url; + StatusRecordOr> creds = + CreateCredentials(conn_props); if (!creds) { return Status(StatusCode::kInternal, "Unable to create external credentials from JSON file"); @@ -181,25 +185,25 @@ StatusOr CreateExternalAuthenticationBYOIDWorkforce() { kWorkForceSubTokenType, kWorkForceTokenUrl); } -Oauth CreateExternalUserOauthBYOIDWorkload() { - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.byoid_aud_url = kWorkLoadAudUrl; - oauth.byoid_creds_src = kWorkLoadCredsSource; - oauth.byoid_subj_token_type = kWorkLoadSubTokenType; - oauth.byoid_token_url = kWorkLoadTokenUrl; - return oauth; +ConnProps CreateExternalUserOauthBYOIDWorkload() { + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.byoid_aud_url = kWorkLoadAudUrl; + conn_props.byoid_creds_src = kWorkLoadCredsSource; + conn_props.byoid_subj_token_type = kWorkLoadSubTokenType; + conn_props.byoid_token_url = kWorkLoadTokenUrl; + return conn_props; } -Oauth CreateExternalUserOauthBYOIDWorkforce() { - Oauth oauth; - oauth.auth_mechanism = OauthMechanism::kExternalUser; - oauth.byoid_aud_url = kWorkForceAudUrl; - oauth.byoid_creds_src = kWorkForceCredsSource; - oauth.byoid_subj_token_type = kWorkForceSubTokenType; - oauth.byoid_token_url = kWorkForceTokenUrl; - oauth.byoid_pool_user_project = kWorkForcePoolUserProject; - return oauth; +ConnProps CreateExternalUserOauthBYOIDWorkforce() { + ConnProps conn_props; + conn_props.auth_mechanism = OauthMechanism::kExternalUser; + conn_props.byoid_aud_url = kWorkForceAudUrl; + conn_props.byoid_creds_src = kWorkForceCredsSource; + conn_props.byoid_subj_token_type = kWorkForceSubTokenType; + conn_props.byoid_token_url = kWorkForceTokenUrl; + conn_props.byoid_pool_user_project = kWorkForcePoolUserProject; + return conn_props; } } // namespace google::cloud::odbc_testing_client_library_utils diff --git a/google/cloud/odbc/testing/client_library_utils/authentication.h b/google/cloud/odbc/testing/client_library_utils/authentication.h index 36f4058d37..9760243b93 100644 --- a/google/cloud/odbc/testing/client_library_utils/authentication.h +++ b/google/cloud/odbc/testing/client_library_utils/authentication.h @@ -75,9 +75,9 @@ StatusOr CreateExternalAuthenticationBYOIDWorkload(); StatusOr CreateExternalAuthenticationBYOIDWorkforce(); // Create Oauth struct for External Authentication -::google::cloud::odbc_bigquery_client_interface::Oauth +::google::cloud::odbc_bigquery_client_interface::ConnProps CreateExternalUserOauthBYOIDWorkload(); -::google::cloud::odbc_bigquery_client_interface::Oauth +::google::cloud::odbc_bigquery_client_interface::ConnProps CreateExternalUserOauthBYOIDWorkforce(); } // namespace google::cloud::odbc_testing_client_library_utils