google-cloud-spanner 3.60.0__tar.gz → 3.61.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {google_cloud_spanner-3.60.0/google_cloud_spanner.egg-info → google_cloud_spanner-3.61.0}/PKG-INFO +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/__init__.py +104 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/gapic_version.py +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/client.py +32 -14
- google_cloud_spanner-3.61.0/google/cloud/spanner_admin_instance_v1/__init__.py +214 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/gapic_version.py +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/client.py +32 -14
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/version.py +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/gapic_version.py +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/client.py +32 -14
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0/google_cloud_spanner.egg-info}/PKG-INFO +1 -1
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/setup.py +4 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_database_v1/test_database_admin.py +226 -29
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_instance_v1/test_instance_admin.py +226 -29
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_v1/test_spanner.py +226 -29
- google_cloud_spanner-3.60.0/google/cloud/spanner_admin_instance_v1/__init__.py +0 -110
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/LICENSE +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/MANIFEST.in +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/README.rst +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/py.typed +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/async_client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/pagers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/grpc_asyncio.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/services/database_admin/transports/rest_base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/backup.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/backup_schedule.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/common.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_database_v1/types/spanner_database_admin.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/py.typed +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/async_client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/pagers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/grpc_asyncio.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/services/instance_admin/transports/rest_base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/types/common.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_admin_instance_v1/types/spanner_instance_admin.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/_helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/batch_dml_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/checksum.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/client_side_statement_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/client_side_statement_parser.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/connection.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/cursor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/exceptions.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/parse_utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/parsed_statement.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/parser.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/partition_helper.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/transaction_helper.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_dbapi/utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/_helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/_opentelemetry_tracing.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/backup.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/batch.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/data_types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/database.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/database_sessions_manager.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/gapic_metadata.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/instance.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/keyset.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/merged_result_set.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/constants.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_capture.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_exporter.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_interceptor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_tracer.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/metrics/spanner_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/param_types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/pool.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/py.typed +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/request_id_header.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/async_client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/pagers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/grpc.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/grpc_asyncio.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/rest.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/services/spanner/transports/rest_base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/session.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/snapshot.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/streamed.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/table.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/database_test.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/interceptors.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/mock_database_admin.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/mock_spanner.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/spanner_database_admin_pb2_grpc.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/testing/spanner_pb2_grpc.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/transaction.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/change_stream.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/commit_response.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/keys.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/location.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/mutation.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/query_plan.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/result_set.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/spanner.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/transaction.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google/cloud/spanner_v1/types/type.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/SOURCES.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/dependency_links.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/not-zip-safe +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/requires.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/google_cloud_spanner.egg-info/top_level.txt +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/setup.cfg +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/_builders.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/_fixtures.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/_helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/mock_server_test_base.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_aborted_transaction.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_basics.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_dbapi_autocommit.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_dbapi_isolation_level.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_request_id_header.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/mockserver_tests/test_tags.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/_helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/_sample_data.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/conftest.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_backup_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_database_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_dbapi.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_instance_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_metrics.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_observability_options.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_session_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_streaming_chunking.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/test_table_api.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/testdata/descriptors.pb +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/testdata/singer.proto +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/testdata/singer_pb2.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/utils/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/utils/clear_streaming.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/utils/populate_streaming.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/utils/scrub_instances.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/system/utils/streaming_utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_database_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_admin_instance_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/gapic/spanner_v1/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/__init__.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test__helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_batch_dml_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_checksum.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_client_side_statement_executor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_connect.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_connection.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_cursor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_globals.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_parse_utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_parser.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_transaction_helper.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/spanner_dbapi/test_utils.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/streaming-read-acceptance-test.json +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test__helpers.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test__opentelemetry_tracing.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_atomic_counter.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_backup.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_batch.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_client.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_database.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_database_session_manager.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_datatypes.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_instance.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_keyset.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_merged_result_set.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_capture.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_exporter.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_interceptor.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_tracer.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_packaging.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_param_types.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_pool.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_session.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_snapshot.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_spanner.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_spanner_metrics_tracer_factory.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_streamed.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_table.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/test_transaction.py +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/testdata/singer.proto +0 -0
- {google_cloud_spanner-3.60.0 → google_cloud_spanner-3.61.0}/tests/unit/testdata/singer_pb2.py +0 -0
|
@@ -15,8 +15,18 @@
|
|
|
15
15
|
#
|
|
16
16
|
from google.cloud.spanner_admin_database_v1 import gapic_version as package_version
|
|
17
17
|
|
|
18
|
+
import google.api_core as api_core
|
|
19
|
+
import sys
|
|
20
|
+
|
|
18
21
|
__version__ = package_version.__version__
|
|
19
22
|
|
|
23
|
+
if sys.version_info >= (3, 8): # pragma: NO COVER
|
|
24
|
+
from importlib import metadata
|
|
25
|
+
else: # pragma: NO COVER
|
|
26
|
+
# TODO(https://github.com/googleapis/python-api-core/issues/835): Remove
|
|
27
|
+
# this code path once we drop support for Python 3.7
|
|
28
|
+
import importlib_metadata as metadata
|
|
29
|
+
|
|
20
30
|
|
|
21
31
|
from .services.database_admin import DatabaseAdminClient
|
|
22
32
|
from .services.database_admin import DatabaseAdminAsyncClient
|
|
@@ -83,6 +93,100 @@ from .types.spanner_database_admin import UpdateDatabaseMetadata
|
|
|
83
93
|
from .types.spanner_database_admin import UpdateDatabaseRequest
|
|
84
94
|
from .types.spanner_database_admin import RestoreSourceType
|
|
85
95
|
|
|
96
|
+
if hasattr(api_core, "check_python_version") and hasattr(
|
|
97
|
+
api_core, "check_dependency_versions"
|
|
98
|
+
): # pragma: NO COVER
|
|
99
|
+
api_core.check_python_version("google.cloud.spanner_admin_database_v1") # type: ignore
|
|
100
|
+
api_core.check_dependency_versions("google.cloud.spanner_admin_database_v1") # type: ignore
|
|
101
|
+
else: # pragma: NO COVER
|
|
102
|
+
# An older version of api_core is installed which does not define the
|
|
103
|
+
# functions above. We do equivalent checks manually.
|
|
104
|
+
try:
|
|
105
|
+
import warnings
|
|
106
|
+
import sys
|
|
107
|
+
|
|
108
|
+
_py_version_str = sys.version.split()[0]
|
|
109
|
+
_package_label = "google.cloud.spanner_admin_database_v1"
|
|
110
|
+
if sys.version_info < (3, 9):
|
|
111
|
+
warnings.warn(
|
|
112
|
+
"You are using a non-supported Python version "
|
|
113
|
+
+ f"({_py_version_str}). Google will not post any further "
|
|
114
|
+
+ f"updates to {_package_label} supporting this Python version. "
|
|
115
|
+
+ "Please upgrade to the latest Python version, or at "
|
|
116
|
+
+ f"least to Python 3.9, and then update {_package_label}.",
|
|
117
|
+
FutureWarning,
|
|
118
|
+
)
|
|
119
|
+
if sys.version_info[:2] == (3, 9):
|
|
120
|
+
warnings.warn(
|
|
121
|
+
f"You are using a Python version ({_py_version_str}) "
|
|
122
|
+
+ f"which Google will stop supporting in {_package_label} in "
|
|
123
|
+
+ "January 2026. Please "
|
|
124
|
+
+ "upgrade to the latest Python version, or at "
|
|
125
|
+
+ "least to Python 3.10, before then, and "
|
|
126
|
+
+ f"then update {_package_label}.",
|
|
127
|
+
FutureWarning,
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def parse_version_to_tuple(version_string: str):
|
|
131
|
+
"""Safely converts a semantic version string to a comparable tuple of integers.
|
|
132
|
+
Example: "4.25.8" -> (4, 25, 8)
|
|
133
|
+
Ignores non-numeric parts and handles common version formats.
|
|
134
|
+
Args:
|
|
135
|
+
version_string: Version string in the format "x.y.z" or "x.y.z<suffix>"
|
|
136
|
+
Returns:
|
|
137
|
+
Tuple of integers for the parsed version string.
|
|
138
|
+
"""
|
|
139
|
+
parts = []
|
|
140
|
+
for part in version_string.split("."):
|
|
141
|
+
try:
|
|
142
|
+
parts.append(int(part))
|
|
143
|
+
except ValueError:
|
|
144
|
+
# If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here.
|
|
145
|
+
# This is a simplification compared to 'packaging.parse_version', but sufficient
|
|
146
|
+
# for comparing strictly numeric semantic versions.
|
|
147
|
+
break
|
|
148
|
+
return tuple(parts)
|
|
149
|
+
|
|
150
|
+
def _get_version(dependency_name):
|
|
151
|
+
try:
|
|
152
|
+
version_string: str = metadata.version(dependency_name)
|
|
153
|
+
parsed_version = parse_version_to_tuple(version_string)
|
|
154
|
+
return (parsed_version, version_string)
|
|
155
|
+
except Exception:
|
|
156
|
+
# Catch exceptions from metadata.version() (e.g., PackageNotFoundError)
|
|
157
|
+
# or errors during parse_version_to_tuple
|
|
158
|
+
return (None, "--")
|
|
159
|
+
|
|
160
|
+
_dependency_package = "google.protobuf"
|
|
161
|
+
_next_supported_version = "4.25.8"
|
|
162
|
+
_next_supported_version_tuple = (4, 25, 8)
|
|
163
|
+
_recommendation = " (we recommend 6.x)"
|
|
164
|
+
(_version_used, _version_used_string) = _get_version(_dependency_package)
|
|
165
|
+
if _version_used and _version_used < _next_supported_version_tuple:
|
|
166
|
+
warnings.warn(
|
|
167
|
+
f"Package {_package_label} depends on "
|
|
168
|
+
+ f"{_dependency_package}, currently installed at version "
|
|
169
|
+
+ f"{_version_used_string}. Future updates to "
|
|
170
|
+
+ f"{_package_label} will require {_dependency_package} at "
|
|
171
|
+
+ f"version {_next_supported_version} or higher{_recommendation}."
|
|
172
|
+
+ " Please ensure "
|
|
173
|
+
+ "that either (a) your Python environment doesn't pin the "
|
|
174
|
+
+ f"version of {_dependency_package}, so that updates to "
|
|
175
|
+
+ f"{_package_label} can require the higher version, or "
|
|
176
|
+
+ "(b) you manually update your Python environment to use at "
|
|
177
|
+
+ f"least version {_next_supported_version} of "
|
|
178
|
+
+ f"{_dependency_package}.",
|
|
179
|
+
FutureWarning,
|
|
180
|
+
)
|
|
181
|
+
except Exception:
|
|
182
|
+
warnings.warn(
|
|
183
|
+
"Could not determine the version of Python "
|
|
184
|
+
+ "currently being used. To continue receiving "
|
|
185
|
+
+ "updates for {_package_label}, ensure you are "
|
|
186
|
+
+ "using a supported version of Python; see "
|
|
187
|
+
+ "https://devguide.python.org/versions/"
|
|
188
|
+
)
|
|
189
|
+
|
|
86
190
|
__all__ = (
|
|
87
191
|
"DatabaseAdminAsyncClient",
|
|
88
192
|
"AddSplitPointsRequest",
|
|
@@ -172,6 +172,34 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
|
|
|
172
172
|
_DEFAULT_ENDPOINT_TEMPLATE = "spanner.{UNIVERSE_DOMAIN}"
|
|
173
173
|
_DEFAULT_UNIVERSE = "googleapis.com"
|
|
174
174
|
|
|
175
|
+
@staticmethod
|
|
176
|
+
def _use_client_cert_effective():
|
|
177
|
+
"""Returns whether client certificate should be used for mTLS if the
|
|
178
|
+
google-auth version supports should_use_client_cert automatic mTLS enablement.
|
|
179
|
+
|
|
180
|
+
Alternatively, read from the GOOGLE_API_USE_CLIENT_CERTIFICATE env var.
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
bool: whether client certificate should be used for mTLS
|
|
184
|
+
Raises:
|
|
185
|
+
ValueError: (If using a version of google-auth without should_use_client_cert and
|
|
186
|
+
GOOGLE_API_USE_CLIENT_CERTIFICATE is set to an unexpected value.)
|
|
187
|
+
"""
|
|
188
|
+
# check if google-auth version supports should_use_client_cert for automatic mTLS enablement
|
|
189
|
+
if hasattr(mtls, "should_use_client_cert"): # pragma: NO COVER
|
|
190
|
+
return mtls.should_use_client_cert()
|
|
191
|
+
else: # pragma: NO COVER
|
|
192
|
+
# if unsupported, fallback to reading from env var
|
|
193
|
+
use_client_cert_str = os.getenv(
|
|
194
|
+
"GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
|
|
195
|
+
).lower()
|
|
196
|
+
if use_client_cert_str not in ("true", "false"):
|
|
197
|
+
raise ValueError(
|
|
198
|
+
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be"
|
|
199
|
+
" either `true` or `false`"
|
|
200
|
+
)
|
|
201
|
+
return use_client_cert_str == "true"
|
|
202
|
+
|
|
175
203
|
@classmethod
|
|
176
204
|
def from_service_account_info(cls, info: dict, *args, **kwargs):
|
|
177
205
|
"""Creates an instance of this client using the provided credentials
|
|
@@ -518,12 +546,8 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
|
|
|
518
546
|
)
|
|
519
547
|
if client_options is None:
|
|
520
548
|
client_options = client_options_lib.ClientOptions()
|
|
521
|
-
use_client_cert =
|
|
549
|
+
use_client_cert = DatabaseAdminClient._use_client_cert_effective()
|
|
522
550
|
use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
|
|
523
|
-
if use_client_cert not in ("true", "false"):
|
|
524
|
-
raise ValueError(
|
|
525
|
-
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
|
|
526
|
-
)
|
|
527
551
|
if use_mtls_endpoint not in ("auto", "never", "always"):
|
|
528
552
|
raise MutualTLSChannelError(
|
|
529
553
|
"Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
|
|
@@ -531,7 +555,7 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
|
|
|
531
555
|
|
|
532
556
|
# Figure out the client cert source to use.
|
|
533
557
|
client_cert_source = None
|
|
534
|
-
if use_client_cert
|
|
558
|
+
if use_client_cert:
|
|
535
559
|
if client_options.client_cert_source:
|
|
536
560
|
client_cert_source = client_options.client_cert_source
|
|
537
561
|
elif mtls.has_default_client_cert_source():
|
|
@@ -563,20 +587,14 @@ class DatabaseAdminClient(metaclass=DatabaseAdminClientMeta):
|
|
|
563
587
|
google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT
|
|
564
588
|
is not any of ["auto", "never", "always"].
|
|
565
589
|
"""
|
|
566
|
-
use_client_cert =
|
|
567
|
-
"GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
|
|
568
|
-
).lower()
|
|
590
|
+
use_client_cert = DatabaseAdminClient._use_client_cert_effective()
|
|
569
591
|
use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower()
|
|
570
592
|
universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN")
|
|
571
|
-
if use_client_cert not in ("true", "false"):
|
|
572
|
-
raise ValueError(
|
|
573
|
-
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
|
|
574
|
-
)
|
|
575
593
|
if use_mtls_endpoint not in ("auto", "never", "always"):
|
|
576
594
|
raise MutualTLSChannelError(
|
|
577
595
|
"Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
|
|
578
596
|
)
|
|
579
|
-
return use_client_cert
|
|
597
|
+
return use_client_cert, use_mtls_endpoint, universe_domain_env
|
|
580
598
|
|
|
581
599
|
@staticmethod
|
|
582
600
|
def _get_client_cert_source(provided_cert_source, use_cert_flag):
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Copyright 2025 Google LLC
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
#
|
|
16
|
+
from google.cloud.spanner_admin_instance_v1 import gapic_version as package_version
|
|
17
|
+
|
|
18
|
+
import google.api_core as api_core
|
|
19
|
+
import sys
|
|
20
|
+
|
|
21
|
+
__version__ = package_version.__version__
|
|
22
|
+
|
|
23
|
+
if sys.version_info >= (3, 8): # pragma: NO COVER
|
|
24
|
+
from importlib import metadata
|
|
25
|
+
else: # pragma: NO COVER
|
|
26
|
+
# TODO(https://github.com/googleapis/python-api-core/issues/835): Remove
|
|
27
|
+
# this code path once we drop support for Python 3.7
|
|
28
|
+
import importlib_metadata as metadata
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
from .services.instance_admin import InstanceAdminClient
|
|
32
|
+
from .services.instance_admin import InstanceAdminAsyncClient
|
|
33
|
+
|
|
34
|
+
from .types.common import OperationProgress
|
|
35
|
+
from .types.common import ReplicaSelection
|
|
36
|
+
from .types.common import FulfillmentPeriod
|
|
37
|
+
from .types.spanner_instance_admin import AutoscalingConfig
|
|
38
|
+
from .types.spanner_instance_admin import CreateInstanceConfigMetadata
|
|
39
|
+
from .types.spanner_instance_admin import CreateInstanceConfigRequest
|
|
40
|
+
from .types.spanner_instance_admin import CreateInstanceMetadata
|
|
41
|
+
from .types.spanner_instance_admin import CreateInstancePartitionMetadata
|
|
42
|
+
from .types.spanner_instance_admin import CreateInstancePartitionRequest
|
|
43
|
+
from .types.spanner_instance_admin import CreateInstanceRequest
|
|
44
|
+
from .types.spanner_instance_admin import DeleteInstanceConfigRequest
|
|
45
|
+
from .types.spanner_instance_admin import DeleteInstancePartitionRequest
|
|
46
|
+
from .types.spanner_instance_admin import DeleteInstanceRequest
|
|
47
|
+
from .types.spanner_instance_admin import FreeInstanceMetadata
|
|
48
|
+
from .types.spanner_instance_admin import GetInstanceConfigRequest
|
|
49
|
+
from .types.spanner_instance_admin import GetInstancePartitionRequest
|
|
50
|
+
from .types.spanner_instance_admin import GetInstanceRequest
|
|
51
|
+
from .types.spanner_instance_admin import Instance
|
|
52
|
+
from .types.spanner_instance_admin import InstanceConfig
|
|
53
|
+
from .types.spanner_instance_admin import InstancePartition
|
|
54
|
+
from .types.spanner_instance_admin import ListInstanceConfigOperationsRequest
|
|
55
|
+
from .types.spanner_instance_admin import ListInstanceConfigOperationsResponse
|
|
56
|
+
from .types.spanner_instance_admin import ListInstanceConfigsRequest
|
|
57
|
+
from .types.spanner_instance_admin import ListInstanceConfigsResponse
|
|
58
|
+
from .types.spanner_instance_admin import ListInstancePartitionOperationsRequest
|
|
59
|
+
from .types.spanner_instance_admin import ListInstancePartitionOperationsResponse
|
|
60
|
+
from .types.spanner_instance_admin import ListInstancePartitionsRequest
|
|
61
|
+
from .types.spanner_instance_admin import ListInstancePartitionsResponse
|
|
62
|
+
from .types.spanner_instance_admin import ListInstancesRequest
|
|
63
|
+
from .types.spanner_instance_admin import ListInstancesResponse
|
|
64
|
+
from .types.spanner_instance_admin import MoveInstanceMetadata
|
|
65
|
+
from .types.spanner_instance_admin import MoveInstanceRequest
|
|
66
|
+
from .types.spanner_instance_admin import MoveInstanceResponse
|
|
67
|
+
from .types.spanner_instance_admin import ReplicaComputeCapacity
|
|
68
|
+
from .types.spanner_instance_admin import ReplicaInfo
|
|
69
|
+
from .types.spanner_instance_admin import UpdateInstanceConfigMetadata
|
|
70
|
+
from .types.spanner_instance_admin import UpdateInstanceConfigRequest
|
|
71
|
+
from .types.spanner_instance_admin import UpdateInstanceMetadata
|
|
72
|
+
from .types.spanner_instance_admin import UpdateInstancePartitionMetadata
|
|
73
|
+
from .types.spanner_instance_admin import UpdateInstancePartitionRequest
|
|
74
|
+
from .types.spanner_instance_admin import UpdateInstanceRequest
|
|
75
|
+
|
|
76
|
+
if hasattr(api_core, "check_python_version") and hasattr(
|
|
77
|
+
api_core, "check_dependency_versions"
|
|
78
|
+
): # pragma: NO COVER
|
|
79
|
+
api_core.check_python_version("google.cloud.spanner_admin_instance_v1") # type: ignore
|
|
80
|
+
api_core.check_dependency_versions("google.cloud.spanner_admin_instance_v1") # type: ignore
|
|
81
|
+
else: # pragma: NO COVER
|
|
82
|
+
# An older version of api_core is installed which does not define the
|
|
83
|
+
# functions above. We do equivalent checks manually.
|
|
84
|
+
try:
|
|
85
|
+
import warnings
|
|
86
|
+
import sys
|
|
87
|
+
|
|
88
|
+
_py_version_str = sys.version.split()[0]
|
|
89
|
+
_package_label = "google.cloud.spanner_admin_instance_v1"
|
|
90
|
+
if sys.version_info < (3, 9):
|
|
91
|
+
warnings.warn(
|
|
92
|
+
"You are using a non-supported Python version "
|
|
93
|
+
+ f"({_py_version_str}). Google will not post any further "
|
|
94
|
+
+ f"updates to {_package_label} supporting this Python version. "
|
|
95
|
+
+ "Please upgrade to the latest Python version, or at "
|
|
96
|
+
+ f"least to Python 3.9, and then update {_package_label}.",
|
|
97
|
+
FutureWarning,
|
|
98
|
+
)
|
|
99
|
+
if sys.version_info[:2] == (3, 9):
|
|
100
|
+
warnings.warn(
|
|
101
|
+
f"You are using a Python version ({_py_version_str}) "
|
|
102
|
+
+ f"which Google will stop supporting in {_package_label} in "
|
|
103
|
+
+ "January 2026. Please "
|
|
104
|
+
+ "upgrade to the latest Python version, or at "
|
|
105
|
+
+ "least to Python 3.10, before then, and "
|
|
106
|
+
+ f"then update {_package_label}.",
|
|
107
|
+
FutureWarning,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
def parse_version_to_tuple(version_string: str):
|
|
111
|
+
"""Safely converts a semantic version string to a comparable tuple of integers.
|
|
112
|
+
Example: "4.25.8" -> (4, 25, 8)
|
|
113
|
+
Ignores non-numeric parts and handles common version formats.
|
|
114
|
+
Args:
|
|
115
|
+
version_string: Version string in the format "x.y.z" or "x.y.z<suffix>"
|
|
116
|
+
Returns:
|
|
117
|
+
Tuple of integers for the parsed version string.
|
|
118
|
+
"""
|
|
119
|
+
parts = []
|
|
120
|
+
for part in version_string.split("."):
|
|
121
|
+
try:
|
|
122
|
+
parts.append(int(part))
|
|
123
|
+
except ValueError:
|
|
124
|
+
# If it's a non-numeric part (e.g., '1.0.0b1' -> 'b1'), stop here.
|
|
125
|
+
# This is a simplification compared to 'packaging.parse_version', but sufficient
|
|
126
|
+
# for comparing strictly numeric semantic versions.
|
|
127
|
+
break
|
|
128
|
+
return tuple(parts)
|
|
129
|
+
|
|
130
|
+
def _get_version(dependency_name):
|
|
131
|
+
try:
|
|
132
|
+
version_string: str = metadata.version(dependency_name)
|
|
133
|
+
parsed_version = parse_version_to_tuple(version_string)
|
|
134
|
+
return (parsed_version, version_string)
|
|
135
|
+
except Exception:
|
|
136
|
+
# Catch exceptions from metadata.version() (e.g., PackageNotFoundError)
|
|
137
|
+
# or errors during parse_version_to_tuple
|
|
138
|
+
return (None, "--")
|
|
139
|
+
|
|
140
|
+
_dependency_package = "google.protobuf"
|
|
141
|
+
_next_supported_version = "4.25.8"
|
|
142
|
+
_next_supported_version_tuple = (4, 25, 8)
|
|
143
|
+
_recommendation = " (we recommend 6.x)"
|
|
144
|
+
(_version_used, _version_used_string) = _get_version(_dependency_package)
|
|
145
|
+
if _version_used and _version_used < _next_supported_version_tuple:
|
|
146
|
+
warnings.warn(
|
|
147
|
+
f"Package {_package_label} depends on "
|
|
148
|
+
+ f"{_dependency_package}, currently installed at version "
|
|
149
|
+
+ f"{_version_used_string}. Future updates to "
|
|
150
|
+
+ f"{_package_label} will require {_dependency_package} at "
|
|
151
|
+
+ f"version {_next_supported_version} or higher{_recommendation}."
|
|
152
|
+
+ " Please ensure "
|
|
153
|
+
+ "that either (a) your Python environment doesn't pin the "
|
|
154
|
+
+ f"version of {_dependency_package}, so that updates to "
|
|
155
|
+
+ f"{_package_label} can require the higher version, or "
|
|
156
|
+
+ "(b) you manually update your Python environment to use at "
|
|
157
|
+
+ f"least version {_next_supported_version} of "
|
|
158
|
+
+ f"{_dependency_package}.",
|
|
159
|
+
FutureWarning,
|
|
160
|
+
)
|
|
161
|
+
except Exception:
|
|
162
|
+
warnings.warn(
|
|
163
|
+
"Could not determine the version of Python "
|
|
164
|
+
+ "currently being used. To continue receiving "
|
|
165
|
+
+ "updates for {_package_label}, ensure you are "
|
|
166
|
+
+ "using a supported version of Python; see "
|
|
167
|
+
+ "https://devguide.python.org/versions/"
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
__all__ = (
|
|
171
|
+
"InstanceAdminAsyncClient",
|
|
172
|
+
"AutoscalingConfig",
|
|
173
|
+
"CreateInstanceConfigMetadata",
|
|
174
|
+
"CreateInstanceConfigRequest",
|
|
175
|
+
"CreateInstanceMetadata",
|
|
176
|
+
"CreateInstancePartitionMetadata",
|
|
177
|
+
"CreateInstancePartitionRequest",
|
|
178
|
+
"CreateInstanceRequest",
|
|
179
|
+
"DeleteInstanceConfigRequest",
|
|
180
|
+
"DeleteInstancePartitionRequest",
|
|
181
|
+
"DeleteInstanceRequest",
|
|
182
|
+
"FreeInstanceMetadata",
|
|
183
|
+
"FulfillmentPeriod",
|
|
184
|
+
"GetInstanceConfigRequest",
|
|
185
|
+
"GetInstancePartitionRequest",
|
|
186
|
+
"GetInstanceRequest",
|
|
187
|
+
"Instance",
|
|
188
|
+
"InstanceAdminClient",
|
|
189
|
+
"InstanceConfig",
|
|
190
|
+
"InstancePartition",
|
|
191
|
+
"ListInstanceConfigOperationsRequest",
|
|
192
|
+
"ListInstanceConfigOperationsResponse",
|
|
193
|
+
"ListInstanceConfigsRequest",
|
|
194
|
+
"ListInstanceConfigsResponse",
|
|
195
|
+
"ListInstancePartitionOperationsRequest",
|
|
196
|
+
"ListInstancePartitionOperationsResponse",
|
|
197
|
+
"ListInstancePartitionsRequest",
|
|
198
|
+
"ListInstancePartitionsResponse",
|
|
199
|
+
"ListInstancesRequest",
|
|
200
|
+
"ListInstancesResponse",
|
|
201
|
+
"MoveInstanceMetadata",
|
|
202
|
+
"MoveInstanceRequest",
|
|
203
|
+
"MoveInstanceResponse",
|
|
204
|
+
"OperationProgress",
|
|
205
|
+
"ReplicaComputeCapacity",
|
|
206
|
+
"ReplicaInfo",
|
|
207
|
+
"ReplicaSelection",
|
|
208
|
+
"UpdateInstanceConfigMetadata",
|
|
209
|
+
"UpdateInstanceConfigRequest",
|
|
210
|
+
"UpdateInstanceMetadata",
|
|
211
|
+
"UpdateInstancePartitionMetadata",
|
|
212
|
+
"UpdateInstancePartitionRequest",
|
|
213
|
+
"UpdateInstanceRequest",
|
|
214
|
+
)
|
|
@@ -178,6 +178,34 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
|
|
|
178
178
|
_DEFAULT_ENDPOINT_TEMPLATE = "spanner.{UNIVERSE_DOMAIN}"
|
|
179
179
|
_DEFAULT_UNIVERSE = "googleapis.com"
|
|
180
180
|
|
|
181
|
+
@staticmethod
|
|
182
|
+
def _use_client_cert_effective():
|
|
183
|
+
"""Returns whether client certificate should be used for mTLS if the
|
|
184
|
+
google-auth version supports should_use_client_cert automatic mTLS enablement.
|
|
185
|
+
|
|
186
|
+
Alternatively, read from the GOOGLE_API_USE_CLIENT_CERTIFICATE env var.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
bool: whether client certificate should be used for mTLS
|
|
190
|
+
Raises:
|
|
191
|
+
ValueError: (If using a version of google-auth without should_use_client_cert and
|
|
192
|
+
GOOGLE_API_USE_CLIENT_CERTIFICATE is set to an unexpected value.)
|
|
193
|
+
"""
|
|
194
|
+
# check if google-auth version supports should_use_client_cert for automatic mTLS enablement
|
|
195
|
+
if hasattr(mtls, "should_use_client_cert"): # pragma: NO COVER
|
|
196
|
+
return mtls.should_use_client_cert()
|
|
197
|
+
else: # pragma: NO COVER
|
|
198
|
+
# if unsupported, fallback to reading from env var
|
|
199
|
+
use_client_cert_str = os.getenv(
|
|
200
|
+
"GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
|
|
201
|
+
).lower()
|
|
202
|
+
if use_client_cert_str not in ("true", "false"):
|
|
203
|
+
raise ValueError(
|
|
204
|
+
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be"
|
|
205
|
+
" either `true` or `false`"
|
|
206
|
+
)
|
|
207
|
+
return use_client_cert_str == "true"
|
|
208
|
+
|
|
181
209
|
@classmethod
|
|
182
210
|
def from_service_account_info(cls, info: dict, *args, **kwargs):
|
|
183
211
|
"""Creates an instance of this client using the provided credentials
|
|
@@ -402,12 +430,8 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
|
|
|
402
430
|
)
|
|
403
431
|
if client_options is None:
|
|
404
432
|
client_options = client_options_lib.ClientOptions()
|
|
405
|
-
use_client_cert =
|
|
433
|
+
use_client_cert = InstanceAdminClient._use_client_cert_effective()
|
|
406
434
|
use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
|
|
407
|
-
if use_client_cert not in ("true", "false"):
|
|
408
|
-
raise ValueError(
|
|
409
|
-
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
|
|
410
|
-
)
|
|
411
435
|
if use_mtls_endpoint not in ("auto", "never", "always"):
|
|
412
436
|
raise MutualTLSChannelError(
|
|
413
437
|
"Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
|
|
@@ -415,7 +439,7 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
|
|
|
415
439
|
|
|
416
440
|
# Figure out the client cert source to use.
|
|
417
441
|
client_cert_source = None
|
|
418
|
-
if use_client_cert
|
|
442
|
+
if use_client_cert:
|
|
419
443
|
if client_options.client_cert_source:
|
|
420
444
|
client_cert_source = client_options.client_cert_source
|
|
421
445
|
elif mtls.has_default_client_cert_source():
|
|
@@ -447,20 +471,14 @@ class InstanceAdminClient(metaclass=InstanceAdminClientMeta):
|
|
|
447
471
|
google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT
|
|
448
472
|
is not any of ["auto", "never", "always"].
|
|
449
473
|
"""
|
|
450
|
-
use_client_cert =
|
|
451
|
-
"GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
|
|
452
|
-
).lower()
|
|
474
|
+
use_client_cert = InstanceAdminClient._use_client_cert_effective()
|
|
453
475
|
use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower()
|
|
454
476
|
universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN")
|
|
455
|
-
if use_client_cert not in ("true", "false"):
|
|
456
|
-
raise ValueError(
|
|
457
|
-
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
|
|
458
|
-
)
|
|
459
477
|
if use_mtls_endpoint not in ("auto", "never", "always"):
|
|
460
478
|
raise MutualTLSChannelError(
|
|
461
479
|
"Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
|
|
462
480
|
)
|
|
463
|
-
return use_client_cert
|
|
481
|
+
return use_client_cert, use_mtls_endpoint, universe_domain_env
|
|
464
482
|
|
|
465
483
|
@staticmethod
|
|
466
484
|
def _get_client_cert_source(provided_cert_source, use_cert_flag):
|
|
@@ -160,6 +160,34 @@ class SpannerClient(metaclass=SpannerClientMeta):
|
|
|
160
160
|
_DEFAULT_ENDPOINT_TEMPLATE = "spanner.{UNIVERSE_DOMAIN}"
|
|
161
161
|
_DEFAULT_UNIVERSE = "googleapis.com"
|
|
162
162
|
|
|
163
|
+
@staticmethod
|
|
164
|
+
def _use_client_cert_effective():
|
|
165
|
+
"""Returns whether client certificate should be used for mTLS if the
|
|
166
|
+
google-auth version supports should_use_client_cert automatic mTLS enablement.
|
|
167
|
+
|
|
168
|
+
Alternatively, read from the GOOGLE_API_USE_CLIENT_CERTIFICATE env var.
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
bool: whether client certificate should be used for mTLS
|
|
172
|
+
Raises:
|
|
173
|
+
ValueError: (If using a version of google-auth without should_use_client_cert and
|
|
174
|
+
GOOGLE_API_USE_CLIENT_CERTIFICATE is set to an unexpected value.)
|
|
175
|
+
"""
|
|
176
|
+
# check if google-auth version supports should_use_client_cert for automatic mTLS enablement
|
|
177
|
+
if hasattr(mtls, "should_use_client_cert"): # pragma: NO COVER
|
|
178
|
+
return mtls.should_use_client_cert()
|
|
179
|
+
else: # pragma: NO COVER
|
|
180
|
+
# if unsupported, fallback to reading from env var
|
|
181
|
+
use_client_cert_str = os.getenv(
|
|
182
|
+
"GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
|
|
183
|
+
).lower()
|
|
184
|
+
if use_client_cert_str not in ("true", "false"):
|
|
185
|
+
raise ValueError(
|
|
186
|
+
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be"
|
|
187
|
+
" either `true` or `false`"
|
|
188
|
+
)
|
|
189
|
+
return use_client_cert_str == "true"
|
|
190
|
+
|
|
163
191
|
@classmethod
|
|
164
192
|
def from_service_account_info(cls, info: dict, *args, **kwargs):
|
|
165
193
|
"""Creates an instance of this client using the provided credentials
|
|
@@ -371,12 +399,8 @@ class SpannerClient(metaclass=SpannerClientMeta):
|
|
|
371
399
|
)
|
|
372
400
|
if client_options is None:
|
|
373
401
|
client_options = client_options_lib.ClientOptions()
|
|
374
|
-
use_client_cert =
|
|
402
|
+
use_client_cert = SpannerClient._use_client_cert_effective()
|
|
375
403
|
use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto")
|
|
376
|
-
if use_client_cert not in ("true", "false"):
|
|
377
|
-
raise ValueError(
|
|
378
|
-
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
|
|
379
|
-
)
|
|
380
404
|
if use_mtls_endpoint not in ("auto", "never", "always"):
|
|
381
405
|
raise MutualTLSChannelError(
|
|
382
406
|
"Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
|
|
@@ -384,7 +408,7 @@ class SpannerClient(metaclass=SpannerClientMeta):
|
|
|
384
408
|
|
|
385
409
|
# Figure out the client cert source to use.
|
|
386
410
|
client_cert_source = None
|
|
387
|
-
if use_client_cert
|
|
411
|
+
if use_client_cert:
|
|
388
412
|
if client_options.client_cert_source:
|
|
389
413
|
client_cert_source = client_options.client_cert_source
|
|
390
414
|
elif mtls.has_default_client_cert_source():
|
|
@@ -416,20 +440,14 @@ class SpannerClient(metaclass=SpannerClientMeta):
|
|
|
416
440
|
google.auth.exceptions.MutualTLSChannelError: If GOOGLE_API_USE_MTLS_ENDPOINT
|
|
417
441
|
is not any of ["auto", "never", "always"].
|
|
418
442
|
"""
|
|
419
|
-
use_client_cert =
|
|
420
|
-
"GOOGLE_API_USE_CLIENT_CERTIFICATE", "false"
|
|
421
|
-
).lower()
|
|
443
|
+
use_client_cert = SpannerClient._use_client_cert_effective()
|
|
422
444
|
use_mtls_endpoint = os.getenv("GOOGLE_API_USE_MTLS_ENDPOINT", "auto").lower()
|
|
423
445
|
universe_domain_env = os.getenv("GOOGLE_CLOUD_UNIVERSE_DOMAIN")
|
|
424
|
-
if use_client_cert not in ("true", "false"):
|
|
425
|
-
raise ValueError(
|
|
426
|
-
"Environment variable `GOOGLE_API_USE_CLIENT_CERTIFICATE` must be either `true` or `false`"
|
|
427
|
-
)
|
|
428
446
|
if use_mtls_endpoint not in ("auto", "never", "always"):
|
|
429
447
|
raise MutualTLSChannelError(
|
|
430
448
|
"Environment variable `GOOGLE_API_USE_MTLS_ENDPOINT` must be `never`, `auto` or `always`"
|
|
431
449
|
)
|
|
432
|
-
return use_client_cert
|
|
450
|
+
return use_client_cert, use_mtls_endpoint, universe_domain_env
|
|
433
451
|
|
|
434
452
|
@staticmethod
|
|
435
453
|
def _get_client_cert_source(provided_cert_source, use_cert_flag):
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
15
|
#
|
|
16
|
+
|
|
17
|
+
# DO NOT EDIT THIS FILE OUTSIDE OF `.librarian/generator-input`
|
|
18
|
+
# The source of truth for this file is `.librarian/generator-input`
|
|
19
|
+
|
|
16
20
|
import io
|
|
17
21
|
import os
|
|
18
22
|
|