diff --git a/bigquery-connection/snippets/conftest.py b/bigquery-connection/snippets/conftest.py index 8e39714b92f5..eca2a7fd12d0 100644 --- a/bigquery-connection/snippets/conftest.py +++ b/bigquery-connection/snippets/conftest.py @@ -19,15 +19,35 @@ @pytest.fixture(scope="session") -def project_id() -> str: - return os.environ["GOOGLE_CLOUD_PROJECT"] +def connection_client() -> connection_service.ConnectionServiceClient: + return connection_service.ConnectionServiceClient() @pytest.fixture(scope="session") -def connection_client() -> connection_service.ConnectionServiceClient: - return connection_service.ConnectionServiceClient() +def project_id() -> str: + return os.environ["GOOGLE_CLOUD_PROJECT"] @pytest.fixture(scope="session") def location() -> str: return "US" + + +@pytest.fixture(scope="session") +def database() -> str: + return os.environ["MYSQL_DATABASE"] + + +@pytest.fixture(scope="session") +def cloud_sql_conn_name() -> str: + return os.environ["MYSQL_INSTANCE"] + + +@pytest.fixture(scope="session") +def mysql_username() -> str: + return os.environ["MYSQL_USER"] + + +@pytest.fixture(scope="session") +def mysql_password() -> str: + return os.environ["MYSQL_PASSWORD"] diff --git a/bigquery-connection/snippets/create_mysql_connection.py b/bigquery-connection/snippets/create_mysql_connection.py new file mode 100644 index 000000000000..823fd1aaa989 --- /dev/null +++ b/bigquery-connection/snippets/create_mysql_connection.py @@ -0,0 +1,64 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# [START bigqueryconnection_connection_create] +from google.cloud import bigquery_connection_v1 as bq_connection + +"""This sample shows how to create a BigQuery connection with a Cloud SQL for MySQL database""" + + +def main() -> None: + # TODO(developer): Set all variables for your Cloud SQL for MySQL connection. + project_id = "your-project-id" # set project_id + location = "US" # set location + # See: https://cloud.google.com/bigquery/docs/locations for a list of + # available locations. + database = "my-database" # set database name + username = "my-username" # set database username + password = "my-password" # set database password + cloud_sql_conn_name = "" # set the name of your connection + + cloud_sql_credential = bq_connection.CloudSqlCredential( + { + "username": username, + "password": password, + } + ) + cloud_sql_properties = bq_connection.CloudSqlProperties( + { + "type_": bq_connection.CloudSqlProperties.DatabaseType.MYSQL, + "database": database, + "instance_id": cloud_sql_conn_name, + "credential": cloud_sql_credential, + } + ) + create_mysql_connection(project_id, location, cloud_sql_properties) + + +def create_mysql_connection( + project_id: str, + location: str, + cloud_sql_properties: bq_connection.CloudSqlProperties, +) -> None: + connection = bq_connection.types.Connection({"cloud_sql": cloud_sql_properties}) + client = bq_connection.ConnectionServiceClient() + parent = client.common_location_path(project_id, location) + request = bq_connection.CreateConnectionRequest( + {"parent": parent, "connection": connection} + ) + response = client.create_connection(request) + print(f"Created connection successfully: {response.name}") + + +# [END bigqueryconnection_connection_create] diff --git a/bigquery-connection/snippets/create_mysql_connection_test.py b/bigquery-connection/snippets/create_mysql_connection_test.py new file mode 100644 index 000000000000..9eda07da2d0d --- /dev/null +++ b/bigquery-connection/snippets/create_mysql_connection_test.py @@ -0,0 +1,90 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import google.api_core.exceptions +from google.cloud import bigquery_connection_v1 as bq_connection +from google.cloud.bigquery_connection_v1.services import connection_service +import pytest +import test_utils.prefixer + +from . import create_mysql_connection + +connection_prefixer = test_utils.prefixer.Prefixer("py-bq-r", "snippets", separator="-") + + +@pytest.fixture(scope="session") +def location_path( + connection_client: connection_service.ConnectionServiceClient(), + project_id: str, + location: str, +) -> str: + return connection_client.common_location_path(project_id, location) + + +@pytest.fixture(scope="module", autouse=True) +def cleanup_connection( + connection_client: connection_service.ConnectionServiceClient, location_path: str +) -> None: + for connection in connection_client.list_connections(parent=location_path): + connection_id = connection.name.split("/")[-1] + if connection_prefixer.should_cleanup(connection_id): + connection_client.delete_connection(name=connection.name) + + +@pytest.fixture(scope="session") +def connection_id( + connection_client: connection_service.ConnectionServiceClient, + project_id: str, + location: str, +) -> str: + id_ = connection_prefixer.create_prefix() + yield id_ + + connection_name = connection_client.connection_path(project_id, location, id_) + try: + connection_client.delete_connection(name=connection_name) + except google.api_core.exceptions.NotFound: + pass + + +def test_create_mysql_connection( + capsys: pytest.CaptureFixture, + mysql_username: str, + mysql_password: str, + database: str, + cloud_sql_conn_name: str, + project_id: str, + location: str, +) -> None: + cloud_sql_credential = bq_connection.CloudSqlCredential( + { + "username": mysql_username, + "password": mysql_password, + } + ) + cloud_sql_properties = bq_connection.CloudSqlProperties( + { + "type_": bq_connection.CloudSqlProperties.DatabaseType.MYSQL, + "database": database, + "instance_id": cloud_sql_conn_name, + "credential": cloud_sql_credential, + } + ) + create_mysql_connection.create_mysql_connection( + project_id=project_id, + location=location, + cloud_sql_properties=cloud_sql_properties, + ) + out, _ = capsys.readouterr() + assert "Created connection successfully:" in out