diff --git a/.github/release-please.yml b/.github/release-please.yml deleted file mode 100644 index 7a6989aefd52..000000000000 --- a/.github/release-please.yml +++ /dev/null @@ -1,3 +0,0 @@ -handleGHRelease: true -manifest: true -tagPullRequestNumber: true diff --git a/.github/release-trigger.yml b/.github/release-trigger.yml deleted file mode 100644 index e48d9df053de..000000000000 --- a/.github/release-trigger.yml +++ /dev/null @@ -1,2 +0,0 @@ -enabled: true -multiScmName: google-cloud-python diff --git a/.github/workflows/configure_release_please.yml b/.github/workflows/configure_release_please.yml deleted file mode 100644 index a2de49c3fae5..000000000000 --- a/.github/workflows/configure_release_please.yml +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2023 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. - -name: A workflow for updating the release please configuration files - -# Controls when the action will run. - -on: - push: - paths: - - '**/gapic_version.py' - - '**/.OwlBot.yaml' - branches: - - main - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -permissions: - contents: read - -jobs: - build: - permissions: - pull-requests: write # for googleapis/code-suggester - name: Update release please config - runs-on: ubuntu-latest - # don't run the workflow on forks of googleapis/google-cloud-python - if: ${{github.repository == 'googleapis/google-cloud-python'}} - steps: - - uses: actions/checkout@v5 - # Use a fetch-depth of 2 - # See https://github.com/googleapis/google-cloud-python/issues/12013 - # and https://github.com/actions/checkout#checkout-head. - with: - fetch-depth: 2 - - name: Set up Python 3.11 - uses: actions/setup-python@v6 - with: - python-version: 3.14 - - name: Run configure_release_please.py - run: python3 configure_release_please.py - working-directory: ./scripts/configure_release_please - - uses: googleapis/code-suggester@v5 - env: - ACCESS_TOKEN: ${{ secrets.YOSHI_CODE_BOT_TOKEN }} - with: - command: pr - force: true - upstream_owner: googleapis - upstream_repo: google-cloud-python - description: 'Update release-please config files' - title: 'chore: Update release-please config files' - message: 'chore: Update release-please config files' - branch: update-release-please-config-files - git_dir: '.' diff --git a/.github/workflows/scripts.yml b/.github/workflows/scripts.yml deleted file mode 100644 index 8aa1dad4e3b8..000000000000 --- a/.github/workflows/scripts.yml +++ /dev/null @@ -1,30 +0,0 @@ -on: - pull_request: - branches: - - main -name: scripts - -permissions: - contents: read - -jobs: - test_release_please_scripts: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v5 - # Use a fetch-depth of 2 - # See https://github.com/googleapis/google-cloud-python/issues/12013 - # and https://github.com/actions/checkout#checkout-head. - with: - fetch-depth: 2 - - name: Setup Python - uses: actions/setup-python@v6 - with: - python-version: "3.14" - - name: Install pytest - run: | - python -m pip install pytest - - name: Run configure_release_please_scripts tests - run: | - pytest scripts/configure_release_please diff --git a/.release-please-manifest.json b/.release-please-manifest.json deleted file mode 100644 index 0967ef424bce..000000000000 --- a/.release-please-manifest.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/release-please-config.json b/release-please-config.json deleted file mode 100644 index 9f8bb9f9fe8c..000000000000 --- a/release-please-config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "packages": {} -} diff --git a/scripts/configure_release_please/configure_release_please.py b/scripts/configure_release_please/configure_release_please.py deleted file mode 100644 index 9d36e3f2a8db..000000000000 --- a/scripts/configure_release_please/configure_release_please.py +++ /dev/null @@ -1,174 +0,0 @@ -import json -from pathlib import Path -from typing import Union, Dict, List, Tuple -import re - -SCRIPT_DIR = Path(__file__).resolve().parent -ROOT_DIR = Path(SCRIPT_DIR / ".." / "..").resolve() -PACKAGES_DIR = ROOT_DIR / "packages" -PACKAGES_WITHOUT_GAPIC_VERSION = [ - "google-cloud-access-context-manager", - "google-cloud-audit-log", - "googleapis-common-protos", - "grpc-google-iam-v1", -] - - -def get_version_for_package(version_path: Path) -> Tuple[int]: - """ - Given a `version_path` to a `gapic_version.py` file, - return Tuple which contains the version. - - Args: - version_path(pathlib.Path): Path to the gapic_version.py file - - Returns: - Tuple[int] in the format (, , ) - """ - VERSION_REGEX = r"__version__\s=\s\"(?P\d+)\.(?P\d+)\.(?P\d+)\"" - match = re.search(VERSION_REGEX, version_path.read_text()) - - if match is None: - raise Exception("Could not detect version") - - major_version = int(match.group("major_version")) - minor_version = int(match.group("minor_version")) - patch_version = int(match.group("patch_version")) - - if any(elem is None for elem in [major_version, minor_version, patch_version]): - raise Exception("could not detect version") - - return (major_version, minor_version, patch_version) - - -def get_packages_with_owlbot_yaml(packages_dir: Path = PACKAGES_DIR) -> List[Path]: - """ - Walks through all API packages in the specified `packages_dir` path. - - Args: - packages_dir(pathlib.Path): Path to the directory which contains packages. - - Returns: - List[pathlib.Path] where each entry corresponds to a package within the - specified `packages_dir`, which has a corresponding .OwlBot.yaml file. - """ - if not Path(packages_dir).exists(): - raise FileNotFoundError(f"Directory {packages_dir} not found") - return [obj.parents[0].resolve() for obj in packages_dir.rglob("**/.OwlBot.yaml")] - - -def configure_release_please_manifest( - package_dirs: List[Path], root_dir: Path = ROOT_DIR -) -> None: - """ - This method updates the `.release-please-manifest.json` file in the directory - `root_dir`. It removes entries that are not in `package_dirs` and updates - versions for both existing and new packages. - - Args: - package_dirs(List[pathlib.Path]): A list of Paths, one for each package in the - `packages/` folder whose entry will be updated in the release-please manifest. - root_dir(pathlib.Path): The directory to update the `.release-please-manifest.json` - - Returns: - None - """ - - release_please_manifest = root_dir / ".release-please-manifest.json" - - with open(release_please_manifest, "r") as f: - manifest_json = json.load(f) - - expected_package_paths = { - f"packages/{package_dir.name}" for package_dir in package_dirs - } - - keys_to_remove = [] - for key in manifest_json.keys(): - if key not in expected_package_paths: - keys_to_remove.append(key) - - for key in keys_to_remove: - print(f"Removed stale entry from manifest: {key}") - del manifest_json[key] - - for package_dir in package_dirs: - if f"packages/{package_dir.name}" not in manifest_json: - manifest_json[f"packages/{package_dir.name}"] = "0.0.0" - - if not package_supports_gapic_version(package_dir): - continue - gapic_version_file = next(package_dir.rglob("**/gapic_version.py"), None) - if gapic_version_file is None: - raise Exception("Failed to find gapic_version.py") - version = get_version_for_package(gapic_version_file) - # check the version in gapic_version.py and update if newer than the default which is - # 0.0.0 or 0.1.0. - if version != (0, 0, 0) and version != (0, 1, 0): - manifest_json[ - f"packages/{package_dir.name}" - ] = f"{version[0]}.{version[1]}.{version[2]}" - - with open(release_please_manifest, "w") as f: - json.dump(manifest_json, f, indent=4, sort_keys=True) - f.write("\n") - - -def package_supports_gapic_version(package_dir: str) -> bool: - """Returns True if the given package directory is expected to have gapic_version.py""" - - for package in PACKAGES_WITHOUT_GAPIC_VERSION: - if package_dir == Path(PACKAGES_DIR / package): - return False - - return True - - -def configure_release_please_config( - package_dirs: List[Path], root_dir: Path = ROOT_DIR -) -> None: - """ - This method updates the `release-please-config.json` file in the directory - `root_dir`. If `root_dir` is not provided, `google-cloud-python` will be used as the root. - - Args: - package_dirs(List[pathlib.Path]): A list of Paths, one for each package in - the `packages/` folder whose entry will be updated in the release-please config. - root_dir(pathlib.Path): The directory to update the `release-please-config.json` - - Returns: - None - """ - release_please_config = root_dir / "release-please-config.json" - config_json = {"packages": {}} - for package_dir in package_dirs: - extra_files: List[Union[str, Dict[str, str]]] = [ - str(file.relative_to(package_dir)) - for file in sorted(package_dir.rglob("**/gapic_version.py")) - ] - if len(extra_files) < 1 and package_supports_gapic_version(package_dir): - raise Exception("Failed to find gapic_version.py") - for json_file in sorted(package_dir.glob("samples/**/*.json")): - sample_json = {} - sample_json["jsonpath"] = "$.clientLibrary.version" - sample_json["path"] = str(json_file.relative_to(package_dir)) - sample_json["type"] = "json" - extra_files.append(sample_json) - - config_json["packages"][f"packages/{package_dir.name}"] = { - "component": f"{package_dir.name}", - "release-type": "python", - "extra-files": extra_files, - "bump-minor-pre-major": True, - "bump-patch-for-minor-pre-major": True, - } - - with open(release_please_config, "w") as f: - json.dump(config_json, f, indent=4, sort_keys=True) - f.write("\n") - - -if __name__ == "__main__": - owlbot_dirs = get_packages_with_owlbot_yaml() - configure_release_please_manifest(owlbot_dirs) - configure_release_please_config(owlbot_dirs) diff --git a/scripts/configure_release_please/configure_release_please_test.py b/scripts/configure_release_please/configure_release_please_test.py deleted file mode 100644 index d1b9e05b6bf4..000000000000 --- a/scripts/configure_release_please/configure_release_please_test.py +++ /dev/null @@ -1,70 +0,0 @@ -from pathlib import Path -import shutil -import unittest - -import configure_release_please - -SCRIPT_DIR = Path(__file__).parent.resolve() -TEST_RESOURCES_DIR = SCRIPT_DIR / "test_resources" -PACKAGES_DIR = TEST_RESOURCES_DIR / "packages" - - -class TestChangeSummary(unittest.TestCase): - def test_get_version_for_package(self): - path_to_gapic_version_py = ( - PACKAGES_DIR / "google-cloud-ids/google/cloud/ids/gapic_version.py" - ) - version = configure_release_please.get_version_for_package( - path_to_gapic_version_py - ) - self.assertEqual(version, (1, 5, 1)) - - def test_get_version_for_package_raises_when_file_not_found(self): - with self.assertRaises(FileNotFoundError): - configure_release_please.get_version_for_package(Path("does/not/exist")) - - def test_get_packages_with_owlbot_yaml(self): - expected_result = [PACKAGES_DIR / "google-cloud-ids"] - self.assertEqual( - configure_release_please.get_packages_with_owlbot_yaml(PACKAGES_DIR), - expected_result, - ) - - def test_get_packages_with_owlbot_yaml_bad_path(self): - with self.assertRaises(FileNotFoundError): - configure_release_please.get_packages_with_owlbot_yaml(Path("does/not/exist")) - - def test_configure_release_please_manifest(self): - expected_result = """{ - "packages/google-cloud-ids": "1.5.1" -}\n""" - package_dirs = configure_release_please.get_packages_with_owlbot_yaml(PACKAGES_DIR) - configure_release_please.configure_release_please_manifest( - package_dirs=package_dirs, root_dir=TEST_RESOURCES_DIR - ) - self.assertEqual( - (TEST_RESOURCES_DIR / ".release-please-manifest.json").read_text(), expected_result - ) - - def test_configure_release_please_config(self): - expected_result = """{ - "packages": { - "packages/google-cloud-ids": { - "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": true, - "component": "google-cloud-ids", - "extra-files": [ - "google/cloud/ids/gapic_version.py", - "google/cloud/ids_v1/gapic_version.py" - ], - "release-type": "python" - } - } -}\n""" - package_dirs = configure_release_please.get_packages_with_owlbot_yaml(PACKAGES_DIR) - configure_release_please.configure_release_please_config( - package_dirs=package_dirs, root_dir=TEST_RESOURCES_DIR - ) - self.assertEqual( - (TEST_RESOURCES_DIR / "release-please-config.json").read_text(), expected_result - ) diff --git a/scripts/configure_release_please/test_resources/.release-please-manifest.json b/scripts/configure_release_please/test_resources/.release-please-manifest.json deleted file mode 100644 index 5290da775ddf..000000000000 --- a/scripts/configure_release_please/test_resources/.release-please-manifest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "packages/google-cloud-ids": "1.5.1" -} diff --git a/scripts/configure_release_please/test_resources/packages/google-cloud-ids/.OwlBot.yaml b/scripts/configure_release_please/test_resources/packages/google-cloud-ids/.OwlBot.yaml deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/scripts/configure_release_please/test_resources/packages/google-cloud-ids/google/cloud/ids/gapic_version.py b/scripts/configure_release_please/test_resources/packages/google-cloud-ids/google/cloud/ids/gapic_version.py deleted file mode 100644 index 69ff013987c9..000000000000 --- a/scripts/configure_release_please/test_resources/packages/google-cloud-ids/google/cloud/ids/gapic_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2022 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 -# -# http://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. -# -__version__ = "1.5.1" # {x-release-please-version} diff --git a/scripts/configure_release_please/test_resources/packages/google-cloud-ids/google/cloud/ids_v1/gapic_version.py b/scripts/configure_release_please/test_resources/packages/google-cloud-ids/google/cloud/ids_v1/gapic_version.py deleted file mode 100644 index 69ff013987c9..000000000000 --- a/scripts/configure_release_please/test_resources/packages/google-cloud-ids/google/cloud/ids_v1/gapic_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2022 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 -# -# http://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. -# -__version__ = "1.5.1" # {x-release-please-version} diff --git a/scripts/configure_release_please/test_resources/release-please-config.json b/scripts/configure_release_please/test_resources/release-please-config.json deleted file mode 100644 index 9a9bb2c5cb53..000000000000 --- a/scripts/configure_release_please/test_resources/release-please-config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "packages": { - "packages/google-cloud-ids": { - "bump-minor-pre-major": true, - "bump-patch-for-minor-pre-major": true, - "component": "google-cloud-ids", - "extra-files": [ - "google/cloud/ids/gapic_version.py", - "google/cloud/ids_v1/gapic_version.py" - ], - "release-type": "python" - } - } -} diff --git a/scripts/configure_state_yaml/configure_state_yaml.py b/scripts/configure_state_yaml/configure_state_yaml.py deleted file mode 100644 index 9a8b71ab4538..000000000000 --- a/scripts/configure_state_yaml/configure_state_yaml.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright 2025 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 -# -# http://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 json -from pathlib import Path -from typing import List -import yaml - -SCRIPT_DIR = Path(__file__).resolve().parent -ROOT_DIR = Path(SCRIPT_DIR / ".." / "..").resolve() -PACKAGES_DIR = ROOT_DIR / "packages" -PACKAGES_TO_ONBOARD_YAML = SCRIPT_DIR / "packages_to_onboard.yaml" -LIBRARIAN_DIR = ROOT_DIR / ".librarian" -LIBRARIAN_YAML = LIBRARIAN_DIR / "state.yaml" -RELEASE_PLEASE_MANIFEST_JSON = ROOT_DIR / ".release-please-manifest.json" -GAPIC_METADATA_JSON = "gapic_metadata.json" - - -def configure_state_yaml() -> None: - """ - This method updates the `state.yaml` file in the directory - `.librarian`. - """ - - state_dict = {} - - release_please_manifest = {} - with open(RELEASE_PLEASE_MANIFEST_JSON, "r") as release_please_manifest_json_file: - release_please_manifest = json.load(release_please_manifest_json_file) - - packages_to_onboard = {} - with open(PACKAGES_TO_ONBOARD_YAML, "r") as packages_to_onboard_yaml_file: - packages_to_onboard = yaml.safe_load(packages_to_onboard_yaml_file) - - state_dict = {} - with open(LIBRARIAN_YAML, "r") as state_yaml_file: - state_dict = yaml.safe_load(state_yaml_file) - - existing_library_ids = {library["id"] for library in state_dict.get("libraries", [])} - - for package_name in packages_to_onboard["packages_to_onboard"]: - # Check for duplication - if package_name in existing_library_ids: - print(f"Skipping package '{package_name}' as it already exists in state.yaml.") - continue - - package_path = Path(PACKAGES_DIR / package_name).resolve() - api_paths = [] - for individual_metadata_file in package_path.rglob(f"**/{GAPIC_METADATA_JSON}"): - with open(individual_metadata_file, "r") as gapic_metadata_json_file: - gapic_metadata = json.load(gapic_metadata_json_file) - api_paths.extend( - [ - { - "path": gapic_metadata["protoPackage"].replace(".", "/"), - } - ] - ) - - # Skip libraries which are not present in the release please manifest as - # these are likely libraries that have already onboarded. - if release_please_manifest.get(f"packages/{package_name}", None): - state_dict["libraries"].append( - { - "id": package_name, - "version": release_please_manifest[f"packages/{package_name}"], - "last_generated_commit": "d300b151a973ce0425ae4ad07b3de957ca31bec6", - "apis": api_paths, - "source_roots": [f"packages/{package_path.name}"], - "preserve_regex": [ - # Use the full path to avoid ambiguity with the root CHANGELOG.md - f"packages/{package_path.name}/CHANGELOG.md", - "docs/CHANGELOG.md", - "docs/README.rst", - "samples/README.txt", - "scripts/client-post-processing", - "samples/snippets/README.rst", - "tests/system", - ], - "remove_regex": [f"packages/{package_path.name}"], - "tag_format": "{id}-v{version}", - } - ) - - with open(LIBRARIAN_YAML, "w") as f: - yaml.dump(state_dict, f, sort_keys=False, indent=2) - - -if __name__ == "__main__": - configure_state_yaml() diff --git a/scripts/configure_state_yaml/packages_to_onboard.yaml b/scripts/configure_state_yaml/packages_to_onboard.yaml deleted file mode 100644 index 2ec5aa93d8d3..000000000000 --- a/scripts/configure_state_yaml/packages_to_onboard.yaml +++ /dev/null @@ -1,245 +0,0 @@ -# Copyright 2025 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 -# -# http://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. -# - -packages_to_onboard: [ - "google-ads-admanager", - "google-ads-marketingplatform-admin", - "google-ai-generativelanguage", - "google-analytics-admin", - "google-analytics-data", - "google-apps-card", - "google-apps-chat", - "google-apps-events-subscriptions", - "google-apps-meet", - "google-apps-script-type", - "google-area120-tables", - "google-cloud-access-approval", - "google-cloud-access-context-manager", - "google-cloud-advisorynotifications", - "google-cloud-alloydb", - "google-cloud-alloydb-connectors", - "google-cloud-api-gateway", - "google-cloud-api-keys", - "google-cloud-apigee-connect", - "google-cloud-apigee-registry", - "google-cloud-apihub", - "google-cloud-appengine-admin", - "google-cloud-appengine-logging", - "google-cloud-apphub", - "google-cloud-artifact-registry", - "google-cloud-asset", - "google-cloud-assured-workloads", - "google-cloud-audit-log", - "google-cloud-automl", - "google-cloud-backupdr", - "google-cloud-bare-metal-solution", - "google-cloud-batch", - "google-cloud-beyondcorp-appconnections", - "google-cloud-beyondcorp-appconnectors", - "google-cloud-beyondcorp-appgateways", - "google-cloud-beyondcorp-clientconnectorservices", - "google-cloud-beyondcorp-clientgateways", - "google-cloud-biglake", - "google-cloud-bigquery-analyticshub", - "google-cloud-bigquery-biglake", - "google-cloud-bigquery-connection", - "google-cloud-bigquery-data-exchange", - "google-cloud-bigquery-datapolicies", - "google-cloud-bigquery-datatransfer", - "google-cloud-bigquery-logging", - "google-cloud-bigquery-migration", - "google-cloud-bigquery-reservation", - "google-cloud-billing", - "google-cloud-billing-budgets", - "google-cloud-binary-authorization", - "google-cloud-build", - "google-cloud-capacityplanner", - "google-cloud-certificate-manager", - "google-cloud-channel", - "google-cloud-chronicle", - "google-cloud-cloudcontrolspartner", - "google-cloud-cloudsecuritycompliance", - "google-cloud-commerce-consumer-procurement", - "google-cloud-common", - "google-cloud-compute", - "google-cloud-compute-v1beta", - "google-cloud-confidentialcomputing", - "google-cloud-config", - "google-cloud-configdelivery", - "google-cloud-contact-center-insights", - "google-cloud-container", - "google-cloud-containeranalysis", - "google-cloud-contentwarehouse", - "google-cloud-data-fusion", - "google-cloud-data-qna", - "google-cloud-datacatalog", - "google-cloud-datacatalog-lineage", - "google-cloud-dataflow-client", - "google-cloud-dataform", - "google-cloud-datalabeling", - "google-cloud-dataplex", - "google-cloud-dataproc", - "google-cloud-dataproc-metastore", - "google-cloud-datastream", - "google-cloud-deploy", - "google-cloud-developerconnect", - "google-cloud-devicestreaming", - "google-cloud-dialogflow", - "google-cloud-dialogflow-cx", - "google-cloud-discoveryengine", - "google-cloud-dlp", - "google-cloud-dms", - "google-cloud-documentai", - "google-cloud-domains", - "google-cloud-edgecontainer", - "google-cloud-edgenetwork", - "google-cloud-enterpriseknowledgegraph", - "google-cloud-essential-contacts", - "google-cloud-eventarc", - "google-cloud-eventarc-publishing", - "google-cloud-filestore", - "google-cloud-financialservices", - "google-cloud-functions", - "google-cloud-gdchardwaremanagement", - "google-cloud-geminidataanalytics", - "google-cloud-gke-backup", - "google-cloud-gke-connect-gateway", - "google-cloud-gke-hub", - "google-cloud-gke-multicloud", - "google-cloud-gsuiteaddons", - "google-cloud-iam", - "google-cloud-iam-logging", - "google-cloud-iap", - "google-cloud-ids", - "google-cloud-kms", - "google-cloud-kms-inventory", - "google-cloud-language", - "google-cloud-licensemanager", - "google-cloud-life-sciences", - "google-cloud-locationfinder", - "google-cloud-lustre", - "google-cloud-maintenance-api", - "google-cloud-managed-identities", - "google-cloud-managedkafka", - "google-cloud-managedkafka-schemaregistry", - "google-cloud-media-translation", - "google-cloud-memcache", - "google-cloud-memorystore", - "google-cloud-migrationcenter", - "google-cloud-modelarmor", - "google-cloud-monitoring", - "google-cloud-monitoring-dashboards", - "google-cloud-monitoring-metrics-scopes", - "google-cloud-netapp", - "google-cloud-network-connectivity", - "google-cloud-network-management", - "google-cloud-network-security", - "google-cloud-network-services", - "google-cloud-notebooks", - "google-cloud-optimization", - "google-cloud-oracledatabase", - "google-cloud-orchestration-airflow", - "google-cloud-org-policy", - "google-cloud-os-config", - "google-cloud-os-login", - "google-cloud-parallelstore", - "google-cloud-parametermanager", - "google-cloud-phishing-protection", - "google-cloud-policy-troubleshooter", - "google-cloud-policysimulator", - "google-cloud-policytroubleshooter-iam", - "google-cloud-private-ca", - "google-cloud-private-catalog", - "google-cloud-privilegedaccessmanager", - "google-cloud-quotas", - "google-cloud-rapidmigrationassessment", - "google-cloud-recaptcha-enterprise", - "google-cloud-recommendations-ai", - "google-cloud-recommender", - "google-cloud-redis", - "google-cloud-redis-cluster", - "google-cloud-resource-manager", - "google-cloud-retail", - "google-cloud-run", - "google-cloud-saasplatform-saasservicemgmt", - "google-cloud-scheduler", - "google-cloud-securesourcemanager", - "google-cloud-security-publicca", - "google-cloud-securitycenter", - "google-cloud-securitycentermanagement", - "google-cloud-service-control", - "google-cloud-service-directory", - "google-cloud-secret-manager", - "google-cloud-service-management", - "google-cloud-service-usage", - "google-cloud-servicehealth", - "google-cloud-shell", - "google-cloud-source-context", - "google-cloud-speech", - "google-cloud-storage-control", - "google-cloud-storage-transfer", - "google-cloud-storagebatchoperations", - "google-cloud-storageinsights", - "google-cloud-support", - "google-cloud-talent", - "google-cloud-tasks", - "google-cloud-telcoautomation", - "google-cloud-texttospeech", - "google-cloud-tpu", - "google-cloud-trace", - "google-cloud-translate", - "google-cloud-video-stitcher", - "google-cloud-video-transcoder", - "google-cloud-video-live-stream", - "google-cloud-videointelligence", - "google-cloud-vision", - "google-cloud-visionai", - "google-cloud-vm-migration", - "google-cloud-vmwareengine", - "google-cloud-vpc-access", - "google-cloud-webrisk", - "google-cloud-websecurityscanner", - "google-cloud-workflows", - "google-cloud-workstations", - "google-geo-type", - "google-maps-addressvalidation", - "google-maps-areainsights", - "google-maps-fleetengine", - "google-maps-fleetengine-delivery", - "google-maps-mapsplatformdatasets", - "google-maps-places", - "google-maps-routeoptimization", - "google-maps-routing", - "google-maps-solar", - "google-shopping-css", - "google-shopping-merchant-accounts", - "google-shopping-merchant-conversions", - "google-shopping-merchant-datasources", - "google-shopping-merchant-inventories", - "google-shopping-merchant-issueresolution", - "google-shopping-merchant-lfp", - "google-shopping-merchant-notifications", - "google-shopping-merchant-ordertracking", - "google-shopping-merchant-products", - "google-shopping-merchant-productstudio", - "google-shopping-merchant-promotions", - "google-shopping-merchant-quota", - "google-shopping-merchant-reports", - "google-shopping-merchant-reviews", - "google-shopping-type", - "googleapis-common-protos", - "grafeas", - "grpc-google-iam-v1", -]