From 75f7198e8828c68838c4e9c4cc011e3bf0a29d03 Mon Sep 17 00:00:00 2001 From: WhiteSource Renovate Date: Thu, 29 Sep 2022 20:47:06 +0200 Subject: [PATCH 1/4] chore(deps): update dependency google-cloud-spanner to v3.22.0 (#831) --- samples/samples/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/samples/requirements.txt b/samples/samples/requirements.txt index 8f9b8ad280..c3216b3800 100644 --- a/samples/samples/requirements.txt +++ b/samples/samples/requirements.txt @@ -1,2 +1,2 @@ -google-cloud-spanner==3.21.0 +google-cloud-spanner==3.22.0 futures==3.3.0; python_version < "3" From 4282340bc2c3a34496c59c33f5c64ff76dceda4c Mon Sep 17 00:00:00 2001 From: rahul2393 Date: Mon, 3 Oct 2022 10:24:16 +0530 Subject: [PATCH 2/4] feat: add samples for CMMR phase 2 (#672) * feat(spanner): add support for CMMR phase 2 * fix lint issues * re-trigger build --- samples/samples/snippets.py | 92 ++++++++++++++++++++++++++++++++ samples/samples/snippets_test.py | 43 +++++++++++++++ 2 files changed, 135 insertions(+) diff --git a/samples/samples/snippets.py b/samples/samples/snippets.py index 0fa78390e5..3d65ab9c7b 100644 --- a/samples/samples/snippets.py +++ b/samples/samples/snippets.py @@ -29,7 +29,9 @@ import time from google.cloud import spanner +from google.cloud.spanner_admin_instance_v1.types import spanner_instance_admin from google.cloud.spanner_v1 import param_types +from google.protobuf import field_mask_pb2 # type: ignore OPERATION_TIMEOUT_SECONDS = 240 @@ -2116,6 +2118,96 @@ def set_request_tag(instance_id, database_id): # [END spanner_set_request_tag] +# [START spanner_create_instance_config] +def create_instance_config(user_config_name, base_config_id): + """Creates the new user-managed instance configuration using base instance config.""" + + # user_config_name = `custom-nam11` + # base_config_id = `projects//instanceConfigs/nam11` + spanner_client = spanner.Client() + base_config = spanner_client.instance_admin_api.get_instance_config( + name=base_config_id) + + # The replicas for the custom instance configuration must include all the replicas of the base + # configuration, in addition to at least one from the list of optional replicas of the base + # configuration. + replicas = [] + for replica in base_config.replicas: + replicas.append(replica) + replicas.append(base_config.optional_replicas[0]) + operation = spanner_client.instance_admin_api.create_instance_config( + parent=spanner_client.project_name, + instance_config_id=user_config_name, + instance_config=spanner_instance_admin.InstanceConfig( + name="{}/instanceConfigs/{}".format(spanner_client.project_name, user_config_name), + display_name="custom-python-samples", + config_type=spanner_instance_admin.InstanceConfig.Type.USER_MANAGED, + replicas=replicas, + base_config=base_config.name, + labels={ + "python_cloud_spanner_samples": "true" + } + )) + print("Waiting for operation to complete...") + operation.result(OPERATION_TIMEOUT_SECONDS) + + print("Created instance configuration {}".format(user_config_name)) + + +# [END spanner_create_instance_config] + +# [START spanner_update_instance_config] +def update_instance_config(user_config_name): + """Updates the user-managed instance configuration.""" + + # user_config_name = `custom-nam11` + spanner_client = spanner.Client() + config = spanner_client.instance_admin_api.get_instance_config( + name="{}/instanceConfigs/{}".format(spanner_client.project_name, user_config_name)) + config.display_name = "updated custom instance config" + config.labels["updated"] = "true" + operation = spanner_client.instance_admin_api.update_instance_config(instance_config=config, + update_mask=field_mask_pb2.FieldMask( + paths=["display_name", "labels"])) + print("Waiting for operation to complete...") + operation.result(OPERATION_TIMEOUT_SECONDS) + print("Updated instance configuration {}".format(user_config_name)) + + +# [END spanner_update_instance_config] + +# [START spanner_delete_instance_config] +def delete_instance_config(user_config_id): + """Deleted the user-managed instance configuration.""" + spanner_client = spanner.Client() + spanner_client.instance_admin_api.delete_instance_config( + name=user_config_id) + print("Instance config {} successfully deleted".format(user_config_id)) + + +# [END spanner_delete_instance_config] + + +# [START spanner_list_instance_config_operations] +def list_instance_config_operations(): + """List the user-managed instance configuration operations.""" + spanner_client = spanner.Client() + operations = spanner_client.instance_admin_api.list_instance_config_operations( + request=spanner_instance_admin.ListInstanceConfigOperationsRequest(parent=spanner_client.project_name, + filter="(metadata.@type=type.googleapis.com/google.spanner.admin.instance.v1.CreateInstanceConfigMetadata)")) + for op in operations: + metadata = spanner_instance_admin.CreateInstanceConfigMetadata.pb(spanner_instance_admin.CreateInstanceConfigMetadata()) + op.metadata.Unpack(metadata) + print( + "List instance config operations {} is {}% completed.".format( + metadata.instance_config.name, metadata.progress.progress_percent + ) + ) + + +# [END spanner_list_instance_config_operations] + + if __name__ == "__main__": # noqa: C901 parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter diff --git a/samples/samples/snippets_test.py b/samples/samples/snippets_test.py index 008a3ee24c..f085a0e71c 100644 --- a/samples/samples/snippets_test.py +++ b/samples/samples/snippets_test.py @@ -95,6 +95,20 @@ def default_leader(): return "us-east4" +@pytest.fixture(scope="module") +def user_managed_instance_config_name(spanner_client): + name = f"custom-python-samples-config-{uuid.uuid4().hex[:10]}" + yield name + snippets.delete_instance_config("{}/instanceConfigs/{}".format( + spanner_client.project_name, name)) + return + + +@pytest.fixture(scope="module") +def base_instance_config_id(spanner_client): + return "{}/instanceConfigs/{}".format(spanner_client.project_name, "nam7") + + def test_create_instance_explicit(spanner_client, create_instance_id): # Rather than re-use 'sample_isntance', we create a new instance, to # ensure that the 'create_instance' snippet is tested. @@ -148,6 +162,35 @@ def test_list_instance_config(capsys): assert "regional-us-central1" in out +@pytest.mark.dependency(name="create_instance_config") +def test_create_instance_config(capsys, user_managed_instance_config_name, base_instance_config_id): + snippets.create_instance_config(user_managed_instance_config_name, base_instance_config_id) + out, _ = capsys.readouterr() + assert "Created instance configuration" in out + + +@pytest.mark.dependency(depends=["create_instance_config"]) +def test_update_instance_config(capsys, user_managed_instance_config_name): + snippets.update_instance_config(user_managed_instance_config_name) + out, _ = capsys.readouterr() + assert "Updated instance configuration" in out + + +@pytest.mark.dependency(depends=["create_instance_config"]) +def test_delete_instance_config(capsys, user_managed_instance_config_name): + spanner_client = spanner.Client() + snippets.delete_instance_config("{}/instanceConfigs/{}".format( + spanner_client.project_name, user_managed_instance_config_name)) + out, _ = capsys.readouterr() + assert "successfully deleted" in out + + +def test_list_instance_config_operations(capsys): + snippets.list_instance_config_operations() + out, _ = capsys.readouterr() + assert "List instance config operations" in out + + def test_list_databases(capsys, instance_id): snippets.list_databases(instance_id) out, _ = capsys.readouterr() From 4d7156376f4633de6c1a2bfd25ba97126386ebd0 Mon Sep 17 00:00:00 2001 From: "gcf-owl-bot[bot]" <78513119+gcf-owl-bot[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 13:33:29 -0400 Subject: [PATCH 3/4] fix(deps): require protobuf >= 3.20.2 (#830) * chore: exclude requirements.txt file from renovate-bot Source-Link: https://github.com/googleapis/synthtool/commit/f58d3135a2fab20e225d98741dbc06d57459b816 Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:7a40313731a7cb1454eef6b33d3446ebb121836738dc3ab3d2d3ded5268c35b6 * update constraints files * fix(deps): require protobuf 3.20.2 Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/requirements.txt | 49 ++++++++++++++++++------------------- setup.py | 2 +- testing/constraints-3.7.txt | 2 +- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index aa547962eb..3815c983cb 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,4 +13,4 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:e09366bdf0fd9c8976592988390b24d53583dd9f002d476934da43725adbb978 + digest: sha256:7a40313731a7cb1454eef6b33d3446ebb121836738dc3ab3d2d3ded5268c35b6 diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 385f2d4d61..d15994bac9 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -325,31 +325,30 @@ platformdirs==2.5.2 \ --hash=sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788 \ --hash=sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19 # via virtualenv -protobuf==3.20.1 \ - --hash=sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf \ - --hash=sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f \ - --hash=sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f \ - --hash=sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7 \ - --hash=sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996 \ - --hash=sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067 \ - --hash=sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c \ - --hash=sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7 \ - --hash=sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9 \ - --hash=sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c \ - --hash=sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739 \ - --hash=sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91 \ - --hash=sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c \ - --hash=sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153 \ - --hash=sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9 \ - --hash=sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388 \ - --hash=sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e \ - --hash=sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab \ - --hash=sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde \ - --hash=sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531 \ - --hash=sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8 \ - --hash=sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7 \ - --hash=sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20 \ - --hash=sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3 +protobuf==3.20.2 \ + --hash=sha256:03d76b7bd42ac4a6e109742a4edf81ffe26ffd87c5993126d894fe48a120396a \ + --hash=sha256:09e25909c4297d71d97612f04f41cea8fa8510096864f2835ad2f3b3df5a5559 \ + --hash=sha256:18e34a10ae10d458b027d7638a599c964b030c1739ebd035a1dfc0e22baa3bfe \ + --hash=sha256:291fb4307094bf5ccc29f424b42268640e00d5240bf0d9b86bf3079f7576474d \ + --hash=sha256:2c0b040d0b5d5d207936ca2d02f00f765906622c07d3fa19c23a16a8ca71873f \ + --hash=sha256:384164994727f274cc34b8abd41a9e7e0562801361ee77437099ff6dfedd024b \ + --hash=sha256:3cb608e5a0eb61b8e00fe641d9f0282cd0eedb603be372f91f163cbfbca0ded0 \ + --hash=sha256:5d9402bf27d11e37801d1743eada54372f986a372ec9679673bfcc5c60441151 \ + --hash=sha256:712dca319eee507a1e7df3591e639a2b112a2f4a62d40fe7832a16fd19151750 \ + --hash=sha256:7a5037af4e76c975b88c3becdf53922b5ffa3f2cddf657574a4920a3b33b80f3 \ + --hash=sha256:8228e56a865c27163d5d1d1771d94b98194aa6917bcfb6ce139cbfa8e3c27334 \ + --hash=sha256:84a1544252a933ef07bb0b5ef13afe7c36232a774affa673fc3636f7cee1db6c \ + --hash=sha256:84fe5953b18a383fd4495d375fe16e1e55e0a3afe7b4f7b4d01a3a0649fcda9d \ + --hash=sha256:9c673c8bfdf52f903081816b9e0e612186684f4eb4c17eeb729133022d6032e3 \ + --hash=sha256:9f876a69ca55aed879b43c295a328970306e8e80a263ec91cf6e9189243c613b \ + --hash=sha256:a9e5ae5a8e8985c67e8944c23035a0dff2c26b0f5070b2f55b217a1c33bbe8b1 \ + --hash=sha256:b4fdb29c5a7406e3f7ef176b2a7079baa68b5b854f364c21abe327bbeec01cdb \ + --hash=sha256:c184485e0dfba4dfd451c3bd348c2e685d6523543a0f91b9fd4ae90eb09e8422 \ + --hash=sha256:c9cdf251c582c16fd6a9f5e95836c90828d51b0069ad22f463761d27c6c19019 \ + --hash=sha256:e39cf61bb8582bda88cdfebc0db163b774e7e03364bbf9ce1ead13863e81e359 \ + --hash=sha256:e8fbc522303e09036c752a0afcc5c0603e917222d8bedc02813fd73b4b4ed804 \ + --hash=sha256:f34464ab1207114e73bba0794d1257c150a2b89b7a9faf504e00af7c9fd58978 \ + --hash=sha256:f52dabc96ca99ebd2169dadbe018824ebda08a795c7684a0b7d203a290f3adb0 # via # gcp-docuploader # gcp-releasetool diff --git a/setup.py b/setup.py index faf8a4685c..518376da02 100644 --- a/setup.py +++ b/setup.py @@ -35,7 +35,7 @@ "proto-plus >= 1.22.0, <2.0.0dev", "sqlparse >= 0.3.0", "packaging >= 14.3", - "protobuf >= 3.19.0, <5.0.0dev", + "protobuf >= 3.20.2, <5.0.0dev", ] extras = { "tracing": [ diff --git a/testing/constraints-3.7.txt b/testing/constraints-3.7.txt index 1d3f790e94..7391e756d0 100644 --- a/testing/constraints-3.7.txt +++ b/testing/constraints-3.7.txt @@ -15,4 +15,4 @@ opentelemetry-api==1.1.0 opentelemetry-sdk==1.1.0 opentelemetry-instrumentation==0.20b0 packaging==14.3 -protobuf==3.19.0 +protobuf==3.20.2 From e9832e1336a297b12a5dcde0984332c21fee42a8 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Mon, 3 Oct 2022 19:50:15 -0700 Subject: [PATCH 4/4] chore(main): release 3.22.1 (#833) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 12 ++++++++++++ setup.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a39f7b8f96..e09b232b92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ [1]: https://pypi.org/project/google-cloud-spanner/#history +## [3.22.1](https://github.com/googleapis/python-spanner/compare/v3.22.0...v3.22.1) (2022-10-04) + + +### Bug Fixes + +* **deps:** Require protobuf >= 3.20.2 ([#830](https://github.com/googleapis/python-spanner/issues/830)) ([4d71563](https://github.com/googleapis/python-spanner/commit/4d7156376f4633de6c1a2bfd25ba97126386ebd0)) + + +### Documentation + +* **samples:** add samples for CMMR phase 2 ([4282340](https://github.com/googleapis/python-spanner/commit/4282340bc2c3a34496c59c33f5c64ff76dceda4c)) + ## [3.22.0](https://github.com/googleapis/python-spanner/compare/v3.21.0...v3.22.0) (2022-09-26) diff --git a/setup.py b/setup.py index 518376da02..b14776ee2d 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ name = "google-cloud-spanner" description = "Cloud Spanner API client library" -version = "3.22.0" +version = "3.22.1" # Should be one of: # 'Development Status :: 3 - Alpha' # 'Development Status :: 4 - Beta'