From 32708885b1bf588a44dbd2d33dd789ca678fb6fc Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Wed, 7 Aug 2024 11:41:24 -0400 Subject: [PATCH 1/4] feat(apihub): generate library --- external/googleapis/update_libraries.sh | 1 + generator/generator_config.textproto | 43 +++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/external/googleapis/update_libraries.sh b/external/googleapis/update_libraries.sh index 916b01273d575..b5cad20264a1d 100755 --- a/external/googleapis/update_libraries.sh +++ b/external/googleapis/update_libraries.sh @@ -35,6 +35,7 @@ declare -A -r LIBRARIES=( ["alloydb"]="@com_google_googleapis//google/cloud/alloydb/v1:alloydb_cc_grpc" ["apigateway"]="@com_google_googleapis//google/cloud/apigateway/v1:apigateway_cc_grpc" ["apigeeconnect"]="@com_google_googleapis//google/cloud/apigeeconnect/v1:apigeeconnect_cc_grpc" + ["apihub"]="@com_google_googleapis//google/cloud/apihub/v1:apihub_cc_grpc" ["apikeys"]="@com_google_googleapis//google/api/apikeys/v2:apikeys_cc_grpc" ["appengine"]="$( printf ",%s" \ diff --git a/generator/generator_config.textproto b/generator/generator_config.textproto index 211159029ae4a..95310a55f391c 100644 --- a/generator/generator_config.textproto +++ b/generator/generator_config.textproto @@ -278,6 +278,49 @@ service { retryable_status_codes: ["kUnavailable", "kUnknown"] } +# API Hub +service { + service_proto_path: "google/cloud/apihub/v1/apihub_service.proto" + product_path: "google/cloud/apihub/v1" + initial_copyright_year: "2024" + retryable_status_codes: ["kUnavailable"] +} + +service { + service_proto_path: "google/cloud/apihub/v1/host_project_registration_service.proto" + product_path: "google/cloud/apihub/v1" + initial_copyright_year: "2024" + retryable_status_codes: ["kUnavailable"] +} + +service { + service_proto_path: "google/cloud/apihub/v1/linting_service.proto" + product_path: "google/cloud/apihub/v1" + initial_copyright_year: "2024" + retryable_status_codes: ["kUnavailable"] +} + +service { + service_proto_path: "google/cloud/apihub/v1/plugin_service.proto" + product_path: "google/cloud/apihub/v1" + initial_copyright_year: "2024" + retryable_status_codes: ["kUnavailable"] +} + +service { + service_proto_path: "google/cloud/apihub/v1/provisioning_service.proto" + product_path: "google/cloud/apihub/v1" + initial_copyright_year: "2024" + retryable_status_codes: ["kUnavailable"] +} + +service { + service_proto_path: "google/cloud/apihub/v1/runtime_project_attachment_service.proto" + product_path: "google/cloud/apihub/v1" + initial_copyright_year: "2024" + retryable_status_codes: ["kUnavailable"] +} + # API Keys service { service_proto_path: "google/api/apikeys/v2/apikeys.proto" From 127fb6f60d43127ccb8fc873e9a30aa3c332cd16 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Wed, 7 Aug 2024 11:47:05 -0400 Subject: [PATCH 2/4] Run generators and format their outputs --- README.md | 3 + ci/etc/expected_install_directories | 6 + external/googleapis/protodeps/apihub.deps | 8 + external/googleapis/protolists/apihub.list | 7 + google/cloud/apihub/BUILD.bazel | 31 + google/cloud/apihub/CMakeLists.txt | 34 + google/cloud/apihub/README.md | 60 + .../apihub/doc/environment-variables.dox | 74 + google/cloud/apihub/doc/main.dox | 58 + google/cloud/apihub/doc/options.dox | 10 + .../apihub/doc/override-authentication.dox | 81 + google/cloud/apihub/doc/override-endpoint.dox | 71 + .../apihub/doc/override-retry-policies.dox | 186 ++ google/cloud/apihub/quickstart/.bazelrc | 30 + google/cloud/apihub/quickstart/BUILD.bazel | 25 + google/cloud/apihub/quickstart/CMakeLists.txt | 32 + google/cloud/apihub/quickstart/Makefile | 35 + google/cloud/apihub/quickstart/README.md | 154 + .../cloud/apihub/quickstart/WORKSPACE.bazel | 53 + google/cloud/apihub/quickstart/quickstart.cc | 42 + google/cloud/apihub/v1/.repo-metadata.json | 14 + google/cloud/apihub/v1/api_hub_client.cc | 584 ++++ google/cloud/apihub/v1/api_hub_client.h | 2707 +++++++++++++++++ google/cloud/apihub/v1/api_hub_connection.cc | 263 ++ google/cloud/apihub/v1/api_hub_connection.h | 316 ++ .../api_hub_connection_idempotency_policy.cc | 220 ++ .../api_hub_connection_idempotency_policy.h | 153 + .../apihub/v1/api_hub_dependencies_client.cc | 125 + .../apihub/v1/api_hub_dependencies_client.h | 432 +++ .../v1/api_hub_dependencies_connection.cc | 92 + .../v1/api_hub_dependencies_connection.h | 235 ++ ...endencies_connection_idempotency_policy.cc | 70 + ...pendencies_connection_idempotency_policy.h | 64 + .../apihub/v1/api_hub_dependencies_options.h | 76 + google/cloud/apihub/v1/api_hub_options.h | 75 + .../cloud/apihub/v1/api_hub_plugin_client.cc | 82 + .../cloud/apihub/v1/api_hub_plugin_client.h | 273 ++ .../apihub/v1/api_hub_plugin_connection.cc | 76 + .../apihub/v1/api_hub_plugin_connection.h | 223 ++ ...ub_plugin_connection_idempotency_policy.cc | 60 + ...hub_plugin_connection_idempotency_policy.h | 58 + .../cloud/apihub/v1/api_hub_plugin_options.h | 75 + .../v1/host_project_registration_client.cc | 97 + .../v1/host_project_registration_client.h | 314 ++ .../host_project_registration_connection.cc | 84 + .../v1/host_project_registration_connection.h | 249 ++ ...istration_connection_idempotency_policy.cc | 67 + ...gistration_connection_idempotency_policy.h | 61 + .../v1/host_project_registration_options.h | 77 + .../v1/internal/api_hub_auth_decorator.cc | 323 ++ .../v1/internal/api_hub_auth_decorator.h | 206 ++ .../v1/internal/api_hub_connection_impl.cc | 700 +++++ .../v1/internal/api_hub_connection_impl.h | 177 ++ .../api_hub_dependencies_auth_decorator.cc | 81 + .../api_hub_dependencies_auth_decorator.h | 75 + .../api_hub_dependencies_connection_impl.cc | 158 + .../api_hub_dependencies_connection_impl.h | 81 + .../api_hub_dependencies_logging_decorator.cc | 104 + .../api_hub_dependencies_logging_decorator.h | 75 + ...api_hub_dependencies_metadata_decorator.cc | 108 + .../api_hub_dependencies_metadata_decorator.h | 81 + .../api_hub_dependencies_option_defaults.cc | 67 + .../api_hub_dependencies_option_defaults.h | 37 + .../api_hub_dependencies_retry_traits.h | 43 + .../internal/api_hub_dependencies_sources.cc | 32 + .../v1/internal/api_hub_dependencies_stub.cc | 95 + .../v1/internal/api_hub_dependencies_stub.h | 102 + .../api_hub_dependencies_stub_factory.cc | 72 + .../api_hub_dependencies_stub_factory.h | 42 + ...api_hub_dependencies_tracing_connection.cc | 99 + .../api_hub_dependencies_tracing_connection.h | 82 + .../api_hub_dependencies_tracing_stub.cc | 108 + .../api_hub_dependencies_tracing_stub.h | 88 + .../v1/internal/api_hub_logging_decorator.cc | 444 +++ .../v1/internal/api_hub_logging_decorator.h | 206 ++ .../v1/internal/api_hub_metadata_decorator.cc | 363 +++ .../v1/internal/api_hub_metadata_decorator.h | 211 ++ .../v1/internal/api_hub_option_defaults.cc | 64 + .../v1/internal/api_hub_option_defaults.h | 37 + .../internal/api_hub_plugin_auth_decorator.cc | 61 + .../internal/api_hub_plugin_auth_decorator.h | 63 + .../api_hub_plugin_connection_impl.cc | 105 + .../internal/api_hub_plugin_connection_impl.h | 70 + .../api_hub_plugin_logging_decorator.cc | 74 + .../api_hub_plugin_logging_decorator.h | 63 + .../api_hub_plugin_metadata_decorator.cc | 87 + .../api_hub_plugin_metadata_decorator.h | 68 + .../api_hub_plugin_option_defaults.cc | 65 + .../internal/api_hub_plugin_option_defaults.h | 37 + .../v1/internal/api_hub_plugin_retry_traits.h | 43 + .../v1/internal/api_hub_plugin_sources.cc | 32 + .../apihub/v1/internal/api_hub_plugin_stub.cc | 71 + .../apihub/v1/internal/api_hub_plugin_stub.h | 80 + .../internal/api_hub_plugin_stub_factory.cc | 70 + .../v1/internal/api_hub_plugin_stub_factory.h | 42 + .../api_hub_plugin_tracing_connection.cc | 78 + .../api_hub_plugin_tracing_connection.h | 72 + .../internal/api_hub_plugin_tracing_stub.cc | 84 + .../v1/internal/api_hub_plugin_tracing_stub.h | 75 + .../apihub/v1/internal/api_hub_retry_traits.h | 43 + .../apihub/v1/internal/api_hub_sources.cc | 32 + .../cloud/apihub/v1/internal/api_hub_stub.cc | 440 +++ .../cloud/apihub/v1/internal/api_hub_stub.h | 356 +++ .../v1/internal/api_hub_stub_factory.cc | 69 + .../apihub/v1/internal/api_hub_stub_factory.h | 42 + .../v1/internal/api_hub_tracing_connection.cc | 348 +++ .../v1/internal/api_hub_tracing_connection.h | 178 ++ .../v1/internal/api_hub_tracing_stub.cc | 451 +++ .../apihub/v1/internal/api_hub_tracing_stub.h | 218 ++ ...ost_project_registration_auth_decorator.cc | 67 + ...host_project_registration_auth_decorator.h | 70 + ...st_project_registration_connection_impl.cc | 146 + ...ost_project_registration_connection_impl.h | 79 + ..._project_registration_logging_decorator.cc | 85 + ...t_project_registration_logging_decorator.h | 70 + ...project_registration_metadata_decorator.cc | 93 + ..._project_registration_metadata_decorator.h | 76 + ...st_project_registration_option_defaults.cc | 74 + ...ost_project_registration_option_defaults.h | 37 + .../host_project_registration_retry_traits.h | 43 + .../host_project_registration_sources.cc | 32 + .../host_project_registration_stub.cc | 79 + .../internal/host_project_registration_stub.h | 96 + .../host_project_registration_stub_factory.cc | 74 + .../host_project_registration_stub_factory.h | 43 + ...project_registration_tracing_connection.cc | 91 + ..._project_registration_tracing_connection.h | 80 + .../host_project_registration_tracing_stub.cc | 97 + .../host_project_registration_tracing_stub.h | 84 + .../v1/internal/linting_auth_decorator.cc | 72 + .../v1/internal/linting_auth_decorator.h | 69 + .../v1/internal/linting_connection_impl.cc | 121 + .../v1/internal/linting_connection_impl.h | 76 + .../v1/internal/linting_logging_decorator.cc | 90 + .../v1/internal/linting_logging_decorator.h | 69 + .../v1/internal/linting_metadata_decorator.cc | 99 + .../v1/internal/linting_metadata_decorator.h | 74 + .../v1/internal/linting_option_defaults.cc | 66 + .../v1/internal/linting_option_defaults.h | 37 + .../apihub/v1/internal/linting_retry_traits.h | 43 + .../apihub/v1/internal/linting_sources.cc | 32 + .../cloud/apihub/v1/internal/linting_stub.cc | 83 + .../cloud/apihub/v1/internal/linting_stub.h | 92 + .../v1/internal/linting_stub_factory.cc | 71 + .../apihub/v1/internal/linting_stub_factory.h | 42 + .../v1/internal/linting_tracing_connection.cc | 86 + .../v1/internal/linting_tracing_connection.h | 78 + .../v1/internal/linting_tracing_stub.cc | 96 + .../apihub/v1/internal/linting_tracing_stub.h | 81 + .../internal/provisioning_auth_decorator.cc | 119 + .../v1/internal/provisioning_auth_decorator.h | 87 + .../internal/provisioning_connection_impl.cc | 191 ++ .../internal/provisioning_connection_impl.h | 87 + .../provisioning_logging_decorator.cc | 134 + .../internal/provisioning_logging_decorator.h | 87 + .../provisioning_metadata_decorator.cc | 125 + .../provisioning_metadata_decorator.h | 92 + .../internal/provisioning_option_defaults.cc | 75 + .../internal/provisioning_option_defaults.h | 37 + .../v1/internal/provisioning_retry_traits.h | 43 + .../v1/internal/provisioning_sources.cc | 32 + .../apihub/v1/internal/provisioning_stub.cc | 130 + .../apihub/v1/internal/provisioning_stub.h | 132 + .../v1/internal/provisioning_stub_factory.cc | 72 + .../v1/internal/provisioning_stub_factory.h | 42 + .../provisioning_tracing_connection.cc | 100 + .../provisioning_tracing_connection.h | 86 + .../v1/internal/provisioning_tracing_stub.cc | 128 + .../v1/internal/provisioning_tracing_stub.h | 98 + ...ntime_project_attachment_auth_decorator.cc | 86 + ...untime_project_attachment_auth_decorator.h | 81 + ...time_project_attachment_connection_impl.cc | 178 ++ ...ntime_project_attachment_connection_impl.h | 89 + ...me_project_attachment_logging_decorator.cc | 115 + ...ime_project_attachment_logging_decorator.h | 81 + ...e_project_attachment_metadata_decorator.cc | 113 + ...me_project_attachment_metadata_decorator.h | 87 + ...time_project_attachment_option_defaults.cc | 74 + ...ntime_project_attachment_option_defaults.h | 37 + .../runtime_project_attachment_retry_traits.h | 43 + .../runtime_project_attachment_sources.cc | 32 + .../runtime_project_attachment_stub.cc | 107 + .../runtime_project_attachment_stub.h | 119 + ...runtime_project_attachment_stub_factory.cc | 74 + .../runtime_project_attachment_stub_factory.h | 43 + ...e_project_attachment_tracing_connection.cc | 118 + ...me_project_attachment_tracing_connection.h | 89 + ...runtime_project_attachment_tracing_stub.cc | 127 + .../runtime_project_attachment_tracing_stub.h | 95 + google/cloud/apihub/v1/linting_client.cc | 96 + google/cloud/apihub/v1/linting_client.h | 302 ++ google/cloud/apihub/v1/linting_connection.cc | 83 + google/cloud/apihub/v1/linting_connection.h | 227 ++ .../linting_connection_idempotency_policy.cc | 65 + .../linting_connection_idempotency_policy.h | 61 + google/cloud/apihub/v1/linting_options.h | 76 + .../apihub/v1/mocks/mock_api_hub_connection.h | 210 ++ .../mock_api_hub_dependencies_connection.h | 80 + .../v1/mocks/mock_api_hub_plugin_connection.h | 67 + ...ock_host_project_registration_connection.h | 76 + .../apihub/v1/mocks/mock_linting_connection.h | 75 + .../v1/mocks/mock_provisioning_connection.h | 105 + ...ck_runtime_project_attachment_connection.h | 91 + google/cloud/apihub/v1/provisioning_client.cc | 121 + google/cloud/apihub/v1/provisioning_client.h | 349 +++ .../apihub/v1/provisioning_connection.cc | 94 + .../cloud/apihub/v1/provisioning_connection.h | 236 ++ ...visioning_connection_idempotency_policy.cc | 60 + ...ovisioning_connection_idempotency_policy.h | 58 + google/cloud/apihub/v1/provisioning_options.h | 86 + .../v1/runtime_project_attachment_client.cc | 132 + .../v1/runtime_project_attachment_client.h | 424 +++ .../runtime_project_attachment_connection.cc | 96 + .../runtime_project_attachment_connection.h | 260 ++ ...ttachment_connection_idempotency_policy.cc | 81 + ...attachment_connection_idempotency_policy.h | 69 + .../v1/runtime_project_attachment_options.h | 77 + .../v1/samples/api_hub_client_samples.cc | 153 + .../api_hub_dependencies_client_samples.cc | 158 + .../samples/api_hub_plugin_client_samples.cc | 156 + ...ost_project_registration_client_samples.cc | 167 + .../v1/samples/linting_client_samples.cc | 156 + .../v1/samples/provisioning_client_samples.cc | 200 ++ ...ntime_project_attachment_client_samples.cc | 168 + 224 files changed, 27693 insertions(+) create mode 100644 external/googleapis/protodeps/apihub.deps create mode 100644 external/googleapis/protolists/apihub.list create mode 100644 google/cloud/apihub/BUILD.bazel create mode 100644 google/cloud/apihub/CMakeLists.txt create mode 100644 google/cloud/apihub/README.md create mode 100644 google/cloud/apihub/doc/environment-variables.dox create mode 100644 google/cloud/apihub/doc/main.dox create mode 100644 google/cloud/apihub/doc/options.dox create mode 100644 google/cloud/apihub/doc/override-authentication.dox create mode 100644 google/cloud/apihub/doc/override-endpoint.dox create mode 100644 google/cloud/apihub/doc/override-retry-policies.dox create mode 100644 google/cloud/apihub/quickstart/.bazelrc create mode 100644 google/cloud/apihub/quickstart/BUILD.bazel create mode 100644 google/cloud/apihub/quickstart/CMakeLists.txt create mode 100644 google/cloud/apihub/quickstart/Makefile create mode 100644 google/cloud/apihub/quickstart/README.md create mode 100644 google/cloud/apihub/quickstart/WORKSPACE.bazel create mode 100644 google/cloud/apihub/quickstart/quickstart.cc create mode 100644 google/cloud/apihub/v1/.repo-metadata.json create mode 100644 google/cloud/apihub/v1/api_hub_client.cc create mode 100644 google/cloud/apihub/v1/api_hub_client.h create mode 100644 google/cloud/apihub/v1/api_hub_connection.cc create mode 100644 google/cloud/apihub/v1/api_hub_connection.h create mode 100644 google/cloud/apihub/v1/api_hub_connection_idempotency_policy.cc create mode 100644 google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h create mode 100644 google/cloud/apihub/v1/api_hub_dependencies_client.cc create mode 100644 google/cloud/apihub/v1/api_hub_dependencies_client.h create mode 100644 google/cloud/apihub/v1/api_hub_dependencies_connection.cc create mode 100644 google/cloud/apihub/v1/api_hub_dependencies_connection.h create mode 100644 google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.cc create mode 100644 google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h create mode 100644 google/cloud/apihub/v1/api_hub_dependencies_options.h create mode 100644 google/cloud/apihub/v1/api_hub_options.h create mode 100644 google/cloud/apihub/v1/api_hub_plugin_client.cc create mode 100644 google/cloud/apihub/v1/api_hub_plugin_client.h create mode 100644 google/cloud/apihub/v1/api_hub_plugin_connection.cc create mode 100644 google/cloud/apihub/v1/api_hub_plugin_connection.h create mode 100644 google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.cc create mode 100644 google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h create mode 100644 google/cloud/apihub/v1/api_hub_plugin_options.h create mode 100644 google/cloud/apihub/v1/host_project_registration_client.cc create mode 100644 google/cloud/apihub/v1/host_project_registration_client.h create mode 100644 google/cloud/apihub/v1/host_project_registration_connection.cc create mode 100644 google/cloud/apihub/v1/host_project_registration_connection.h create mode 100644 google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.cc create mode 100644 google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h create mode 100644 google/cloud/apihub/v1/host_project_registration_options.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_auth_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_auth_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_connection_impl.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_connection_impl.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_retry_traits.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_sources.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_stub.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_logging_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_logging_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_metadata_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_metadata_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_option_defaults.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_option_defaults.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_retry_traits.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_sources.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_stub.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_stub.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_retry_traits.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_sources.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_stub.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_stub.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_stub_factory.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_stub_factory.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_tracing_connection.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_tracing_connection.h create mode 100644 google/cloud/apihub/v1/internal/api_hub_tracing_stub.cc create mode 100644 google/cloud/apihub/v1/internal/api_hub_tracing_stub.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_connection_impl.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_connection_impl.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_option_defaults.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_option_defaults.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_retry_traits.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_sources.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_stub.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_stub.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_stub_factory.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_stub_factory.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.h create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.cc create mode 100644 google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.h create mode 100644 google/cloud/apihub/v1/internal/linting_auth_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/linting_auth_decorator.h create mode 100644 google/cloud/apihub/v1/internal/linting_connection_impl.cc create mode 100644 google/cloud/apihub/v1/internal/linting_connection_impl.h create mode 100644 google/cloud/apihub/v1/internal/linting_logging_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/linting_logging_decorator.h create mode 100644 google/cloud/apihub/v1/internal/linting_metadata_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/linting_metadata_decorator.h create mode 100644 google/cloud/apihub/v1/internal/linting_option_defaults.cc create mode 100644 google/cloud/apihub/v1/internal/linting_option_defaults.h create mode 100644 google/cloud/apihub/v1/internal/linting_retry_traits.h create mode 100644 google/cloud/apihub/v1/internal/linting_sources.cc create mode 100644 google/cloud/apihub/v1/internal/linting_stub.cc create mode 100644 google/cloud/apihub/v1/internal/linting_stub.h create mode 100644 google/cloud/apihub/v1/internal/linting_stub_factory.cc create mode 100644 google/cloud/apihub/v1/internal/linting_stub_factory.h create mode 100644 google/cloud/apihub/v1/internal/linting_tracing_connection.cc create mode 100644 google/cloud/apihub/v1/internal/linting_tracing_connection.h create mode 100644 google/cloud/apihub/v1/internal/linting_tracing_stub.cc create mode 100644 google/cloud/apihub/v1/internal/linting_tracing_stub.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_auth_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_auth_decorator.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_connection_impl.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_connection_impl.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_logging_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_logging_decorator.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_metadata_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_metadata_decorator.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_option_defaults.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_option_defaults.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_retry_traits.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_sources.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_stub.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_stub.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_stub_factory.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_stub_factory.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_tracing_connection.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_tracing_connection.h create mode 100644 google/cloud/apihub/v1/internal/provisioning_tracing_stub.cc create mode 100644 google/cloud/apihub/v1/internal/provisioning_tracing_stub.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_retry_traits.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_sources.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_stub.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.h create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.cc create mode 100644 google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.h create mode 100644 google/cloud/apihub/v1/linting_client.cc create mode 100644 google/cloud/apihub/v1/linting_client.h create mode 100644 google/cloud/apihub/v1/linting_connection.cc create mode 100644 google/cloud/apihub/v1/linting_connection.h create mode 100644 google/cloud/apihub/v1/linting_connection_idempotency_policy.cc create mode 100644 google/cloud/apihub/v1/linting_connection_idempotency_policy.h create mode 100644 google/cloud/apihub/v1/linting_options.h create mode 100644 google/cloud/apihub/v1/mocks/mock_api_hub_connection.h create mode 100644 google/cloud/apihub/v1/mocks/mock_api_hub_dependencies_connection.h create mode 100644 google/cloud/apihub/v1/mocks/mock_api_hub_plugin_connection.h create mode 100644 google/cloud/apihub/v1/mocks/mock_host_project_registration_connection.h create mode 100644 google/cloud/apihub/v1/mocks/mock_linting_connection.h create mode 100644 google/cloud/apihub/v1/mocks/mock_provisioning_connection.h create mode 100644 google/cloud/apihub/v1/mocks/mock_runtime_project_attachment_connection.h create mode 100644 google/cloud/apihub/v1/provisioning_client.cc create mode 100644 google/cloud/apihub/v1/provisioning_client.h create mode 100644 google/cloud/apihub/v1/provisioning_connection.cc create mode 100644 google/cloud/apihub/v1/provisioning_connection.h create mode 100644 google/cloud/apihub/v1/provisioning_connection_idempotency_policy.cc create mode 100644 google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h create mode 100644 google/cloud/apihub/v1/provisioning_options.h create mode 100644 google/cloud/apihub/v1/runtime_project_attachment_client.cc create mode 100644 google/cloud/apihub/v1/runtime_project_attachment_client.h create mode 100644 google/cloud/apihub/v1/runtime_project_attachment_connection.cc create mode 100644 google/cloud/apihub/v1/runtime_project_attachment_connection.h create mode 100644 google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.cc create mode 100644 google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h create mode 100644 google/cloud/apihub/v1/runtime_project_attachment_options.h create mode 100644 google/cloud/apihub/v1/samples/api_hub_client_samples.cc create mode 100644 google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc create mode 100644 google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc create mode 100644 google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc create mode 100644 google/cloud/apihub/v1/samples/linting_client_samples.cc create mode 100644 google/cloud/apihub/v1/samples/provisioning_client_samples.cc create mode 100644 google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc diff --git a/README.md b/README.md index dc7ec8066eb2c..3e625b0f1f110 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,9 @@ See each library's `README.md` file for more information about: - [Apigee Connect API](google/cloud/apigeeconnect/README.md) [\[quickstart\]](google/cloud/apigeeconnect/quickstart/README.md) [\[reference\]](https://cloud.google.com/cpp/docs/reference/apigeeconnect/latest) +- [API hub API](google/cloud/apihub/README.md) + [\[quickstart\]](google/cloud/apihub/quickstart/README.md) + [\[reference\]](https://cloud.google.com/cpp/docs/reference/apihub/latest) - [API Keys API](google/cloud/apikeys/README.md) [\[quickstart\]](google/cloud/apikeys/quickstart/README.md) [\[reference\]](https://cloud.google.com/cpp/docs/reference/apikeys/latest) diff --git a/ci/etc/expected_install_directories b/ci/etc/expected_install_directories index cc150fa8a603e..295dafff3c03e 100644 --- a/ci/etc/expected_install_directories +++ b/ci/etc/expected_install_directories @@ -52,6 +52,10 @@ ./include/google/cloud/apigeeconnect/v1 ./include/google/cloud/apigeeconnect/v1/internal ./include/google/cloud/apigeeconnect/v1/mocks +./include/google/cloud/apihub +./include/google/cloud/apihub/v1 +./include/google/cloud/apihub/v1/internal +./include/google/cloud/apihub/v1/mocks ./include/google/cloud/apikeys ./include/google/cloud/apikeys/mocks ./include/google/cloud/apikeys/v2 @@ -1261,6 +1265,8 @@ ./lib64/cmake/google_cloud_cpp_apigateway_mocks ./lib64/cmake/google_cloud_cpp_apigeeconnect ./lib64/cmake/google_cloud_cpp_apigeeconnect_mocks +./lib64/cmake/google_cloud_cpp_apihub +./lib64/cmake/google_cloud_cpp_apihub_mocks ./lib64/cmake/google_cloud_cpp_apikeys ./lib64/cmake/google_cloud_cpp_apikeys_mocks ./lib64/cmake/google_cloud_cpp_appengine diff --git a/external/googleapis/protodeps/apihub.deps b/external/googleapis/protodeps/apihub.deps new file mode 100644 index 0000000000000..6ef8f9ccdeb73 --- /dev/null +++ b/external/googleapis/protodeps/apihub.deps @@ -0,0 +1,8 @@ +@com_google_googleapis//google/api:annotations_proto +@com_google_googleapis//google/api:client_proto +@com_google_googleapis//google/api:field_behavior_proto +@com_google_googleapis//google/api:http_proto +@com_google_googleapis//google/api:launch_stage_proto +@com_google_googleapis//google/api:resource_proto +@com_google_googleapis//google/longrunning:operations_proto +@com_google_googleapis//google/rpc:status_proto diff --git a/external/googleapis/protolists/apihub.list b/external/googleapis/protolists/apihub.list new file mode 100644 index 0000000000000..a06e860c62dd9 --- /dev/null +++ b/external/googleapis/protolists/apihub.list @@ -0,0 +1,7 @@ +@com_google_googleapis//google/cloud/apihub/v1:apihub_service.proto +@com_google_googleapis//google/cloud/apihub/v1:common_fields.proto +@com_google_googleapis//google/cloud/apihub/v1:host_project_registration_service.proto +@com_google_googleapis//google/cloud/apihub/v1:linting_service.proto +@com_google_googleapis//google/cloud/apihub/v1:plugin_service.proto +@com_google_googleapis//google/cloud/apihub/v1:provisioning_service.proto +@com_google_googleapis//google/cloud/apihub/v1:runtime_project_attachment_service.proto diff --git a/google/cloud/apihub/BUILD.bazel b/google/cloud/apihub/BUILD.bazel new file mode 100644 index 0000000000000..b7cd97271495c --- /dev/null +++ b/google/cloud/apihub/BUILD.bazel @@ -0,0 +1,31 @@ +# Copyright 2024 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. + +load("//bazel:gapic.bzl", "cc_gapic_library") + +package(default_visibility = ["//visibility:private"]) + +licenses(["notice"]) # Apache 2.0 + +service_dirs = ["v1/"] + +googleapis_deps = [ + "@com_google_googleapis//google/cloud/apihub/v1:apihub_cc_grpc", +] + +cc_gapic_library( + name = "apihub", + googleapis_deps = googleapis_deps, + service_dirs = service_dirs, +) diff --git a/google/cloud/apihub/CMakeLists.txt b/google/cloud/apihub/CMakeLists.txt new file mode 100644 index 0000000000000..63f1fb785ed34 --- /dev/null +++ b/google/cloud/apihub/CMakeLists.txt @@ -0,0 +1,34 @@ +# ~~~ +# Copyright 2024 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. +# ~~~ + +include(GoogleCloudCppLibrary) + +google_cloud_cpp_add_gapic_library(apihub "API hub API" SERVICE_DIRS "v1/") + +if (BUILD_TESTING AND GOOGLE_CLOUD_CPP_ENABLE_CXX_EXCEPTIONS) + add_executable(apihub_quickstart "quickstart/quickstart.cc") + target_link_libraries(apihub_quickstart PRIVATE google-cloud-cpp::apihub) + google_cloud_cpp_add_common_options(apihub_quickstart) + add_test( + NAME apihub_quickstart + COMMAND + cmake -P "${PROJECT_SOURCE_DIR}/cmake/quickstart-runner.cmake" + $ GOOGLE_CLOUD_PROJECT + GOOGLE_CLOUD_CPP_TEST_REGION # EDIT HERE + ) + set_tests_properties(apihub_quickstart + PROPERTIES LABELS "integration-test;quickstart") +endif () diff --git a/google/cloud/apihub/README.md b/google/cloud/apihub/README.md new file mode 100644 index 0000000000000..d9010cae8ca0c --- /dev/null +++ b/google/cloud/apihub/README.md @@ -0,0 +1,60 @@ +# API hub API C++ Client Library + +This directory contains an idiomatic C++ client library for the +[API hub API][cloud-service-docs]. + +\ + +While this library is **GA**, please note that the Google Cloud C++ client +libraries do **not** follow [Semantic Versioning](https://semver.org/). + +## Quickstart + +The [quickstart/](quickstart/README.md) directory contains a minimal environment +to get started using this client library in a larger project. The following +"Hello World" program is used in this quickstart, and should give you a taste of +this library. + + + +```cc +#include "google/cloud/apihub/v1/ EDIT HERE _client.h" +#include "google/cloud/location.h" +#include + +int main(int argc, char* argv[]) try { + if (argc != 3) { + std::cerr << "Usage: " << argv[0] << " project-id location-id\n"; + return 1; + } + + auto const location = google::cloud::Location(argv[1], argv[2]); + + namespace apihub = ::google::cloud::apihub_v1; + auto client = + apihub::ServiceClient(apihub::MakeServiceConnection()); // EDIT HERE + + for (auto r : client.List /*EDIT HERE*/ (location.FullName())) { + if (!r) throw std::move(r).status(); + std::cout << r->DebugString() << "\n"; + } + + return 0; +} catch (google::cloud::Status const& status) { + std::cerr << "google::cloud::Status thrown: " << status << "\n"; + return 1; +} +``` + + + +## More Information + +- Official documentation about the [API hub API][cloud-service-docs] service +- [Reference doxygen documentation][doxygen-link] for each release of this + client library +- Detailed header comments in our [public `.h`][source-link] files + +[cloud-service-docs]: https://cloud.google.com/apigee/docs/apihub/what-is-api-hub +[doxygen-link]: https://cloud.google.com/cpp/docs/reference/apihub/latest/ +[source-link]: https://github.com/googleapis/google-cloud-cpp/tree/main/google/cloud/apihub diff --git a/google/cloud/apihub/doc/environment-variables.dox b/google/cloud/apihub/doc/environment-variables.dox new file mode 100644 index 0000000000000..58e2c323cdf80 --- /dev/null +++ b/google/cloud/apihub/doc/environment-variables.dox @@ -0,0 +1,74 @@ +/*! + +@page apihub-env Environment Variables + +A number of environment variables can be used to configure the behavior of +the library. There are also functions to configure this behavior in code. The +environment variables are convenient when troubleshooting problems. + +@section apihub-env-endpoint Endpoint Overrides + + + +- `GOOGLE_CLOUD_CPP_API_HUB_DEPENDENCIES_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "apihub.googleapis.com") + used by `MakeApiHubDependenciesConnection()`. + +- `GOOGLE_CLOUD_CPP_API_HUB_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "apihub.googleapis.com") + used by `MakeApiHubConnection()`. + +- `GOOGLE_CLOUD_CPP_API_HUB_PLUGIN_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "apihub.googleapis.com") + used by `MakeApiHubPluginConnection()`. + +- `GOOGLE_CLOUD_CPP_HOST_PROJECT_REGISTRATION_SERVICE_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "apihub.googleapis.com") + used by `MakeHostProjectRegistrationServiceConnection()`. + +- `GOOGLE_CLOUD_CPP_LINTING_SERVICE_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "apihub.googleapis.com") + used by `MakeLintingServiceConnection()`. + +- `GOOGLE_CLOUD_CPP_PROVISIONING_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "apihub.googleapis.com") + used by `MakeProvisioningConnection()`. + +- `GOOGLE_CLOUD_CPP_RUNTIME_PROJECT_ATTACHMENT_SERVICE_ENDPOINT=...` overrides the + `EndpointOption` (which defaults to "apihub.googleapis.com") + used by `MakeRuntimeProjectAttachmentServiceConnection()`. + + + +@see google::cloud::EndpointOption + +@section apihub-env-logging Logging + +`GOOGLE_CLOUD_CPP_ENABLE_TRACING=rpc`: turns on tracing for most gRPC +calls. The library injects an additional Stub decorator that prints each gRPC +request and response. Unless you have configured your own logging backend, +you should also set `GOOGLE_CLOUD_CPP_ENABLE_CLOG` to produce any output on +the program's console. + +@see google::cloud::LoggingComponentsOption + +`GOOGLE_CLOUD_CPP_TRACING_OPTIONS=...`: modifies the behavior of gRPC tracing, +including whether messages will be output on multiple lines, or whether +string/bytes fields will be truncated. + +@see google::cloud::GrpcTracingOptionsOption + +`GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes`: turns on logging in the library, basically +the library always "logs" but the logging infrastructure has no backend to +actually print anything until the application sets a backend or they set this +environment variable. + +@see google::cloud::LogBackend +@see google::cloud::LogSink + +@section apihub-env-project Setting the Default Project + +`GOOGLE_CLOUD_PROJECT=...`: is used in examples and integration tests to +configure the GCP project. This has no effect in the library. + +*/ diff --git a/google/cloud/apihub/doc/main.dox b/google/cloud/apihub/doc/main.dox new file mode 100644 index 0000000000000..10b8bca1ec4cb --- /dev/null +++ b/google/cloud/apihub/doc/main.dox @@ -0,0 +1,58 @@ +/*! + +@mainpage API hub API C++ Client Library + +An idiomatic C++ client library for the [API hub API][cloud-service-docs]. + + + +While this library is **GA**, please note that the Google Cloud C++ client libraries do **not** follow +[Semantic Versioning](https://semver.org/). + +@tableofcontents{HTML:2} + +## Quickstart + +The following shows the code that you'll run in the +`google/cloud/apihub/quickstart/` directory, +which should give you a taste of the API hub API C++ client library API. + +@snippet quickstart.cc all + +## Main classes + + +This library offers multiple `*Client` classes, which are listed below. Each one +of these classes exposes all the RPCs for a service as member functions of the +class. This library groups multiple services because they are part of the same +product or are often used together. A typical example may be the administrative +and data plane operations for a single product. + +The library also has other classes that provide helpers, configuration +parameters, and infrastructure to mock the `*Client` classes when testing your +application. + +- [\c apihub_v1::ApiHubClient](@ref google::cloud::apihub_v1::ApiHubClient) +- [\c apihub_v1::ApiHubDependenciesClient](@ref google::cloud::apihub_v1::ApiHubDependenciesClient) +- [\c apihub_v1::ApiHubPluginClient](@ref google::cloud::apihub_v1::ApiHubPluginClient) +- [\c apihub_v1::HostProjectRegistrationServiceClient](@ref google::cloud::apihub_v1::HostProjectRegistrationServiceClient) +- [\c apihub_v1::LintingServiceClient](@ref google::cloud::apihub_v1::LintingServiceClient) +- [\c apihub_v1::ProvisioningClient](@ref google::cloud::apihub_v1::ProvisioningClient) +- [\c apihub_v1::RuntimeProjectAttachmentServiceClient](@ref google::cloud::apihub_v1::RuntimeProjectAttachmentServiceClient) + + +## More Information + +- @ref common-error-handling - describes how the library reports errors. +- @ref apihub-override-endpoint - describes how to override the default + endpoint. +- @ref apihub-override-authentication - describes how to change the + authentication credentials used by the library. +- @ref apihub-override-retry - describes how to change the default retry + policies. +- @ref apihub-env - describes environment variables that can configure the + behavior of the library. + +[cloud-service-docs]: https://cloud.google.com/apigee/docs/apihub/what-is-api-hub + +*/ diff --git a/google/cloud/apihub/doc/options.dox b/google/cloud/apihub/doc/options.dox new file mode 100644 index 0000000000000..4f0261c5d5b42 --- /dev/null +++ b/google/cloud/apihub/doc/options.dox @@ -0,0 +1,10 @@ +/*! +@defgroup google-cloud-apihub-options API hub API Configuration Options + +This library uses the same mechanism (`google::cloud::Options`) and the common +[options](@ref options) as all other C++ client libraries for its configuration. +Some `*Option` classes, which are only used in this library, are documented in +this page. + +@see @ref options - for an overview of client library configuration. +*/ diff --git a/google/cloud/apihub/doc/override-authentication.dox b/google/cloud/apihub/doc/override-authentication.dox new file mode 100644 index 0000000000000..415b9aa2184e1 --- /dev/null +++ b/google/cloud/apihub/doc/override-authentication.dox @@ -0,0 +1,81 @@ +/*! +@page apihub-override-authentication How to Override the Authentication Credentials + +Unless otherwise configured, the client libraries use +[Application Default Credentials] to authenticate with Google Cloud Services. +While this works for most applications, in some cases you may need to override +this default. You can do so by providing the +[UnifiedCredentialsOption](@ref google::cloud::UnifiedCredentialsOption) +The following example shows how to explicitly load a service account key file: + + +@snippet api_hub_client_samples.cc with-service-account + +Follow these links to find examples for other \c *Client classes: + +- [\c apihub_v1::ApiHubClient](@ref apihub_v1::ApiHubClient-service-account-snippet) +- [\c apihub_v1::ApiHubDependenciesClient](@ref apihub_v1::ApiHubDependenciesClient-service-account-snippet) +- [\c apihub_v1::ApiHubPluginClient](@ref apihub_v1::ApiHubPluginClient-service-account-snippet) +- [\c apihub_v1::HostProjectRegistrationServiceClient](@ref apihub_v1::HostProjectRegistrationServiceClient-service-account-snippet) +- [\c apihub_v1::LintingServiceClient](@ref apihub_v1::LintingServiceClient-service-account-snippet) +- [\c apihub_v1::ProvisioningClient](@ref apihub_v1::ProvisioningClient-service-account-snippet) +- [\c apihub_v1::RuntimeProjectAttachmentServiceClient](@ref apihub_v1::RuntimeProjectAttachmentServiceClient-service-account-snippet) + + + +Keep in mind that we chose this as an example because it is relatively easy to +understand. Consult the [Best practices for managing service account keys] +guide for more details. + +@see @ref guac - for more information on the factory functions to create +`google::cloud::Credentials` objects. + +[Best practices for managing service account keys]: https://cloud.google.com/iam/docs/best-practices-for-managing-service-account-keys +[Application Default Credentials]: https://cloud.google.com/docs/authentication#adc + +*/ + +// + +/*! @page apihub_v1::ApiHubClient-service-account-snippet Override apihub_v1::ApiHubClient Authentication Defaults + +@snippet google/cloud/apihub/v1/samples/api_hub_client_samples.cc with-service-account + +*/ + +/*! @page apihub_v1::ApiHubDependenciesClient-service-account-snippet Override apihub_v1::ApiHubDependenciesClient Authentication Defaults + +@snippet google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc with-service-account + +*/ + +/*! @page apihub_v1::ApiHubPluginClient-service-account-snippet Override apihub_v1::ApiHubPluginClient Authentication Defaults + +@snippet google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc with-service-account + +*/ + +/*! @page apihub_v1::HostProjectRegistrationServiceClient-service-account-snippet Override apihub_v1::HostProjectRegistrationServiceClient Authentication Defaults + +@snippet google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc with-service-account + +*/ + +/*! @page apihub_v1::LintingServiceClient-service-account-snippet Override apihub_v1::LintingServiceClient Authentication Defaults + +@snippet google/cloud/apihub/v1/samples/linting_client_samples.cc with-service-account + +*/ + +/*! @page apihub_v1::ProvisioningClient-service-account-snippet Override apihub_v1::ProvisioningClient Authentication Defaults + +@snippet google/cloud/apihub/v1/samples/provisioning_client_samples.cc with-service-account + +*/ + +/*! @page apihub_v1::RuntimeProjectAttachmentServiceClient-service-account-snippet Override apihub_v1::RuntimeProjectAttachmentServiceClient Authentication Defaults + +@snippet google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc with-service-account + +*/ +// diff --git a/google/cloud/apihub/doc/override-endpoint.dox b/google/cloud/apihub/doc/override-endpoint.dox new file mode 100644 index 0000000000000..0866dab41ebc2 --- /dev/null +++ b/google/cloud/apihub/doc/override-endpoint.dox @@ -0,0 +1,71 @@ +/*! +@page apihub-override-endpoint How to Override the Default Endpoint + +In some cases, you may need to override the default endpoint used by the client +library. Use the +[EndpointOption](@ref google::cloud::EndpointOption) when initializing the +client library to change this default. + + +For example, this will override the default endpoint for `apihub_v1::ApiHubClient`: + +@snippet api_hub_client_samples.cc set-client-endpoint + +Follow these links to find examples for other \c *Client classes: + +- [\c apihub_v1::ApiHubClient](@ref apihub_v1::ApiHubClient-endpoint-snippet) +- [\c apihub_v1::ApiHubDependenciesClient](@ref apihub_v1::ApiHubDependenciesClient-endpoint-snippet) +- [\c apihub_v1::ApiHubPluginClient](@ref apihub_v1::ApiHubPluginClient-endpoint-snippet) +- [\c apihub_v1::HostProjectRegistrationServiceClient](@ref apihub_v1::HostProjectRegistrationServiceClient-endpoint-snippet) +- [\c apihub_v1::LintingServiceClient](@ref apihub_v1::LintingServiceClient-endpoint-snippet) +- [\c apihub_v1::ProvisioningClient](@ref apihub_v1::ProvisioningClient-endpoint-snippet) +- [\c apihub_v1::RuntimeProjectAttachmentServiceClient](@ref apihub_v1::RuntimeProjectAttachmentServiceClient-endpoint-snippet) + + + +*/ + +// + +/*! @page apihub_v1::ApiHubClient-endpoint-snippet Override apihub_v1::ApiHubClient Endpoint Configuration + +@snippet google/cloud/apihub/v1/samples/api_hub_client_samples.cc set-client-endpoint + +*/ + +/*! @page apihub_v1::ApiHubDependenciesClient-endpoint-snippet Override apihub_v1::ApiHubDependenciesClient Endpoint Configuration + +@snippet google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc set-client-endpoint + +*/ + +/*! @page apihub_v1::ApiHubPluginClient-endpoint-snippet Override apihub_v1::ApiHubPluginClient Endpoint Configuration + +@snippet google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc set-client-endpoint + +*/ + +/*! @page apihub_v1::HostProjectRegistrationServiceClient-endpoint-snippet Override apihub_v1::HostProjectRegistrationServiceClient Endpoint Configuration + +@snippet google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc set-client-endpoint + +*/ + +/*! @page apihub_v1::LintingServiceClient-endpoint-snippet Override apihub_v1::LintingServiceClient Endpoint Configuration + +@snippet google/cloud/apihub/v1/samples/linting_client_samples.cc set-client-endpoint + +*/ + +/*! @page apihub_v1::ProvisioningClient-endpoint-snippet Override apihub_v1::ProvisioningClient Endpoint Configuration + +@snippet google/cloud/apihub/v1/samples/provisioning_client_samples.cc set-client-endpoint + +*/ + +/*! @page apihub_v1::RuntimeProjectAttachmentServiceClient-endpoint-snippet Override apihub_v1::RuntimeProjectAttachmentServiceClient Endpoint Configuration + +@snippet google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc set-client-endpoint + +*/ +// diff --git a/google/cloud/apihub/doc/override-retry-policies.dox b/google/cloud/apihub/doc/override-retry-policies.dox new file mode 100644 index 0000000000000..e155eed1ed3f9 --- /dev/null +++ b/google/cloud/apihub/doc/override-retry-policies.dox @@ -0,0 +1,186 @@ +/*! +@page apihub-override-retry Override Retry, Backoff, and Idempotency Policies + +When it is safe to do so, the library automatically retries requests that fail +due to a transient error. The library then uses [exponential backoff] to backoff +before trying again. Which operations are considered safe to retry, which +errors are treated as transient failures, the details of the exponential backoff +algorithm, and for how long the library retries are all configurable via +policies. + +This document provides examples showing how to override the default policies. + +The policies can be set when the `*Connection` object is created. The library +provides default policies for any policy that is not set. The application can +also override some (or all) policies when the `*Client` object is created. This +can be useful if multiple `*Client` objects share the same `*Connection` object, +but you want different retry behavior in some of the clients. Finally, the +application can override some retry policies when calling a specific member +function. + +The library uses three different options to control the retry loop. The options +have per-client names. + +@section apihub-override-retry-retry-policy Configuring the transient errors and retry duration + +The `*RetryPolicyOption` controls: + +- Which errors are to be treated as transient errors. +- How long the library will keep retrying transient errors. + +You can provide your own class for this option. The library also provides two +built-in policies: + +- `*LimitedErrorCountRetryPolicy`: stops retrying after a specified number + of transient errors. +- `*LimitedTimeRetryPolicy`: stops retrying after a specified time. + +Note that a library may have more than one version of these classes. Their name +match the `*Client` and `*Connection` object they are intended to be used +with. Some `*Client` objects treat different error codes as transient errors. +In most cases, only [kUnavailable](@ref google::cloud::StatusCode) is treated +as a transient error. + +@section apihub-override-retry-backoff-policy Controlling the backoff algorithm + +The `*BackoffPolicyOption` controls how long the client library will wait +before retrying a request that failed with a transient error. You can provide +your own class for this option. + +The only built-in backoff policy is +[`ExponentialBackoffPolicy`](@ref google::cloud::ExponentialBackoffPolicy). +This class implements a truncated exponential backoff algorithm, with jitter. +In summary, it doubles the current backoff time after each failure. The actual +backoff time for an RPC is chosen at random, but never exceeds the current +backoff. The current backoff is doubled after each failure, but never exceeds +(or is "truncated") if it reaches a prescribed maximum. + +@section apihub-override-retry-idempotency-policy Controlling which operations are retryable + +The `*IdempotencyPolicyOption` controls which requests are retryable, as some +requests are never safe to retry. + +Only one built-in idempotency policy is provided by the library. The name +matches the name of the client it is intended for. For example, `FooBarClient` +will use `FooBarIdempotencyPolicy`. This policy is very conservative. + +@section apihub-override-retry-example Example + + +For example, this will override the retry policies for `apihub_v1::ApiHubClient`: + +@snippet api_hub_client_samples.cc set-retry-policy + +This assumes you have created a custom idempotency policy. Such as: + +@snippet api_hub_client_samples.cc custom-idempotency-policy + + +Follow these links to find examples for other \c *Client classes: + +- [\c apihub_v1::ApiHubClient](@ref apihub_v1::ApiHubClient-retry-snippet) +- [\c apihub_v1::ApiHubDependenciesClient](@ref apihub_v1::ApiHubDependenciesClient-retry-snippet) +- [\c apihub_v1::ApiHubPluginClient](@ref apihub_v1::ApiHubPluginClient-retry-snippet) +- [\c apihub_v1::HostProjectRegistrationServiceClient](@ref apihub_v1::HostProjectRegistrationServiceClient-retry-snippet) +- [\c apihub_v1::LintingServiceClient](@ref apihub_v1::LintingServiceClient-retry-snippet) +- [\c apihub_v1::ProvisioningClient](@ref apihub_v1::ProvisioningClient-retry-snippet) +- [\c apihub_v1::RuntimeProjectAttachmentServiceClient](@ref apihub_v1::RuntimeProjectAttachmentServiceClient-retry-snippet) + + + +@section apihub-override-retry-more-information More Information + +@see google::cloud::Options +@see google::cloud::BackoffPolicy +@see google::cloud::ExponentialBackoffPolicy + +[exponential backoff]: https://en.wikipedia.org/wiki/Exponential_backoff + +*/ + +// + +/*! @page apihub_v1::ApiHubClient-retry-snippet Override apihub_v1::ApiHubClient Retry Policies + +This shows how to override the retry policies for apihub_v1::ApiHubClient: + +@snippet google/cloud/apihub/v1/samples/api_hub_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/apihub/v1/samples/api_hub_client_samples.cc custom-idempotency-policy + +*/ + +/*! @page apihub_v1::ApiHubDependenciesClient-retry-snippet Override apihub_v1::ApiHubDependenciesClient Retry Policies + +This shows how to override the retry policies for apihub_v1::ApiHubDependenciesClient: + +@snippet google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc custom-idempotency-policy + +*/ + +/*! @page apihub_v1::ApiHubPluginClient-retry-snippet Override apihub_v1::ApiHubPluginClient Retry Policies + +This shows how to override the retry policies for apihub_v1::ApiHubPluginClient: + +@snippet google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc custom-idempotency-policy + +*/ + +/*! @page apihub_v1::HostProjectRegistrationServiceClient-retry-snippet Override apihub_v1::HostProjectRegistrationServiceClient Retry Policies + +This shows how to override the retry policies for apihub_v1::HostProjectRegistrationServiceClient: + +@snippet google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc custom-idempotency-policy + +*/ + +/*! @page apihub_v1::LintingServiceClient-retry-snippet Override apihub_v1::LintingServiceClient Retry Policies + +This shows how to override the retry policies for apihub_v1::LintingServiceClient: + +@snippet google/cloud/apihub/v1/samples/linting_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/apihub/v1/samples/linting_client_samples.cc custom-idempotency-policy + +*/ + +/*! @page apihub_v1::ProvisioningClient-retry-snippet Override apihub_v1::ProvisioningClient Retry Policies + +This shows how to override the retry policies for apihub_v1::ProvisioningClient: + +@snippet google/cloud/apihub/v1/samples/provisioning_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/apihub/v1/samples/provisioning_client_samples.cc custom-idempotency-policy + +*/ + +/*! @page apihub_v1::RuntimeProjectAttachmentServiceClient-retry-snippet Override apihub_v1::RuntimeProjectAttachmentServiceClient Retry Policies + +This shows how to override the retry policies for apihub_v1::RuntimeProjectAttachmentServiceClient: + +@snippet google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc set-retry-policy + +Assuming you have created a custom idempotency policy. Such as: + +@snippet google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc custom-idempotency-policy + +*/ +// diff --git a/google/cloud/apihub/quickstart/.bazelrc b/google/cloud/apihub/quickstart/.bazelrc new file mode 100644 index 0000000000000..e676fbffccb52 --- /dev/null +++ b/google/cloud/apihub/quickstart/.bazelrc @@ -0,0 +1,30 @@ +# Copyright 2024 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. + +# Use host-OS-specific config lines from bazelrc files. +build --enable_platform_specific_config=true + +# The project requires C++ >= 14. By default Bazel adds `-std=c++0x` which +# disables C++14 features, even if the compilers defaults to C++ >= 14 +build:linux --cxxopt=-std=c++14 +build:macos --cxxopt=-std=c++14 +# Protobuf and gRPC require (or soon will require) C++14 to compile the "host" +# targets, such as protoc and the grpc plugin. +build:linux --host_cxxopt=-std=c++14 +build:macos --host_cxxopt=-std=c++14 + +# Do not create the convenience links. They are inconvenient when the build +# runs inside a docker image or if one builds a quickstart and then builds +# the project separately. +build --experimental_convenience_symlinks=ignore diff --git a/google/cloud/apihub/quickstart/BUILD.bazel b/google/cloud/apihub/quickstart/BUILD.bazel new file mode 100644 index 0000000000000..22d9b72624f2b --- /dev/null +++ b/google/cloud/apihub/quickstart/BUILD.bazel @@ -0,0 +1,25 @@ +# Copyright 2024 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. + +licenses(["notice"]) # Apache 2.0 + +cc_binary( + name = "quickstart", + srcs = [ + "quickstart.cc", + ], + deps = [ + "@google_cloud_cpp//:apihub", + ], +) diff --git a/google/cloud/apihub/quickstart/CMakeLists.txt b/google/cloud/apihub/quickstart/CMakeLists.txt new file mode 100644 index 0000000000000..83389acb6c9e3 --- /dev/null +++ b/google/cloud/apihub/quickstart/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright 2024 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. + +# This file shows how to use the API hub API C++ client library from a larger +# CMake project. + +cmake_minimum_required(VERSION 3.10...3.24) +project(google-cloud-cpp-apihub-quickstart CXX) + +find_package(google_cloud_cpp_apihub REQUIRED) + +# MSVC requires some additional code to select the correct runtime library +if (VCPKG_TARGET_TRIPLET MATCHES "-static$") + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +else () + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") +endif () + +# Define your targets. +add_executable(quickstart quickstart.cc) +target_link_libraries(quickstart google-cloud-cpp::apihub) diff --git a/google/cloud/apihub/quickstart/Makefile b/google/cloud/apihub/quickstart/Makefile new file mode 100644 index 0000000000000..bd541d2cd6264 --- /dev/null +++ b/google/cloud/apihub/quickstart/Makefile @@ -0,0 +1,35 @@ +# Copyright 2024 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. + +# This is a minimal Makefile to show how to use the API hub API C++ client +# for developers who use make(1) as their build system. + +# The CXX, CXXFLAGS and CXXLD variables are hard-coded. These values work for +# our tests, but applications would typically make them configurable parameters. +CXX=g++ +CXXFLAGS= +CXXLD=$(CXX) +BIN=. + +all: $(BIN)/quickstart + +# Configuration variables to compile and link against the API hub API C++ +# client library. +CLIENT_MODULE := google_cloud_cpp_apihub +CLIENT_CXXFLAGS := $(shell pkg-config $(CLIENT_MODULE) --cflags) +CLIENT_CXXLDFLAGS := $(shell pkg-config $(CLIENT_MODULE) --libs-only-L) +CLIENT_LIBS := $(shell pkg-config $(CLIENT_MODULE) --libs-only-l) + +$(BIN)/quickstart: quickstart.cc + $(CXXLD) $(CXXFLAGS) $(CLIENT_CXXFLAGS) $(CLIENT_CXXLDFLAGS) -o $@ $^ $(CLIENT_LIBS) diff --git a/google/cloud/apihub/quickstart/README.md b/google/cloud/apihub/quickstart/README.md new file mode 100644 index 0000000000000..438c13a40473f --- /dev/null +++ b/google/cloud/apihub/quickstart/README.md @@ -0,0 +1,154 @@ +# HOWTO: using the API hub API C++ client in your project + +This directory contains small examples showing how to use the API hub API C++ +client library in your own project. These instructions assume that you have some +experience as a C++ developer and that you have a working C++ toolchain +(compiler, linker, etc.) installed on your platform. + +- Packaging maintainers or developers who prefer to install the library in a + fixed directory (such as `/usr/local` or `/opt`) should consult the + [packaging guide](/doc/packaging.md). +- Developers who prefer using a package manager such as + [vcpkg](https://vcpkg.io), or [Conda](https://conda.io), should follow the + instructions for their package manager. +- Developers wanting to use the libraries as part of a larger CMake or Bazel + project should consult the current document. Note that there are similar + documents for each library in their corresponding directories. +- Developers wanting to compile the library just to run some examples or tests + should consult the + [building and installing](/README.md#building-and-installing) section of the + top-level README file. +- Contributors and developers to `google-cloud-cpp` should consult the guide to + [set up a development workstation][howto-setup-dev-workstation]. + +## Before you begin + +To run the quickstart examples you will need a working Google Cloud Platform +(GCP) project. The [quickstart][quickstart-link] covers the necessary steps in +detail. + +## Configuring authentication for the C++ Client Library + +Like most Google Cloud Platform (GCP) services, API hub API requires that your +application authenticates with the service before accessing any data. If you are +not familiar with GCP authentication please take this opportunity to review the +[Authentication Overview][authentication-quickstart]. This library uses the +`GOOGLE_APPLICATION_CREDENTIALS` environment variable to find the credentials +file. For example: + +| Shell | Command | +| :----------------- | ------------------------------------------------------------------------------------ | +| Bash/zsh/ksh/etc. | `export GOOGLE_APPLICATION_CREDENTIALS=[PATH]` | +| sh | `GOOGLE_APPLICATION_CREDENTIALS=[PATH];`
`export GOOGLE_APPLICATION_CREDENTIALS` | +| csh/tsch | `setenv GOOGLE_APPLICATION_CREDENTIALS [PATH]` | +| Windows Powershell | `$env:GOOGLE_APPLICATION_CREDENTIALS=[PATH]` | +| Windows cmd.exe | `set GOOGLE_APPLICATION_CREDENTIALS=[PATH]` | + +Setting this environment variable is the recommended way to configure the +authentication preferences, though if the environment variable is not set, the +library searches for a credentials file in the same location as the +[Cloud SDK](https://cloud.google.com/sdk/). For more information about +*Application Default Credentials*, see +https://cloud.google.com/docs/authentication/production + +## Using with Bazel + +> :warning: If you are using Windows or macOS there are additional instructions +> at the end of this document. + +1. Install Bazel using [the instructions][bazel-install] from the `bazel.build` + website. + +1. Compile this example using Bazel: + + ```bash + cd $HOME/google-cloud-cpp/google/cloud/apihub/quickstart + bazel build ... + ``` + + Note that Bazel automatically downloads and compiles all dependencies of the + project. As it is often the case with C++ libraries, compiling these + dependencies may take several minutes. + +1. Run the example, changing the placeholder(s) to appropriate values: + + ```bash + bazel run :quickstart -- [...] + ``` + +## Using with CMake + +> :warning: If you are using Windows or macOS there are additional instructions +> at the end of this document. + +1. Install CMake. The package managers for most Linux distributions include a + package for CMake. Likewise, you can install CMake on Windows using a package + manager such as [chocolatey][choco-cmake-link], and on macOS using + [homebrew][homebrew-cmake-link]. You can also obtain the software directly + from the [cmake.org](https://cmake.org/download/). + +1. Install the dependencies with your favorite tools. As an example, if you use + [vcpkg](https://github.com/Microsoft/vcpkg.git): + + ```bash + cd $HOME/vcpkg + ./vcpkg install google-cloud-cpp[core,apihub] + ``` + + Note that, as it is often the case with C++ libraries, compiling these + dependencies may take several minutes. + +1. Configure CMake, if necessary, configure the directory where you installed + the dependencies: + + ```bash + cd $HOME/google-cloud-cpp/google/cloud/apihub/quickstart + cmake -S . -B .build -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake + cmake --build .build + ``` + +1. Run the example, changing the placeholder(s) to appropriate values: + + ```bash + .build/quickstart [...] + ``` + +## Platform Specific Notes + +### macOS + +gRPC [requires][grpc-roots-pem-bug] an environment variable to configure the +trust store for SSL certificates, you can download and configure this using: + +```bash +curl -Lo roots.pem https://pki.google.com/roots.pem +export GRPC_DEFAULT_SSL_ROOTS_FILE_PATH="$PWD/roots.pem" +``` + +### Windows + +Bazel tends to create very long file names and paths. You may need to use a +short directory to store the build output, such as `c:\b`, and instruct Bazel to +use it via: + +```shell +bazel --output_user_root=c:\b build ... +``` + +gRPC [requires][grpc-roots-pem-bug] an environment variable to configure the +trust store for SSL certificates, you can download and configure this using: + +```console +@powershell -NoProfile -ExecutionPolicy unrestricted -Command ^ + (new-object System.Net.WebClient).Downloadfile( ^ + 'https://pki.google.com/roots.pem', 'roots.pem') +set GRPC_DEFAULT_SSL_ROOTS_FILE_PATH=%cd%\roots.pem +``` + +[authentication-quickstart]: https://cloud.google.com/docs/authentication/getting-started "Authentication Getting Started" +[bazel-install]: https://docs.bazel.build/versions/main/install.html +[choco-cmake-link]: https://chocolatey.org/packages/cmake +[grpc-roots-pem-bug]: https://github.com/grpc/grpc/issues/16571 +[homebrew-cmake-link]: https://formulae.brew.sh/formula/cmake +[howto-setup-dev-workstation]: /doc/contributor/howto-guide-setup-development-workstation.md +[quickstart-link]: https://cloud.google.com/apihub/docs/quickstart diff --git a/google/cloud/apihub/quickstart/WORKSPACE.bazel b/google/cloud/apihub/quickstart/WORKSPACE.bazel new file mode 100644 index 0000000000000..a4a1ef7c0692c --- /dev/null +++ b/google/cloud/apihub/quickstart/WORKSPACE.bazel @@ -0,0 +1,53 @@ +# Copyright 2024 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. + +# A minimal WORKSPACE file showing how to use the API hub API +# C++ client library in Bazel-based projects. +workspace(name = "qs") + +# Add the necessary Starlark functions to fetch google-cloud-cpp. +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +# Fetch the Google Cloud C++ libraries. +# NOTE: Update this version and SHA256 as needed. +http_archive( + name = "google_cloud_cpp", + sha256 = "333fe00210ce1a6f0c1b51c232438a316eaf2c7a1724f75d0b2c64f8fc456aa7", + strip_prefix = "google-cloud-cpp-2.27.0", + url = "https://github.com/googleapis/google-cloud-cpp/archive/v2.27.0.tar.gz", +) + +load("@google_cloud_cpp//bazel:workspace0.bzl", "gl_cpp_workspace0") + +gl_cpp_workspace0() + +load("@google_cloud_cpp//bazel:workspace1.bzl", "gl_cpp_workspace1") + +gl_cpp_workspace1() + +load("@google_cloud_cpp//bazel:workspace2.bzl", "gl_cpp_workspace2") + +gl_cpp_workspace2() + +load("@google_cloud_cpp//bazel:workspace3.bzl", "gl_cpp_workspace3") + +gl_cpp_workspace3() + +load("@google_cloud_cpp//bazel:workspace4.bzl", "gl_cpp_workspace4") + +gl_cpp_workspace4() + +load("@google_cloud_cpp//bazel:workspace5.bzl", "gl_cpp_workspace5") + +gl_cpp_workspace5() diff --git a/google/cloud/apihub/quickstart/quickstart.cc b/google/cloud/apihub/quickstart/quickstart.cc new file mode 100644 index 0000000000000..53860e285a160 --- /dev/null +++ b/google/cloud/apihub/quickstart/quickstart.cc @@ -0,0 +1,42 @@ +// Copyright 2024 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. + +//! [all] +#include "google/cloud/apihub/v1/ EDIT HERE _client.h" +#include "google/cloud/location.h" +#include + +int main(int argc, char* argv[]) try { + if (argc != 3) { + std::cerr << "Usage: " << argv[0] << " project-id location-id\n"; + return 1; + } + + auto const location = google::cloud::Location(argv[1], argv[2]); + + namespace apihub = ::google::cloud::apihub_v1; + auto client = + apihub::ServiceClient(apihub::MakeServiceConnection()); // EDIT HERE + + for (auto r : client.List /*EDIT HERE*/ (location.FullName())) { + if (!r) throw std::move(r).status(); + std::cout << r->DebugString() << "\n"; + } + + return 0; +} catch (google::cloud::Status const& status) { + std::cerr << "google::cloud::Status thrown: " << status << "\n"; + return 1; +} +//! [all] diff --git a/google/cloud/apihub/v1/.repo-metadata.json b/google/cloud/apihub/v1/.repo-metadata.json new file mode 100644 index 0000000000000..bc73e0b686d95 --- /dev/null +++ b/google/cloud/apihub/v1/.repo-metadata.json @@ -0,0 +1,14 @@ +{ + "api_id": "apihub.googleapis.com", + "api_shortname": "apihub", + "client_documentation": "https://cloud.google.com/cpp/docs/reference/apihub/latest", + "distribution_name": "google-cloud-cpp", + "issue_tracker": "https://issuetracker.google.com/issues?q=componentid:1447560%20status=open", + "language": "cpp", + "library_type": "GAPIC_AUTO", + "name_pretty": "API hub API", + "product_documentation": "https://cloud.google.com/apigee/docs/apihub/what-is-api-hub", + "release_level": "stable", + "repo": "googleapis/google-cloud-cpp", + "requires_billing": true +} diff --git a/google/cloud/apihub/v1/api_hub_client.cc b/google/cloud/apihub/v1/api_hub_client.cc new file mode 100644 index 0000000000000..d74f3a64805ef --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_client.cc @@ -0,0 +1,584 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubClient::ApiHubClient(std::shared_ptr connection, + Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +ApiHubClient::~ApiHubClient() = default; + +StatusOr ApiHubClient::CreateApi( + std::string const& parent, google::cloud::apihub::v1::Api const& api, + std::string const& api_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateApiRequest request; + request.set_parent(parent); + *request.mutable_api() = api; + request.set_api_id(api_id); + return connection_->CreateApi(request); +} + +StatusOr ApiHubClient::CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateApi(request); +} + +StatusOr ApiHubClient::GetApi( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetApiRequest request; + request.set_name(name); + return connection_->GetApi(request); +} + +StatusOr ApiHubClient::GetApi( + google::cloud::apihub::v1::GetApiRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetApi(request); +} + +StreamRange ApiHubClient::ListApis( + std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListApisRequest request; + request.set_parent(parent); + return connection_->ListApis(request); +} + +StreamRange ApiHubClient::ListApis( + google::cloud::apihub::v1::ListApisRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListApis(std::move(request)); +} + +StatusOr ApiHubClient::UpdateApi( + google::cloud::apihub::v1::Api const& api, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateApiRequest request; + *request.mutable_api() = api; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateApi(request); +} + +StatusOr ApiHubClient::UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateApi(request); +} + +Status ApiHubClient::DeleteApi(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteApiRequest request; + request.set_name(name); + return connection_->DeleteApi(request); +} + +Status ApiHubClient::DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteApi(request); +} + +StatusOr ApiHubClient::CreateVersion( + std::string const& parent, + google::cloud::apihub::v1::Version const& version, + std::string const& version_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateVersionRequest request; + request.set_parent(parent); + *request.mutable_version() = version; + request.set_version_id(version_id); + return connection_->CreateVersion(request); +} + +StatusOr ApiHubClient::CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateVersion(request); +} + +StatusOr ApiHubClient::GetVersion( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetVersionRequest request; + request.set_name(name); + return connection_->GetVersion(request); +} + +StatusOr ApiHubClient::GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetVersion(request); +} + +StreamRange ApiHubClient::ListVersions( + std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListVersionsRequest request; + request.set_parent(parent); + return connection_->ListVersions(request); +} + +StreamRange ApiHubClient::ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListVersions(std::move(request)); +} + +StatusOr ApiHubClient::UpdateVersion( + google::cloud::apihub::v1::Version const& version, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateVersionRequest request; + *request.mutable_version() = version; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateVersion(request); +} + +StatusOr ApiHubClient::UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateVersion(request); +} + +Status ApiHubClient::DeleteVersion(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteVersionRequest request; + request.set_name(name); + return connection_->DeleteVersion(request); +} + +Status ApiHubClient::DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteVersion(request); +} + +StatusOr ApiHubClient::CreateSpec( + std::string const& parent, google::cloud::apihub::v1::Spec const& spec, + std::string const& spec_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateSpecRequest request; + request.set_parent(parent); + *request.mutable_spec() = spec; + request.set_spec_id(spec_id); + return connection_->CreateSpec(request); +} + +StatusOr ApiHubClient::CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateSpec(request); +} + +StatusOr ApiHubClient::GetSpec( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetSpecRequest request; + request.set_name(name); + return connection_->GetSpec(request); +} + +StatusOr ApiHubClient::GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetSpec(request); +} + +StatusOr ApiHubClient::GetSpecContents( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetSpecContentsRequest request; + request.set_name(name); + return connection_->GetSpecContents(request); +} + +StatusOr ApiHubClient::GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetSpecContents(request); +} + +StreamRange ApiHubClient::ListSpecs( + std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListSpecsRequest request; + request.set_parent(parent); + return connection_->ListSpecs(request); +} + +StreamRange ApiHubClient::ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListSpecs(std::move(request)); +} + +StatusOr ApiHubClient::UpdateSpec( + google::cloud::apihub::v1::Spec const& spec, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateSpecRequest request; + *request.mutable_spec() = spec; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateSpec(request); +} + +StatusOr ApiHubClient::UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateSpec(request); +} + +Status ApiHubClient::DeleteSpec(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteSpecRequest request; + request.set_name(name); + return connection_->DeleteSpec(request); +} + +Status ApiHubClient::DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteSpec(request); +} + +StatusOr ApiHubClient::GetApiOperation( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetApiOperationRequest request; + request.set_name(name); + return connection_->GetApiOperation(request); +} + +StatusOr ApiHubClient::GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetApiOperation(request); +} + +StreamRange +ApiHubClient::ListApiOperations(std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListApiOperationsRequest request; + request.set_parent(parent); + return connection_->ListApiOperations(request); +} + +StreamRange +ApiHubClient::ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListApiOperations(std::move(request)); +} + +StatusOr ApiHubClient::GetDefinition( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetDefinitionRequest request; + request.set_name(name); + return connection_->GetDefinition(request); +} + +StatusOr ApiHubClient::GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetDefinition(request); +} + +StatusOr ApiHubClient::CreateDeployment( + std::string const& parent, + google::cloud::apihub::v1::Deployment const& deployment, + std::string const& deployment_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateDeploymentRequest request; + request.set_parent(parent); + *request.mutable_deployment() = deployment; + request.set_deployment_id(deployment_id); + return connection_->CreateDeployment(request); +} + +StatusOr ApiHubClient::CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateDeployment(request); +} + +StatusOr ApiHubClient::GetDeployment( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetDeploymentRequest request; + request.set_name(name); + return connection_->GetDeployment(request); +} + +StatusOr ApiHubClient::GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetDeployment(request); +} + +StreamRange +ApiHubClient::ListDeployments(std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListDeploymentsRequest request; + request.set_parent(parent); + return connection_->ListDeployments(request); +} + +StreamRange +ApiHubClient::ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListDeployments(std::move(request)); +} + +StatusOr ApiHubClient::UpdateDeployment( + google::cloud::apihub::v1::Deployment const& deployment, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateDeploymentRequest request; + *request.mutable_deployment() = deployment; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateDeployment(request); +} + +StatusOr ApiHubClient::UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateDeployment(request); +} + +Status ApiHubClient::DeleteDeployment(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteDeploymentRequest request; + request.set_name(name); + return connection_->DeleteDeployment(request); +} + +Status ApiHubClient::DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteDeployment(request); +} + +StatusOr ApiHubClient::CreateAttribute( + std::string const& parent, + google::cloud::apihub::v1::Attribute const& attribute, + std::string const& attribute_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateAttributeRequest request; + request.set_parent(parent); + *request.mutable_attribute() = attribute; + request.set_attribute_id(attribute_id); + return connection_->CreateAttribute(request); +} + +StatusOr ApiHubClient::CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateAttribute(request); +} + +StatusOr ApiHubClient::GetAttribute( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetAttributeRequest request; + request.set_name(name); + return connection_->GetAttribute(request); +} + +StatusOr ApiHubClient::GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetAttribute(request); +} + +StatusOr ApiHubClient::UpdateAttribute( + google::cloud::apihub::v1::Attribute const& attribute, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateAttributeRequest request; + *request.mutable_attribute() = attribute; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateAttribute(request); +} + +StatusOr ApiHubClient::UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateAttribute(request); +} + +Status ApiHubClient::DeleteAttribute(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteAttributeRequest request; + request.set_name(name); + return connection_->DeleteAttribute(request); +} + +Status ApiHubClient::DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteAttribute(request); +} + +StreamRange ApiHubClient::ListAttributes( + std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListAttributesRequest request; + request.set_parent(parent); + return connection_->ListAttributes(request); +} + +StreamRange ApiHubClient::ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListAttributes(std::move(request)); +} + +StreamRange +ApiHubClient::SearchResources(std::string const& location, + std::string const& query, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::SearchResourcesRequest request; + request.set_location(location); + request.set_query(query); + return connection_->SearchResources(request); +} + +StreamRange +ApiHubClient::SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->SearchResources(std::move(request)); +} + +StatusOr +ApiHubClient::CreateExternalApi( + std::string const& parent, + google::cloud::apihub::v1::ExternalApi const& external_api, + std::string const& external_api_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateExternalApiRequest request; + request.set_parent(parent); + *request.mutable_external_api() = external_api; + request.set_external_api_id(external_api_id); + return connection_->CreateExternalApi(request); +} + +StatusOr +ApiHubClient::CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateExternalApi(request); +} + +StatusOr ApiHubClient::GetExternalApi( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetExternalApiRequest request; + request.set_name(name); + return connection_->GetExternalApi(request); +} + +StatusOr ApiHubClient::GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetExternalApi(request); +} + +StatusOr +ApiHubClient::UpdateExternalApi( + google::cloud::apihub::v1::ExternalApi const& external_api, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateExternalApiRequest request; + *request.mutable_external_api() = external_api; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateExternalApi(request); +} + +StatusOr +ApiHubClient::UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateExternalApi(request); +} + +Status ApiHubClient::DeleteExternalApi(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteExternalApiRequest request; + request.set_name(name); + return connection_->DeleteExternalApi(request); +} + +Status ApiHubClient::DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteExternalApi(request); +} + +StreamRange +ApiHubClient::ListExternalApis(std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListExternalApisRequest request; + request.set_parent(parent); + return connection_->ListExternalApis(request); +} + +StreamRange +ApiHubClient::ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListExternalApis(std::move(request)); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_client.h b/google/cloud/apihub/v1/api_hub_client.h new file mode 100644 index 0000000000000..6f1f3091c6064 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_client.h @@ -0,0 +1,2707 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CLIENT_H + +#include "google/cloud/apihub/v1/api_hub_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// This service provides all methods related to the API hub. +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +class ApiHubClient { + public: + explicit ApiHubClient(std::shared_ptr connection, + Options opts = {}); + ~ApiHubClient(); + + ///@{ + /// @name Copy and move support + ApiHubClient(ApiHubClient const&) = default; + ApiHubClient& operator=(ApiHubClient const&) = default; + ApiHubClient(ApiHubClient&&) = default; + ApiHubClient& operator=(ApiHubClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(ApiHubClient const& a, ApiHubClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(ApiHubClient const& a, ApiHubClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Create an API resource in the API hub. + /// Once an API resource is created, versions can be added to it. + /// + /// @param parent Required. The parent resource for the API resource. + /// Format: `projects/{project}/locations/{location}` + /// @param api Required. The API resource to create. + /// @param api_id Optional. The ID to use for the API resource, which will become the final + /// component of the API's resource name. This field is optional. + /// @n + /// * If provided, the same will be used. The service will throw an error if + /// the specified id is already used by another API resource in the API hub. + /// * If not provided, a system generated id will be used. + /// @n + /// This value should be 4-500 characters, and valid characters + /// are /[a-z][A-Z][0-9]-_/. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Api]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.CreateApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L545} + /// + // clang-format on + StatusOr CreateApi( + std::string const& parent, google::cloud::apihub::v1::Api const& api, + std::string const& api_id, Options opts = {}); + + // clang-format off + /// + /// Create an API resource in the API hub. + /// Once an API resource is created, versions can be added to it. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Api]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.CreateApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L545} + /// + // clang-format on + StatusOr CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get API resource details including the API versions contained in it. + /// + /// @param name Required. The name of the API resource to retrieve. + /// Format: `projects/{project}/locations/{location}/apis/{api}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Api]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.GetApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L571} + /// + // clang-format on + StatusOr GetApi(std::string const& name, + Options opts = {}); + + // clang-format off + /// + /// Get API resource details including the API versions contained in it. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Api]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.GetApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L571} + /// + // clang-format on + StatusOr GetApi( + google::cloud::apihub::v1::GetApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List API resources in the API hub. + /// + /// @param parent Required. The parent, which owns this collection of API resources. + /// Format: `projects/{project}/locations/{location}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Api], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.ListApisRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L609} + /// + // clang-format on + StreamRange ListApis( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List API resources in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListApisRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Api], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.ListApisRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L609} + /// + // clang-format on + StreamRange ListApis( + google::cloud::apihub::v1::ListApisRequest request, Options opts = {}); + + // clang-format off + /// + /// Update an API resource in the API hub. The following fields in the + /// [API][] can be updated: + /// + /// * [display_name][google.cloud.apihub.v1.Api.display_name] + /// * [description][google.cloud.apihub.v1.Api.description] + /// * [owner][google.cloud.apihub.v1.Api.owner] + /// * [documentation][google.cloud.apihub.v1.Api.documentation] + /// * [target_user][google.cloud.apihub.v1.Api.target_user] + /// * [team][google.cloud.apihub.v1.Api.team] + /// * [business_unit][google.cloud.apihub.v1.Api.business_unit] + /// * [maturity_level][google.cloud.apihub.v1.Api.maturity_level] + /// * [attributes][google.cloud.apihub.v1.Api.attributes] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateApiRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// Updating the owner field requires complete owner message + /// and updates both owner and email fields. + /// + /// @param api Required. The API resource to update. + /// @n + /// The API resource's `name` field is used to identify the API resource to + /// update. + /// Format: `projects/{project}/locations/{location}/apis/{api}` + /// @param update_mask Required. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Api]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.Api.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L165} + /// [google.cloud.apihub.v1.Api.business_unit]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L149} + /// [google.cloud.apihub.v1.Api.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L96} + /// [google.cloud.apihub.v1.Api.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L93} + /// [google.cloud.apihub.v1.Api.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L99} + /// [google.cloud.apihub.v1.Api.maturity_level]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L159} + /// [google.cloud.apihub.v1.Api.owner]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L102} + /// [google.cloud.apihub.v1.Api.target_user]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L129} + /// [google.cloud.apihub.v1.Api.team]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L139} + /// [google.cloud.apihub.v1.UpdateApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L581} + /// [google.cloud.apihub.v1.UpdateApiRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L590} + /// + // clang-format on + StatusOr UpdateApi( + google::cloud::apihub::v1::Api const& api, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update an API resource in the API hub. The following fields in the + /// [API][] can be updated: + /// + /// * [display_name][google.cloud.apihub.v1.Api.display_name] + /// * [description][google.cloud.apihub.v1.Api.description] + /// * [owner][google.cloud.apihub.v1.Api.owner] + /// * [documentation][google.cloud.apihub.v1.Api.documentation] + /// * [target_user][google.cloud.apihub.v1.Api.target_user] + /// * [team][google.cloud.apihub.v1.Api.team] + /// * [business_unit][google.cloud.apihub.v1.Api.business_unit] + /// * [maturity_level][google.cloud.apihub.v1.Api.maturity_level] + /// * [attributes][google.cloud.apihub.v1.Api.attributes] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateApiRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// Updating the owner field requires complete owner message + /// and updates both owner and email fields. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Api]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Api]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L78} + /// [google.cloud.apihub.v1.Api.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L165} + /// [google.cloud.apihub.v1.Api.business_unit]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L149} + /// [google.cloud.apihub.v1.Api.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L96} + /// [google.cloud.apihub.v1.Api.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L93} + /// [google.cloud.apihub.v1.Api.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L99} + /// [google.cloud.apihub.v1.Api.maturity_level]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L159} + /// [google.cloud.apihub.v1.Api.owner]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L102} + /// [google.cloud.apihub.v1.Api.target_user]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L129} + /// [google.cloud.apihub.v1.Api.team]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L139} + /// [google.cloud.apihub.v1.UpdateApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L581} + /// [google.cloud.apihub.v1.UpdateApiRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L590} + /// + // clang-format on + StatusOr UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Delete an API resource in the API hub. API can only be deleted if all + /// underlying versions are deleted. + /// + /// @param name Required. The name of the API resource to delete. + /// Format: `projects/{project}/locations/{location}/apis/{api}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L595} + /// + // clang-format on + Status DeleteApi(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Delete an API resource in the API hub. API can only be deleted if all + /// underlying versions are deleted. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L595} + /// + // clang-format on + Status DeleteApi(google::cloud::apihub::v1::DeleteApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Create an API version for an API resource in the API hub. + /// + /// @param parent Required. The parent resource for API version. + /// Format: `projects/{project}/locations/{location}/apis/{api}` + /// @param version Required. The version to create. + /// @param version_id Optional. The ID to use for the API version, which will become the final + /// component of the version's resource name. This field is optional. + /// @n + /// * If provided, the same will be used. The service will throw an error if + /// the specified id is already used by another version in the API resource. + /// * If not provided, a system generated id will be used. + /// @n + /// This value should be 4-500 characters, and valid characters + /// are /[a-z][A-Z][0-9]-_/. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Version]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L718} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// + // clang-format on + StatusOr CreateVersion( + std::string const& parent, + google::cloud::apihub::v1::Version const& version, + std::string const& version_id, Options opts = {}); + + // clang-format off + /// + /// Create an API version for an API resource in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateVersionRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Version]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L718} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// + // clang-format on + StatusOr CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get details about the API version of an API resource. This will include + /// information about the specs and operations present in the API + /// version as well as the deployments linked to it. + /// + /// @param name Required. The name of the API version to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Version]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L742} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// + // clang-format on + StatusOr GetVersion( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get details about the API version of an API resource. This will include + /// information about the specs and operations present in the API + /// version as well as the deployments linked to it. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetVersionRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Version]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L742} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// + // clang-format on + StatusOr GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List API versions of an API resource in the API hub. + /// + /// @param parent Required. The parent which owns this collection of API versions i.e., the + /// API resource Format: `projects/{project}/locations/{location}/apis/{api}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Version], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ListVersionsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L785} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// + // clang-format on + StreamRange ListVersions( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List API versions of an API resource in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListVersionsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Version], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ListVersionsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L785} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// + // clang-format on + StreamRange ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request, + Options opts = {}); + + // clang-format off + /// + /// Update API version. The following fields in the + /// [version][google.cloud.apihub.v1.Version] can be updated currently: + /// + /// * [display_name][google.cloud.apihub.v1.Version.display_name] + /// * [description][google.cloud.apihub.v1.Version.description] + /// * [documentation][google.cloud.apihub.v1.Version.documentation] + /// * [deployments][google.cloud.apihub.v1.Version.deployments] + /// * [lifecycle][google.cloud.apihub.v1.Version.lifecycle] + /// * [compliance][google.cloud.apihub.v1.Version.compliance] + /// * [accreditation][google.cloud.apihub.v1.Version.accreditation] + /// * [attributes][google.cloud.apihub.v1.Version.attributes] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateVersionRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param version Required. The API version to update. + /// @n + /// The version's `name` field is used to identify the API version to update. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}` + /// @param update_mask Required. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Version]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.UpdateVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L754} + /// [google.cloud.apihub.v1.UpdateVersionRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L763} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// [google.cloud.apihub.v1.Version.accreditation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L292} + /// [google.cloud.apihub.v1.Version.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L298} + /// [google.cloud.apihub.v1.Version.compliance]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L282} + /// [google.cloud.apihub.v1.Version.deployments]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L249} + /// [google.cloud.apihub.v1.Version.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L208} + /// [google.cloud.apihub.v1.Version.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L205} + /// [google.cloud.apihub.v1.Version.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L211} + /// [google.cloud.apihub.v1.Version.lifecycle]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L272} + /// + // clang-format on + StatusOr UpdateVersion( + google::cloud::apihub::v1::Version const& version, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update API version. The following fields in the + /// [version][google.cloud.apihub.v1.Version] can be updated currently: + /// + /// * [display_name][google.cloud.apihub.v1.Version.display_name] + /// * [description][google.cloud.apihub.v1.Version.description] + /// * [documentation][google.cloud.apihub.v1.Version.documentation] + /// * [deployments][google.cloud.apihub.v1.Version.deployments] + /// * [lifecycle][google.cloud.apihub.v1.Version.lifecycle] + /// * [compliance][google.cloud.apihub.v1.Version.compliance] + /// * [accreditation][google.cloud.apihub.v1.Version.accreditation] + /// * [attributes][google.cloud.apihub.v1.Version.attributes] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateVersionRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateVersionRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Version]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.UpdateVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L754} + /// [google.cloud.apihub.v1.UpdateVersionRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L763} + /// [google.cloud.apihub.v1.Version]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L190} + /// [google.cloud.apihub.v1.Version.accreditation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L292} + /// [google.cloud.apihub.v1.Version.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L298} + /// [google.cloud.apihub.v1.Version.compliance]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L282} + /// [google.cloud.apihub.v1.Version.deployments]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L249} + /// [google.cloud.apihub.v1.Version.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L208} + /// [google.cloud.apihub.v1.Version.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L205} + /// [google.cloud.apihub.v1.Version.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L211} + /// [google.cloud.apihub.v1.Version.lifecycle]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L272} + /// + // clang-format on + StatusOr UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Delete an API version. Version can only be deleted if all underlying specs, + /// operations, definitions and linked deployments are deleted. + /// + /// @param name Required. The name of the version to delete. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L769} + /// + // clang-format on + Status DeleteVersion(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Delete an API version. Version can only be deleted if all underlying specs, + /// operations, definitions and linked deployments are deleted. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteVersionRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteVersionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L769} + /// + // clang-format on + Status DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Add a spec to an API version in the API hub. + /// Multiple specs can be added to an API version. + /// Note, while adding a spec, at least one of `contents` or `source_uri` must + /// be provided. If `contents` is provided, then `spec_type` must also be + /// provided. + /// + /// On adding a spec with contents to the version, the operations present in it + /// will be added to the version.Note that the file contents in the spec should + /// be of the same type as defined in the + /// `projects/{project}/locations/{location}/attributes/system-spec-type` + /// attribute associated with spec resource. Note that specs of various types + /// can be uploaded, however parsing of details is supported for OpenAPI spec + /// currently. + /// + /// In order to access the information parsed from the spec, use the + /// [GetSpec][google.cloud.apihub.v1.ApiHub.GetSpec] method. + /// In order to access the raw contents for a particular spec, use the + /// [GetSpecContents][google.cloud.apihub.v1.ApiHub.GetSpecContents] method. + /// In order to access the operations parsed from the spec, use the + /// [ListAPIOperations][google.cloud.apihub.v1.ApiHub.ListApiOperations] + /// method. + /// + /// @param parent Required. The parent resource for Spec. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}` + /// @param spec Required. The spec to create. + /// @param spec_id Optional. The ID to use for the spec, which will become the final component + /// of the spec's resource name. This field is optional. + /// @n + /// * If provided, the same will be used. The service will throw an error if + /// the specified id is already used by another spec in the API + /// resource. + /// * If not provided, a system generated id will be used. + /// @n + /// This value should be 4-500 characters, and valid characters + /// are /[a-z][A-Z][0-9]-_/. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Spec]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHub.GetSpec]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L195} + /// [google.cloud.apihub.v1.ApiHub.GetSpecContents]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L203} + /// [google.cloud.apihub.v1.ApiHub.ListApiOperations]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L267} + /// [google.cloud.apihub.v1.CreateSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L882} + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// + // clang-format on + StatusOr CreateSpec( + std::string const& parent, google::cloud::apihub::v1::Spec const& spec, + std::string const& spec_id, Options opts = {}); + + // clang-format off + /// + /// Add a spec to an API version in the API hub. + /// Multiple specs can be added to an API version. + /// Note, while adding a spec, at least one of `contents` or `source_uri` must + /// be provided. If `contents` is provided, then `spec_type` must also be + /// provided. + /// + /// On adding a spec with contents to the version, the operations present in it + /// will be added to the version.Note that the file contents in the spec should + /// be of the same type as defined in the + /// `projects/{project}/locations/{location}/attributes/system-spec-type` + /// attribute associated with spec resource. Note that specs of various types + /// can be uploaded, however parsing of details is supported for OpenAPI spec + /// currently. + /// + /// In order to access the information parsed from the spec, use the + /// [GetSpec][google.cloud.apihub.v1.ApiHub.GetSpec] method. + /// In order to access the raw contents for a particular spec, use the + /// [GetSpecContents][google.cloud.apihub.v1.ApiHub.GetSpecContents] method. + /// In order to access the operations parsed from the spec, use the + /// [ListAPIOperations][google.cloud.apihub.v1.ApiHub.ListApiOperations] + /// method. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateSpecRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Spec]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHub.GetSpec]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L195} + /// [google.cloud.apihub.v1.ApiHub.GetSpecContents]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L203} + /// [google.cloud.apihub.v1.ApiHub.ListApiOperations]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L267} + /// [google.cloud.apihub.v1.CreateSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L882} + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// + // clang-format on + StatusOr CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get details about the information parsed from a spec. + /// Note that this method does not return the raw spec contents. + /// Use [GetSpecContents][google.cloud.apihub.v1.ApiHub.GetSpecContents] method + /// to retrieve the same. + /// + /// @param name Required. The name of the spec to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}/specs/{spec}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Spec]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHub.GetSpecContents]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L203} + /// [google.cloud.apihub.v1.GetSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L908} + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// + // clang-format on + StatusOr GetSpec(std::string const& name, + Options opts = {}); + + // clang-format off + /// + /// Get details about the information parsed from a spec. + /// Note that this method does not return the raw spec contents. + /// Use [GetSpecContents][google.cloud.apihub.v1.ApiHub.GetSpecContents] method + /// to retrieve the same. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetSpecRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Spec]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHub.GetSpecContents]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L203} + /// [google.cloud.apihub.v1.GetSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L908} + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// + // clang-format on + StatusOr GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get spec contents. + /// + /// @param name Required. The name of the spec whose contents need to be retrieved. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}/specs/{spec}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.SpecContents]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetSpecContentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1034} + /// [google.cloud.apihub.v1.SpecContents]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L757} + /// + // clang-format on + StatusOr GetSpecContents( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get spec contents. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetSpecContentsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.SpecContents]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetSpecContentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1034} + /// [google.cloud.apihub.v1.SpecContents]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L757} + /// + // clang-format on + StatusOr GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List specs corresponding to a particular API resource. + /// + /// @param parent Required. The parent, which owns this collection of specs. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Spec], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ListSpecsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L944} + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// + // clang-format on + StreamRange ListSpecs( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List specs corresponding to a particular API resource. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListSpecsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Spec], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ListSpecsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L944} + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// + // clang-format on + StreamRange ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request, Options opts = {}); + + // clang-format off + /// + /// Update spec. The following fields in the + /// [spec][google.cloud.apihub.v1.Spec] can be updated: + /// + /// * [display_name][google.cloud.apihub.v1.Spec.display_name] + /// * [source_uri][google.cloud.apihub.v1.Spec.source_uri] + /// * [lint_response][google.cloud.apihub.v1.Spec.lint_response] + /// * [attributes][google.cloud.apihub.v1.Spec.attributes] + /// * [contents][google.cloud.apihub.v1.Spec.contents] + /// * [spec_type][google.cloud.apihub.v1.Spec.spec_type] + /// + /// In case of an OAS spec, updating spec contents can lead to: + /// 1. Creation, deletion and update of operations. + /// 2. Creation, deletion and update of definitions. + /// 3. Update of other info parsed out from the new spec. + /// + /// In case of contents or source_uri being present in update mask, spec_type + /// must also be present. Also, spec_type can not be present in update mask if + /// contents or source_uri is not present. + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateSpecRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param spec Required. The spec to update. + /// @n + /// The spec's `name` field is used to identify the spec to + /// update. Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}/specs/{spec}` + /// @param update_mask Required. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Spec]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// [google.cloud.apihub.v1.Spec.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L394} + /// [google.cloud.apihub.v1.Spec.contents]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L367} + /// [google.cloud.apihub.v1.Spec.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L353} + /// [google.cloud.apihub.v1.Spec.lint_response]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L388} + /// [google.cloud.apihub.v1.Spec.source_uri]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L377} + /// [google.cloud.apihub.v1.Spec.spec_type]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L364} + /// [google.cloud.apihub.v1.UpdateSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L919} + /// [google.cloud.apihub.v1.UpdateSpecRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L928} + /// + // clang-format on + StatusOr UpdateSpec( + google::cloud::apihub::v1::Spec const& spec, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update spec. The following fields in the + /// [spec][google.cloud.apihub.v1.Spec] can be updated: + /// + /// * [display_name][google.cloud.apihub.v1.Spec.display_name] + /// * [source_uri][google.cloud.apihub.v1.Spec.source_uri] + /// * [lint_response][google.cloud.apihub.v1.Spec.lint_response] + /// * [attributes][google.cloud.apihub.v1.Spec.attributes] + /// * [contents][google.cloud.apihub.v1.Spec.contents] + /// * [spec_type][google.cloud.apihub.v1.Spec.spec_type] + /// + /// In case of an OAS spec, updating spec contents can lead to: + /// 1. Creation, deletion and update of operations. + /// 2. Creation, deletion and update of definitions. + /// 3. Update of other info parsed out from the new spec. + /// + /// In case of contents or source_uri being present in update mask, spec_type + /// must also be present. Also, spec_type can not be present in update mask if + /// contents or source_uri is not present. + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateSpecRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateSpecRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Spec]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Spec]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L317} + /// [google.cloud.apihub.v1.Spec.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L394} + /// [google.cloud.apihub.v1.Spec.contents]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L367} + /// [google.cloud.apihub.v1.Spec.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L353} + /// [google.cloud.apihub.v1.Spec.lint_response]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L388} + /// [google.cloud.apihub.v1.Spec.source_uri]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L377} + /// [google.cloud.apihub.v1.Spec.spec_type]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L364} + /// [google.cloud.apihub.v1.UpdateSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L919} + /// [google.cloud.apihub.v1.UpdateSpecRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L928} + /// + // clang-format on + StatusOr UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Delete a spec. + /// Deleting a spec will also delete the associated operations from the + /// version. + /// + /// @param name Required. The name of the spec to delete. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}/specs/{spec}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L933} + /// + // clang-format on + Status DeleteSpec(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Delete a spec. + /// Deleting a spec will also delete the associated operations from the + /// version. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteSpecRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L933} + /// + // clang-format on + Status DeleteSpec(google::cloud::apihub::v1::DeleteSpecRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get details about a particular operation in API version. + /// + /// @param name Required. The name of the operation to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}/operations/{operation}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ApiOperation]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiOperation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L503} + /// [google.cloud.apihub.v1.GetApiOperationRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1046} + /// + // clang-format on + StatusOr GetApiOperation( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get details about a particular operation in API version. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetApiOperationRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ApiOperation]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiOperation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L503} + /// [google.cloud.apihub.v1.GetApiOperationRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1046} + /// + // clang-format on + StatusOr GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List operations in an API version. + /// + /// @param parent Required. The parent which owns this collection of operations i.e., the API + /// version. Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.ApiOperation], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiOperation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L503} + /// [google.cloud.apihub.v1.ListApiOperationsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1060} + /// + // clang-format on + StreamRange ListApiOperations( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List operations in an API version. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListApiOperationsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.ApiOperation], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiOperation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L503} + /// [google.cloud.apihub.v1.ListApiOperationsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1060} + /// + // clang-format on + StreamRange ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request, + Options opts = {}); + + // clang-format off + /// + /// Get details about a definition in an API version. + /// + /// @param name Required. The name of the definition to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/apis/{api}/versions/{version}/definitions/{definition}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Definition]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Definition]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L551} + /// [google.cloud.apihub.v1.GetDefinitionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1143} + /// + // clang-format on + StatusOr GetDefinition( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get details about a definition in an API version. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetDefinitionRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Definition]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Definition]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L551} + /// [google.cloud.apihub.v1.GetDefinitionRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1143} + /// + // clang-format on + StatusOr GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Create a deployment resource in the API hub. + /// Once a deployment resource is created, it can be associated with API + /// versions. + /// + /// @param parent Required. The parent resource for the deployment resource. + /// Format: `projects/{project}/locations/{location}` + /// @param deployment Required. The deployment resource to create. + /// @param deployment_id Optional. The ID to use for the deployment resource, which will become the + /// final component of the deployment's resource name. This field is optional. + /// @n + /// * If provided, the same will be used. The service will throw an error if + /// the specified id is already used by another deployment resource in the API + /// hub. + /// * If not provided, a system generated id will be used. + /// @n + /// This value should be 4-500 characters, and valid characters + /// are /[a-z][A-Z][0-9]-_/. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Deployment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1157} + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// + // clang-format on + StatusOr CreateDeployment( + std::string const& parent, + google::cloud::apihub::v1::Deployment const& deployment, + std::string const& deployment_id, Options opts = {}); + + // clang-format off + /// + /// Create a deployment resource in the API hub. + /// Once a deployment resource is created, it can be associated with API + /// versions. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateDeploymentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Deployment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1157} + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// + // clang-format on + StatusOr CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get details about a deployment and the API versions linked to it. + /// + /// @param name Required. The name of the deployment resource to retrieve. + /// Format: `projects/{project}/locations/{location}/deployments/{deployment}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Deployment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// [google.cloud.apihub.v1.GetDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1185} + /// + // clang-format on + StatusOr GetDeployment( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get details about a deployment and the API versions linked to it. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetDeploymentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Deployment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// [google.cloud.apihub.v1.GetDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1185} + /// + // clang-format on + StatusOr GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List deployment resources in the API hub. + /// + /// @param parent Required. The parent, which owns this collection of deployment resources. + /// Format: `projects/{project}/locations/{location}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Deployment], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// [google.cloud.apihub.v1.ListDeploymentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1226} + /// + // clang-format on + StreamRange ListDeployments( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List deployment resources in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListDeploymentsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Deployment], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// [google.cloud.apihub.v1.ListDeploymentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1226} + /// + // clang-format on + StreamRange ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request, + Options opts = {}); + + // clang-format off + /// + /// Update a deployment resource in the API hub. The following fields in the + /// [deployment resource][google.cloud.apihub.v1.Deployment] can be + /// updated: + /// + /// * [display_name][google.cloud.apihub.v1.Deployment.display_name] + /// * [description][google.cloud.apihub.v1.Deployment.description] + /// * [documentation][google.cloud.apihub.v1.Deployment.documentation] + /// * [deployment_type][google.cloud.apihub.v1.Deployment.deployment_type] + /// * [resource_uri][google.cloud.apihub.v1.Deployment.resource_uri] + /// * [endpoints][google.cloud.apihub.v1.Deployment.endpoints] + /// * [slo][google.cloud.apihub.v1.Deployment.slo] + /// * [environment][google.cloud.apihub.v1.Deployment.environment] + /// * [attributes][google.cloud.apihub.v1.Deployment.attributes] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateDeploymentRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param deployment Required. The deployment resource to update. + /// @n + /// The deployment resource's `name` field is used to identify the deployment + /// resource to update. + /// Format: `projects/{project}/locations/{location}/deployments/{deployment}` + /// @param update_mask Required. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Deployment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// [google.cloud.apihub.v1.Deployment.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L494} + /// [google.cloud.apihub.v1.Deployment.deployment_type]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L445} + /// [google.cloud.apihub.v1.Deployment.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L432} + /// [google.cloud.apihub.v1.Deployment.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L429} + /// [google.cloud.apihub.v1.Deployment.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L435} + /// [google.cloud.apihub.v1.Deployment.endpoints]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L455} + /// [google.cloud.apihub.v1.Deployment.environment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L488} + /// [google.cloud.apihub.v1.Deployment.resource_uri]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L450} + /// [google.cloud.apihub.v1.Deployment.slo]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L478} + /// [google.cloud.apihub.v1.UpdateDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1198} + /// [google.cloud.apihub.v1.UpdateDeploymentRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1207} + /// + // clang-format on + StatusOr UpdateDeployment( + google::cloud::apihub::v1::Deployment const& deployment, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update a deployment resource in the API hub. The following fields in the + /// [deployment resource][google.cloud.apihub.v1.Deployment] can be + /// updated: + /// + /// * [display_name][google.cloud.apihub.v1.Deployment.display_name] + /// * [description][google.cloud.apihub.v1.Deployment.description] + /// * [documentation][google.cloud.apihub.v1.Deployment.documentation] + /// * [deployment_type][google.cloud.apihub.v1.Deployment.deployment_type] + /// * [resource_uri][google.cloud.apihub.v1.Deployment.resource_uri] + /// * [endpoints][google.cloud.apihub.v1.Deployment.endpoints] + /// * [slo][google.cloud.apihub.v1.Deployment.slo] + /// * [environment][google.cloud.apihub.v1.Deployment.environment] + /// * [attributes][google.cloud.apihub.v1.Deployment.attributes] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateDeploymentRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateDeploymentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Deployment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Deployment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L414} + /// [google.cloud.apihub.v1.Deployment.attributes]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L494} + /// [google.cloud.apihub.v1.Deployment.deployment_type]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L445} + /// [google.cloud.apihub.v1.Deployment.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L432} + /// [google.cloud.apihub.v1.Deployment.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L429} + /// [google.cloud.apihub.v1.Deployment.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L435} + /// [google.cloud.apihub.v1.Deployment.endpoints]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L455} + /// [google.cloud.apihub.v1.Deployment.environment]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L488} + /// [google.cloud.apihub.v1.Deployment.resource_uri]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L450} + /// [google.cloud.apihub.v1.Deployment.slo]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L478} + /// [google.cloud.apihub.v1.UpdateDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1198} + /// [google.cloud.apihub.v1.UpdateDeploymentRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1207} + /// + // clang-format on + StatusOr UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Delete a deployment resource in the API hub. + /// + /// @param name Required. The name of the deployment resource to delete. + /// Format: `projects/{project}/locations/{location}/deployments/{deployment}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1213} + /// + // clang-format on + Status DeleteDeployment(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Delete a deployment resource in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteDeploymentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteDeploymentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1213} + /// + // clang-format on + Status DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Create a user defined attribute. + /// + /// Certain pre defined attributes are already created by the API hub. These + /// attributes will have type as `SYSTEM_DEFINED` and can be listed via + /// [ListAttributes][google.cloud.apihub.v1.ApiHub.ListAttributes] method. + /// Allowed values for the same can be updated via + /// [UpdateAttribute][google.cloud.apihub.v1.ApiHub.UpdateAttribute] method. + /// + /// @param parent Required. The parent resource for Attribute. + /// Format: `projects/{project}/locations/{location}` + /// @param attribute Required. The attribute to create. + /// @param attribute_id Optional. The ID to use for the attribute, which will become the final + /// component of the attribute's resource name. This field is optional. + /// @n + /// * If provided, the same will be used. The service will throw an error if + /// the specified id is already used by another attribute resource in the API + /// hub. + /// * If not provided, a system generated id will be used. + /// @n + /// This value should be 4-500 characters, and valid characters + /// are /[a-z][A-Z][0-9]-_/. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Attribute]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHub.ListAttributes]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L412} + /// [google.cloud.apihub.v1.ApiHub.UpdateAttribute]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L391} + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.CreateAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1323} + /// + // clang-format on + StatusOr CreateAttribute( + std::string const& parent, + google::cloud::apihub::v1::Attribute const& attribute, + std::string const& attribute_id, Options opts = {}); + + // clang-format off + /// + /// Create a user defined attribute. + /// + /// Certain pre defined attributes are already created by the API hub. These + /// attributes will have type as `SYSTEM_DEFINED` and can be listed via + /// [ListAttributes][google.cloud.apihub.v1.ApiHub.ListAttributes] method. + /// Allowed values for the same can be updated via + /// [UpdateAttribute][google.cloud.apihub.v1.ApiHub.UpdateAttribute] method. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateAttributeRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Attribute]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHub.ListAttributes]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L412} + /// [google.cloud.apihub.v1.ApiHub.UpdateAttribute]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L391} + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.CreateAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1323} + /// + // clang-format on + StatusOr CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get details about the attribute. + /// + /// @param name Required. The name of the attribute to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/attributes/{attribute}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Attribute]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.GetAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1351} + /// + // clang-format on + StatusOr GetAttribute( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get details about the attribute. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetAttributeRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Attribute]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.GetAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1351} + /// + // clang-format on + StatusOr GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Update the attribute. The following fields in the + /// [Attribute resource][google.cloud.apihub.v1.Attribute] can be updated: + /// + /// * [display_name][google.cloud.apihub.v1.Attribute.display_name] + /// The display name can be updated for user defined attributes only. + /// * [description][google.cloud.apihub.v1.Attribute.description] + /// The description can be updated for user defined attributes only. + /// * [allowed_values][google.cloud.apihub.v1.Attribute.allowed_values] + /// To update the list of allowed values, clients need to use the fetched list + /// of allowed values and add or remove values to or from the same list. + /// The mutable allowed values can be updated for both user defined and System + /// defined attributes. The immutable allowed values cannot be updated or + /// deleted. The updated list of allowed values cannot be empty. If an allowed + /// value that is already used by some resource's attribute is deleted, then + /// the association between the resource and the attribute value will also be + /// deleted. + /// * [cardinality][google.cloud.apihub.v1.Attribute.cardinality] + /// The cardinality can be updated for user defined attributes only. + /// Cardinality can only be increased during an update. + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateAttributeRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param attribute Required. The attribute to update. + /// @n + /// The attribute's `name` field is used to identify the attribute to update. + /// Format: + /// `projects/{project}/locations/{location}/attributes/{attribute}` + /// @param update_mask Required. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Attribute]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.Attribute.allowed_values]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L732} + /// [google.cloud.apihub.v1.Attribute.cardinality]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L740} + /// [google.cloud.apihub.v1.Attribute.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L716} + /// [google.cloud.apihub.v1.Attribute.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L713} + /// [google.cloud.apihub.v1.UpdateAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1365} + /// [google.cloud.apihub.v1.UpdateAttributeRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1374} + /// + // clang-format on + StatusOr UpdateAttribute( + google::cloud::apihub::v1::Attribute const& attribute, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update the attribute. The following fields in the + /// [Attribute resource][google.cloud.apihub.v1.Attribute] can be updated: + /// + /// * [display_name][google.cloud.apihub.v1.Attribute.display_name] + /// The display name can be updated for user defined attributes only. + /// * [description][google.cloud.apihub.v1.Attribute.description] + /// The description can be updated for user defined attributes only. + /// * [allowed_values][google.cloud.apihub.v1.Attribute.allowed_values] + /// To update the list of allowed values, clients need to use the fetched list + /// of allowed values and add or remove values to or from the same list. + /// The mutable allowed values can be updated for both user defined and System + /// defined attributes. The immutable allowed values cannot be updated or + /// deleted. The updated list of allowed values cannot be empty. If an allowed + /// value that is already used by some resource's attribute is deleted, then + /// the association between the resource and the attribute value will also be + /// deleted. + /// * [cardinality][google.cloud.apihub.v1.Attribute.cardinality] + /// The cardinality can be updated for user defined attributes only. + /// Cardinality can only be increased during an update. + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateAttributeRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateAttributeRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Attribute]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.Attribute.allowed_values]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L732} + /// [google.cloud.apihub.v1.Attribute.cardinality]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L740} + /// [google.cloud.apihub.v1.Attribute.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L716} + /// [google.cloud.apihub.v1.Attribute.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L713} + /// [google.cloud.apihub.v1.UpdateAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1365} + /// [google.cloud.apihub.v1.UpdateAttributeRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1374} + /// + // clang-format on + StatusOr UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Delete an attribute. + /// + /// Note: System defined attributes cannot be deleted. All + /// associations of the attribute being deleted with any API hub resource will + /// also get deleted. + /// + /// @param name Required. The name of the attribute to delete. + /// Format: + /// `projects/{project}/locations/{location}/attributes/{attribute}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1380} + /// + // clang-format on + Status DeleteAttribute(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Delete an attribute. + /// + /// Note: System defined attributes cannot be deleted. All + /// associations of the attribute being deleted with any API hub resource will + /// also get deleted. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteAttributeRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteAttributeRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1380} + /// + // clang-format on + Status DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List all attributes. + /// + /// @param parent Required. The parent resource for Attribute. + /// Format: `projects/{project}/locations/{location}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Attribute], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.ListAttributesRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1394} + /// + // clang-format on + StreamRange ListAttributes( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List all attributes. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListAttributesRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Attribute], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Attribute]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L610} + /// [google.cloud.apihub.v1.ListAttributesRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1394} + /// + // clang-format on + StreamRange ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request, + Options opts = {}); + + // clang-format off + /// + /// Search across API-Hub resources. + /// + /// @param location Required. The resource name of the location which will be of the type + /// `projects/{project_id}/locations/{location_id}`. This field is used to + /// identify the instance of API-Hub in which resources should be searched. + /// @param query Required. The free text search query. This query can contain keywords which + /// could be related to any detail of the API-Hub resources such display names, + /// descriptions, attributes etc. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.SearchResult], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.SearchResourcesRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1476} + /// [google.cloud.apihub.v1.SearchResult]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1562} + /// + // clang-format on + StreamRange SearchResources( + std::string const& location, std::string const& query, Options opts = {}); + + // clang-format off + /// + /// Search across API-Hub resources. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.SearchResourcesRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.SearchResult], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.SearchResourcesRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1476} + /// [google.cloud.apihub.v1.SearchResult]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1562} + /// + // clang-format on + StreamRange SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request, + Options opts = {}); + + // clang-format off + /// + /// Create an External API resource in the API hub. + /// + /// @param parent Required. The parent resource for the External API resource. + /// Format: `projects/{project}/locations/{location}` + /// @param external_api Required. The External API resource to create. + /// @param external_api_id Optional. The ID to use for the External API resource, which will become + /// the final component of the External API's resource name. This field is + /// optional. + /// @n + /// * If provided, the same will be used. The service will throw an error if + /// the specified id is already used by another External API resource in the + /// API hub. + /// * If not provided, a system generated id will be used. + /// @n + /// This value should be 4-500 characters, and valid characters + /// are /[a-z][A-Z][0-9]-_/. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ExternalApi]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1729} + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// + // clang-format on + StatusOr CreateExternalApi( + std::string const& parent, + google::cloud::apihub::v1::ExternalApi const& external_api, + std::string const& external_api_id, Options opts = {}); + + // clang-format off + /// + /// Create an External API resource in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateExternalApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ExternalApi]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1729} + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// + // clang-format on + StatusOr CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get details about an External API resource in the API hub. + /// + /// @param name Required. The name of the External API resource to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/externalApis/{externalApi}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ExternalApi]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// [google.cloud.apihub.v1.GetExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1758} + /// + // clang-format on + StatusOr GetExternalApi( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get details about an External API resource in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetExternalApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ExternalApi]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// [google.cloud.apihub.v1.GetExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1758} + /// + // clang-format on + StatusOr GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Update an External API resource in the API hub. The following fields can be + /// updated: + /// + /// * [display_name][google.cloud.apihub.v1.ExternalApi.display_name] + /// * [description][google.cloud.apihub.v1.ExternalApi.description] + /// * [documentation][google.cloud.apihub.v1.ExternalApi.documentation] + /// * [endpoints][google.cloud.apihub.v1.ExternalApi.endpoints] + /// * [paths][google.cloud.apihub.v1.ExternalApi.paths] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateExternalApiRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param external_api Required. The External API resource to update. + /// @n + /// The External API resource's `name` field is used to identify the External + /// API resource to update. Format: + /// `projects/{project}/locations/{location}/externalApis/{externalApi}` + /// @param update_mask Required. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ExternalApi]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// [google.cloud.apihub.v1.ExternalApi.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1272} + /// [google.cloud.apihub.v1.ExternalApi.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1268} + /// [google.cloud.apihub.v1.ExternalApi.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1281} + /// [google.cloud.apihub.v1.ExternalApi.endpoints]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1275} + /// [google.cloud.apihub.v1.ExternalApi.paths]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1278} + /// [google.cloud.apihub.v1.UpdateExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1772} + /// [google.cloud.apihub.v1.UpdateExternalApiRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1781} + /// + // clang-format on + StatusOr UpdateExternalApi( + google::cloud::apihub::v1::ExternalApi const& external_api, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update an External API resource in the API hub. The following fields can be + /// updated: + /// + /// * [display_name][google.cloud.apihub.v1.ExternalApi.display_name] + /// * [description][google.cloud.apihub.v1.ExternalApi.description] + /// * [documentation][google.cloud.apihub.v1.ExternalApi.documentation] + /// * [endpoints][google.cloud.apihub.v1.ExternalApi.endpoints] + /// * [paths][google.cloud.apihub.v1.ExternalApi.paths] + /// + /// The + /// [update_mask][google.cloud.apihub.v1.UpdateExternalApiRequest.update_mask] + /// should be used to specify the fields being updated. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateExternalApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ExternalApi]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// [google.cloud.apihub.v1.ExternalApi.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1272} + /// [google.cloud.apihub.v1.ExternalApi.display_name]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1268} + /// [google.cloud.apihub.v1.ExternalApi.documentation]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1281} + /// [google.cloud.apihub.v1.ExternalApi.endpoints]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1275} + /// [google.cloud.apihub.v1.ExternalApi.paths]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1278} + /// [google.cloud.apihub.v1.UpdateExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1772} + /// [google.cloud.apihub.v1.UpdateExternalApiRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1781} + /// + // clang-format on + StatusOr UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Delete an External API resource in the API hub. + /// + /// @param name Required. The name of the External API resource to delete. + /// Format: + /// `projects/{project}/locations/{location}/externalApis/{externalApi}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1787} + /// + // clang-format on + Status DeleteExternalApi(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Delete an External API resource in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteExternalApiRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteExternalApiRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1787} + /// + // clang-format on + Status DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List External API resources in the API hub. + /// + /// @param parent Required. The parent, which owns this collection of External API resources. + /// Format: `projects/{project}/locations/{location}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.ExternalApi], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// [google.cloud.apihub.v1.ListExternalApisRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1801} + /// + // clang-format on + StreamRange ListExternalApis( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List External API resources in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListExternalApisRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.ExternalApi], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ExternalApi]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1254} + /// [google.cloud.apihub.v1.ListExternalApisRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1801} + /// + // clang-format on + StreamRange ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CLIENT_H diff --git a/google/cloud/apihub/v1/api_hub_connection.cc b/google/cloud/apihub/v1/api_hub_connection.cc new file mode 100644 index 0000000000000..3b4eda4535bfd --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_connection.cc @@ -0,0 +1,263 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_connection.h" +#include "google/cloud/apihub/v1/api_hub_options.h" +#include "google/cloud/apihub/v1/internal/api_hub_connection_impl.h" +#include "google/cloud/apihub/v1/internal/api_hub_option_defaults.h" +#include "google/cloud/apihub/v1/internal/api_hub_stub_factory.h" +#include "google/cloud/apihub/v1/internal/api_hub_tracing_connection.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubConnection::~ApiHubConnection() = default; + +StatusOr ApiHubConnection::CreateApi( + google::cloud::apihub::v1::CreateApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr ApiHubConnection::GetApi( + google::cloud::apihub::v1::GetApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange ApiHubConnection::ListApis( + google::cloud::apihub::v1:: + ListApisRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr ApiHubConnection::UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ApiHubConnection::DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr ApiHubConnection::CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr ApiHubConnection::GetVersion( + google::cloud::apihub::v1::GetVersionRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange ApiHubConnection::ListVersions( + google::cloud::apihub::v1:: + ListVersionsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr ApiHubConnection::UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ApiHubConnection::DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr ApiHubConnection::CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr ApiHubConnection::GetSpec( + google::cloud::apihub::v1::GetSpecRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubConnection::GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange ApiHubConnection::ListSpecs( + google::cloud::apihub::v1:: + ListSpecsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr ApiHubConnection::UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ApiHubConnection::DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubConnection::GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +ApiHubConnection::ListApiOperations( + google::cloud::apihub::v1:: + ListApiOperationsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr ApiHubConnection::GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubConnection::CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr ApiHubConnection::GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +ApiHubConnection::ListDeployments( + google::cloud::apihub::v1:: + ListDeploymentsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr +ApiHubConnection::UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ApiHubConnection::DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubConnection::CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr ApiHubConnection::GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubConnection::UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ApiHubConnection::DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +ApiHubConnection::ListAttributes( + google::cloud::apihub::v1:: + ListAttributesRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StreamRange +ApiHubConnection::SearchResources( + google::cloud::apihub::v1:: + SearchResourcesRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +StatusOr +ApiHubConnection::CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubConnection::GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubConnection::UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ApiHubConnection::DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +ApiHubConnection::ListExternalApis( + google::cloud::apihub::v1:: + ListExternalApisRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +std::shared_ptr MakeApiHubConnection(Options options) { + internal::CheckExpectedOptions(options, __func__); + options = apihub_v1_internal::ApiHubDefaultOptions(std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = + apihub_v1_internal::CreateDefaultApiHubStub(std::move(auth), options); + return apihub_v1_internal::MakeApiHubTracingConnection( + std::make_shared( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_connection.h b/google/cloud/apihub/v1/api_hub_connection.h new file mode 100644 index 0000000000000..c50af7eb22697 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_connection.h @@ -0,0 +1,316 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/internal/api_hub_retry_traits.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `ApiHubConnection`. +class ApiHubRetryPolicy : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() const = 0; +}; + +/** + * A retry policy for `ApiHubConnection` based on counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ApiHubLimitedErrorCountRetryPolicy : public ApiHubRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit ApiHubLimitedErrorCountRetryPolicy(int maximum_failures) + : impl_(maximum_failures) {} + + ApiHubLimitedErrorCountRetryPolicy( + ApiHubLimitedErrorCountRetryPolicy&& rhs) noexcept + : ApiHubLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + ApiHubLimitedErrorCountRetryPolicy( + ApiHubLimitedErrorCountRetryPolicy const& rhs) noexcept + : ApiHubLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = ApiHubRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + apihub_v1_internal::ApiHubRetryTraits> + impl_; +}; + +/** + * A retry policy for `ApiHubConnection` based on elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ApiHubLimitedTimeRetryPolicy : public ApiHubRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit ApiHubLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + ApiHubLimitedTimeRetryPolicy(ApiHubLimitedTimeRetryPolicy&& rhs) noexcept + : ApiHubLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + ApiHubLimitedTimeRetryPolicy(ApiHubLimitedTimeRetryPolicy const& rhs) noexcept + : ApiHubLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique(maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = ApiHubRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + apihub_v1_internal::ApiHubRetryTraits> + impl_; +}; + +/** + * The `ApiHubConnection` object for `ApiHubClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `ApiHubClient`. This allows users to inject custom behavior + * (e.g., with a Google Mock object) when writing tests that use objects of type + * `ApiHubClient`. + * + * To create a concrete instance, see `MakeApiHubConnection()`. + * + * For mocking, see `apihub_v1_mocks::MockApiHubConnection`. + */ +class ApiHubConnection { + public: + virtual ~ApiHubConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual StatusOr CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request); + + virtual StatusOr GetApi( + google::cloud::apihub::v1::GetApiRequest const& request); + + virtual StreamRange ListApis( + google::cloud::apihub::v1::ListApisRequest request); + + virtual StatusOr UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request); + + virtual Status DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const& request); + + virtual StatusOr CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request); + + virtual StatusOr GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request); + + virtual StreamRange ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request); + + virtual StatusOr UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request); + + virtual Status DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request); + + virtual StatusOr CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request); + + virtual StatusOr GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request); + + virtual StatusOr GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request); + + virtual StreamRange ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request); + + virtual StatusOr UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request); + + virtual Status DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const& request); + + virtual StatusOr GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request); + + virtual StreamRange + ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request); + + virtual StatusOr GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request); + + virtual StatusOr CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request); + + virtual StatusOr GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request); + + virtual StreamRange ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request); + + virtual StatusOr UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request); + + virtual Status DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request); + + virtual StatusOr CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request); + + virtual StatusOr GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request); + + virtual StatusOr UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request); + + virtual Status DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request); + + virtual StreamRange ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request); + + virtual StreamRange SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request); + + virtual StatusOr CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request); + + virtual StatusOr GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request); + + virtual StatusOr UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request); + + virtual Status DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request); + + virtual StreamRange ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request); +}; + +/** + * A factory function to construct an object of type `ApiHubConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of ApiHubClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `ApiHubConnection`. Expected options are any of the types in + * the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::apihub_v1::ApiHubPolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the `ApiHubConnection` created by + * this function. + */ +std::shared_ptr MakeApiHubConnection(Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CONNECTION_H diff --git a/google/cloud/apihub/v1/api_hub_connection_idempotency_policy.cc b/google/cloud/apihub/v1/api_hub_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..fbfd52f541176 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_connection_idempotency_policy.cc @@ -0,0 +1,220 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +ApiHubConnectionIdempotencyPolicy::~ApiHubConnectionIdempotencyPolicy() = + default; + +std::unique_ptr +ApiHubConnectionIdempotencyPolicy::clone() const { + return std::make_unique(*this); +} + +Idempotency ApiHubConnectionIdempotencyPolicy::CreateApi( + google::cloud::apihub::v1::CreateApiRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetApi( + google::cloud::apihub::v1::GetApiRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::ListApis( + google::cloud::apihub::v1::ListApisRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetVersion( + google::cloud::apihub::v1::GetVersionRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::ListVersions( + google::cloud::apihub::v1::ListVersionsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetSpec( + google::cloud::apihub::v1::GetSpecRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest) { // NOLINT + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubConnectionIdempotencyPolicy::ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +std::unique_ptr +MakeDefaultApiHubConnectionIdempotencyPolicy() { + return std::make_unique(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h b/google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h new file mode 100644 index 0000000000000..e4eee761b8756 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h @@ -0,0 +1,153 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubConnectionIdempotencyPolicy { + public: + virtual ~ApiHubConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr clone() const; + + virtual google::cloud::Idempotency CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request); + + virtual google::cloud::Idempotency GetApi( + google::cloud::apihub::v1::GetApiRequest const& request); + + virtual google::cloud::Idempotency ListApis( + google::cloud::apihub::v1::ListApisRequest request); + + virtual google::cloud::Idempotency UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request); + + virtual google::cloud::Idempotency DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const& request); + + virtual google::cloud::Idempotency CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request); + + virtual google::cloud::Idempotency GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request); + + virtual google::cloud::Idempotency ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request); + + virtual google::cloud::Idempotency UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request); + + virtual google::cloud::Idempotency DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request); + + virtual google::cloud::Idempotency CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request); + + virtual google::cloud::Idempotency GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request); + + virtual google::cloud::Idempotency GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request); + + virtual google::cloud::Idempotency ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request); + + virtual google::cloud::Idempotency UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request); + + virtual google::cloud::Idempotency DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const& request); + + virtual google::cloud::Idempotency GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request); + + virtual google::cloud::Idempotency ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request); + + virtual google::cloud::Idempotency GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request); + + virtual google::cloud::Idempotency CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request); + + virtual google::cloud::Idempotency GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request); + + virtual google::cloud::Idempotency ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request); + + virtual google::cloud::Idempotency UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request); + + virtual google::cloud::Idempotency DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request); + + virtual google::cloud::Idempotency CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request); + + virtual google::cloud::Idempotency GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request); + + virtual google::cloud::Idempotency UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request); + + virtual google::cloud::Idempotency DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request); + + virtual google::cloud::Idempotency ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request); + + virtual google::cloud::Idempotency SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request); + + virtual google::cloud::Idempotency CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request); + + virtual google::cloud::Idempotency GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request); + + virtual google::cloud::Idempotency UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request); + + virtual google::cloud::Idempotency DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request); + + virtual google::cloud::Idempotency ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request); +}; + +std::unique_ptr +MakeDefaultApiHubConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/apihub/v1/api_hub_dependencies_client.cc b/google/cloud/apihub/v1/api_hub_dependencies_client.cc new file mode 100644 index 0000000000000..a451fab84d578 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_dependencies_client.cc @@ -0,0 +1,125 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_dependencies_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubDependenciesClient::ApiHubDependenciesClient( + std::shared_ptr connection, Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +ApiHubDependenciesClient::~ApiHubDependenciesClient() = default; + +StatusOr +ApiHubDependenciesClient::CreateDependency( + std::string const& parent, + google::cloud::apihub::v1::Dependency const& dependency, + std::string const& dependency_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateDependencyRequest request; + request.set_parent(parent); + *request.mutable_dependency() = dependency; + request.set_dependency_id(dependency_id); + return connection_->CreateDependency(request); +} + +StatusOr +ApiHubDependenciesClient::CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateDependency(request); +} + +StatusOr +ApiHubDependenciesClient::GetDependency(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetDependencyRequest request; + request.set_name(name); + return connection_->GetDependency(request); +} + +StatusOr +ApiHubDependenciesClient::GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetDependency(request); +} + +StatusOr +ApiHubDependenciesClient::UpdateDependency( + google::cloud::apihub::v1::Dependency const& dependency, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateDependencyRequest request; + *request.mutable_dependency() = dependency; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateDependency(request); +} + +StatusOr +ApiHubDependenciesClient::UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateDependency(request); +} + +Status ApiHubDependenciesClient::DeleteDependency(std::string const& name, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteDependencyRequest request; + request.set_name(name); + return connection_->DeleteDependency(request); +} + +Status ApiHubDependenciesClient::DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteDependency(request); +} + +StreamRange +ApiHubDependenciesClient::ListDependencies(std::string const& parent, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListDependenciesRequest request; + request.set_parent(parent); + return connection_->ListDependencies(request); +} + +StreamRange +ApiHubDependenciesClient::ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListDependencies(std::move(request)); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_dependencies_client.h b/google/cloud/apihub/v1/api_hub_dependencies_client.h new file mode 100644 index 0000000000000..837efef502b03 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_dependencies_client.h @@ -0,0 +1,432 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CLIENT_H + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// This service provides methods for various operations related to a +/// [Dependency][google.cloud.apihub.v1.Dependency] in the API hub. +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +/// [google.cloud.apihub.v1.Dependency]: +/// @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} +/// +class ApiHubDependenciesClient { + public: + explicit ApiHubDependenciesClient( + std::shared_ptr connection, + Options opts = {}); + ~ApiHubDependenciesClient(); + + ///@{ + /// @name Copy and move support + ApiHubDependenciesClient(ApiHubDependenciesClient const&) = default; + ApiHubDependenciesClient& operator=(ApiHubDependenciesClient const&) = + default; + ApiHubDependenciesClient(ApiHubDependenciesClient&&) = default; + ApiHubDependenciesClient& operator=(ApiHubDependenciesClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(ApiHubDependenciesClient const& a, + ApiHubDependenciesClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(ApiHubDependenciesClient const& a, + ApiHubDependenciesClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Create a dependency between two entities in the API hub. + /// + /// @param parent Required. The parent resource for the dependency resource. + /// Format: `projects/{project}/locations/{location}` + /// @param dependency Required. The dependency resource to create. + /// @param dependency_id Optional. The ID to use for the dependency resource, which will become the + /// final component of the dependency's resource name. This field is optional. + /// * If provided, the same will be used. The service will throw an error if + /// duplicate id is provided by the client. + /// * If not provided, a system generated id will be used. + /// @n + /// This value should be 4-500 characters, and valid characters + /// are `[a-z][A-Z][0-9]-_`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Dependency]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1585} + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// + // clang-format on + StatusOr CreateDependency( + std::string const& parent, + google::cloud::apihub::v1::Dependency const& dependency, + std::string const& dependency_id, Options opts = {}); + + // clang-format off + /// + /// Create a dependency between two entities in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateDependencyRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Dependency]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1585} + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// + // clang-format on + StatusOr CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get details about a dependency resource in the API hub. + /// + /// @param name Required. The name of the dependency resource to retrieve. + /// Format: `projects/{project}/locations/{location}/dependencies/{dependency}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Dependency]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// [google.cloud.apihub.v1.GetDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1611} + /// + // clang-format on + StatusOr GetDependency( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get details about a dependency resource in the API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetDependencyRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Dependency]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// [google.cloud.apihub.v1.GetDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1611} + /// + // clang-format on + StatusOr GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Update a dependency based on the + /// [update_mask][google.cloud.apihub.v1.UpdateDependencyRequest.update_mask] + /// provided in the request. + /// + /// The following fields in the [dependency][google.cloud.apihub.v1.Dependency] + /// can be updated: + /// * [description][google.cloud.apihub.v1.Dependency.description] + /// + /// @param dependency Required. The dependency resource to update. + /// @n + /// The dependency's `name` field is used to identify the dependency to update. + /// Format: `projects/{project}/locations/{location}/dependencies/{dependency}` + /// @param update_mask Required. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Dependency]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// [google.cloud.apihub.v1.Dependency.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1011} + /// [google.cloud.apihub.v1.UpdateDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1625} + /// [google.cloud.apihub.v1.UpdateDependencyRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1633} + /// + // clang-format on + StatusOr UpdateDependency( + google::cloud::apihub::v1::Dependency const& dependency, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update a dependency based on the + /// [update_mask][google.cloud.apihub.v1.UpdateDependencyRequest.update_mask] + /// provided in the request. + /// + /// The following fields in the [dependency][google.cloud.apihub.v1.Dependency] + /// can be updated: + /// * [description][google.cloud.apihub.v1.Dependency.description] + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateDependencyRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Dependency]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// [google.cloud.apihub.v1.Dependency.description]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1011} + /// [google.cloud.apihub.v1.UpdateDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1625} + /// [google.cloud.apihub.v1.UpdateDependencyRequest.update_mask]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1633} + /// + // clang-format on + StatusOr UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Delete the dependency resource. + /// + /// @param name Required. The name of the dependency resource to delete. + /// Format: `projects/{project}/locations/{location}/dependencies/{dependency}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1640} + /// + // clang-format on + Status DeleteDependency(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Delete the dependency resource. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteDependencyRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteDependencyRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1640} + /// + // clang-format on + Status DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// List dependencies based on the provided filter and pagination parameters. + /// + /// @param parent Required. The parent which owns this collection of dependency resources. + /// Format: `projects/{project}/locations/{location}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Dependency], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// [google.cloud.apihub.v1.ListDependenciesRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1654} + /// + // clang-format on + StreamRange ListDependencies( + std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List dependencies based on the provided filter and pagination parameters. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListDependenciesRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.Dependency], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.Dependency]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L959} + /// [google.cloud.apihub.v1.ListDependenciesRequest]: @googleapis_reference_link{google/cloud/apihub/v1/apihub_service.proto#L1654} + /// + // clang-format on + StreamRange ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CLIENT_H diff --git a/google/cloud/apihub/v1/api_hub_dependencies_connection.cc b/google/cloud/apihub/v1/api_hub_dependencies_connection.cc new file mode 100644 index 0000000000000..4d8e5c1a09e59 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_dependencies_connection.cc @@ -0,0 +1,92 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_options.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubDependenciesConnection::~ApiHubDependenciesConnection() = default; + +StatusOr +ApiHubDependenciesConnection::CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubDependenciesConnection::GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubDependenciesConnection::UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status ApiHubDependenciesConnection::DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +ApiHubDependenciesConnection::ListDependencies( + google::cloud::apihub::v1:: + ListDependenciesRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +std::shared_ptr MakeApiHubDependenciesConnection( + Options options) { + internal::CheckExpectedOptions(options, + __func__); + options = + apihub_v1_internal::ApiHubDependenciesDefaultOptions(std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = apihub_v1_internal::CreateDefaultApiHubDependenciesStub( + std::move(auth), options); + return apihub_v1_internal::MakeApiHubDependenciesTracingConnection( + std::make_shared( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_dependencies_connection.h b/google/cloud/apihub/v1/api_hub_dependencies_connection.h new file mode 100644 index 0000000000000..aebd54923c659 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_dependencies_connection.h @@ -0,0 +1,235 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_retry_traits.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `ApiHubDependenciesConnection`. +class ApiHubDependenciesRetryPolicy : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() const = 0; +}; + +/** + * A retry policy for `ApiHubDependenciesConnection` based on counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ApiHubDependenciesLimitedErrorCountRetryPolicy + : public ApiHubDependenciesRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit ApiHubDependenciesLimitedErrorCountRetryPolicy(int maximum_failures) + : impl_(maximum_failures) {} + + ApiHubDependenciesLimitedErrorCountRetryPolicy( + ApiHubDependenciesLimitedErrorCountRetryPolicy&& rhs) noexcept + : ApiHubDependenciesLimitedErrorCountRetryPolicy(rhs.maximum_failures()) { + } + ApiHubDependenciesLimitedErrorCountRetryPolicy( + ApiHubDependenciesLimitedErrorCountRetryPolicy const& rhs) noexcept + : ApiHubDependenciesLimitedErrorCountRetryPolicy(rhs.maximum_failures()) { + } + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = ApiHubDependenciesRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + apihub_v1_internal::ApiHubDependenciesRetryTraits> + impl_; +}; + +/** + * A retry policy for `ApiHubDependenciesConnection` based on elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ApiHubDependenciesLimitedTimeRetryPolicy + : public ApiHubDependenciesRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit ApiHubDependenciesLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + ApiHubDependenciesLimitedTimeRetryPolicy( + ApiHubDependenciesLimitedTimeRetryPolicy&& rhs) noexcept + : ApiHubDependenciesLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + ApiHubDependenciesLimitedTimeRetryPolicy( + ApiHubDependenciesLimitedTimeRetryPolicy const& rhs) noexcept + : ApiHubDependenciesLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = ApiHubDependenciesRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + apihub_v1_internal::ApiHubDependenciesRetryTraits> + impl_; +}; + +/** + * The `ApiHubDependenciesConnection` object for `ApiHubDependenciesClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `ApiHubDependenciesClient`. This allows users to inject custom + * behavior (e.g., with a Google Mock object) when writing tests that use + * objects of type `ApiHubDependenciesClient`. + * + * To create a concrete instance, see `MakeApiHubDependenciesConnection()`. + * + * For mocking, see `apihub_v1_mocks::MockApiHubDependenciesConnection`. + */ +class ApiHubDependenciesConnection { + public: + virtual ~ApiHubDependenciesConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual StatusOr CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request); + + virtual StatusOr GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request); + + virtual StatusOr UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request); + + virtual Status DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request); + + virtual StreamRange ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request); +}; + +/** + * A factory function to construct an object of type + * `ApiHubDependenciesConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of + * ApiHubDependenciesClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `ApiHubDependenciesConnection`. Expected options are any of the + * types in the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::apihub_v1::ApiHubDependenciesPolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the `ApiHubDependenciesConnection` + * created by this function. + */ +std::shared_ptr MakeApiHubDependenciesConnection( + Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CONNECTION_H diff --git a/google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.cc b/google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..1ed92fd96e682 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.cc @@ -0,0 +1,70 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +ApiHubDependenciesConnectionIdempotencyPolicy:: + ~ApiHubDependenciesConnectionIdempotencyPolicy() = default; + +std::unique_ptr +ApiHubDependenciesConnectionIdempotencyPolicy::clone() const { + return std::make_unique(*this); +} + +Idempotency ApiHubDependenciesConnectionIdempotencyPolicy::CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubDependenciesConnectionIdempotencyPolicy::GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubDependenciesConnectionIdempotencyPolicy::UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubDependenciesConnectionIdempotencyPolicy::DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubDependenciesConnectionIdempotencyPolicy::ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +std::unique_ptr +MakeDefaultApiHubDependenciesConnectionIdempotencyPolicy() { + return std::make_unique(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h b/google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h new file mode 100644 index 0000000000000..feccd4d868029 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubDependenciesConnectionIdempotencyPolicy { + public: + virtual ~ApiHubDependenciesConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr clone() + const; + + virtual google::cloud::Idempotency CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request); + + virtual google::cloud::Idempotency GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request); + + virtual google::cloud::Idempotency UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request); + + virtual google::cloud::Idempotency DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request); + + virtual google::cloud::Idempotency ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request); +}; + +std::unique_ptr +MakeDefaultApiHubDependenciesConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/apihub/v1/api_hub_dependencies_options.h b/google/cloud/apihub/v1/api_hub_dependencies_options.h new file mode 100644 index 0000000000000..c4a2296be2c6e --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_dependencies_options.h @@ -0,0 +1,76 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_OPTIONS_H + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubDependenciesRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubDependenciesBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubDependenciesConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * The options applicable to ApiHubDependencies. + * + * @ingroup google-cloud-apihub-options + */ +using ApiHubDependenciesPolicyOptionList = + OptionList; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_DEPENDENCIES_OPTIONS_H diff --git a/google/cloud/apihub/v1/api_hub_options.h b/google/cloud/apihub/v1/api_hub_options.h new file mode 100644 index 0000000000000..40c858316d949 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_options.h @@ -0,0 +1,75 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_OPTIONS_H + +#include "google/cloud/apihub/v1/api_hub_connection.h" +#include "google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * The options applicable to ApiHub. + * + * @ingroup google-cloud-apihub-options + */ +using ApiHubPolicyOptionList = + OptionList; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_OPTIONS_H diff --git a/google/cloud/apihub/v1/api_hub_plugin_client.cc b/google/cloud/apihub/v1/api_hub_plugin_client.cc new file mode 100644 index 0000000000000..a840db2ab910d --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_plugin_client.cc @@ -0,0 +1,82 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/api_hub_plugin_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubPluginClient::ApiHubPluginClient( + std::shared_ptr connection, Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +ApiHubPluginClient::~ApiHubPluginClient() = default; + +StatusOr ApiHubPluginClient::GetPlugin( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetPluginRequest request; + request.set_name(name); + return connection_->GetPlugin(request); +} + +StatusOr ApiHubPluginClient::GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetPlugin(request); +} + +StatusOr ApiHubPluginClient::EnablePlugin( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::EnablePluginRequest request; + request.set_name(name); + return connection_->EnablePlugin(request); +} + +StatusOr ApiHubPluginClient::EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->EnablePlugin(request); +} + +StatusOr ApiHubPluginClient::DisablePlugin( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DisablePluginRequest request; + request.set_name(name); + return connection_->DisablePlugin(request); +} + +StatusOr ApiHubPluginClient::DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DisablePlugin(request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_plugin_client.h b/google/cloud/apihub/v1/api_hub_plugin_client.h new file mode 100644 index 0000000000000..0728da8f2b5c2 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_plugin_client.h @@ -0,0 +1,273 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CLIENT_H + +#include "google/cloud/apihub/v1/api_hub_plugin_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// This service is used for managing plugins inside the API Hub. +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +class ApiHubPluginClient { + public: + explicit ApiHubPluginClient( + std::shared_ptr connection, Options opts = {}); + ~ApiHubPluginClient(); + + ///@{ + /// @name Copy and move support + ApiHubPluginClient(ApiHubPluginClient const&) = default; + ApiHubPluginClient& operator=(ApiHubPluginClient const&) = default; + ApiHubPluginClient(ApiHubPluginClient&&) = default; + ApiHubPluginClient& operator=(ApiHubPluginClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(ApiHubPluginClient const& a, + ApiHubPluginClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(ApiHubPluginClient const& a, + ApiHubPluginClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Get details about an API Hub plugin. + /// + /// @param name Required. The name of the plugin to retrieve. + /// Format: `projects/{project}/locations/{location}/plugins/{plugin}`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Plugin]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetPluginRequest]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L119} + /// [google.cloud.apihub.v1.Plugin]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L69} + /// + // clang-format on + StatusOr GetPlugin(std::string const& name, + Options opts = {}); + + // clang-format off + /// + /// Get details about an API Hub plugin. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetPluginRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Plugin]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetPluginRequest]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L119} + /// [google.cloud.apihub.v1.Plugin]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L69} + /// + // clang-format on + StatusOr GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Enables a plugin. + /// The `state` of the plugin after enabling is `ENABLED` + /// + /// @param name Required. The name of the plugin to enable. + /// Format: `projects/{project}/locations/{location}/plugins/{plugin}`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Plugin]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.EnablePluginRequest]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L130} + /// [google.cloud.apihub.v1.Plugin]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L69} + /// + // clang-format on + StatusOr EnablePlugin( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Enables a plugin. + /// The `state` of the plugin after enabling is `ENABLED` + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.EnablePluginRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Plugin]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.EnablePluginRequest]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L130} + /// [google.cloud.apihub.v1.Plugin]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L69} + /// + // clang-format on + StatusOr EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Disables a plugin. + /// The `state` of the plugin after disabling is `DISABLED` + /// + /// @param name Required. The name of the plugin to disable. + /// Format: `projects/{project}/locations/{location}/plugins/{plugin}`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Plugin]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DisablePluginRequest]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L141} + /// [google.cloud.apihub.v1.Plugin]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L69} + /// + // clang-format on + StatusOr DisablePlugin( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Disables a plugin. + /// The `state` of the plugin after disabling is `DISABLED` + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DisablePluginRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.Plugin]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DisablePluginRequest]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L141} + /// [google.cloud.apihub.v1.Plugin]: @googleapis_reference_link{google/cloud/apihub/v1/plugin_service.proto#L69} + /// + // clang-format on + StatusOr DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CLIENT_H diff --git a/google/cloud/apihub/v1/api_hub_plugin_connection.cc b/google/cloud/apihub/v1/api_hub_plugin_connection.cc new file mode 100644 index 0000000000000..96fd214c12654 --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_plugin_connection.cc @@ -0,0 +1,76 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/api_hub_plugin_connection.h" +#include "google/cloud/apihub/v1/api_hub_plugin_options.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubPluginConnection::~ApiHubPluginConnection() = default; + +StatusOr ApiHubPluginConnection::GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubPluginConnection::EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ApiHubPluginConnection::DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +std::shared_ptr MakeApiHubPluginConnection( + Options options) { + internal::CheckExpectedOptions(options, + __func__); + options = apihub_v1_internal::ApiHubPluginDefaultOptions(std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = apihub_v1_internal::CreateDefaultApiHubPluginStub(std::move(auth), + options); + return apihub_v1_internal::MakeApiHubPluginTracingConnection( + std::make_shared( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_plugin_connection.h b/google/cloud/apihub/v1/api_hub_plugin_connection.h new file mode 100644 index 0000000000000..a68e5cc6ebbad --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_plugin_connection.h @@ -0,0 +1,223 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_retry_traits.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `ApiHubPluginConnection`. +class ApiHubPluginRetryPolicy : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() const = 0; +}; + +/** + * A retry policy for `ApiHubPluginConnection` based on counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ApiHubPluginLimitedErrorCountRetryPolicy + : public ApiHubPluginRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit ApiHubPluginLimitedErrorCountRetryPolicy(int maximum_failures) + : impl_(maximum_failures) {} + + ApiHubPluginLimitedErrorCountRetryPolicy( + ApiHubPluginLimitedErrorCountRetryPolicy&& rhs) noexcept + : ApiHubPluginLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + ApiHubPluginLimitedErrorCountRetryPolicy( + ApiHubPluginLimitedErrorCountRetryPolicy const& rhs) noexcept + : ApiHubPluginLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = ApiHubPluginRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + apihub_v1_internal::ApiHubPluginRetryTraits> + impl_; +}; + +/** + * A retry policy for `ApiHubPluginConnection` based on elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ApiHubPluginLimitedTimeRetryPolicy : public ApiHubPluginRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit ApiHubPluginLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + ApiHubPluginLimitedTimeRetryPolicy( + ApiHubPluginLimitedTimeRetryPolicy&& rhs) noexcept + : ApiHubPluginLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + ApiHubPluginLimitedTimeRetryPolicy( + ApiHubPluginLimitedTimeRetryPolicy const& rhs) noexcept + : ApiHubPluginLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = ApiHubPluginRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + apihub_v1_internal::ApiHubPluginRetryTraits> + impl_; +}; + +/** + * The `ApiHubPluginConnection` object for `ApiHubPluginClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `ApiHubPluginClient`. This allows users to inject custom behavior + * (e.g., with a Google Mock object) when writing tests that use objects of type + * `ApiHubPluginClient`. + * + * To create a concrete instance, see `MakeApiHubPluginConnection()`. + * + * For mocking, see `apihub_v1_mocks::MockApiHubPluginConnection`. + */ +class ApiHubPluginConnection { + public: + virtual ~ApiHubPluginConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual StatusOr GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request); + + virtual StatusOr EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request); + + virtual StatusOr DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request); +}; + +/** + * A factory function to construct an object of type `ApiHubPluginConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of ApiHubPluginClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `ApiHubPluginConnection`. Expected options are any of the types in + * the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::apihub_v1::ApiHubPluginPolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the `ApiHubPluginConnection` created by + * this function. + */ +std::shared_ptr MakeApiHubPluginConnection( + Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CONNECTION_H diff --git a/google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.cc b/google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..82c76f2e5119f --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.cc @@ -0,0 +1,60 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +ApiHubPluginConnectionIdempotencyPolicy:: + ~ApiHubPluginConnectionIdempotencyPolicy() = default; + +std::unique_ptr +ApiHubPluginConnectionIdempotencyPolicy::clone() const { + return std::make_unique(*this); +} + +Idempotency ApiHubPluginConnectionIdempotencyPolicy::GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ApiHubPluginConnectionIdempotencyPolicy::EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ApiHubPluginConnectionIdempotencyPolicy::DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const&) { + return Idempotency::kNonIdempotent; +} + +std::unique_ptr +MakeDefaultApiHubPluginConnectionIdempotencyPolicy() { + return std::make_unique(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h b/google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h new file mode 100644 index 0000000000000..a57e80cc7f3bc --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h @@ -0,0 +1,58 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubPluginConnectionIdempotencyPolicy { + public: + virtual ~ApiHubPluginConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr clone() + const; + + virtual google::cloud::Idempotency GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request); + + virtual google::cloud::Idempotency EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request); + + virtual google::cloud::Idempotency DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request); +}; + +std::unique_ptr +MakeDefaultApiHubPluginConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/apihub/v1/api_hub_plugin_options.h b/google/cloud/apihub/v1/api_hub_plugin_options.h new file mode 100644 index 0000000000000..717ce942c2f8f --- /dev/null +++ b/google/cloud/apihub/v1/api_hub_plugin_options.h @@ -0,0 +1,75 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_OPTIONS_H + +#include "google/cloud/apihub/v1/api_hub_plugin_connection.h" +#include "google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubPluginRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubPluginBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-apihub-options + */ +struct ApiHubPluginConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * The options applicable to ApiHubPlugin. + * + * @ingroup google-cloud-apihub-options + */ +using ApiHubPluginPolicyOptionList = + OptionList; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_API_HUB_PLUGIN_OPTIONS_H diff --git a/google/cloud/apihub/v1/host_project_registration_client.cc b/google/cloud/apihub/v1/host_project_registration_client.cc new file mode 100644 index 0000000000000..49ca83f2cc499 --- /dev/null +++ b/google/cloud/apihub/v1/host_project_registration_client.cc @@ -0,0 +1,97 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/host_project_registration_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +HostProjectRegistrationServiceClient::HostProjectRegistrationServiceClient( + std::shared_ptr connection, + Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +HostProjectRegistrationServiceClient::~HostProjectRegistrationServiceClient() = + default; + +StatusOr +HostProjectRegistrationServiceClient::CreateHostProjectRegistration( + std::string const& parent, + google::cloud::apihub::v1::HostProjectRegistration const& + host_project_registration, + std::string const& host_project_registration_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest request; + request.set_parent(parent); + *request.mutable_host_project_registration() = host_project_registration; + request.set_host_project_registration_id(host_project_registration_id); + return connection_->CreateHostProjectRegistration(request); +} + +StatusOr +HostProjectRegistrationServiceClient::CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateHostProjectRegistration(request); +} + +StatusOr +HostProjectRegistrationServiceClient::GetHostProjectRegistration( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetHostProjectRegistrationRequest request; + request.set_name(name); + return connection_->GetHostProjectRegistration(request); +} + +StatusOr +HostProjectRegistrationServiceClient::GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetHostProjectRegistration(request); +} + +StreamRange +HostProjectRegistrationServiceClient::ListHostProjectRegistrations( + std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request; + request.set_parent(parent); + return connection_->ListHostProjectRegistrations(request); +} + +StreamRange +HostProjectRegistrationServiceClient::ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListHostProjectRegistrations(std::move(request)); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/host_project_registration_client.h b/google/cloud/apihub/v1/host_project_registration_client.h new file mode 100644 index 0000000000000..9db62ebaa0a60 --- /dev/null +++ b/google/cloud/apihub/v1/host_project_registration_client.h @@ -0,0 +1,314 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CLIENT_H + +#include "google/cloud/apihub/v1/host_project_registration_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// This service is used for managing the host project registrations. +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +class HostProjectRegistrationServiceClient { + public: + explicit HostProjectRegistrationServiceClient( + std::shared_ptr connection, + Options opts = {}); + ~HostProjectRegistrationServiceClient(); + + ///@{ + /// @name Copy and move support + HostProjectRegistrationServiceClient( + HostProjectRegistrationServiceClient const&) = default; + HostProjectRegistrationServiceClient& operator=( + HostProjectRegistrationServiceClient const&) = default; + HostProjectRegistrationServiceClient(HostProjectRegistrationServiceClient&&) = + default; + HostProjectRegistrationServiceClient& operator=( + HostProjectRegistrationServiceClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(HostProjectRegistrationServiceClient const& a, + HostProjectRegistrationServiceClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(HostProjectRegistrationServiceClient const& a, + HostProjectRegistrationServiceClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Create a host project registration. + /// A Google cloud project can be registered as a host project if it is not + /// attached as a runtime project to another host project. + /// A project can be registered as a host project only once. Subsequent + /// register calls for the same project will fail. + /// + /// @param parent Required. The parent resource for the host project. + /// Format: `projects/{project}/locations/{location}` + /// @param host_project_registration Required. The host project registration to register. + /// @param host_project_registration_id Required. The ID to use for the Host Project Registration, which will + /// become the final component of the host project registration's resource + /// name. The ID must be the same as the Google cloud project specified in the + /// host_project_registration.gcp_project field. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.HostProjectRegistration]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateHostProjectRegistrationRequest]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L76} + /// [google.cloud.apihub.v1.HostProjectRegistration]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L179} + /// + // clang-format on + StatusOr + CreateHostProjectRegistration( + std::string const& parent, + google::cloud::apihub::v1::HostProjectRegistration const& + host_project_registration, + std::string const& host_project_registration_id, Options opts = {}); + + // clang-format off + /// + /// Create a host project registration. + /// A Google cloud project can be registered as a host project if it is not + /// attached as a runtime project to another host project. + /// A project can be registered as a host project only once. Subsequent + /// register calls for the same project will fail. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateHostProjectRegistrationRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.HostProjectRegistration]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateHostProjectRegistrationRequest]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L76} + /// [google.cloud.apihub.v1.HostProjectRegistration]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L179} + /// + // clang-format on + StatusOr + CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request, + Options opts = {}); + + // clang-format off + /// + /// Get a host project registration. + /// + /// @param name Required. Host project registration resource name. + /// projects/{project}/locations/{location}/hostProjectRegistrations/{host_project_registration_id} + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.HostProjectRegistration]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetHostProjectRegistrationRequest]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L101} + /// [google.cloud.apihub.v1.HostProjectRegistration]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L179} + /// + // clang-format on + StatusOr + GetHostProjectRegistration(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get a host project registration. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetHostProjectRegistrationRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.HostProjectRegistration]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetHostProjectRegistrationRequest]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L101} + /// [google.cloud.apihub.v1.HostProjectRegistration]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L179} + /// + // clang-format on + StatusOr + GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request, + Options opts = {}); + + // clang-format off + /// + /// Lists host project registrations. + /// + /// @param parent Required. The parent, which owns this collection of host projects. + /// Format: `projects/*/locations/*` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.HostProjectRegistration], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.HostProjectRegistration]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L179} + /// [google.cloud.apihub.v1.ListHostProjectRegistrationsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L115} + /// + // clang-format on + StreamRange + ListHostProjectRegistrations(std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// Lists host project registrations. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListHostProjectRegistrationsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.HostProjectRegistration], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.HostProjectRegistration]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L179} + /// [google.cloud.apihub.v1.ListHostProjectRegistrationsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/host_project_registration_service.proto#L115} + /// + // clang-format on + StreamRange + ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CLIENT_H diff --git a/google/cloud/apihub/v1/host_project_registration_connection.cc b/google/cloud/apihub/v1/host_project_registration_connection.cc new file mode 100644 index 0000000000000..3bccbb749fa66 --- /dev/null +++ b/google/cloud/apihub/v1/host_project_registration_connection.cc @@ -0,0 +1,84 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/host_project_registration_connection.h" +#include "google/cloud/apihub/v1/host_project_registration_options.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_connection_impl.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_option_defaults.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_stub_factory.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +HostProjectRegistrationServiceConnection:: + ~HostProjectRegistrationServiceConnection() = default; + +StatusOr +HostProjectRegistrationServiceConnection::CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +HostProjectRegistrationServiceConnection::GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +HostProjectRegistrationServiceConnection::ListHostProjectRegistrations( + google::cloud::apihub::v1:: + ListHostProjectRegistrationsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +std::shared_ptr +MakeHostProjectRegistrationServiceConnection(Options options) { + internal::CheckExpectedOptions< + CommonOptionList, GrpcOptionList, UnifiedCredentialsOptionList, + HostProjectRegistrationServicePolicyOptionList>(options, __func__); + options = apihub_v1_internal::HostProjectRegistrationServiceDefaultOptions( + std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = + apihub_v1_internal::CreateDefaultHostProjectRegistrationServiceStub( + std::move(auth), options); + return apihub_v1_internal:: + MakeHostProjectRegistrationServiceTracingConnection( + std::make_shared< + apihub_v1_internal::HostProjectRegistrationServiceConnectionImpl>( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/host_project_registration_connection.h b/google/cloud/apihub/v1/host_project_registration_connection.h new file mode 100644 index 0000000000000..3654cfa26f4da --- /dev/null +++ b/google/cloud/apihub/v1/host_project_registration_connection.h @@ -0,0 +1,249 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CONNECTION_H + +#include "google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_retry_traits.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `HostProjectRegistrationServiceConnection`. +class HostProjectRegistrationServiceRetryPolicy + : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() + const = 0; +}; + +/** + * A retry policy for `HostProjectRegistrationServiceConnection` based on + * counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class HostProjectRegistrationServiceLimitedErrorCountRetryPolicy + : public HostProjectRegistrationServiceRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit HostProjectRegistrationServiceLimitedErrorCountRetryPolicy( + int maximum_failures) + : impl_(maximum_failures) {} + + HostProjectRegistrationServiceLimitedErrorCountRetryPolicy( + HostProjectRegistrationServiceLimitedErrorCountRetryPolicy&& rhs) noexcept + : HostProjectRegistrationServiceLimitedErrorCountRetryPolicy( + rhs.maximum_failures()) {} + HostProjectRegistrationServiceLimitedErrorCountRetryPolicy( + HostProjectRegistrationServiceLimitedErrorCountRetryPolicy const& + rhs) noexcept + : HostProjectRegistrationServiceLimitedErrorCountRetryPolicy( + rhs.maximum_failures()) {} + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() + const override { + return std::make_unique< + HostProjectRegistrationServiceLimitedErrorCountRetryPolicy>( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = HostProjectRegistrationServiceRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + apihub_v1_internal::HostProjectRegistrationServiceRetryTraits> + impl_; +}; + +/** + * A retry policy for `HostProjectRegistrationServiceConnection` based on + * elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class HostProjectRegistrationServiceLimitedTimeRetryPolicy + : public HostProjectRegistrationServiceRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit HostProjectRegistrationServiceLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + HostProjectRegistrationServiceLimitedTimeRetryPolicy( + HostProjectRegistrationServiceLimitedTimeRetryPolicy&& rhs) noexcept + : HostProjectRegistrationServiceLimitedTimeRetryPolicy( + rhs.maximum_duration()) {} + HostProjectRegistrationServiceLimitedTimeRetryPolicy( + HostProjectRegistrationServiceLimitedTimeRetryPolicy const& rhs) noexcept + : HostProjectRegistrationServiceLimitedTimeRetryPolicy( + rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() + const override { + return std::make_unique< + HostProjectRegistrationServiceLimitedTimeRetryPolicy>( + maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = HostProjectRegistrationServiceRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + apihub_v1_internal::HostProjectRegistrationServiceRetryTraits> + impl_; +}; + +/** + * The `HostProjectRegistrationServiceConnection` object for + * `HostProjectRegistrationServiceClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `HostProjectRegistrationServiceClient`. This allows users to inject + * custom behavior (e.g., with a Google Mock object) when writing tests that use + * objects of type `HostProjectRegistrationServiceClient`. + * + * To create a concrete instance, see + * `MakeHostProjectRegistrationServiceConnection()`. + * + * For mocking, see + * `apihub_v1_mocks::MockHostProjectRegistrationServiceConnection`. + */ +class HostProjectRegistrationServiceConnection { + public: + virtual ~HostProjectRegistrationServiceConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual StatusOr + CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request); + + virtual StatusOr + GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request); + + virtual StreamRange + ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request); +}; + +/** + * A factory function to construct an object of type + * `HostProjectRegistrationServiceConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of + * HostProjectRegistrationServiceClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `HostProjectRegistrationServiceConnection`. Expected options are any + * of the types in the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::apihub_v1::HostProjectRegistrationServicePolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the + * `HostProjectRegistrationServiceConnection` created by this function. + */ +std::shared_ptr +MakeHostProjectRegistrationServiceConnection(Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CONNECTION_H diff --git a/google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.cc b/google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..f655584500a19 --- /dev/null +++ b/google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.cc @@ -0,0 +1,67 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +HostProjectRegistrationServiceConnectionIdempotencyPolicy:: + ~HostProjectRegistrationServiceConnectionIdempotencyPolicy() = default; + +std::unique_ptr +HostProjectRegistrationServiceConnectionIdempotencyPolicy::clone() const { + return std::make_unique< + HostProjectRegistrationServiceConnectionIdempotencyPolicy>(*this); +} + +Idempotency HostProjectRegistrationServiceConnectionIdempotencyPolicy:: + CreateHostProjectRegistration( + google::cloud::apihub::v1:: + CreateHostProjectRegistrationRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency HostProjectRegistrationServiceConnectionIdempotencyPolicy:: + GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency HostProjectRegistrationServiceConnectionIdempotencyPolicy:: + ListHostProjectRegistrations( + google::cloud::apihub::v1:: + ListHostProjectRegistrationsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +std::unique_ptr +MakeDefaultHostProjectRegistrationServiceConnectionIdempotencyPolicy() { + return std::make_unique< + HostProjectRegistrationServiceConnectionIdempotencyPolicy>(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h b/google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h new file mode 100644 index 0000000000000..53ddd22ec73b1 --- /dev/null +++ b/google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h @@ -0,0 +1,61 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class HostProjectRegistrationServiceConnectionIdempotencyPolicy { + public: + virtual ~HostProjectRegistrationServiceConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr< + HostProjectRegistrationServiceConnectionIdempotencyPolicy> + clone() const; + + virtual google::cloud::Idempotency CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request); + + virtual google::cloud::Idempotency GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request); + + virtual google::cloud::Idempotency ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request); +}; + +std::unique_ptr +MakeDefaultHostProjectRegistrationServiceConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/apihub/v1/host_project_registration_options.h b/google/cloud/apihub/v1/host_project_registration_options.h new file mode 100644 index 0000000000000..01789da5f1a8e --- /dev/null +++ b/google/cloud/apihub/v1/host_project_registration_options.h @@ -0,0 +1,77 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_OPTIONS_H + +#include "google/cloud/apihub/v1/host_project_registration_connection.h" +#include "google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-apihub-options + */ +struct HostProjectRegistrationServiceRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-apihub-options + */ +struct HostProjectRegistrationServiceBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-apihub-options + */ +struct HostProjectRegistrationServiceConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr< + HostProjectRegistrationServiceConnectionIdempotencyPolicy>; +}; + +/** + * The options applicable to HostProjectRegistrationService. + * + * @ingroup google-cloud-apihub-options + */ +using HostProjectRegistrationServicePolicyOptionList = + OptionList; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_HOST_PROJECT_REGISTRATION_OPTIONS_H diff --git a/google/cloud/apihub/v1/internal/api_hub_auth_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_auth_decorator.cc new file mode 100644 index 0000000000000..46ed1eba78cb8 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_auth_decorator.cc @@ -0,0 +1,323 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubAuth::ApiHubAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +StatusOr ApiHubAuth::CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateApi(context, options, request); +} + +StatusOr ApiHubAuth::GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetApi(context, options, request); +} + +StatusOr ApiHubAuth::ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListApis(context, options, request); +} + +StatusOr ApiHubAuth::UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateApi(context, options, request); +} + +Status ApiHubAuth::DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteApi(context, options, request); +} + +StatusOr ApiHubAuth::CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateVersion(context, options, request); +} + +StatusOr ApiHubAuth::GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetVersion(context, options, request); +} + +StatusOr +ApiHubAuth::ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListVersions(context, options, request); +} + +StatusOr ApiHubAuth::UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateVersion(context, options, request); +} + +Status ApiHubAuth::DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteVersion(context, options, request); +} + +StatusOr ApiHubAuth::CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateSpec(context, options, request); +} + +StatusOr ApiHubAuth::GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetSpec(context, options, request); +} + +StatusOr ApiHubAuth::GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetSpecContents(context, options, request); +} + +StatusOr ApiHubAuth::ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListSpecs(context, options, request); +} + +StatusOr ApiHubAuth::UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateSpec(context, options, request); +} + +Status ApiHubAuth::DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteSpec(context, options, request); +} + +StatusOr ApiHubAuth::GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetApiOperation(context, options, request); +} + +StatusOr +ApiHubAuth::ListApiOperations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListApiOperations(context, options, request); +} + +StatusOr ApiHubAuth::GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetDefinition(context, options, request); +} + +StatusOr ApiHubAuth::CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateDeployment(context, options, request); +} + +StatusOr ApiHubAuth::GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetDeployment(context, options, request); +} + +StatusOr +ApiHubAuth::ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListDeployments(context, options, request); +} + +StatusOr ApiHubAuth::UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateDeployment(context, options, request); +} + +Status ApiHubAuth::DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteDeployment(context, options, request); +} + +StatusOr ApiHubAuth::CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateAttribute(context, options, request); +} + +StatusOr ApiHubAuth::GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetAttribute(context, options, request); +} + +StatusOr ApiHubAuth::UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateAttribute(context, options, request); +} + +Status ApiHubAuth::DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteAttribute(context, options, request); +} + +StatusOr +ApiHubAuth::ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListAttributes(context, options, request); +} + +StatusOr +ApiHubAuth::SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->SearchResources(context, options, request); +} + +StatusOr ApiHubAuth::CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateExternalApi(context, options, request); +} + +StatusOr ApiHubAuth::GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetExternalApi(context, options, request); +} + +StatusOr ApiHubAuth::UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateExternalApi(context, options, request); +} + +Status ApiHubAuth::DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteExternalApi(context, options, request); +} + +StatusOr +ApiHubAuth::ListExternalApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListExternalApis(context, options, request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_auth_decorator.h b/google/cloud/apihub/v1/internal/api_hub_auth_decorator.h new file mode 100644 index 0000000000000..51dd16c8c5aec --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_auth_decorator.h @@ -0,0 +1,206 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_AUTH_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubAuth : public ApiHubStub { + public: + ~ApiHubAuth() override = default; + ApiHubAuth( + std::shared_ptr auth, + std::shared_ptr child); + + StatusOr CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) override; + + StatusOr GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) override; + + StatusOr ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) override; + + StatusOr UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) override; + + Status DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) override; + + StatusOr CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) override; + + StatusOr GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) override; + + StatusOr ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) override; + + StatusOr UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) override; + + Status DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) override; + + StatusOr CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) override; + + StatusOr GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) override; + + StatusOr GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) + override; + + StatusOr ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) override; + + StatusOr UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) override; + + Status DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) override; + + StatusOr GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) + override; + + StatusOr + ListApiOperations(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& + request) override; + + StatusOr GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) override; + + StatusOr CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) + override; + + StatusOr GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) override; + + StatusOr ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) + override; + + StatusOr UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) + override; + + Status DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) + override; + + StatusOr CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) + override; + + StatusOr GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) override; + + StatusOr UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) + override; + + Status DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) + override; + + StatusOr ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) override; + + StatusOr SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) + override; + + StatusOr CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) + override; + + StatusOr GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) override; + + StatusOr UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) + override; + + Status DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) + override; + + StatusOr + ListExternalApis(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& + request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_AUTH_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_connection_impl.cc b/google/cloud/apihub/v1/internal/api_hub_connection_impl.cc new file mode 100644 index 0000000000000..1b1f2ed47e3a8 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_connection_impl.cc @@ -0,0 +1,700 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_connection_impl.h" +#include "google/cloud/apihub/v1/internal/api_hub_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr retry_policy( + Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr +idempotency_policy(Options const& options) { + return options.get() + ->clone(); +} + +} // namespace + +ApiHubConnectionImpl::ApiHubConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions(std::move(options), + ApiHubConnection::options())) {} + +StatusOr ApiHubConnectionImpl::CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateApi(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) { + return stub_->CreateApi(context, options, request); + }, + *current, request, __func__); +} + +StatusOr ApiHubConnectionImpl::GetApi( + google::cloud::apihub::v1::GetApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetApi(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) { + return stub_->GetApi(context, options, request); + }, + *current, request, __func__); +} + +StreamRange ApiHubConnectionImpl::ListApis( + google::cloud::apihub::v1::ListApisRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListApis(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListApisRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) { + return stub->ListApis(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListApisResponse r) { + std::vector result(r.apis().size()); + auto& messages = *r.mutable_apis(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr ApiHubConnectionImpl::UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateApi(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) { + return stub_->UpdateApi(context, options, request); + }, + *current, request, __func__); +} + +Status ApiHubConnectionImpl::DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteApi(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) { + return stub_->DeleteApi(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateVersion(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) { + return stub_->CreateVersion(context, options, request); + }, + *current, request, __func__); +} + +StatusOr ApiHubConnectionImpl::GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetVersion(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) { + return stub_->GetVersion(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +ApiHubConnectionImpl::ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListVersions(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) { + return stub->ListVersions(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListVersionsResponse r) { + std::vector result( + r.versions().size()); + auto& messages = *r.mutable_versions(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr +ApiHubConnectionImpl::UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateVersion(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + return stub_->UpdateVersion(context, options, request); + }, + *current, request, __func__); +} + +Status ApiHubConnectionImpl::DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteVersion(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + return stub_->DeleteVersion(context, options, request); + }, + *current, request, __func__); +} + +StatusOr ApiHubConnectionImpl::CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateSpec(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) { + return stub_->CreateSpec(context, options, request); + }, + *current, request, __func__); +} + +StatusOr ApiHubConnectionImpl::GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetSpec(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) { + return stub_->GetSpec(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetSpecContents(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + return stub_->GetSpecContents(context, options, request); + }, + *current, request, __func__); +} + +StreamRange ApiHubConnectionImpl::ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListSpecs(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) { + return stub->ListSpecs(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListSpecsResponse r) { + std::vector result(r.specs().size()); + auto& messages = *r.mutable_specs(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr ApiHubConnectionImpl::UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateSpec(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + return stub_->UpdateSpec(context, options, request); + }, + *current, request, __func__); +} + +Status ApiHubConnectionImpl::DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteSpec(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + return stub_->DeleteSpec(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetApiOperation(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + return stub_->GetApiOperation(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +ApiHubConnectionImpl::ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListApiOperations(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& + request) { + return stub->ListApiOperations(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListApiOperationsResponse r) { + std::vector result( + r.api_operations().size()); + auto& messages = *r.mutable_api_operations(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr +ApiHubConnectionImpl::GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetDefinition(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + return stub_->GetDefinition(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateDeployment(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + return stub_->CreateDeployment(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetDeployment(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + return stub_->GetDeployment(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +ApiHubConnectionImpl::ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListDeployments(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& + request) { + return stub->ListDeployments(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListDeploymentsResponse r) { + std::vector result( + r.deployments().size()); + auto& messages = *r.mutable_deployments(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr +ApiHubConnectionImpl::UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateDeployment(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + return stub_->UpdateDeployment(context, options, request); + }, + *current, request, __func__); +} + +Status ApiHubConnectionImpl::DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteDeployment(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + return stub_->DeleteDeployment(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateAttribute(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + return stub_->CreateAttribute(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetAttribute(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) { + return stub_->GetAttribute(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateAttribute(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + return stub_->UpdateAttribute(context, options, request); + }, + *current, request, __func__); +} + +Status ApiHubConnectionImpl::DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteAttribute(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + return stub_->DeleteAttribute(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +ApiHubConnectionImpl::ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListAttributes(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& + request) { + return stub->ListAttributes(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListAttributesResponse r) { + std::vector result( + r.attributes().size()); + auto& messages = *r.mutable_attributes(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StreamRange +ApiHubConnectionImpl::SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->SearchResources(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& + request) { + return stub->SearchResources(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::SearchResourcesResponse r) { + std::vector result( + r.search_results().size()); + auto& messages = *r.mutable_search_results(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +StatusOr +ApiHubConnectionImpl::CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateExternalApi(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + return stub_->CreateExternalApi(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetExternalApi(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + return stub_->GetExternalApi(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubConnectionImpl::UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateExternalApi(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + return stub_->UpdateExternalApi(context, options, request); + }, + *current, request, __func__); +} + +Status ApiHubConnectionImpl::DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteExternalApi(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + return stub_->DeleteExternalApi(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +ApiHubConnectionImpl::ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListExternalApis(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& + request) { + return stub->ListExternalApis(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListExternalApisResponse r) { + std::vector result( + r.external_apis().size()); + auto& messages = *r.mutable_external_apis(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_connection_impl.h b/google/cloud/apihub/v1/internal/api_hub_connection_impl.h new file mode 100644 index 0000000000000..6794e925f1005 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_connection_impl.h @@ -0,0 +1,177 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_CONNECTION_IMPL_H + +#include "google/cloud/apihub/v1/api_hub_connection.h" +#include "google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/api_hub_options.h" +#include "google/cloud/apihub/v1/internal/api_hub_retry_traits.h" +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubConnectionImpl : public apihub_v1::ApiHubConnection { + public: + ~ApiHubConnectionImpl() override = default; + + ApiHubConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, Options options); + + Options options() override { return options_; } + + StatusOr CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request) override; + + StatusOr GetApi( + google::cloud::apihub::v1::GetApiRequest const& request) override; + + StreamRange ListApis( + google::cloud::apihub::v1::ListApisRequest request) override; + + StatusOr UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request) override; + + Status DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const& request) override; + + StatusOr CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request) override; + + StatusOr GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request) override; + + StreamRange ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request) override; + + StatusOr UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request) override; + + Status DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request) override; + + StatusOr CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request) override; + + StatusOr GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request) override; + + StatusOr GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request) + override; + + StreamRange ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request) override; + + StatusOr UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request) override; + + Status DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const& request) override; + + StatusOr GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request) + override; + + StreamRange ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request) override; + + StatusOr GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request) override; + + StatusOr CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request) + override; + + StatusOr GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request) override; + + StreamRange ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request) override; + + StatusOr UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) + override; + + Status DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) + override; + + StatusOr CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request) + override; + + StatusOr GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request) override; + + StatusOr UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request) + override; + + Status DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request) + override; + + StreamRange ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request) override; + + StreamRange SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request) override; + + StatusOr CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request) + override; + + StatusOr GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request) override; + + StatusOr UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) + override; + + Status DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) + override; + + StreamRange ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request) override; + + private: + std::unique_ptr background_; + std::shared_ptr stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_CONNECTION_IMPL_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.cc new file mode 100644 index 0000000000000..a467d74d4a266 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.cc @@ -0,0 +1,81 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubDependenciesAuth::ApiHubDependenciesAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +StatusOr +ApiHubDependenciesAuth::CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateDependency(context, options, request); +} + +StatusOr +ApiHubDependenciesAuth::GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetDependency(context, options, request); +} + +StatusOr +ApiHubDependenciesAuth::UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateDependency(context, options, request); +} + +Status ApiHubDependenciesAuth::DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteDependency(context, options, request); +} + +StatusOr +ApiHubDependenciesAuth::ListDependencies( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListDependencies(context, options, request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.h new file mode 100644 index 0000000000000..67994a4962d22 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.h @@ -0,0 +1,75 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_AUTH_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubDependenciesAuth : public ApiHubDependenciesStub { + public: + ~ApiHubDependenciesAuth() override = default; + ApiHubDependenciesAuth( + std::shared_ptr auth, + std::shared_ptr child); + + StatusOr CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) + override; + + StatusOr GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) override; + + StatusOr UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) + override; + + Status DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) + override; + + StatusOr + ListDependencies(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& + request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_AUTH_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.cc new file mode 100644 index 0000000000000..9bb11e95c3439 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.cc @@ -0,0 +1,158 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr retry_policy( + Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options.get() + ->clone(); +} + +std::unique_ptr +idempotency_policy(Options const& options) { + return options + .get() + ->clone(); +} + +} // namespace + +ApiHubDependenciesConnectionImpl::ApiHubDependenciesConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions( + std::move(options), ApiHubDependenciesConnection::options())) {} + +StatusOr +ApiHubDependenciesConnectionImpl::CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateDependency(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + return stub_->CreateDependency(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubDependenciesConnectionImpl::GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetDependency(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) { + return stub_->GetDependency(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubDependenciesConnectionImpl::UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateDependency(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + return stub_->UpdateDependency(context, options, request); + }, + *current, request, __func__); +} + +Status ApiHubDependenciesConnectionImpl::DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteDependency(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + return stub_->DeleteDependency(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +ApiHubDependenciesConnectionImpl::ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = idempotency_policy(*current)->ListDependencies(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& + request) { + return stub->ListDependencies(context, options, request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListDependenciesResponse r) { + std::vector result( + r.dependencies().size()); + auto& messages = *r.mutable_dependencies(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.h new file mode 100644 index 0000000000000..161deed092bcf --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.h @@ -0,0 +1,81 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_CONNECTION_IMPL_H + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_options.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_retry_traits.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubDependenciesConnectionImpl + : public apihub_v1::ApiHubDependenciesConnection { + public: + ~ApiHubDependenciesConnectionImpl() override = default; + + ApiHubDependenciesConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options); + + Options options() override { return options_; } + + StatusOr CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request) + override; + + StatusOr GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request) override; + + StatusOr UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request) + override; + + Status DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request) + override; + + StreamRange ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request) override; + + private: + std::unique_ptr background_; + std::shared_ptr stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_CONNECTION_IMPL_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.cc new file mode 100644 index 0000000000000..dac35ab9e54b2 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.cc @@ -0,0 +1,104 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubDependenciesLogging::ApiHubDependenciesLogging( + std::shared_ptr child, + TracingOptions tracing_options, std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +StatusOr +ApiHubDependenciesLogging::CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + return child_->CreateDependency(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubDependenciesLogging::GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) { + return child_->GetDependency(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubDependenciesLogging::UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + return child_->UpdateDependency(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ApiHubDependenciesLogging::DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + return child_->DeleteDependency(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubDependenciesLogging::ListDependencies( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& request) { + return child_->ListDependencies(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.h new file mode 100644 index 0000000000000..e484e96fd3e42 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.h @@ -0,0 +1,75 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_LOGGING_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubDependenciesLogging : public ApiHubDependenciesStub { + public: + ~ApiHubDependenciesLogging() override = default; + ApiHubDependenciesLogging(std::shared_ptr child, + TracingOptions tracing_options, + std::set const& components); + + StatusOr CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) + override; + + StatusOr GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) override; + + StatusOr UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) + override; + + Status DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) + override; + + StatusOr + ListDependencies(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& + request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // ApiHubDependenciesLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_LOGGING_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.cc new file mode 100644 index 0000000000000..926b1ffd93d54 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.cc @@ -0,0 +1,108 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubDependenciesMetadata::ApiHubDependenciesMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +StatusOr +ApiHubDependenciesMetadata::CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateDependency(context, options, request); +} + +StatusOr +ApiHubDependenciesMetadata::GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetDependency(context, options, request); +} + +StatusOr +ApiHubDependenciesMetadata::UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + SetMetadata(context, options, + absl::StrCat("dependency.name=", + internal::UrlEncode(request.dependency().name()))); + return child_->UpdateDependency(context, options, request); +} + +Status ApiHubDependenciesMetadata::DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteDependency(context, options, request); +} + +StatusOr +ApiHubDependenciesMetadata::ListDependencies( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListDependencies(context, options, request); +} + +void ApiHubDependenciesMetadata::SetMetadata( + grpc::ClientContext& context, Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void ApiHubDependenciesMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.h new file mode 100644 index 0000000000000..9b5bbb52788f6 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.h @@ -0,0 +1,81 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_METADATA_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubDependenciesMetadata : public ApiHubDependenciesStub { + public: + ~ApiHubDependenciesMetadata() override = default; + ApiHubDependenciesMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + StatusOr CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) + override; + + StatusOr GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) override; + + StatusOr UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) + override; + + Status DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) + override; + + StatusOr + ListDependencies(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& + request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_METADATA_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.cc new file mode 100644 index 0000000000000..ec521014693e6 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.cc @@ -0,0 +1,67 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options ApiHubDependenciesDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), "GOOGLE_CLOUD_CPP_API_HUB_DEPENDENCIES_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_API_HUB_DEPENDENCIES_AUTHORITY", + "apihub.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options.has()) { + options.set( + apihub_v1::ApiHubDependenciesLimitedTimeRetryPolicy( + std::chrono::minutes(30)) + .clone()); + } + if (!options.has()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options.has< + apihub_v1::ApiHubDependenciesConnectionIdempotencyPolicyOption>()) { + options.set( + apihub_v1::MakeDefaultApiHubDependenciesConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.h new file mode 100644 index 0000000000000..d29074e886a82 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options ApiHubDependenciesDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_OPTION_DEFAULTS_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_retry_traits.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_retry_traits.h new file mode 100644 index 0000000000000..dcf7d0b4c45fc --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct ApiHubDependenciesRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_RETRY_TRAITS_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_sources.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_sources.cc new file mode 100644 index 0000000000000..82de5f701b54b --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/apihub/v1/api_hub_dependencies_client.cc" +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.cc" +#include "google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_connection_impl.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_option_defaults.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.cc" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_stub.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub.cc new file mode 100644 index 0000000000000..10928904f6ba1 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub.cc @@ -0,0 +1,95 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubDependenciesStub::~ApiHubDependenciesStub() = default; + +StatusOr +DefaultApiHubDependenciesStub::CreateDependency( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + google::cloud::apihub::v1::Dependency response; + auto status = grpc_stub_->CreateDependency(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubDependenciesStub::GetDependency( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetDependencyRequest const& request) { + google::cloud::apihub::v1::Dependency response; + auto status = grpc_stub_->GetDependency(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubDependenciesStub::UpdateDependency( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + google::cloud::apihub::v1::Dependency response; + auto status = grpc_stub_->UpdateDependency(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultApiHubDependenciesStub::DeleteDependency( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->DeleteDependency(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr +DefaultApiHubDependenciesStub::ListDependencies( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListDependenciesRequest const& request) { + google::cloud::apihub::v1::ListDependenciesResponse response; + auto status = grpc_stub_->ListDependencies(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h new file mode 100644 index 0000000000000..56fb376d4ff07 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h @@ -0,0 +1,102 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_STUB_H + +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubDependenciesStub { + public: + virtual ~ApiHubDependenciesStub() = 0; + + virtual StatusOr CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) = 0; + + virtual StatusOr GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) = 0; + + virtual StatusOr UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) = 0; + + virtual Status DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) = 0; + + virtual StatusOr + ListDependencies( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& request) = 0; +}; + +class DefaultApiHubDependenciesStub : public ApiHubDependenciesStub { + public: + explicit DefaultApiHubDependenciesStub( + std::unique_ptr< + google::cloud::apihub::v1::ApiHubDependencies::StubInterface> + grpc_stub) + : grpc_stub_(std::move(grpc_stub)) {} + + StatusOr CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) + override; + + StatusOr GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) override; + + StatusOr UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) + override; + + Status DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) + override; + + StatusOr + ListDependencies(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& + request) override; + + private: + std::unique_ptr + grpc_stub_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_STUB_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.cc new file mode 100644 index 0000000000000..c7d4080790d6d --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.cc @@ -0,0 +1,72 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_auth_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_logging_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_metadata_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultApiHubDependenciesStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = + google::cloud::apihub::v1::ApiHubDependencies::NewStub(channel); + std::shared_ptr stub = + std::make_shared( + std::move(service_grpc_stub)); + + if (auth->RequiresConfigureContext()) { + stub = std::make_shared(std::move(auth), + std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeApiHubDependenciesTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.h new file mode 100644 index 0000000000000..1edae286f7d42 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_stub_factory.h @@ -0,0 +1,42 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_STUB_FACTORY_H + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultApiHubDependenciesStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_STUB_FACTORY_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.cc new file mode 100644 index 0000000000000..c8b2499b77034 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.cc @@ -0,0 +1,99 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/internal/traced_stream_range.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ApiHubDependenciesTracingConnection::ApiHubDependenciesTracingConnection( + std::shared_ptr child) + : child_(std::move(child)) {} + +StatusOr +ApiHubDependenciesTracingConnection::CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ApiHubDependenciesConnection::CreateDependency"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CreateDependency(request)); +} + +StatusOr +ApiHubDependenciesTracingConnection::GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ApiHubDependenciesConnection::GetDependency"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetDependency(request)); +} + +StatusOr +ApiHubDependenciesTracingConnection::UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ApiHubDependenciesConnection::UpdateDependency"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateDependency(request)); +} + +Status ApiHubDependenciesTracingConnection::DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ApiHubDependenciesConnection::DeleteDependency"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteDependency(request)); +} + +StreamRange +ApiHubDependenciesTracingConnection::ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request) { + auto span = internal::MakeSpan( + "apihub_v1::ApiHubDependenciesConnection::ListDependencies"); + internal::OTelScope scope(span); + auto sr = child_->ListDependencies(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeApiHubDependenciesTracingConnection( + std::shared_ptr conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = + std::make_shared(std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.h new file mode 100644 index 0000000000000..b05b625d7b53f --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_connection.h @@ -0,0 +1,82 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_TRACING_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ApiHubDependenciesTracingConnection + : public apihub_v1::ApiHubDependenciesConnection { + public: + ~ApiHubDependenciesTracingConnection() override = default; + + explicit ApiHubDependenciesTracingConnection( + std::shared_ptr child); + + Options options() override { return child_->options(); } + + StatusOr CreateDependency( + google::cloud::apihub::v1::CreateDependencyRequest const& request) + override; + + StatusOr GetDependency( + google::cloud::apihub::v1::GetDependencyRequest const& request) override; + + StatusOr UpdateDependency( + google::cloud::apihub::v1::UpdateDependencyRequest const& request) + override; + + Status DeleteDependency( + google::cloud::apihub::v1::DeleteDependencyRequest const& request) + override; + + StreamRange ListDependencies( + google::cloud::apihub::v1::ListDependenciesRequest request) override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr +MakeApiHubDependenciesTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_TRACING_CONNECTION_H diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.cc b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.cc new file mode 100644 index 0000000000000..8b0797c41422b --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.cc @@ -0,0 +1,108 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ApiHubDependenciesTracingStub::ApiHubDependenciesTracingStub( + std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +StatusOr +ApiHubDependenciesTracingStub::CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.ApiHubDependencies", "CreateDependency"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CreateDependency(context, options, request)); +} + +StatusOr +ApiHubDependenciesTracingStub::GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.ApiHubDependencies", "GetDependency"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetDependency(context, options, request)); +} + +StatusOr +ApiHubDependenciesTracingStub::UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.ApiHubDependencies", "UpdateDependency"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateDependency(context, options, request)); +} + +Status ApiHubDependenciesTracingStub::DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.ApiHubDependencies", "DeleteDependency"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteDependency(context, options, request)); +} + +StatusOr +ApiHubDependenciesTracingStub::ListDependencies( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.ApiHubDependencies", "ListDependencies"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListDependencies(context, options, request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr MakeApiHubDependenciesTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared(std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.h b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.h new file mode 100644 index 0000000000000..de64544b915a0 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_dependencies_tracing_stub.h @@ -0,0 +1,88 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_TRACING_STUB_H + +#include "google/cloud/apihub/v1/internal/api_hub_dependencies_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ApiHubDependenciesTracingStub : public ApiHubDependenciesStub { + public: + ~ApiHubDependenciesTracingStub() override = default; + + explicit ApiHubDependenciesTracingStub( + std::shared_ptr child); + + StatusOr CreateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDependencyRequest const& request) + override; + + StatusOr GetDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDependencyRequest const& request) override; + + StatusOr UpdateDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDependencyRequest const& request) + override; + + Status DeleteDependency( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDependencyRequest const& request) + override; + + StatusOr + ListDependencies(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDependenciesRequest const& + request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr MakeApiHubDependenciesTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_DEPENDENCIES_TRACING_STUB_H diff --git a/google/cloud/apihub/v1/internal/api_hub_logging_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_logging_decorator.cc new file mode 100644 index 0000000000000..0c2906f4d557f --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_logging_decorator.cc @@ -0,0 +1,444 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubLogging::ApiHubLogging(std::shared_ptr child, + TracingOptions tracing_options, + std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +StatusOr ApiHubLogging::CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) { + return child_->CreateApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) { + return child_->GetApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) { + return child_->ListApis(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) { + return child_->UpdateApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ApiHubLogging::DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) { + return child_->DeleteApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) { + return child_->CreateVersion(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) { + return child_->GetVersion(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) { + return child_->ListVersions(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + return child_->UpdateVersion(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ApiHubLogging::DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + return child_->DeleteVersion(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) { + return child_->CreateSpec(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) { + return child_->GetSpec(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + return child_->GetSpecContents(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) { + return child_->ListSpecs(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + return child_->UpdateSpec(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ApiHubLogging::DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + return child_->DeleteSpec(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + return child_->GetApiOperation(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::ListApiOperations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& request) { + return child_->ListApiOperations(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + return child_->GetDefinition(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + return child_->CreateDeployment(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + return child_->GetDeployment(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) { + return child_->ListDeployments(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + return child_->UpdateDeployment(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ApiHubLogging::DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + return child_->DeleteDeployment(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + return child_->CreateAttribute(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) { + return child_->GetAttribute(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + return child_->UpdateAttribute(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ApiHubLogging::DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + return child_->DeleteAttribute(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) { + return child_->ListAttributes(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) { + return child_->SearchResources(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + return child_->CreateExternalApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubLogging::GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + return child_->GetExternalApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + return child_->UpdateExternalApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status ApiHubLogging::DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + return child_->DeleteExternalApi(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ApiHubLogging::ListExternalApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& request) { + return child_->ListExternalApis(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_logging_decorator.h b/google/cloud/apihub/v1/internal/api_hub_logging_decorator.h new file mode 100644 index 0000000000000..bb4b8bdc9e4da --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_logging_decorator.h @@ -0,0 +1,206 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_LOGGING_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubLogging : public ApiHubStub { + public: + ~ApiHubLogging() override = default; + ApiHubLogging(std::shared_ptr child, + TracingOptions tracing_options, + std::set const& components); + + StatusOr CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) override; + + StatusOr GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) override; + + StatusOr ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) override; + + StatusOr UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) override; + + Status DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) override; + + StatusOr CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) override; + + StatusOr GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) override; + + StatusOr ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) override; + + StatusOr UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) override; + + Status DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) override; + + StatusOr CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) override; + + StatusOr GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) override; + + StatusOr GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) + override; + + StatusOr ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) override; + + StatusOr UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) override; + + Status DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) override; + + StatusOr GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) + override; + + StatusOr + ListApiOperations(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& + request) override; + + StatusOr GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) override; + + StatusOr CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) + override; + + StatusOr GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) override; + + StatusOr ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) + override; + + StatusOr UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) + override; + + Status DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) + override; + + StatusOr CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) + override; + + StatusOr GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) override; + + StatusOr UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) + override; + + Status DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) + override; + + StatusOr ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) override; + + StatusOr SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) + override; + + StatusOr CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) + override; + + StatusOr GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) override; + + StatusOr UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) + override; + + Status DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) + override; + + StatusOr + ListExternalApis(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& + request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // ApiHubLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_LOGGING_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_metadata_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_metadata_decorator.cc new file mode 100644 index 0000000000000..3595b8e7a05ac --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_metadata_decorator.cc @@ -0,0 +1,363 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubMetadata::ApiHubMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +StatusOr ApiHubMetadata::CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateApi(context, options, request); +} + +StatusOr ApiHubMetadata::GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetApi(context, options, request); +} + +StatusOr ApiHubMetadata::ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListApis(context, options, request); +} + +StatusOr ApiHubMetadata::UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) { + SetMetadata( + context, options, + absl::StrCat("api.name=", internal::UrlEncode(request.api().name()))); + return child_->UpdateApi(context, options, request); +} + +Status ApiHubMetadata::DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteApi(context, options, request); +} + +StatusOr ApiHubMetadata::CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateVersion(context, options, request); +} + +StatusOr ApiHubMetadata::GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetVersion(context, options, request); +} + +StatusOr +ApiHubMetadata::ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListVersions(context, options, request); +} + +StatusOr ApiHubMetadata::UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + SetMetadata(context, options, + absl::StrCat("version.name=", + internal::UrlEncode(request.version().name()))); + return child_->UpdateVersion(context, options, request); +} + +Status ApiHubMetadata::DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteVersion(context, options, request); +} + +StatusOr ApiHubMetadata::CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateSpec(context, options, request); +} + +StatusOr ApiHubMetadata::GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetSpec(context, options, request); +} + +StatusOr +ApiHubMetadata::GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetSpecContents(context, options, request); +} + +StatusOr +ApiHubMetadata::ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListSpecs(context, options, request); +} + +StatusOr ApiHubMetadata::UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + SetMetadata( + context, options, + absl::StrCat("spec.name=", internal::UrlEncode(request.spec().name()))); + return child_->UpdateSpec(context, options, request); +} + +Status ApiHubMetadata::DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteSpec(context, options, request); +} + +StatusOr +ApiHubMetadata::GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetApiOperation(context, options, request); +} + +StatusOr +ApiHubMetadata::ListApiOperations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListApiOperations(context, options, request); +} + +StatusOr ApiHubMetadata::GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetDefinition(context, options, request); +} + +StatusOr +ApiHubMetadata::CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateDeployment(context, options, request); +} + +StatusOr ApiHubMetadata::GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetDeployment(context, options, request); +} + +StatusOr +ApiHubMetadata::ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListDeployments(context, options, request); +} + +StatusOr +ApiHubMetadata::UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + SetMetadata(context, options, + absl::StrCat("deployment.name=", + internal::UrlEncode(request.deployment().name()))); + return child_->UpdateDeployment(context, options, request); +} + +Status ApiHubMetadata::DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteDeployment(context, options, request); +} + +StatusOr ApiHubMetadata::CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateAttribute(context, options, request); +} + +StatusOr ApiHubMetadata::GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetAttribute(context, options, request); +} + +StatusOr ApiHubMetadata::UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + SetMetadata(context, options, + absl::StrCat("attribute.name=", + internal::UrlEncode(request.attribute().name()))); + return child_->UpdateAttribute(context, options, request); +} + +Status ApiHubMetadata::DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteAttribute(context, options, request); +} + +StatusOr +ApiHubMetadata::ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListAttributes(context, options, request); +} + +StatusOr +ApiHubMetadata::SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) { + SetMetadata( + context, options, + absl::StrCat("location=", internal::UrlEncode(request.location()))); + return child_->SearchResources(context, options, request); +} + +StatusOr +ApiHubMetadata::CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateExternalApi(context, options, request); +} + +StatusOr ApiHubMetadata::GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetExternalApi(context, options, request); +} + +StatusOr +ApiHubMetadata::UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + SetMetadata(context, options, + absl::StrCat("external_api.name=", + internal::UrlEncode(request.external_api().name()))); + return child_->UpdateExternalApi(context, options, request); +} + +Status ApiHubMetadata::DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteExternalApi(context, options, request); +} + +StatusOr +ApiHubMetadata::ListExternalApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListExternalApis(context, options, request); +} + +void ApiHubMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void ApiHubMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_metadata_decorator.h b/google/cloud/apihub/v1/internal/api_hub_metadata_decorator.h new file mode 100644 index 0000000000000..fdb3212abe188 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_metadata_decorator.h @@ -0,0 +1,211 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_METADATA_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubMetadata : public ApiHubStub { + public: + ~ApiHubMetadata() override = default; + ApiHubMetadata(std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + StatusOr CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) override; + + StatusOr GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) override; + + StatusOr ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) override; + + StatusOr UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) override; + + Status DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) override; + + StatusOr CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) override; + + StatusOr GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) override; + + StatusOr ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) override; + + StatusOr UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) override; + + Status DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) override; + + StatusOr CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) override; + + StatusOr GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) override; + + StatusOr GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) + override; + + StatusOr ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) override; + + StatusOr UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) override; + + Status DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) override; + + StatusOr GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) + override; + + StatusOr + ListApiOperations(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& + request) override; + + StatusOr GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) override; + + StatusOr CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) + override; + + StatusOr GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) override; + + StatusOr ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) + override; + + StatusOr UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) + override; + + Status DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) + override; + + StatusOr CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) + override; + + StatusOr GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) override; + + StatusOr UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) + override; + + Status DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) + override; + + StatusOr ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) override; + + StatusOr SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) + override; + + StatusOr CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) + override; + + StatusOr GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) override; + + StatusOr UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) + override; + + Status DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) + override; + + StatusOr + ListExternalApis(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& + request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_METADATA_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_option_defaults.cc b/google/cloud/apihub/v1/internal/api_hub_option_defaults.cc new file mode 100644 index 0000000000000..12270801e6dee --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_option_defaults.cc @@ -0,0 +1,64 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_option_defaults.h" +#include "google/cloud/apihub/v1/api_hub_connection.h" +#include "google/cloud/apihub/v1/api_hub_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options ApiHubDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), "GOOGLE_CLOUD_CPP_API_HUB_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_API_HUB_AUTHORITY", "apihub.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options.has()) { + options.set( + apihub_v1::ApiHubLimitedTimeRetryPolicy(std::chrono::minutes(30)) + .clone()); + } + if (!options.has()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options.has()) { + options.set( + apihub_v1::MakeDefaultApiHubConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_option_defaults.h b/google/cloud/apihub/v1/internal/api_hub_option_defaults.h new file mode 100644 index 0000000000000..b64e92363004d --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options ApiHubDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_OPTION_DEFAULTS_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.cc new file mode 100644 index 0000000000000..18b2813e0cee9 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.cc @@ -0,0 +1,61 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubPluginAuth::ApiHubPluginAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +StatusOr ApiHubPluginAuth::GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetPlugin(context, options, request); +} + +StatusOr ApiHubPluginAuth::EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->EnablePlugin(context, options, request); +} + +StatusOr ApiHubPluginAuth::DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DisablePlugin(context, options, request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.h b/google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.h new file mode 100644 index 0000000000000..71528aa224795 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.h @@ -0,0 +1,63 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_AUTH_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubPluginAuth : public ApiHubPluginStub { + public: + ~ApiHubPluginAuth() override = default; + ApiHubPluginAuth( + std::shared_ptr auth, + std::shared_ptr child); + + StatusOr GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) override; + + StatusOr EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) override; + + StatusOr DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_AUTH_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.cc new file mode 100644 index 0000000000000..45121b5dfd071 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.cc @@ -0,0 +1,105 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr retry_policy( + Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr +idempotency_policy(Options const& options) { + return options + .get() + ->clone(); +} + +} // namespace + +ApiHubPluginConnectionImpl::ApiHubPluginConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions(std::move(options), + ApiHubPluginConnection::options())) {} + +StatusOr +ApiHubPluginConnectionImpl::GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetPlugin(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) { + return stub_->GetPlugin(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubPluginConnectionImpl::EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->EnablePlugin(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) { + return stub_->EnablePlugin(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ApiHubPluginConnectionImpl::DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DisablePlugin(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) { + return stub_->DisablePlugin(context, options, request); + }, + *current, request, __func__); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.h b/google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.h new file mode 100644 index 0000000000000..c5b81a1b60dcf --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.h @@ -0,0 +1,70 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_CONNECTION_IMPL_H + +#include "google/cloud/apihub/v1/api_hub_plugin_connection.h" +#include "google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/api_hub_plugin_options.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_retry_traits.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubPluginConnectionImpl : public apihub_v1::ApiHubPluginConnection { + public: + ~ApiHubPluginConnectionImpl() override = default; + + ApiHubPluginConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options); + + Options options() override { return options_; } + + StatusOr GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request) override; + + StatusOr EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request) override; + + StatusOr DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request) override; + + private: + std::unique_ptr background_; + std::shared_ptr stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_CONNECTION_IMPL_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.cc new file mode 100644 index 0000000000000..9b653f2b80ca5 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.cc @@ -0,0 +1,74 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubPluginLogging::ApiHubPluginLogging( + std::shared_ptr child, TracingOptions tracing_options, + std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +StatusOr ApiHubPluginLogging::GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) { + return child_->GetPlugin(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubPluginLogging::EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) { + return child_->EnablePlugin(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr ApiHubPluginLogging::DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) { + return child_->DisablePlugin(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.h b/google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.h new file mode 100644 index 0000000000000..7e6f792bd44a4 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.h @@ -0,0 +1,63 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_LOGGING_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubPluginLogging : public ApiHubPluginStub { + public: + ~ApiHubPluginLogging() override = default; + ApiHubPluginLogging(std::shared_ptr child, + TracingOptions tracing_options, + std::set const& components); + + StatusOr GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) override; + + StatusOr EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) override; + + StatusOr DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // ApiHubPluginLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_LOGGING_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.cc new file mode 100644 index 0000000000000..adf5fa8cf6eb1 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.cc @@ -0,0 +1,87 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubPluginMetadata::ApiHubPluginMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +StatusOr ApiHubPluginMetadata::GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetPlugin(context, options, request); +} + +StatusOr ApiHubPluginMetadata::EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->EnablePlugin(context, options, request); +} + +StatusOr ApiHubPluginMetadata::DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DisablePlugin(context, options, request); +} + +void ApiHubPluginMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void ApiHubPluginMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.h b/google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.h new file mode 100644 index 0000000000000..5ffb0b9569564 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.h @@ -0,0 +1,68 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_METADATA_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubPluginMetadata : public ApiHubPluginStub { + public: + ~ApiHubPluginMetadata() override = default; + ApiHubPluginMetadata(std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + StatusOr GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) override; + + StatusOr EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) override; + + StatusOr DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_METADATA_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.cc new file mode 100644 index 0000000000000..8a48bb57bb8b7 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.cc @@ -0,0 +1,65 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.h" +#include "google/cloud/apihub/v1/api_hub_plugin_connection.h" +#include "google/cloud/apihub/v1/api_hub_plugin_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options ApiHubPluginDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), "GOOGLE_CLOUD_CPP_API_HUB_PLUGIN_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_API_HUB_PLUGIN_AUTHORITY", "apihub.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options.has()) { + options.set( + apihub_v1::ApiHubPluginLimitedTimeRetryPolicy(std::chrono::minutes(30)) + .clone()); + } + if (!options.has()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options + .has()) { + options.set( + apihub_v1::MakeDefaultApiHubPluginConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.h b/google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.h new file mode 100644 index 0000000000000..d9c095e05f803 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options ApiHubPluginDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_OPTION_DEFAULTS_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_retry_traits.h b/google/cloud/apihub/v1/internal/api_hub_plugin_retry_traits.h new file mode 100644 index 0000000000000..8ddd252e8d3a3 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct ApiHubPluginRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_RETRY_TRAITS_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_sources.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_sources.cc new file mode 100644 index 0000000000000..62c1f9edc06c5 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/apihub/v1/api_hub_plugin_client.cc" +#include "google/cloud/apihub/v1/api_hub_plugin_connection.cc" +#include "google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_connection_impl.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_option_defaults.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.cc" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_stub.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_stub.cc new file mode 100644 index 0000000000000..7d7473aeb0a71 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_stub.cc @@ -0,0 +1,71 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubPluginStub::~ApiHubPluginStub() = default; + +StatusOr DefaultApiHubPluginStub::GetPlugin( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetPluginRequest const& request) { + google::cloud::apihub::v1::Plugin response; + auto status = grpc_stub_->GetPlugin(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubPluginStub::EnablePlugin( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::EnablePluginRequest const& request) { + google::cloud::apihub::v1::Plugin response; + auto status = grpc_stub_->EnablePlugin(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubPluginStub::DisablePlugin( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DisablePluginRequest const& request) { + google::cloud::apihub::v1::Plugin response; + auto status = grpc_stub_->DisablePlugin(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_stub.h b/google/cloud/apihub/v1/internal/api_hub_plugin_stub.h new file mode 100644 index 0000000000000..7db9af047cea1 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_stub.h @@ -0,0 +1,80 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_STUB_H + +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubPluginStub { + public: + virtual ~ApiHubPluginStub() = 0; + + virtual StatusOr GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) = 0; + + virtual StatusOr EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) = 0; + + virtual StatusOr DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) = 0; +}; + +class DefaultApiHubPluginStub : public ApiHubPluginStub { + public: + explicit DefaultApiHubPluginStub( + std::unique_ptr + grpc_stub) + : grpc_stub_(std::move(grpc_stub)) {} + + StatusOr GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) override; + + StatusOr EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) override; + + StatusOr DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) override; + + private: + std::unique_ptr + grpc_stub_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_STUB_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.cc new file mode 100644 index 0000000000000..eedc99d3bc719 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.cc @@ -0,0 +1,70 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_auth_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_logging_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_metadata_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultApiHubPluginStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = + google::cloud::apihub::v1::ApiHubPlugin::NewStub(channel); + std::shared_ptr stub = + std::make_shared(std::move(service_grpc_stub)); + + if (auth->RequiresConfigureContext()) { + stub = std::make_shared(std::move(auth), std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeApiHubPluginTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.h b/google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.h new file mode 100644 index 0000000000000..a618a811435f9 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_stub_factory.h @@ -0,0 +1,42 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_STUB_FACTORY_H + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultApiHubPluginStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_STUB_FACTORY_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.cc new file mode 100644 index 0000000000000..7aa811a80b4b0 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.cc @@ -0,0 +1,78 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ApiHubPluginTracingConnection::ApiHubPluginTracingConnection( + std::shared_ptr child) + : child_(std::move(child)) {} + +StatusOr +ApiHubPluginTracingConnection::GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubPluginConnection::GetPlugin"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetPlugin(request)); +} + +StatusOr +ApiHubPluginTracingConnection::EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubPluginConnection::EnablePlugin"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->EnablePlugin(request)); +} + +StatusOr +ApiHubPluginTracingConnection::DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubPluginConnection::DisablePlugin"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DisablePlugin(request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeApiHubPluginTracingConnection( + std::shared_ptr conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = std::make_shared(std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.h b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.h new file mode 100644 index 0000000000000..adb1deabf445c --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_connection.h @@ -0,0 +1,72 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_TRACING_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_plugin_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ApiHubPluginTracingConnection : public apihub_v1::ApiHubPluginConnection { + public: + ~ApiHubPluginTracingConnection() override = default; + + explicit ApiHubPluginTracingConnection( + std::shared_ptr child); + + Options options() override { return child_->options(); } + + StatusOr GetPlugin( + google::cloud::apihub::v1::GetPluginRequest const& request) override; + + StatusOr EnablePlugin( + google::cloud::apihub::v1::EnablePluginRequest const& request) override; + + StatusOr DisablePlugin( + google::cloud::apihub::v1::DisablePluginRequest const& request) override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr +MakeApiHubPluginTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_TRACING_CONNECTION_H diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.cc b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.cc new file mode 100644 index 0000000000000..393ae7a71f9bc --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.cc @@ -0,0 +1,84 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ApiHubPluginTracingStub::ApiHubPluginTracingStub( + std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +StatusOr ApiHubPluginTracingStub::GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHubPlugin", + "GetPlugin"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetPlugin(context, options, request)); +} + +StatusOr +ApiHubPluginTracingStub::EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHubPlugin", + "EnablePlugin"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->EnablePlugin(context, options, request)); +} + +StatusOr +ApiHubPluginTracingStub::DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHubPlugin", + "DisablePlugin"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DisablePlugin(context, options, request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr MakeApiHubPluginTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared(std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.h b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.h new file mode 100644 index 0000000000000..3784da3572d28 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_plugin_tracing_stub.h @@ -0,0 +1,75 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_TRACING_STUB_H + +#include "google/cloud/apihub/v1/internal/api_hub_plugin_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ApiHubPluginTracingStub : public ApiHubPluginStub { + public: + ~ApiHubPluginTracingStub() override = default; + + explicit ApiHubPluginTracingStub(std::shared_ptr child); + + StatusOr GetPlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetPluginRequest const& request) override; + + StatusOr EnablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::EnablePluginRequest const& request) override; + + StatusOr DisablePlugin( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DisablePluginRequest const& request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr MakeApiHubPluginTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_PLUGIN_TRACING_STUB_H diff --git a/google/cloud/apihub/v1/internal/api_hub_retry_traits.h b/google/cloud/apihub/v1/internal/api_hub_retry_traits.h new file mode 100644 index 0000000000000..f2375e68354f5 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct ApiHubRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_RETRY_TRAITS_H diff --git a/google/cloud/apihub/v1/internal/api_hub_sources.cc b/google/cloud/apihub/v1/internal/api_hub_sources.cc new file mode 100644 index 0000000000000..1355d5503cf04 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/apihub/v1/api_hub_client.cc" +#include "google/cloud/apihub/v1/api_hub_connection.cc" +#include "google/cloud/apihub/v1/api_hub_connection_idempotency_policy.cc" +#include "google/cloud/apihub/v1/internal/api_hub_auth_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_connection_impl.cc" +#include "google/cloud/apihub/v1/internal/api_hub_logging_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_metadata_decorator.cc" +#include "google/cloud/apihub/v1/internal/api_hub_option_defaults.cc" +#include "google/cloud/apihub/v1/internal/api_hub_stub.cc" +#include "google/cloud/apihub/v1/internal/api_hub_stub_factory.cc" +#include "google/cloud/apihub/v1/internal/api_hub_tracing_connection.cc" +#include "google/cloud/apihub/v1/internal/api_hub_tracing_stub.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/apihub/v1/internal/api_hub_stub.cc b/google/cloud/apihub/v1/internal/api_hub_stub.cc new file mode 100644 index 0000000000000..cbca2457e2d66 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_stub.cc @@ -0,0 +1,440 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ApiHubStub::~ApiHubStub() = default; + +StatusOr DefaultApiHubStub::CreateApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateApiRequest const& request) { + google::cloud::apihub::v1::Api response; + auto status = grpc_stub_->CreateApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultApiHubStub::GetApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetApiRequest const& request) { + google::cloud::apihub::v1::Api response; + auto status = grpc_stub_->GetApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::ListApis( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListApisRequest const& request) { + google::cloud::apihub::v1::ListApisResponse response; + auto status = grpc_stub_->ListApis(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultApiHubStub::UpdateApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateApiRequest const& request) { + google::cloud::apihub::v1::Api response; + auto status = grpc_stub_->UpdateApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultApiHubStub::DeleteApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteApiRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->DeleteApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr DefaultApiHubStub::CreateVersion( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateVersionRequest const& request) { + google::cloud::apihub::v1::Version response; + auto status = grpc_stub_->CreateVersion(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultApiHubStub::GetVersion( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetVersionRequest const& request) { + google::cloud::apihub::v1::Version response; + auto status = grpc_stub_->GetVersion(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::ListVersions( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListVersionsRequest const& request) { + google::cloud::apihub::v1::ListVersionsResponse response; + auto status = grpc_stub_->ListVersions(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultApiHubStub::UpdateVersion( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + google::cloud::apihub::v1::Version response; + auto status = grpc_stub_->UpdateVersion(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultApiHubStub::DeleteVersion( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->DeleteVersion(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr DefaultApiHubStub::CreateSpec( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateSpecRequest const& request) { + google::cloud::apihub::v1::Spec response; + auto status = grpc_stub_->CreateSpec(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultApiHubStub::GetSpec( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetSpecRequest const& request) { + google::cloud::apihub::v1::Spec response; + auto status = grpc_stub_->GetSpec(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::GetSpecContents( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + google::cloud::apihub::v1::SpecContents response; + auto status = grpc_stub_->GetSpecContents(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::ListSpecs( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListSpecsRequest const& request) { + google::cloud::apihub::v1::ListSpecsResponse response; + auto status = grpc_stub_->ListSpecs(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultApiHubStub::UpdateSpec( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + google::cloud::apihub::v1::Spec response; + auto status = grpc_stub_->UpdateSpec(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultApiHubStub::DeleteSpec( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->DeleteSpec(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr +DefaultApiHubStub::GetApiOperation( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + google::cloud::apihub::v1::ApiOperation response; + auto status = grpc_stub_->GetApiOperation(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::ListApiOperations( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListApiOperationsRequest const& request) { + google::cloud::apihub::v1::ListApiOperationsResponse response; + auto status = grpc_stub_->ListApiOperations(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::GetDefinition( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + google::cloud::apihub::v1::Definition response; + auto status = grpc_stub_->GetDefinition(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::CreateDeployment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + google::cloud::apihub::v1::Deployment response; + auto status = grpc_stub_->CreateDeployment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::GetDeployment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + google::cloud::apihub::v1::Deployment response; + auto status = grpc_stub_->GetDeployment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::ListDeployments( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) { + google::cloud::apihub::v1::ListDeploymentsResponse response; + auto status = grpc_stub_->ListDeployments(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::UpdateDeployment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + google::cloud::apihub::v1::Deployment response; + auto status = grpc_stub_->UpdateDeployment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultApiHubStub::DeleteDeployment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->DeleteDeployment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr +DefaultApiHubStub::CreateAttribute( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + google::cloud::apihub::v1::Attribute response; + auto status = grpc_stub_->CreateAttribute(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr DefaultApiHubStub::GetAttribute( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetAttributeRequest const& request) { + google::cloud::apihub::v1::Attribute response; + auto status = grpc_stub_->GetAttribute(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::UpdateAttribute( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + google::cloud::apihub::v1::Attribute response; + auto status = grpc_stub_->UpdateAttribute(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultApiHubStub::DeleteAttribute( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->DeleteAttribute(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr +DefaultApiHubStub::ListAttributes( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListAttributesRequest const& request) { + google::cloud::apihub::v1::ListAttributesResponse response; + auto status = grpc_stub_->ListAttributes(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::SearchResources( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::SearchResourcesRequest const& request) { + google::cloud::apihub::v1::SearchResourcesResponse response; + auto status = grpc_stub_->SearchResources(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::CreateExternalApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + google::cloud::apihub::v1::ExternalApi response; + auto status = grpc_stub_->CreateExternalApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::GetExternalApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + google::cloud::apihub::v1::ExternalApi response; + auto status = grpc_stub_->GetExternalApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultApiHubStub::UpdateExternalApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + google::cloud::apihub::v1::ExternalApi response; + auto status = grpc_stub_->UpdateExternalApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultApiHubStub::DeleteExternalApi( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->DeleteExternalApi(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr +DefaultApiHubStub::ListExternalApis( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListExternalApisRequest const& request) { + google::cloud::apihub::v1::ListExternalApisResponse response; + auto status = grpc_stub_->ListExternalApis(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_stub.h b/google/cloud/apihub/v1/internal/api_hub_stub.h new file mode 100644 index 0000000000000..4de103c05c940 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_stub.h @@ -0,0 +1,356 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_STUB_H + +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ApiHubStub { + public: + virtual ~ApiHubStub() = 0; + + virtual StatusOr CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) = 0; + + virtual StatusOr GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) = 0; + + virtual StatusOr ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) = 0; + + virtual StatusOr UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) = 0; + + virtual Status DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) = 0; + + virtual StatusOr CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) = 0; + + virtual StatusOr GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) = 0; + + virtual StatusOr + ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) = 0; + + virtual StatusOr UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) = 0; + + virtual Status DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) = 0; + + virtual StatusOr CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) = 0; + + virtual StatusOr GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) = 0; + + virtual StatusOr GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) = 0; + + virtual StatusOr ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) = 0; + + virtual StatusOr UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) = 0; + + virtual Status DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) = 0; + + virtual StatusOr GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) = 0; + + virtual StatusOr + ListApiOperations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& request) = 0; + + virtual StatusOr GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) = 0; + + virtual StatusOr CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) = 0; + + virtual StatusOr GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) = 0; + + virtual StatusOr + ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) = 0; + + virtual StatusOr UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) = 0; + + virtual Status DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) = 0; + + virtual StatusOr CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) = 0; + + virtual StatusOr GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) = 0; + + virtual StatusOr UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) = 0; + + virtual Status DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) = 0; + + virtual StatusOr + ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) = 0; + + virtual StatusOr + SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) = 0; + + virtual StatusOr CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) = 0; + + virtual StatusOr GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) = 0; + + virtual StatusOr UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) = 0; + + virtual Status DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) = 0; + + virtual StatusOr + ListExternalApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& request) = 0; +}; + +class DefaultApiHubStub : public ApiHubStub { + public: + explicit DefaultApiHubStub( + std::unique_ptr + grpc_stub) + : grpc_stub_(std::move(grpc_stub)) {} + + StatusOr CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) override; + + StatusOr GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) override; + + StatusOr ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) override; + + StatusOr UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) override; + + Status DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) override; + + StatusOr CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) override; + + StatusOr GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) override; + + StatusOr ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) override; + + StatusOr UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) override; + + Status DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) override; + + StatusOr CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) override; + + StatusOr GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) override; + + StatusOr GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) + override; + + StatusOr ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) override; + + StatusOr UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) override; + + Status DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) override; + + StatusOr GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) + override; + + StatusOr + ListApiOperations(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& + request) override; + + StatusOr GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) override; + + StatusOr CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) + override; + + StatusOr GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) override; + + StatusOr ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) + override; + + StatusOr UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) + override; + + Status DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) + override; + + StatusOr CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) + override; + + StatusOr GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) override; + + StatusOr UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) + override; + + Status DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) + override; + + StatusOr ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) override; + + StatusOr SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) + override; + + StatusOr CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) + override; + + StatusOr GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) override; + + StatusOr UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) + override; + + Status DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) + override; + + StatusOr + ListExternalApis(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& + request) override; + + private: + std::unique_ptr grpc_stub_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_STUB_H diff --git a/google/cloud/apihub/v1/internal/api_hub_stub_factory.cc b/google/cloud/apihub/v1/internal/api_hub_stub_factory.cc new file mode 100644 index 0000000000000..35b9606a9959e --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_stub_factory.cc @@ -0,0 +1,69 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_stub_factory.h" +#include "google/cloud/apihub/v1/internal/api_hub_auth_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_logging_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_metadata_decorator.h" +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/apihub/v1/internal/api_hub_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultApiHubStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = google::cloud::apihub::v1::ApiHub::NewStub(channel); + std::shared_ptr stub = + std::make_shared(std::move(service_grpc_stub)); + + if (auth->RequiresConfigureContext()) { + stub = std::make_shared(std::move(auth), std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeApiHubTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_stub_factory.h b/google/cloud/apihub/v1/internal/api_hub_stub_factory.h new file mode 100644 index 0000000000000..f3d9884e9bebc --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_stub_factory.h @@ -0,0 +1,42 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_STUB_FACTORY_H + +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultApiHubStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_STUB_FACTORY_H diff --git a/google/cloud/apihub/v1/internal/api_hub_tracing_connection.cc b/google/cloud/apihub/v1/internal/api_hub_tracing_connection.cc new file mode 100644 index 0000000000000..15766bb0ff4d7 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_tracing_connection.cc @@ -0,0 +1,348 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/internal/traced_stream_range.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ApiHubTracingConnection::ApiHubTracingConnection( + std::shared_ptr child) + : child_(std::move(child)) {} + +StatusOr ApiHubTracingConnection::CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::CreateApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CreateApi(request)); +} + +StatusOr ApiHubTracingConnection::GetApi( + google::cloud::apihub::v1::GetApiRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::GetApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetApi(request)); +} + +StreamRange ApiHubTracingConnection::ListApis( + google::cloud::apihub::v1::ListApisRequest request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::ListApis"); + internal::OTelScope scope(span); + auto sr = child_->ListApis(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +StatusOr ApiHubTracingConnection::UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::UpdateApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateApi(request)); +} + +Status ApiHubTracingConnection::DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::DeleteApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteApi(request)); +} + +StatusOr +ApiHubTracingConnection::CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::CreateVersion"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CreateVersion(request)); +} + +StatusOr +ApiHubTracingConnection::GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::GetVersion"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetVersion(request)); +} + +StreamRange +ApiHubTracingConnection::ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::ListVersions"); + internal::OTelScope scope(span); + auto sr = child_->ListVersions(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +StatusOr +ApiHubTracingConnection::UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::UpdateVersion"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateVersion(request)); +} + +Status ApiHubTracingConnection::DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::DeleteVersion"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteVersion(request)); +} + +StatusOr ApiHubTracingConnection::CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::CreateSpec"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CreateSpec(request)); +} + +StatusOr ApiHubTracingConnection::GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::GetSpec"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetSpec(request)); +} + +StatusOr +ApiHubTracingConnection::GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::GetSpecContents"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetSpecContents(request)); +} + +StreamRange ApiHubTracingConnection::ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::ListSpecs"); + internal::OTelScope scope(span); + auto sr = child_->ListSpecs(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +StatusOr ApiHubTracingConnection::UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::UpdateSpec"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateSpec(request)); +} + +Status ApiHubTracingConnection::DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::DeleteSpec"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteSpec(request)); +} + +StatusOr +ApiHubTracingConnection::GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::GetApiOperation"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetApiOperation(request)); +} + +StreamRange +ApiHubTracingConnection::ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::ListApiOperations"); + internal::OTelScope scope(span); + auto sr = child_->ListApiOperations(std::move(request)); + return internal::MakeTracedStreamRange< + google::cloud::apihub::v1::ApiOperation>(std::move(span), std::move(sr)); +} + +StatusOr +ApiHubTracingConnection::GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::GetDefinition"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetDefinition(request)); +} + +StatusOr +ApiHubTracingConnection::CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::CreateDeployment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CreateDeployment(request)); +} + +StatusOr +ApiHubTracingConnection::GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::GetDeployment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetDeployment(request)); +} + +StreamRange +ApiHubTracingConnection::ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::ListDeployments"); + internal::OTelScope scope(span); + auto sr = child_->ListDeployments(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +StatusOr +ApiHubTracingConnection::UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::UpdateDeployment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateDeployment(request)); +} + +Status ApiHubTracingConnection::DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::DeleteDeployment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteDeployment(request)); +} + +StatusOr +ApiHubTracingConnection::CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::CreateAttribute"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CreateAttribute(request)); +} + +StatusOr +ApiHubTracingConnection::GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::GetAttribute"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetAttribute(request)); +} + +StatusOr +ApiHubTracingConnection::UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::UpdateAttribute"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateAttribute(request)); +} + +Status ApiHubTracingConnection::DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::DeleteAttribute"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteAttribute(request)); +} + +StreamRange +ApiHubTracingConnection::ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::ListAttributes"); + internal::OTelScope scope(span); + auto sr = child_->ListAttributes(std::move(request)); + return internal::MakeTracedStreamRange( + std::move(span), std::move(sr)); +} + +StreamRange +ApiHubTracingConnection::SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::SearchResources"); + internal::OTelScope scope(span); + auto sr = child_->SearchResources(std::move(request)); + return internal::MakeTracedStreamRange< + google::cloud::apihub::v1::SearchResult>(std::move(span), std::move(sr)); +} + +StatusOr +ApiHubTracingConnection::CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::CreateExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->CreateExternalApi(request)); +} + +StatusOr +ApiHubTracingConnection::GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + auto span = internal::MakeSpan("apihub_v1::ApiHubConnection::GetExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetExternalApi(request)); +} + +StatusOr +ApiHubTracingConnection::UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::UpdateExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateExternalApi(request)); +} + +Status ApiHubTracingConnection::DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::DeleteExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->DeleteExternalApi(request)); +} + +StreamRange +ApiHubTracingConnection::ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request) { + auto span = + internal::MakeSpan("apihub_v1::ApiHubConnection::ListExternalApis"); + internal::OTelScope scope(span); + auto sr = child_->ListExternalApis(std::move(request)); + return internal::MakeTracedStreamRange< + google::cloud::apihub::v1::ExternalApi>(std::move(span), std::move(sr)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr MakeApiHubTracingConnection( + std::shared_ptr conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = std::make_shared(std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_tracing_connection.h b/google/cloud/apihub/v1/internal/api_hub_tracing_connection.h new file mode 100644 index 0000000000000..4bdd9a6d5ff94 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_tracing_connection.h @@ -0,0 +1,178 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_TRACING_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ApiHubTracingConnection : public apihub_v1::ApiHubConnection { + public: + ~ApiHubTracingConnection() override = default; + + explicit ApiHubTracingConnection( + std::shared_ptr child); + + Options options() override { return child_->options(); } + + StatusOr CreateApi( + google::cloud::apihub::v1::CreateApiRequest const& request) override; + + StatusOr GetApi( + google::cloud::apihub::v1::GetApiRequest const& request) override; + + StreamRange ListApis( + google::cloud::apihub::v1::ListApisRequest request) override; + + StatusOr UpdateApi( + google::cloud::apihub::v1::UpdateApiRequest const& request) override; + + Status DeleteApi( + google::cloud::apihub::v1::DeleteApiRequest const& request) override; + + StatusOr CreateVersion( + google::cloud::apihub::v1::CreateVersionRequest const& request) override; + + StatusOr GetVersion( + google::cloud::apihub::v1::GetVersionRequest const& request) override; + + StreamRange ListVersions( + google::cloud::apihub::v1::ListVersionsRequest request) override; + + StatusOr UpdateVersion( + google::cloud::apihub::v1::UpdateVersionRequest const& request) override; + + Status DeleteVersion( + google::cloud::apihub::v1::DeleteVersionRequest const& request) override; + + StatusOr CreateSpec( + google::cloud::apihub::v1::CreateSpecRequest const& request) override; + + StatusOr GetSpec( + google::cloud::apihub::v1::GetSpecRequest const& request) override; + + StatusOr GetSpecContents( + google::cloud::apihub::v1::GetSpecContentsRequest const& request) + override; + + StreamRange ListSpecs( + google::cloud::apihub::v1::ListSpecsRequest request) override; + + StatusOr UpdateSpec( + google::cloud::apihub::v1::UpdateSpecRequest const& request) override; + + Status DeleteSpec( + google::cloud::apihub::v1::DeleteSpecRequest const& request) override; + + StatusOr GetApiOperation( + google::cloud::apihub::v1::GetApiOperationRequest const& request) + override; + + StreamRange ListApiOperations( + google::cloud::apihub::v1::ListApiOperationsRequest request) override; + + StatusOr GetDefinition( + google::cloud::apihub::v1::GetDefinitionRequest const& request) override; + + StatusOr CreateDeployment( + google::cloud::apihub::v1::CreateDeploymentRequest const& request) + override; + + StatusOr GetDeployment( + google::cloud::apihub::v1::GetDeploymentRequest const& request) override; + + StreamRange ListDeployments( + google::cloud::apihub::v1::ListDeploymentsRequest request) override; + + StatusOr UpdateDeployment( + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) + override; + + Status DeleteDeployment( + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) + override; + + StatusOr CreateAttribute( + google::cloud::apihub::v1::CreateAttributeRequest const& request) + override; + + StatusOr GetAttribute( + google::cloud::apihub::v1::GetAttributeRequest const& request) override; + + StatusOr UpdateAttribute( + google::cloud::apihub::v1::UpdateAttributeRequest const& request) + override; + + Status DeleteAttribute( + google::cloud::apihub::v1::DeleteAttributeRequest const& request) + override; + + StreamRange ListAttributes( + google::cloud::apihub::v1::ListAttributesRequest request) override; + + StreamRange SearchResources( + google::cloud::apihub::v1::SearchResourcesRequest request) override; + + StatusOr CreateExternalApi( + google::cloud::apihub::v1::CreateExternalApiRequest const& request) + override; + + StatusOr GetExternalApi( + google::cloud::apihub::v1::GetExternalApiRequest const& request) override; + + StatusOr UpdateExternalApi( + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) + override; + + Status DeleteExternalApi( + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) + override; + + StreamRange ListExternalApis( + google::cloud::apihub::v1::ListExternalApisRequest request) override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr MakeApiHubTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_TRACING_CONNECTION_H diff --git a/google/cloud/apihub/v1/internal/api_hub_tracing_stub.cc b/google/cloud/apihub/v1/internal/api_hub_tracing_stub.cc new file mode 100644 index 0000000000000..02a6202f14920 --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_tracing_stub.cc @@ -0,0 +1,451 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/internal/api_hub_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ApiHubTracingStub::ApiHubTracingStub(std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +StatusOr ApiHubTracingStub::CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "CreateApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CreateApi(context, options, request)); +} + +StatusOr ApiHubTracingStub::GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "GetApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetApi(context, options, request)); +} + +StatusOr +ApiHubTracingStub::ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "ListApis"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListApis(context, options, request)); +} + +StatusOr ApiHubTracingStub::UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "UpdateApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateApi(context, options, request)); +} + +Status ApiHubTracingStub::DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "DeleteApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteApi(context, options, request)); +} + +StatusOr ApiHubTracingStub::CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "CreateVersion"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CreateVersion(context, options, request)); +} + +StatusOr ApiHubTracingStub::GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "GetVersion"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetVersion(context, options, request)); +} + +StatusOr +ApiHubTracingStub::ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "ListVersions"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListVersions(context, options, request)); +} + +StatusOr ApiHubTracingStub::UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "UpdateVersion"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateVersion(context, options, request)); +} + +Status ApiHubTracingStub::DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "DeleteVersion"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteVersion(context, options, request)); +} + +StatusOr ApiHubTracingStub::CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "CreateSpec"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CreateSpec(context, options, request)); +} + +StatusOr ApiHubTracingStub::GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "GetSpec"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetSpec(context, options, request)); +} + +StatusOr +ApiHubTracingStub::GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "GetSpecContents"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetSpecContents(context, options, request)); +} + +StatusOr +ApiHubTracingStub::ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "ListSpecs"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListSpecs(context, options, request)); +} + +StatusOr ApiHubTracingStub::UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "UpdateSpec"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateSpec(context, options, request)); +} + +Status ApiHubTracingStub::DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "DeleteSpec"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteSpec(context, options, request)); +} + +StatusOr +ApiHubTracingStub::GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "GetApiOperation"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetApiOperation(context, options, request)); +} + +StatusOr +ApiHubTracingStub::ListApiOperations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "ListApiOperations"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->ListApiOperations(context, options, request)); +} + +StatusOr +ApiHubTracingStub::GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "GetDefinition"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetDefinition(context, options, request)); +} + +StatusOr +ApiHubTracingStub::CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "CreateDeployment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CreateDeployment(context, options, request)); +} + +StatusOr +ApiHubTracingStub::GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "GetDeployment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetDeployment(context, options, request)); +} + +StatusOr +ApiHubTracingStub::ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "ListDeployments"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListDeployments(context, options, request)); +} + +StatusOr +ApiHubTracingStub::UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "UpdateDeployment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateDeployment(context, options, request)); +} + +Status ApiHubTracingStub::DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "DeleteDeployment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteDeployment(context, options, request)); +} + +StatusOr +ApiHubTracingStub::CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "CreateAttribute"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->CreateAttribute(context, options, request)); +} + +StatusOr ApiHubTracingStub::GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "GetAttribute"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetAttribute(context, options, request)); +} + +StatusOr +ApiHubTracingStub::UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "UpdateAttribute"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateAttribute(context, options, request)); +} + +Status ApiHubTracingStub::DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "DeleteAttribute"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->DeleteAttribute(context, options, request)); +} + +StatusOr +ApiHubTracingStub::ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "ListAttributes"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListAttributes(context, options, request)); +} + +StatusOr +ApiHubTracingStub::SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "SearchResources"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->SearchResources(context, options, request)); +} + +StatusOr +ApiHubTracingStub::CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "CreateExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->CreateExternalApi(context, options, request)); +} + +StatusOr +ApiHubTracingStub::GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", "GetExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetExternalApi(context, options, request)); +} + +StatusOr +ApiHubTracingStub::UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "UpdateExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->UpdateExternalApi(context, options, request)); +} + +Status ApiHubTracingStub::DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "DeleteExternalApi"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->DeleteExternalApi(context, options, request)); +} + +StatusOr +ApiHubTracingStub::ListExternalApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.ApiHub", + "ListExternalApis"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->ListExternalApis(context, options, request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr MakeApiHubTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared(std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/api_hub_tracing_stub.h b/google/cloud/apihub/v1/internal/api_hub_tracing_stub.h new file mode 100644 index 0000000000000..261645e415b0f --- /dev/null +++ b/google/cloud/apihub/v1/internal/api_hub_tracing_stub.h @@ -0,0 +1,218 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_TRACING_STUB_H + +#include "google/cloud/apihub/v1/internal/api_hub_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ApiHubTracingStub : public ApiHubStub { + public: + ~ApiHubTracingStub() override = default; + + explicit ApiHubTracingStub(std::shared_ptr child); + + StatusOr CreateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiRequest const& request) override; + + StatusOr GetApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiRequest const& request) override; + + StatusOr ListApis( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApisRequest const& request) override; + + StatusOr UpdateApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateApiRequest const& request) override; + + Status DeleteApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteApiRequest const& request) override; + + StatusOr CreateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateVersionRequest const& request) override; + + StatusOr GetVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetVersionRequest const& request) override; + + StatusOr ListVersions( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListVersionsRequest const& request) override; + + StatusOr UpdateVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateVersionRequest const& request) override; + + Status DeleteVersion( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteVersionRequest const& request) override; + + StatusOr CreateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateSpecRequest const& request) override; + + StatusOr GetSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecRequest const& request) override; + + StatusOr GetSpecContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetSpecContentsRequest const& request) + override; + + StatusOr ListSpecs( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListSpecsRequest const& request) override; + + StatusOr UpdateSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateSpecRequest const& request) override; + + Status DeleteSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteSpecRequest const& request) override; + + StatusOr GetApiOperation( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiOperationRequest const& request) + override; + + StatusOr + ListApiOperations(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListApiOperationsRequest const& + request) override; + + StatusOr GetDefinition( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDefinitionRequest const& request) override; + + StatusOr CreateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateDeploymentRequest const& request) + override; + + StatusOr GetDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetDeploymentRequest const& request) override; + + StatusOr ListDeployments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListDeploymentsRequest const& request) + override; + + StatusOr UpdateDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateDeploymentRequest const& request) + override; + + Status DeleteDeployment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteDeploymentRequest const& request) + override; + + StatusOr CreateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateAttributeRequest const& request) + override; + + StatusOr GetAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetAttributeRequest const& request) override; + + StatusOr UpdateAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateAttributeRequest const& request) + override; + + Status DeleteAttribute( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteAttributeRequest const& request) + override; + + StatusOr ListAttributes( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListAttributesRequest const& request) override; + + StatusOr SearchResources( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::SearchResourcesRequest const& request) + override; + + StatusOr CreateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateExternalApiRequest const& request) + override; + + StatusOr GetExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetExternalApiRequest const& request) override; + + StatusOr UpdateExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateExternalApiRequest const& request) + override; + + Status DeleteExternalApi( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteExternalApiRequest const& request) + override; + + StatusOr + ListExternalApis(grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListExternalApisRequest const& + request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr MakeApiHubTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_API_HUB_TRACING_STUB_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.cc b/google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.cc new file mode 100644 index 0000000000000..dbcbe043e81ef --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.cc @@ -0,0 +1,67 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +HostProjectRegistrationServiceAuth::HostProjectRegistrationServiceAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +StatusOr +HostProjectRegistrationServiceAuth::CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateHostProjectRegistration(context, options, request); +} + +StatusOr +HostProjectRegistrationServiceAuth::GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetHostProjectRegistration(context, options, request); +} + +StatusOr +HostProjectRegistrationServiceAuth::ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListHostProjectRegistrations(context, options, request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.h b/google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.h new file mode 100644 index 0000000000000..be001a00f6478 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.h @@ -0,0 +1,70 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_AUTH_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class HostProjectRegistrationServiceAuth + : public HostProjectRegistrationServiceStub { + public: + ~HostProjectRegistrationServiceAuth() override = default; + HostProjectRegistrationServiceAuth( + std::shared_ptr auth, + std::shared_ptr child); + + StatusOr + CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) override; + + StatusOr + GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) override; + + StatusOr + ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_AUTH_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_connection_impl.cc b/google/cloud/apihub/v1/internal/host_project_registration_connection_impl.cc new file mode 100644 index 0000000000000..d3547494b7e27 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_connection_impl.cc @@ -0,0 +1,146 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_connection_impl.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr +retry_policy(Options const& options) { + return options + .get() + ->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options + .get() + ->clone(); +} + +std::unique_ptr< + apihub_v1::HostProjectRegistrationServiceConnectionIdempotencyPolicy> +idempotency_policy(Options const& options) { + return options + .get< + apihub_v1:: + HostProjectRegistrationServiceConnectionIdempotencyPolicyOption>() + ->clone(); +} + +} // namespace + +HostProjectRegistrationServiceConnectionImpl:: + HostProjectRegistrationServiceConnectionImpl( + std::unique_ptr background, + std::shared_ptr + stub, + Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions( + std::move(options), + HostProjectRegistrationServiceConnection::options())) {} + +StatusOr +HostProjectRegistrationServiceConnectionImpl::CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateHostProjectRegistration(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + return stub_->CreateHostProjectRegistration(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +HostProjectRegistrationServiceConnectionImpl::GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetHostProjectRegistration(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + return stub_->GetHostProjectRegistration(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +HostProjectRegistrationServiceConnectionImpl::ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = + idempotency_policy(*current)->ListHostProjectRegistrations(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr< + apihub_v1::HostProjectRegistrationServiceRetryPolicy>( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + ListHostProjectRegistrationsRequest const& request) { + return stub->ListHostProjectRegistrations(context, options, + request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListHostProjectRegistrationsResponse r) { + std::vector result( + r.host_project_registrations().size()); + auto& messages = *r.mutable_host_project_registrations(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_connection_impl.h b/google/cloud/apihub/v1/internal/host_project_registration_connection_impl.h new file mode 100644 index 0000000000000..a7dff65d55981 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_connection_impl.h @@ -0,0 +1,79 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_CONNECTION_IMPL_H + +#include "google/cloud/apihub/v1/host_project_registration_connection.h" +#include "google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/host_project_registration_options.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_retry_traits.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class HostProjectRegistrationServiceConnectionImpl + : public apihub_v1::HostProjectRegistrationServiceConnection { + public: + ~HostProjectRegistrationServiceConnectionImpl() override = default; + + HostProjectRegistrationServiceConnectionImpl( + std::unique_ptr background, + std::shared_ptr + stub, + Options options); + + Options options() override { return options_; } + + StatusOr + CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) override; + + StatusOr + GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) override; + + StreamRange + ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request) + override; + + private: + std::unique_ptr background_; + std::shared_ptr stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_CONNECTION_IMPL_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.cc b/google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.cc new file mode 100644 index 0000000000000..0a63ebfc50efc --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.cc @@ -0,0 +1,85 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +HostProjectRegistrationServiceLogging::HostProjectRegistrationServiceLogging( + std::shared_ptr child, + TracingOptions tracing_options, std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +StatusOr +HostProjectRegistrationServiceLogging::CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + return child_->CreateHostProjectRegistration(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +HostProjectRegistrationServiceLogging::GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + return child_->GetHostProjectRegistration(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +HostProjectRegistrationServiceLogging::ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) { + return child_->ListHostProjectRegistrations(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.h b/google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.h new file mode 100644 index 0000000000000..3ca381df5ac89 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.h @@ -0,0 +1,70 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_LOGGING_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class HostProjectRegistrationServiceLogging + : public HostProjectRegistrationServiceStub { + public: + ~HostProjectRegistrationServiceLogging() override = default; + HostProjectRegistrationServiceLogging( + std::shared_ptr child, + TracingOptions tracing_options, std::set const& components); + + StatusOr + CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) override; + + StatusOr + GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) override; + + StatusOr + ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // HostProjectRegistrationServiceLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_LOGGING_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.cc b/google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.cc new file mode 100644 index 0000000000000..88c43253f5bf4 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.cc @@ -0,0 +1,93 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +HostProjectRegistrationServiceMetadata::HostProjectRegistrationServiceMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +StatusOr +HostProjectRegistrationServiceMetadata::CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateHostProjectRegistration(context, options, request); +} + +StatusOr +HostProjectRegistrationServiceMetadata::GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetHostProjectRegistration(context, options, request); +} + +StatusOr +HostProjectRegistrationServiceMetadata::ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListHostProjectRegistrations(context, options, request); +} + +void HostProjectRegistrationServiceMetadata::SetMetadata( + grpc::ClientContext& context, Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void HostProjectRegistrationServiceMetadata::SetMetadata( + grpc::ClientContext& context, Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.h b/google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.h new file mode 100644 index 0000000000000..a3d8c8347e979 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.h @@ -0,0 +1,76 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_METADATA_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class HostProjectRegistrationServiceMetadata + : public HostProjectRegistrationServiceStub { + public: + ~HostProjectRegistrationServiceMetadata() override = default; + HostProjectRegistrationServiceMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + StatusOr + CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) override; + + StatusOr + GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) override; + + StatusOr + ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_METADATA_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_option_defaults.cc b/google/cloud/apihub/v1/internal/host_project_registration_option_defaults.cc new file mode 100644 index 0000000000000..319c3961a4628 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_option_defaults.cc @@ -0,0 +1,74 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_option_defaults.h" +#include "google/cloud/apihub/v1/host_project_registration_connection.h" +#include "google/cloud/apihub/v1/host_project_registration_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options HostProjectRegistrationServiceDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), + "GOOGLE_CLOUD_CPP_HOST_PROJECT_REGISTRATION_SERVICE_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_HOST_PROJECT_REGISTRATION_SERVICE_AUTHORITY", + "apihub.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options + .has()) { + options.set( + apihub_v1::HostProjectRegistrationServiceLimitedTimeRetryPolicy( + std::chrono::minutes(30)) + .clone()); + } + if (!options.has< + apihub_v1::HostProjectRegistrationServiceBackoffPolicyOption>()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options.has< + apihub_v1:: + HostProjectRegistrationServiceConnectionIdempotencyPolicyOption>()) { + options.set< + apihub_v1:: + HostProjectRegistrationServiceConnectionIdempotencyPolicyOption>( + apihub_v1:: + MakeDefaultHostProjectRegistrationServiceConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_option_defaults.h b/google/cloud/apihub/v1/internal/host_project_registration_option_defaults.h new file mode 100644 index 0000000000000..6c6304abd8103 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options HostProjectRegistrationServiceDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_OPTION_DEFAULTS_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_retry_traits.h b/google/cloud/apihub/v1/internal/host_project_registration_retry_traits.h new file mode 100644 index 0000000000000..e83e4116c7461 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct HostProjectRegistrationServiceRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_RETRY_TRAITS_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_sources.cc b/google/cloud/apihub/v1/internal/host_project_registration_sources.cc new file mode 100644 index 0000000000000..ad35e893410f7 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/apihub/v1/host_project_registration_client.cc" +#include "google/cloud/apihub/v1/host_project_registration_connection.cc" +#include "google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_connection_impl.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_option_defaults.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_stub_factory.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.cc" +#include "google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/apihub/v1/internal/host_project_registration_stub.cc b/google/cloud/apihub/v1/internal/host_project_registration_stub.cc new file mode 100644 index 0000000000000..5b2136bb7fdaa --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_stub.cc @@ -0,0 +1,79 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +HostProjectRegistrationServiceStub::~HostProjectRegistrationServiceStub() = + default; + +StatusOr +DefaultHostProjectRegistrationServiceStub::CreateHostProjectRegistration( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + google::cloud::apihub::v1::HostProjectRegistration response; + auto status = + grpc_stub_->CreateHostProjectRegistration(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultHostProjectRegistrationServiceStub::GetHostProjectRegistration( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + google::cloud::apihub::v1::HostProjectRegistration response; + auto status = + grpc_stub_->GetHostProjectRegistration(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultHostProjectRegistrationServiceStub::ListHostProjectRegistrations( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) { + google::cloud::apihub::v1::ListHostProjectRegistrationsResponse response; + auto status = + grpc_stub_->ListHostProjectRegistrations(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_stub.h b/google/cloud/apihub/v1/internal/host_project_registration_stub.h new file mode 100644 index 0000000000000..c8dcbe3784c11 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_stub.h @@ -0,0 +1,96 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_STUB_H + +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class HostProjectRegistrationServiceStub { + public: + virtual ~HostProjectRegistrationServiceStub() = 0; + + virtual StatusOr + CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) = 0; + + virtual StatusOr + GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) = 0; + + virtual StatusOr< + google::cloud::apihub::v1::ListHostProjectRegistrationsResponse> + ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) = 0; +}; + +class DefaultHostProjectRegistrationServiceStub + : public HostProjectRegistrationServiceStub { + public: + explicit DefaultHostProjectRegistrationServiceStub( + std::unique_ptr + grpc_stub) + : grpc_stub_(std::move(grpc_stub)) {} + + StatusOr + CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) override; + + StatusOr + GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) override; + + StatusOr + ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) override; + + private: + std::unique_ptr< + google::cloud::apihub::v1::HostProjectRegistrationService::StubInterface> + grpc_stub_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_STUB_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_stub_factory.cc b/google/cloud/apihub/v1/internal/host_project_registration_stub_factory.cc new file mode 100644 index 0000000000000..a77dde73d17d9 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_stub_factory.cc @@ -0,0 +1,74 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_stub_factory.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_auth_decorator.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_logging_decorator.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_metadata_decorator.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr +CreateDefaultHostProjectRegistrationServiceStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = + google::cloud::apihub::v1::HostProjectRegistrationService::NewStub( + channel); + std::shared_ptr stub = + std::make_shared( + std::move(service_grpc_stub)); + + if (auth->RequiresConfigureContext()) { + stub = std::make_shared( + std::move(auth), std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeHostProjectRegistrationServiceTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_stub_factory.h b/google/cloud/apihub/v1/internal/host_project_registration_stub_factory.h new file mode 100644 index 0000000000000..75662cb833fbf --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_stub_factory.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_STUB_FACTORY_H + +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr +CreateDefaultHostProjectRegistrationServiceStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_STUB_FACTORY_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.cc b/google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.cc new file mode 100644 index 0000000000000..f40797596e1a0 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.cc @@ -0,0 +1,91 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/internal/traced_stream_range.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +HostProjectRegistrationServiceTracingConnection:: + HostProjectRegistrationServiceTracingConnection( + std::shared_ptr + child) + : child_(std::move(child)) {} + +StatusOr +HostProjectRegistrationServiceTracingConnection::CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + auto span = internal::MakeSpan( + "apihub_v1::HostProjectRegistrationServiceConnection::" + "CreateHostProjectRegistration"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, + child_->CreateHostProjectRegistration(request)); +} + +StatusOr +HostProjectRegistrationServiceTracingConnection::GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + auto span = internal::MakeSpan( + "apihub_v1::HostProjectRegistrationServiceConnection::" + "GetHostProjectRegistration"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetHostProjectRegistration(request)); +} + +StreamRange +HostProjectRegistrationServiceTracingConnection::ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request) { + auto span = internal::MakeSpan( + "apihub_v1::HostProjectRegistrationServiceConnection::" + "ListHostProjectRegistrations"); + internal::OTelScope scope(span); + auto sr = child_->ListHostProjectRegistrations(std::move(request)); + return internal::MakeTracedStreamRange< + google::cloud::apihub::v1::HostProjectRegistration>(std::move(span), + std::move(sr)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeHostProjectRegistrationServiceTracingConnection( + std::shared_ptr conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = std::make_shared( + std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.h b/google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.h new file mode 100644 index 0000000000000..c62103756cc32 --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_tracing_connection.h @@ -0,0 +1,80 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_TRACING_CONNECTION_H + +#include "google/cloud/apihub/v1/host_project_registration_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class HostProjectRegistrationServiceTracingConnection + : public apihub_v1::HostProjectRegistrationServiceConnection { + public: + ~HostProjectRegistrationServiceTracingConnection() override = default; + + explicit HostProjectRegistrationServiceTracingConnection( + std::shared_ptr + child); + + Options options() override { return child_->options(); } + + StatusOr + CreateHostProjectRegistration( + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) override; + + StatusOr + GetHostProjectRegistration( + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) override; + + StreamRange + ListHostProjectRegistrations( + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request) + override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr +MakeHostProjectRegistrationServiceTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_TRACING_CONNECTION_H diff --git a/google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.cc b/google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.cc new file mode 100644 index 0000000000000..f489d713bdd0a --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.cc @@ -0,0 +1,97 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +HostProjectRegistrationServiceTracingStub:: + HostProjectRegistrationServiceTracingStub( + std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +StatusOr +HostProjectRegistrationServiceTracingStub::CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.HostProjectRegistrationService", + "CreateHostProjectRegistration"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->CreateHostProjectRegistration(context, options, request)); +} + +StatusOr +HostProjectRegistrationServiceTracingStub::GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.HostProjectRegistrationService", + "GetHostProjectRegistration"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->GetHostProjectRegistration(context, options, request)); +} + +StatusOr +HostProjectRegistrationServiceTracingStub::ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.HostProjectRegistrationService", + "ListHostProjectRegistrations"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->ListHostProjectRegistrations(context, options, request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeHostProjectRegistrationServiceTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared( + std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.h b/google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.h new file mode 100644 index 0000000000000..fb1a8e38a626d --- /dev/null +++ b/google/cloud/apihub/v1/internal/host_project_registration_tracing_stub.h @@ -0,0 +1,84 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_TRACING_STUB_H + +#include "google/cloud/apihub/v1/internal/host_project_registration_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class HostProjectRegistrationServiceTracingStub + : public HostProjectRegistrationServiceStub { + public: + ~HostProjectRegistrationServiceTracingStub() override = default; + + explicit HostProjectRegistrationServiceTracingStub( + std::shared_ptr child); + + StatusOr + CreateHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request) override; + + StatusOr + GetHostProjectRegistration( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request) override; + + StatusOr + ListHostProjectRegistrations( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListHostProjectRegistrationsRequest const& + request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr +MakeHostProjectRegistrationServiceTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_HOST_PROJECT_REGISTRATION_TRACING_STUB_H diff --git a/google/cloud/apihub/v1/internal/linting_auth_decorator.cc b/google/cloud/apihub/v1/internal/linting_auth_decorator.cc new file mode 100644 index 0000000000000..4c4260955be8d --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_auth_decorator.cc @@ -0,0 +1,72 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +LintingServiceAuth::LintingServiceAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +StatusOr +LintingServiceAuth::GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetStyleGuide(context, options, request); +} + +StatusOr +LintingServiceAuth::UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->UpdateStyleGuide(context, options, request); +} + +StatusOr +LintingServiceAuth::GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetStyleGuideContents(context, options, request); +} + +Status LintingServiceAuth::LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->LintSpec(context, options, request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_auth_decorator.h b/google/cloud/apihub/v1/internal/linting_auth_decorator.h new file mode 100644 index 0000000000000..01ac45d74327f --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_auth_decorator.h @@ -0,0 +1,69 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_AUTH_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class LintingServiceAuth : public LintingServiceStub { + public: + ~LintingServiceAuth() override = default; + LintingServiceAuth( + std::shared_ptr auth, + std::shared_ptr child); + + StatusOr GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) override; + + StatusOr UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) + override; + + StatusOr GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) + override; + + Status LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_AUTH_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/linting_connection_impl.cc b/google/cloud/apihub/v1/internal/linting_connection_impl.cc new file mode 100644 index 0000000000000..f3c6316ca85d8 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_connection_impl.cc @@ -0,0 +1,121 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_connection_impl.h" +#include "google/cloud/apihub/v1/internal/linting_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr retry_policy( + Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr +idempotency_policy(Options const& options) { + return options + .get() + ->clone(); +} + +} // namespace + +LintingServiceConnectionImpl::LintingServiceConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions(std::move(options), + LintingServiceConnection::options())) {} + +StatusOr +LintingServiceConnectionImpl::GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetStyleGuide(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + return stub_->GetStyleGuide(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +LintingServiceConnectionImpl::UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->UpdateStyleGuide(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + return stub_->UpdateStyleGuide(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +LintingServiceConnectionImpl::GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetStyleGuideContents(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& + request) { + return stub_->GetStyleGuideContents(context, options, request); + }, + *current, request, __func__); +} + +Status LintingServiceConnectionImpl::LintSpec( + google::cloud::apihub::v1::LintSpecRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->LintSpec(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) { + return stub_->LintSpec(context, options, request); + }, + *current, request, __func__); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_connection_impl.h b/google/cloud/apihub/v1/internal/linting_connection_impl.h new file mode 100644 index 0000000000000..53f5675178816 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_connection_impl.h @@ -0,0 +1,76 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_CONNECTION_IMPL_H + +#include "google/cloud/apihub/v1/internal/linting_retry_traits.h" +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/apihub/v1/linting_connection.h" +#include "google/cloud/apihub/v1/linting_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/linting_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class LintingServiceConnectionImpl + : public apihub_v1::LintingServiceConnection { + public: + ~LintingServiceConnectionImpl() override = default; + + LintingServiceConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options); + + Options options() override { return options_; } + + StatusOr GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request) override; + + StatusOr UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) + override; + + StatusOr GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) + override; + + Status LintSpec( + google::cloud::apihub::v1::LintSpecRequest const& request) override; + + private: + std::unique_ptr background_; + std::shared_ptr stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_CONNECTION_IMPL_H diff --git a/google/cloud/apihub/v1/internal/linting_logging_decorator.cc b/google/cloud/apihub/v1/internal/linting_logging_decorator.cc new file mode 100644 index 0000000000000..e9fee407ee6d6 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_logging_decorator.cc @@ -0,0 +1,90 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +LintingServiceLogging::LintingServiceLogging( + std::shared_ptr child, TracingOptions tracing_options, + std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +StatusOr +LintingServiceLogging::GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + return child_->GetStyleGuide(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +LintingServiceLogging::UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + return child_->UpdateStyleGuide(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +LintingServiceLogging::GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& + request) { + return child_->GetStyleGuideContents(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status LintingServiceLogging::LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) { + return child_->LintSpec(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_logging_decorator.h b/google/cloud/apihub/v1/internal/linting_logging_decorator.h new file mode 100644 index 0000000000000..f3b9ccbaf8ce1 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_logging_decorator.h @@ -0,0 +1,69 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_LOGGING_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class LintingServiceLogging : public LintingServiceStub { + public: + ~LintingServiceLogging() override = default; + LintingServiceLogging(std::shared_ptr child, + TracingOptions tracing_options, + std::set const& components); + + StatusOr GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) override; + + StatusOr UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) + override; + + StatusOr GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) + override; + + Status LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // LintingServiceLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_LOGGING_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/linting_metadata_decorator.cc b/google/cloud/apihub/v1/internal/linting_metadata_decorator.cc new file mode 100644 index 0000000000000..325a98e6a0e80 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_metadata_decorator.cc @@ -0,0 +1,99 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +LintingServiceMetadata::LintingServiceMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +StatusOr +LintingServiceMetadata::GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetStyleGuide(context, options, request); +} + +StatusOr +LintingServiceMetadata::UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + SetMetadata(context, options, + absl::StrCat("style_guide.name=", + internal::UrlEncode(request.style_guide().name()))); + return child_->UpdateStyleGuide(context, options, request); +} + +StatusOr +LintingServiceMetadata::GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetStyleGuideContents(context, options, request); +} + +Status LintingServiceMetadata::LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->LintSpec(context, options, request); +} + +void LintingServiceMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void LintingServiceMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_metadata_decorator.h b/google/cloud/apihub/v1/internal/linting_metadata_decorator.h new file mode 100644 index 0000000000000..5842ff5c80704 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_metadata_decorator.h @@ -0,0 +1,74 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_METADATA_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class LintingServiceMetadata : public LintingServiceStub { + public: + ~LintingServiceMetadata() override = default; + LintingServiceMetadata(std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + StatusOr GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) override; + + StatusOr UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) + override; + + StatusOr GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) + override; + + Status LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_METADATA_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/linting_option_defaults.cc b/google/cloud/apihub/v1/internal/linting_option_defaults.cc new file mode 100644 index 0000000000000..5a47cba9db119 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_option_defaults.cc @@ -0,0 +1,66 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_option_defaults.h" +#include "google/cloud/apihub/v1/linting_connection.h" +#include "google/cloud/apihub/v1/linting_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options LintingServiceDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), "GOOGLE_CLOUD_CPP_LINTING_SERVICE_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_LINTING_SERVICE_AUTHORITY", "apihub.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options.has()) { + options.set( + apihub_v1::LintingServiceLimitedTimeRetryPolicy( + std::chrono::minutes(30)) + .clone()); + } + if (!options.has()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options + .has()) { + options.set( + apihub_v1::MakeDefaultLintingServiceConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_option_defaults.h b/google/cloud/apihub/v1/internal/linting_option_defaults.h new file mode 100644 index 0000000000000..93d2432b72775 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options LintingServiceDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_OPTION_DEFAULTS_H diff --git a/google/cloud/apihub/v1/internal/linting_retry_traits.h b/google/cloud/apihub/v1/internal/linting_retry_traits.h new file mode 100644 index 0000000000000..25412692e1a70 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct LintingServiceRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_RETRY_TRAITS_H diff --git a/google/cloud/apihub/v1/internal/linting_sources.cc b/google/cloud/apihub/v1/internal/linting_sources.cc new file mode 100644 index 0000000000000..38c36e33706f1 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/apihub/v1/internal/linting_auth_decorator.cc" +#include "google/cloud/apihub/v1/internal/linting_connection_impl.cc" +#include "google/cloud/apihub/v1/internal/linting_logging_decorator.cc" +#include "google/cloud/apihub/v1/internal/linting_metadata_decorator.cc" +#include "google/cloud/apihub/v1/internal/linting_option_defaults.cc" +#include "google/cloud/apihub/v1/internal/linting_stub.cc" +#include "google/cloud/apihub/v1/internal/linting_stub_factory.cc" +#include "google/cloud/apihub/v1/internal/linting_tracing_connection.cc" +#include "google/cloud/apihub/v1/internal/linting_tracing_stub.cc" +#include "google/cloud/apihub/v1/linting_client.cc" +#include "google/cloud/apihub/v1/linting_connection.cc" +#include "google/cloud/apihub/v1/linting_connection_idempotency_policy.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/apihub/v1/internal/linting_stub.cc b/google/cloud/apihub/v1/internal/linting_stub.cc new file mode 100644 index 0000000000000..3233ddb11a380 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_stub.cc @@ -0,0 +1,83 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +LintingServiceStub::~LintingServiceStub() = default; + +StatusOr +DefaultLintingServiceStub::GetStyleGuide( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + google::cloud::apihub::v1::StyleGuide response; + auto status = grpc_stub_->GetStyleGuide(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultLintingServiceStub::UpdateStyleGuide( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + google::cloud::apihub::v1::StyleGuide response; + auto status = grpc_stub_->UpdateStyleGuide(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultLintingServiceStub::GetStyleGuideContents( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) { + google::cloud::apihub::v1::StyleGuideContents response; + auto status = grpc_stub_->GetStyleGuideContents(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status DefaultLintingServiceStub::LintSpec( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::LintSpecRequest const& request) { + google::protobuf::Empty response; + auto status = grpc_stub_->LintSpec(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_stub.h b/google/cloud/apihub/v1/internal/linting_stub.h new file mode 100644 index 0000000000000..c527f0acc7a5e --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_stub.h @@ -0,0 +1,92 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_STUB_H + +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class LintingServiceStub { + public: + virtual ~LintingServiceStub() = 0; + + virtual StatusOr GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) = 0; + + virtual StatusOr UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) = 0; + + virtual StatusOr + GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& + request) = 0; + + virtual Status LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) = 0; +}; + +class DefaultLintingServiceStub : public LintingServiceStub { + public: + explicit DefaultLintingServiceStub( + std::unique_ptr + grpc_stub) + : grpc_stub_(std::move(grpc_stub)) {} + + StatusOr GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) override; + + StatusOr UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) + override; + + StatusOr GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) + override; + + Status LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) override; + + private: + std::unique_ptr + grpc_stub_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_STUB_H diff --git a/google/cloud/apihub/v1/internal/linting_stub_factory.cc b/google/cloud/apihub/v1/internal/linting_stub_factory.cc new file mode 100644 index 0000000000000..46896430def88 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_stub_factory.cc @@ -0,0 +1,71 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_stub_factory.h" +#include "google/cloud/apihub/v1/internal/linting_auth_decorator.h" +#include "google/cloud/apihub/v1/internal/linting_logging_decorator.h" +#include "google/cloud/apihub/v1/internal/linting_metadata_decorator.h" +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/apihub/v1/internal/linting_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultLintingServiceStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = + google::cloud::apihub::v1::LintingService::NewStub(channel); + std::shared_ptr stub = + std::make_shared(std::move(service_grpc_stub)); + + if (auth->RequiresConfigureContext()) { + stub = + std::make_shared(std::move(auth), std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeLintingServiceTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_stub_factory.h b/google/cloud/apihub/v1/internal/linting_stub_factory.h new file mode 100644 index 0000000000000..bc6d4762c8e26 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_stub_factory.h @@ -0,0 +1,42 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_STUB_FACTORY_H + +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultLintingServiceStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_STUB_FACTORY_H diff --git a/google/cloud/apihub/v1/internal/linting_tracing_connection.cc b/google/cloud/apihub/v1/internal/linting_tracing_connection.cc new file mode 100644 index 0000000000000..68a701fd64193 --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_tracing_connection.cc @@ -0,0 +1,86 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +LintingServiceTracingConnection::LintingServiceTracingConnection( + std::shared_ptr child) + : child_(std::move(child)) {} + +StatusOr +LintingServiceTracingConnection::GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::LintingServiceConnection::GetStyleGuide"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetStyleGuide(request)); +} + +StatusOr +LintingServiceTracingConnection::UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::LintingServiceConnection::UpdateStyleGuide"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->UpdateStyleGuide(request)); +} + +StatusOr +LintingServiceTracingConnection::GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::LintingServiceConnection::GetStyleGuideContents"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetStyleGuideContents(request)); +} + +Status LintingServiceTracingConnection::LintSpec( + google::cloud::apihub::v1::LintSpecRequest const& request) { + auto span = + internal::MakeSpan("apihub_v1::LintingServiceConnection::LintSpec"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->LintSpec(request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeLintingServiceTracingConnection( + std::shared_ptr conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = std::make_shared(std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_tracing_connection.h b/google/cloud/apihub/v1/internal/linting_tracing_connection.h new file mode 100644 index 0000000000000..536accdc33fec --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_tracing_connection.h @@ -0,0 +1,78 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_TRACING_CONNECTION_H + +#include "google/cloud/apihub/v1/linting_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class LintingServiceTracingConnection + : public apihub_v1::LintingServiceConnection { + public: + ~LintingServiceTracingConnection() override = default; + + explicit LintingServiceTracingConnection( + std::shared_ptr child); + + Options options() override { return child_->options(); } + + StatusOr GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request) override; + + StatusOr UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) + override; + + StatusOr GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) + override; + + Status LintSpec( + google::cloud::apihub::v1::LintSpecRequest const& request) override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr +MakeLintingServiceTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_TRACING_CONNECTION_H diff --git a/google/cloud/apihub/v1/internal/linting_tracing_stub.cc b/google/cloud/apihub/v1/internal/linting_tracing_stub.cc new file mode 100644 index 0000000000000..cf495a39452ea --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_tracing_stub.cc @@ -0,0 +1,96 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/internal/linting_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +LintingServiceTracingStub::LintingServiceTracingStub( + std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +StatusOr +LintingServiceTracingStub::GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.LintingService", + "GetStyleGuide"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->GetStyleGuide(context, options, request)); +} + +StatusOr +LintingServiceTracingStub::UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.LintingService", + "UpdateStyleGuide"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->UpdateStyleGuide(context, options, request)); +} + +StatusOr +LintingServiceTracingStub::GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.LintingService", + "GetStyleGuideContents"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->GetStyleGuideContents(context, options, request)); +} + +Status LintingServiceTracingStub::LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.LintingService", + "LintSpec"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan(context, *span, + child_->LintSpec(context, options, request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr MakeLintingServiceTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared(std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/linting_tracing_stub.h b/google/cloud/apihub/v1/internal/linting_tracing_stub.h new file mode 100644 index 0000000000000..0d17fe626b06e --- /dev/null +++ b/google/cloud/apihub/v1/internal/linting_tracing_stub.h @@ -0,0 +1,81 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_TRACING_STUB_H + +#include "google/cloud/apihub/v1/internal/linting_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class LintingServiceTracingStub : public LintingServiceStub { + public: + ~LintingServiceTracingStub() override = default; + + explicit LintingServiceTracingStub(std::shared_ptr child); + + StatusOr GetStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideRequest const& request) override; + + StatusOr UpdateStyleGuide( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request) + override; + + StatusOr GetStyleGuideContents( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request) + override; + + Status LintSpec( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LintSpecRequest const& request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr MakeLintingServiceTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_LINTING_TRACING_STUB_H diff --git a/google/cloud/apihub/v1/internal/provisioning_auth_decorator.cc b/google/cloud/apihub/v1/internal/provisioning_auth_decorator.cc new file mode 100644 index 0000000000000..051b157889acf --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_auth_decorator.cc @@ -0,0 +1,119 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ProvisioningAuth::ProvisioningAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +future> +ProvisioningAuth::AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncCreateApiHubInstance(cq, *std::move(context), + std::move(options), request); + }); +} + +StatusOr ProvisioningAuth::CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateApiHubInstance(context, options, request); +} + +StatusOr +ProvisioningAuth::GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetApiHubInstance(context, options, request); +} + +StatusOr +ProvisioningAuth::LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->LookupApiHubInstance(context, options, request); +} + +future> +ProvisioningAuth::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + using ReturnType = StatusOr; + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) { + return make_ready_future(ReturnType(std::move(context).status())); + } + return child->AsyncGetOperation(cq, *std::move(context), + std::move(options), request); + }); +} + +future ProvisioningAuth::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return auth_->AsyncConfigureContext(std::move(context)) + .then([cq, child = child_, options = std::move(options), + request](future>> + f) mutable { + auto context = f.get(); + if (!context) return make_ready_future(std::move(context).status()); + return child->AsyncCancelOperation(cq, *std::move(context), + std::move(options), request); + }); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_auth_decorator.h b/google/cloud/apihub/v1/internal/provisioning_auth_decorator.h new file mode 100644 index 0000000000000..41ccf2f8c771d --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_auth_decorator.h @@ -0,0 +1,87 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_AUTH_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ProvisioningAuth : public ProvisioningStub { + public: + ~ProvisioningAuth() override = default; + ProvisioningAuth( + std::shared_ptr auth, + std::shared_ptr child); + + future> AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) + override; + + StatusOr + LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) + override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_AUTH_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/provisioning_connection_impl.cc b/google/cloud/apihub/v1/internal/provisioning_connection_impl.cc new file mode 100644 index 0000000000000..3b1efa107c684 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_connection_impl.cc @@ -0,0 +1,191 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_connection_impl.h" +#include "google/cloud/apihub/v1/internal/provisioning_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/async_long_running_operation.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr retry_policy( + Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options.get()->clone(); +} + +std::unique_ptr +idempotency_policy(Options const& options) { + return options + .get() + ->clone(); +} + +std::unique_ptr polling_policy(Options const& options) { + return options.get()->clone(); +} + +} // namespace + +ProvisioningConnectionImpl::ProvisioningConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions(std::move(options), + ProvisioningConnection::options())) {} + +future> +ProvisioningConnectionImpl::CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + auto request_copy = request; + auto const idempotent = + idempotency_policy(*current)->CreateApiHubInstance(request_copy); + return google::cloud::internal::AsyncLongRunningOperation< + google::cloud::apihub::v1::ApiHubInstance>( + background_->cq(), current, std::move(request_copy), + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& + request) { + return stub->AsyncCreateApiHubInstance(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::apihub::v1::ApiHubInstance>, + retry_policy(*current), backoff_policy(*current), idempotent, + polling_policy(*current), __func__); +} + +StatusOr +ProvisioningConnectionImpl::CreateApiHubInstance( + NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateApiHubInstance(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& + request) { + return stub_->CreateApiHubInstance(context, options, request); + }, + *current, request, __func__); +} + +future> +ProvisioningConnectionImpl::CreateApiHubInstance( + google::longrunning::Operation const& operation) { + auto current = google::cloud::internal::SaveCurrentOptions(); + if (!operation.metadata() + .Is()) { + return make_ready_future< + StatusOr>( + internal::InvalidArgumentError( + "operation does not correspond to CreateApiHubInstance", + GCP_ERROR_INFO().WithMetadata("operation", + operation.metadata().DebugString()))); + } + + return google::cloud::internal::AsyncAwaitLongRunningOperation< + google::cloud::apihub::v1::ApiHubInstance>( + background_->cq(), current, operation, + [stub = stub_](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return stub->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + [stub = stub_]( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return stub->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + &google::cloud::internal::ExtractLongRunningResultResponse< + google::cloud::apihub::v1::ApiHubInstance>, + polling_policy(*current), __func__); +} + +StatusOr +ProvisioningConnectionImpl::GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetApiHubInstance(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + return stub_->GetApiHubInstance(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +ProvisioningConnectionImpl::LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->LookupApiHubInstance(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& + request) { + return stub_->LookupApiHubInstance(context, options, request); + }, + *current, request, __func__); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_connection_impl.h b/google/cloud/apihub/v1/internal/provisioning_connection_impl.h new file mode 100644 index 0000000000000..233dd67babd4e --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_connection_impl.h @@ -0,0 +1,87 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_CONNECTION_IMPL_H + +#include "google/cloud/apihub/v1/internal/provisioning_retry_traits.h" +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/apihub/v1/provisioning_connection.h" +#include "google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/provisioning_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ProvisioningConnectionImpl : public apihub_v1::ProvisioningConnection { + public: + ~ProvisioningConnectionImpl() override = default; + + ProvisioningConnectionImpl( + std::unique_ptr background, + std::shared_ptr stub, + Options options); + + Options options() override { return options_; } + + future> + CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr CreateApiHubInstance( + NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + future> + CreateApiHubInstance( + google::longrunning::Operation const& operation) override; + + StatusOr GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) + override; + + StatusOr + LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) + override; + + private: + std::unique_ptr background_; + std::shared_ptr stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_CONNECTION_IMPL_H diff --git a/google/cloud/apihub/v1/internal/provisioning_logging_decorator.cc b/google/cloud/apihub/v1/internal/provisioning_logging_decorator.cc new file mode 100644 index 0000000000000..56826321e01d2 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_logging_decorator.cc @@ -0,0 +1,134 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ProvisioningLogging::ProvisioningLogging( + std::shared_ptr child, TracingOptions tracing_options, + std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +future> +ProvisioningLogging::AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& + request) { + return child_->AsyncCreateApiHubInstance(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +StatusOr +ProvisioningLogging::CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& + request) { + return child_->CreateApiHubInstance(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ProvisioningLogging::GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + return child_->GetApiHubInstance(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +ProvisioningLogging::LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& + request) { + return child_->LookupApiHubInstance(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +future> +ProvisioningLogging::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + return child_->AsyncGetOperation(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +future ProvisioningLogging::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return google::cloud::internal::LogWrapper( + [this](google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + return child_->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); + }, + cq, std::move(context), std::move(options), request, __func__, + tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_logging_decorator.h b/google/cloud/apihub/v1/internal/provisioning_logging_decorator.h new file mode 100644 index 0000000000000..3244cc1b1b9f1 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_logging_decorator.h @@ -0,0 +1,87 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_LOGGING_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ProvisioningLogging : public ProvisioningStub { + public: + ~ProvisioningLogging() override = default; + ProvisioningLogging(std::shared_ptr child, + TracingOptions tracing_options, + std::set const& components); + + future> AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) + override; + + StatusOr + LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) + override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // ProvisioningLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_LOGGING_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/provisioning_metadata_decorator.cc b/google/cloud/apihub/v1/internal/provisioning_metadata_decorator.cc new file mode 100644 index 0000000000000..aa9967c73af8e --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_metadata_decorator.cc @@ -0,0 +1,125 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ProvisioningMetadata::ProvisioningMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +future> +ProvisioningMetadata::AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->AsyncCreateApiHubInstance(cq, std::move(context), + std::move(options), request); +} + +StatusOr +ProvisioningMetadata::CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateApiHubInstance(context, options, request); +} + +StatusOr +ProvisioningMetadata::GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetApiHubInstance(context, options, request); +} + +StatusOr +ProvisioningMetadata::LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->LookupApiHubInstance(context, options, request); +} + +future> +ProvisioningMetadata::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->AsyncGetOperation(cq, std::move(context), std::move(options), + request); +} + +future ProvisioningMetadata::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + SetMetadata(*context, *options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->AsyncCancelOperation(cq, std::move(context), + std::move(options), request); +} + +void ProvisioningMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void ProvisioningMetadata::SetMetadata(grpc::ClientContext& context, + Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_metadata_decorator.h b/google/cloud/apihub/v1/internal/provisioning_metadata_decorator.h new file mode 100644 index 0000000000000..c1a1654f9c1e2 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_metadata_decorator.h @@ -0,0 +1,92 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_METADATA_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ProvisioningMetadata : public ProvisioningStub { + public: + ~ProvisioningMetadata() override = default; + ProvisioningMetadata(std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + future> AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) + override; + + StatusOr + LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) + override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_METADATA_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/provisioning_option_defaults.cc b/google/cloud/apihub/v1/internal/provisioning_option_defaults.cc new file mode 100644 index 0000000000000..cdc654bdd1894 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_option_defaults.cc @@ -0,0 +1,75 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_option_defaults.h" +#include "google/cloud/apihub/v1/provisioning_connection.h" +#include "google/cloud/apihub/v1/provisioning_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options ProvisioningDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), "GOOGLE_CLOUD_CPP_PROVISIONING_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_PROVISIONING_AUTHORITY", "apihub.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options.has()) { + options.set( + apihub_v1::ProvisioningLimitedTimeRetryPolicy(std::chrono::minutes(30)) + .clone()); + } + if (!options.has()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options.has()) { + options.set( + GenericPollingPolicy( + options.get()->clone(), + ExponentialBackoffPolicy(std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling) + .clone()) + .clone()); + } + if (!options + .has()) { + options.set( + apihub_v1::MakeDefaultProvisioningConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_option_defaults.h b/google/cloud/apihub/v1/internal/provisioning_option_defaults.h new file mode 100644 index 0000000000000..56bdfa6fe544d --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options ProvisioningDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_OPTION_DEFAULTS_H diff --git a/google/cloud/apihub/v1/internal/provisioning_retry_traits.h b/google/cloud/apihub/v1/internal/provisioning_retry_traits.h new file mode 100644 index 0000000000000..af0ca8515968c --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct ProvisioningRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_RETRY_TRAITS_H diff --git a/google/cloud/apihub/v1/internal/provisioning_sources.cc b/google/cloud/apihub/v1/internal/provisioning_sources.cc new file mode 100644 index 0000000000000..8b18639aee22e --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/apihub/v1/internal/provisioning_auth_decorator.cc" +#include "google/cloud/apihub/v1/internal/provisioning_connection_impl.cc" +#include "google/cloud/apihub/v1/internal/provisioning_logging_decorator.cc" +#include "google/cloud/apihub/v1/internal/provisioning_metadata_decorator.cc" +#include "google/cloud/apihub/v1/internal/provisioning_option_defaults.cc" +#include "google/cloud/apihub/v1/internal/provisioning_stub.cc" +#include "google/cloud/apihub/v1/internal/provisioning_stub_factory.cc" +#include "google/cloud/apihub/v1/internal/provisioning_tracing_connection.cc" +#include "google/cloud/apihub/v1/internal/provisioning_tracing_stub.cc" +#include "google/cloud/apihub/v1/provisioning_client.cc" +#include "google/cloud/apihub/v1/provisioning_connection.cc" +#include "google/cloud/apihub/v1/provisioning_connection_idempotency_policy.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/apihub/v1/internal/provisioning_stub.cc b/google/cloud/apihub/v1/internal/provisioning_stub.cc new file mode 100644 index 0000000000000..5e21de3faf0dd --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_stub.cc @@ -0,0 +1,130 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ProvisioningStub::~ProvisioningStub() = default; + +future> +DefaultProvisioningStub::AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + return internal::MakeUnaryRpcImpl< + google::cloud::apihub::v1::CreateApiHubInstanceRequest, + google::longrunning::Operation>( + cq, + [this]( + grpc::ClientContext* context, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request, + grpc::CompletionQueue* cq) { + return grpc_stub_->AsyncCreateApiHubInstance(context, request, cq); + }, + request, std::move(context)); +} + +StatusOr +DefaultProvisioningStub::CreateApiHubInstance( + grpc::ClientContext& context, Options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + google::longrunning::Operation response; + auto status = grpc_stub_->CreateApiHubInstance(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultProvisioningStub::GetApiHubInstance( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + google::cloud::apihub::v1::ApiHubInstance response; + auto status = grpc_stub_->GetApiHubInstance(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultProvisioningStub::LookupApiHubInstance( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) { + google::cloud::apihub::v1::LookupApiHubInstanceResponse response; + auto status = grpc_stub_->LookupApiHubInstance(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +future> +DefaultProvisioningStub::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + // NOLINTNEXTLINE(performance-unnecessary-value-param) + google::cloud::internal::ImmutableOptions, + google::longrunning::GetOperationRequest const& request) { + return internal::MakeUnaryRpcImpl( + cq, + [this](grpc::ClientContext* context, + google::longrunning::GetOperationRequest const& request, + grpc::CompletionQueue* cq) { + return operations_->AsyncGetOperation(context, request, cq); + }, + request, std::move(context)); +} + +future DefaultProvisioningStub::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + // NOLINTNEXTLINE(performance-unnecessary-value-param) + google::cloud::internal::ImmutableOptions, + google::longrunning::CancelOperationRequest const& request) { + return internal::MakeUnaryRpcImpl( + cq, + [this](grpc::ClientContext* context, + google::longrunning::CancelOperationRequest const& request, + grpc::CompletionQueue* cq) { + return operations_->AsyncCancelOperation(context, request, cq); + }, + request, std::move(context)) + .then([](future> f) { + return f.get().status(); + }); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_stub.h b/google/cloud/apihub/v1/internal/provisioning_stub.h new file mode 100644 index 0000000000000..d4d94fddde847 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_stub.h @@ -0,0 +1,132 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_STUB_H + +#include "google/cloud/completion_queue.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ProvisioningStub { + public: + virtual ~ProvisioningStub() = 0; + + virtual future> + AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& + request) = 0; + + virtual StatusOr CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& + request) = 0; + + virtual StatusOr GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) = 0; + + virtual StatusOr + LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& + request) = 0; + + virtual future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) = 0; + + virtual future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) = 0; +}; + +class DefaultProvisioningStub : public ProvisioningStub { + public: + DefaultProvisioningStub( + std::unique_ptr + grpc_stub, + std::unique_ptr + operations) + : grpc_stub_(std::move(grpc_stub)), operations_(std::move(operations)) {} + + future> AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) + override; + + StatusOr + LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) + override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::unique_ptr + grpc_stub_; + std::unique_ptr operations_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_STUB_H diff --git a/google/cloud/apihub/v1/internal/provisioning_stub_factory.cc b/google/cloud/apihub/v1/internal/provisioning_stub_factory.cc new file mode 100644 index 0000000000000..8a50004404d70 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_stub_factory.cc @@ -0,0 +1,72 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_stub_factory.h" +#include "google/cloud/apihub/v1/internal/provisioning_auth_decorator.h" +#include "google/cloud/apihub/v1/internal/provisioning_logging_decorator.h" +#include "google/cloud/apihub/v1/internal/provisioning_metadata_decorator.h" +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/apihub/v1/internal/provisioning_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultProvisioningStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = + google::cloud::apihub::v1::Provisioning::NewStub(channel); + std::shared_ptr stub = + std::make_shared( + std::move(service_grpc_stub), + google::longrunning::Operations::NewStub(channel)); + + if (auth->RequiresConfigureContext()) { + stub = std::make_shared(std::move(auth), std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeProvisioningTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_stub_factory.h b/google/cloud/apihub/v1/internal/provisioning_stub_factory.h new file mode 100644 index 0000000000000..28aa5bb43f84c --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_stub_factory.h @@ -0,0 +1,42 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_STUB_FACTORY_H + +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr CreateDefaultProvisioningStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_STUB_FACTORY_H diff --git a/google/cloud/apihub/v1/internal/provisioning_tracing_connection.cc b/google/cloud/apihub/v1/internal/provisioning_tracing_connection.cc new file mode 100644 index 0000000000000..8969e28fbdf62 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_tracing_connection.cc @@ -0,0 +1,100 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ProvisioningTracingConnection::ProvisioningTracingConnection( + std::shared_ptr child) + : child_(std::move(child)) {} + +future> +ProvisioningTracingConnection::CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ProvisioningConnection::CreateApiHubInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), + child_->CreateApiHubInstance(request)); +} + +StatusOr +ProvisioningTracingConnection::CreateApiHubInstance( + NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ProvisioningConnection::CreateApiHubInstance"); + opentelemetry::trace::Scope scope(span); + return internal::EndSpan(*span, + child_->CreateApiHubInstance(NoAwaitTag{}, request)); +} + +future> +ProvisioningTracingConnection::CreateApiHubInstance( + google::longrunning::Operation const& operation) { + auto span = internal::MakeSpan( + "apihub_v1::ProvisioningConnection::CreateApiHubInstance"); + internal::OTelScope scope(span); + return internal::EndSpan(std::move(span), + child_->CreateApiHubInstance(operation)); +} + +StatusOr +ProvisioningTracingConnection::GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ProvisioningConnection::GetApiHubInstance"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetApiHubInstance(request)); +} + +StatusOr +ProvisioningTracingConnection::LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) { + auto span = internal::MakeSpan( + "apihub_v1::ProvisioningConnection::LookupApiHubInstance"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->LookupApiHubInstance(request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeProvisioningTracingConnection( + std::shared_ptr conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = std::make_shared(std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_tracing_connection.h b/google/cloud/apihub/v1/internal/provisioning_tracing_connection.h new file mode 100644 index 0000000000000..7e8cc3e642204 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_tracing_connection.h @@ -0,0 +1,86 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_TRACING_CONNECTION_H + +#include "google/cloud/apihub/v1/provisioning_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ProvisioningTracingConnection : public apihub_v1::ProvisioningConnection { + public: + ~ProvisioningTracingConnection() override = default; + + explicit ProvisioningTracingConnection( + std::shared_ptr child); + + Options options() override { return child_->options(); } + + future> + CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr CreateApiHubInstance( + NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + future> + CreateApiHubInstance( + google::longrunning::Operation const& operation) override; + + StatusOr GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) + override; + + StatusOr + LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) + override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr +MakeProvisioningTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_TRACING_CONNECTION_H diff --git a/google/cloud/apihub/v1/internal/provisioning_tracing_stub.cc b/google/cloud/apihub/v1/internal/provisioning_tracing_stub.cc new file mode 100644 index 0000000000000..21bf53f2fa885 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_tracing_stub.cc @@ -0,0 +1,128 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/internal/provisioning_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +ProvisioningTracingStub::ProvisioningTracingStub( + std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +future> +ProvisioningTracingStub::AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.Provisioning", + "CreateApiHubInstance"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = child_->AsyncCreateApiHubInstance(cq, context, std::move(options), + request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +StatusOr +ProvisioningTracingStub::CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.Provisioning", + "CreateApiHubInstance"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->CreateApiHubInstance(context, options, request)); +} + +StatusOr +ProvisioningTracingStub::GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.Provisioning", + "GetApiHubInstance"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->GetApiHubInstance(context, options, request)); +} + +StatusOr +ProvisioningTracingStub::LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) { + auto span = internal::MakeSpanGrpc("google.cloud.apihub.v1.Provisioning", + "LookupApiHubInstance"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, child_->LookupApiHubInstance(context, options, request)); +} + +future> +ProvisioningTracingStub::AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) { + auto span = + internal::MakeSpanGrpc("google.longrunning.Operations", "GetOperation"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = child_->AsyncGetOperation(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +future ProvisioningTracingStub::AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) { + auto span = internal::MakeSpanGrpc("google.longrunning.Operations", + "CancelOperation"); + internal::OTelScope scope(span); + internal::InjectTraceContext(*context, *propagator_); + auto f = + child_->AsyncCancelOperation(cq, context, std::move(options), request); + return internal::EndSpan(std::move(context), std::move(span), std::move(f)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr MakeProvisioningTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared(std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/provisioning_tracing_stub.h b/google/cloud/apihub/v1/internal/provisioning_tracing_stub.h new file mode 100644 index 0000000000000..0c058596c80d2 --- /dev/null +++ b/google/cloud/apihub/v1/internal/provisioning_tracing_stub.h @@ -0,0 +1,98 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_TRACING_STUB_H + +#include "google/cloud/apihub/v1/internal/provisioning_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class ProvisioningTracingStub : public ProvisioningStub { + public: + ~ProvisioningTracingStub() override = default; + + explicit ProvisioningTracingStub(std::shared_ptr child); + + future> AsyncCreateApiHubInstance( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr CreateApiHubInstance( + grpc::ClientContext& context, Options options, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request) + override; + + StatusOr GetApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request) + override; + + StatusOr + LookupApiHubInstance( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request) + override; + + future> AsyncGetOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::GetOperationRequest const& request) override; + + future AsyncCancelOperation( + google::cloud::CompletionQueue& cq, + std::shared_ptr context, + google::cloud::internal::ImmutableOptions options, + google::longrunning::CancelOperationRequest const& request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr MakeProvisioningTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_PROVISIONING_TRACING_STUB_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.cc new file mode 100644 index 0000000000000..0b039c660c841 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.cc @@ -0,0 +1,86 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +RuntimeProjectAttachmentServiceAuth::RuntimeProjectAttachmentServiceAuth( + std::shared_ptr auth, + std::shared_ptr child) + : auth_(std::move(auth)), child_(std::move(child)) {} + +StatusOr +RuntimeProjectAttachmentServiceAuth::CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->CreateRuntimeProjectAttachment(context, options, request); +} + +StatusOr +RuntimeProjectAttachmentServiceAuth::GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->GetRuntimeProjectAttachment(context, options, request); +} + +StatusOr +RuntimeProjectAttachmentServiceAuth::ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->ListRuntimeProjectAttachments(context, options, request); +} + +Status RuntimeProjectAttachmentServiceAuth::DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->DeleteRuntimeProjectAttachment(context, options, request); +} + +StatusOr +RuntimeProjectAttachmentServiceAuth::LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) { + auto status = auth_->ConfigureContext(context); + if (!status.ok()) return status; + return child_->LookupRuntimeProjectAttachment(context, options, request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.h new file mode 100644 index 0000000000000..b6ff56a35e72e --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.h @@ -0,0 +1,81 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_AUTH_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_AUTH_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class RuntimeProjectAttachmentServiceAuth + : public RuntimeProjectAttachmentServiceStub { + public: + ~RuntimeProjectAttachmentServiceAuth() override = default; + RuntimeProjectAttachmentServiceAuth( + std::shared_ptr auth, + std::shared_ptr child); + + StatusOr + CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) override; + + Status DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) override; + + private: + std::shared_ptr auth_; + std::shared_ptr child_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_AUTH_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.cc new file mode 100644 index 0000000000000..9e3b72a427887 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.cc @@ -0,0 +1,178 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/retry_loop.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN +namespace { + +std::unique_ptr +retry_policy(Options const& options) { + return options + .get() + ->clone(); +} + +std::unique_ptr backoff_policy(Options const& options) { + return options + .get() + ->clone(); +} + +std::unique_ptr< + apihub_v1::RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy> +idempotency_policy(Options const& options) { + return options + .get< + apihub_v1:: + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicyOption>() + ->clone(); +} + +} // namespace + +RuntimeProjectAttachmentServiceConnectionImpl:: + RuntimeProjectAttachmentServiceConnectionImpl( + std::unique_ptr background, + std::shared_ptr + stub, + Options options) + : background_(std::move(background)), + stub_(std::move(stub)), + options_(internal::MergeOptions( + std::move(options), + RuntimeProjectAttachmentServiceConnection::options())) {} + +StatusOr +RuntimeProjectAttachmentServiceConnectionImpl::CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->CreateRuntimeProjectAttachment(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + CreateRuntimeProjectAttachmentRequest const& request) { + return stub_->CreateRuntimeProjectAttachment(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +RuntimeProjectAttachmentServiceConnectionImpl::GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->GetRuntimeProjectAttachment(request), + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + return stub_->GetRuntimeProjectAttachment(context, options, request); + }, + *current, request, __func__); +} + +StreamRange +RuntimeProjectAttachmentServiceConnectionImpl::ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request) { + request.clear_page_token(); + auto current = google::cloud::internal::SaveCurrentOptions(); + auto idempotency = + idempotency_policy(*current)->ListRuntimeProjectAttachments(request); + char const* function_name = __func__; + return google::cloud::internal::MakePaginationRange< + StreamRange>( + current, std::move(request), + [idempotency, function_name, stub = stub_, + retry = std::shared_ptr< + apihub_v1::RuntimeProjectAttachmentServiceRetryPolicy>( + retry_policy(*current)), + backoff = std::shared_ptr(backoff_policy(*current))]( + Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + r) { + return google::cloud::internal::RetryLoop( + retry->clone(), backoff->clone(), idempotency, + [stub](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + ListRuntimeProjectAttachmentsRequest const& request) { + return stub->ListRuntimeProjectAttachments(context, options, + request); + }, + options, r, function_name); + }, + [](google::cloud::apihub::v1::ListRuntimeProjectAttachmentsResponse r) { + std::vector result( + r.runtime_project_attachments().size()); + auto& messages = *r.mutable_runtime_project_attachments(); + std::move(messages.begin(), messages.end(), result.begin()); + return result; + }); +} + +Status +RuntimeProjectAttachmentServiceConnectionImpl::DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->DeleteRuntimeProjectAttachment(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + DeleteRuntimeProjectAttachmentRequest const& request) { + return stub_->DeleteRuntimeProjectAttachment(context, options, request); + }, + *current, request, __func__); +} + +StatusOr +RuntimeProjectAttachmentServiceConnectionImpl::LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) { + auto current = google::cloud::internal::SaveCurrentOptions(); + return google::cloud::internal::RetryLoop( + retry_policy(*current), backoff_policy(*current), + idempotency_policy(*current)->LookupRuntimeProjectAttachment(request), + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + LookupRuntimeProjectAttachmentRequest const& request) { + return stub_->LookupRuntimeProjectAttachment(context, options, request); + }, + *current, request, __func__); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.h new file mode 100644 index 0000000000000..6ca04e8f83273 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.h @@ -0,0 +1,89 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_IMPL_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_IMPL_H + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_retry_traits.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class RuntimeProjectAttachmentServiceConnectionImpl + : public apihub_v1::RuntimeProjectAttachmentServiceConnection { + public: + ~RuntimeProjectAttachmentServiceConnectionImpl() override = default; + + RuntimeProjectAttachmentServiceConnectionImpl( + std::unique_ptr background, + std::shared_ptr + stub, + Options options); + + Options options() override { return options_; } + + StatusOr + CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) override; + + StreamRange + ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request) + override; + + Status DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) override; + + private: + std::unique_ptr background_; + std::shared_ptr + stub_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_IMPL_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.cc new file mode 100644 index 0000000000000..8da6a1ef3ea0e --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.cc @@ -0,0 +1,115 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.h" +#include "google/cloud/internal/log_wrapper.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +RuntimeProjectAttachmentServiceLogging::RuntimeProjectAttachmentServiceLogging( + std::shared_ptr child, + TracingOptions tracing_options, std::set const&) + : child_(std::move(child)), tracing_options_(std::move(tracing_options)) {} + +StatusOr +RuntimeProjectAttachmentServiceLogging::CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + CreateRuntimeProjectAttachmentRequest const& request) { + return child_->CreateRuntimeProjectAttachment(context, options, + request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +RuntimeProjectAttachmentServiceLogging::GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + return child_->GetRuntimeProjectAttachment(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +RuntimeProjectAttachmentServiceLogging::ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this]( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) { + return child_->ListRuntimeProjectAttachments(context, options, request); + }, + context, options, request, __func__, tracing_options_); +} + +Status RuntimeProjectAttachmentServiceLogging::DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + DeleteRuntimeProjectAttachmentRequest const& request) { + return child_->DeleteRuntimeProjectAttachment(context, options, + request); + }, + context, options, request, __func__, tracing_options_); +} + +StatusOr +RuntimeProjectAttachmentServiceLogging::LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) { + return google::cloud::internal::LogWrapper( + [this](grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1:: + LookupRuntimeProjectAttachmentRequest const& request) { + return child_->LookupRuntimeProjectAttachment(context, options, + request); + }, + context, options, request, __func__, tracing_options_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.h new file mode 100644 index 0000000000000..0a37d0b6d77f2 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.h @@ -0,0 +1,81 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_LOGGING_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_LOGGING_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/tracing_options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class RuntimeProjectAttachmentServiceLogging + : public RuntimeProjectAttachmentServiceStub { + public: + ~RuntimeProjectAttachmentServiceLogging() override = default; + RuntimeProjectAttachmentServiceLogging( + std::shared_ptr child, + TracingOptions tracing_options, std::set const& components); + + StatusOr + CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) override; + + Status DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) override; + + private: + std::shared_ptr child_; + TracingOptions tracing_options_; +}; // RuntimeProjectAttachmentServiceLogging + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_LOGGING_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.cc new file mode 100644 index 0000000000000..eae55d558d4a8 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.cc @@ -0,0 +1,113 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/absl_str_cat_quiet.h" +#include "google/cloud/internal/api_client_header.h" +#include "google/cloud/internal/url_encode.h" +#include "google/cloud/status_or.h" +#include +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +RuntimeProjectAttachmentServiceMetadata:: + RuntimeProjectAttachmentServiceMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header) + : child_(std::move(child)), + fixed_metadata_(std::move(fixed_metadata)), + api_client_header_( + api_client_header.empty() + ? google::cloud::internal::GeneratedLibClientHeader() + : std::move(api_client_header)) {} + +StatusOr +RuntimeProjectAttachmentServiceMetadata::CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->CreateRuntimeProjectAttachment(context, options, request); +} + +StatusOr +RuntimeProjectAttachmentServiceMetadata::GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->GetRuntimeProjectAttachment(context, options, request); +} + +StatusOr +RuntimeProjectAttachmentServiceMetadata::ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("parent=", internal::UrlEncode(request.parent()))); + return child_->ListRuntimeProjectAttachments(context, options, request); +} + +Status RuntimeProjectAttachmentServiceMetadata::DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->DeleteRuntimeProjectAttachment(context, options, request); +} + +StatusOr +RuntimeProjectAttachmentServiceMetadata::LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) { + SetMetadata(context, options, + absl::StrCat("name=", internal::UrlEncode(request.name()))); + return child_->LookupRuntimeProjectAttachment(context, options, request); +} + +void RuntimeProjectAttachmentServiceMetadata::SetMetadata( + grpc::ClientContext& context, Options const& options, + std::string const& request_params) { + context.AddMetadata("x-goog-request-params", request_params); + SetMetadata(context, options); +} + +void RuntimeProjectAttachmentServiceMetadata::SetMetadata( + grpc::ClientContext& context, Options const& options) { + google::cloud::internal::SetMetadata(context, options, fixed_metadata_, + api_client_header_); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.h new file mode 100644 index 0000000000000..0ccb56120720b --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.h @@ -0,0 +1,87 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_METADATA_DECORATOR_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_METADATA_DECORATOR_H + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class RuntimeProjectAttachmentServiceMetadata + : public RuntimeProjectAttachmentServiceStub { + public: + ~RuntimeProjectAttachmentServiceMetadata() override = default; + RuntimeProjectAttachmentServiceMetadata( + std::shared_ptr child, + std::multimap fixed_metadata, + std::string api_client_header = ""); + + StatusOr + CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) override; + + Status DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) override; + + private: + void SetMetadata(grpc::ClientContext& context, Options const& options, + std::string const& request_params); + void SetMetadata(grpc::ClientContext& context, Options const& options); + + std::shared_ptr child_; + std::multimap fixed_metadata_; + std::string api_client_header_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_METADATA_DECORATOR_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.cc new file mode 100644 index 0000000000000..7f2c7f9f4a33a --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.cc @@ -0,0 +1,74 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_options.h" +#include "google/cloud/internal/populate_common_options.h" +#include "google/cloud/internal/populate_grpc_options.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +namespace { +auto constexpr kBackoffScaling = 2.0; +} // namespace + +Options RuntimeProjectAttachmentServiceDefaultOptions(Options options) { + options = internal::PopulateCommonOptions( + std::move(options), + "GOOGLE_CLOUD_CPP_RUNTIME_PROJECT_ATTACHMENT_SERVICE_ENDPOINT", "", + "GOOGLE_CLOUD_CPP_RUNTIME_PROJECT_ATTACHMENT_SERVICE_AUTHORITY", + "apihub.googleapis.com"); + options = internal::PopulateGrpcOptions(std::move(options)); + if (!options.has< + apihub_v1::RuntimeProjectAttachmentServiceRetryPolicyOption>()) { + options.set( + apihub_v1::RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy( + std::chrono::minutes(30)) + .clone()); + } + if (!options.has< + apihub_v1::RuntimeProjectAttachmentServiceBackoffPolicyOption>()) { + options.set( + ExponentialBackoffPolicy( + std::chrono::seconds(0), std::chrono::seconds(1), + std::chrono::minutes(5), kBackoffScaling, kBackoffScaling) + .clone()); + } + if (!options.has< + apihub_v1:: + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicyOption>()) { + options.set< + apihub_v1:: + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicyOption>( + apihub_v1:: + MakeDefaultRuntimeProjectAttachmentServiceConnectionIdempotencyPolicy()); + } + + return options; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.h new file mode 100644 index 0000000000000..95a4fcacc38de --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.h @@ -0,0 +1,37 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_OPTION_DEFAULTS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_OPTION_DEFAULTS_H + +#include "google/cloud/options.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +Options RuntimeProjectAttachmentServiceDefaultOptions(Options options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_OPTION_DEFAULTS_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_retry_traits.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_retry_traits.h new file mode 100644 index 0000000000000..33b2b714f7b9f --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_retry_traits.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_RETRY_TRAITS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_RETRY_TRAITS_H + +#include "google/cloud/status.h" +#include "google/cloud/version.h" + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// Define the gRPC status code semantics for retrying requests. +struct RuntimeProjectAttachmentServiceRetryTraits { + static bool IsPermanentFailure(google::cloud::Status const& status) { + return status.code() != StatusCode::kOk && + status.code() != StatusCode::kUnavailable; + } +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_RETRY_TRAITS_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_sources.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_sources.cc new file mode 100644 index 0000000000000..c612262aae2b2 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_sources.cc @@ -0,0 +1,32 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +// NOLINTBEGIN(bugprone-suspicious-include) +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.cc" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.cc" +#include "google/cloud/apihub/v1/runtime_project_attachment_client.cc" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.cc" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.cc" +// NOLINTEND(bugprone-suspicious-include) diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_stub.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub.cc new file mode 100644 index 0000000000000..7405a17c21d6d --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub.cc @@ -0,0 +1,107 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/grpc_error_delegate.h" +#include "google/cloud/status_or.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +RuntimeProjectAttachmentServiceStub::~RuntimeProjectAttachmentServiceStub() = + default; + +StatusOr +DefaultRuntimeProjectAttachmentServiceStub::CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) { + google::cloud::apihub::v1::RuntimeProjectAttachment response; + auto status = + grpc_stub_->CreateRuntimeProjectAttachment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultRuntimeProjectAttachmentServiceStub::GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + google::cloud::apihub::v1::RuntimeProjectAttachment response; + auto status = + grpc_stub_->GetRuntimeProjectAttachment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +StatusOr +DefaultRuntimeProjectAttachmentServiceStub::ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) { + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsResponse response; + auto status = + grpc_stub_->ListRuntimeProjectAttachments(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +Status +DefaultRuntimeProjectAttachmentServiceStub::DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) { + google::protobuf::Empty response; + auto status = + grpc_stub_->DeleteRuntimeProjectAttachment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return google::cloud::Status(); +} + +StatusOr +DefaultRuntimeProjectAttachmentServiceStub::LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const&, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) { + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentResponse response; + auto status = + grpc_stub_->LookupRuntimeProjectAttachment(&context, request, &response); + if (!status.ok()) { + return google::cloud::MakeStatusFromRpcError(status); + } + return response; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h new file mode 100644 index 0000000000000..12afd4c81dccf --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h @@ -0,0 +1,119 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_STUB_H + +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class RuntimeProjectAttachmentServiceStub { + public: + virtual ~RuntimeProjectAttachmentServiceStub() = 0; + + virtual StatusOr + CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) = 0; + + virtual StatusOr + GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) = 0; + + virtual StatusOr< + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsResponse> + ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) = 0; + + virtual Status DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) = 0; + + virtual StatusOr< + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentResponse> + LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) = 0; +}; + +class DefaultRuntimeProjectAttachmentServiceStub + : public RuntimeProjectAttachmentServiceStub { + public: + explicit DefaultRuntimeProjectAttachmentServiceStub( + std::unique_ptr + grpc_stub) + : grpc_stub_(std::move(grpc_stub)) {} + + StatusOr + CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) override; + + Status DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) override; + + private: + std::unique_ptr< + google::cloud::apihub::v1::RuntimeProjectAttachmentService::StubInterface> + grpc_stub_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_STUB_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.cc new file mode 100644 index 0000000000000..b129d18b22679 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.cc @@ -0,0 +1,74 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_auth_decorator.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_logging_decorator.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_metadata_decorator.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.h" +#include "google/cloud/common_options.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/algorithm.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/log.h" +#include "google/cloud/options.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr +CreateDefaultRuntimeProjectAttachmentServiceStub( + std::shared_ptr auth, + Options const& options) { + auto channel = auth->CreateChannel(options.get(), + internal::MakeChannelArguments(options)); + auto service_grpc_stub = + google::cloud::apihub::v1::RuntimeProjectAttachmentService::NewStub( + channel); + std::shared_ptr stub = + std::make_shared( + std::move(service_grpc_stub)); + + if (auth->RequiresConfigureContext()) { + stub = std::make_shared( + std::move(auth), std::move(stub)); + } + stub = std::make_shared( + std::move(stub), std::multimap{}); + if (internal::Contains(options.get(), "rpc")) { + GCP_LOG(INFO) << "Enabled logging for gRPC calls"; + stub = std::make_shared( + std::move(stub), options.get(), + options.get()); + } + if (internal::TracingEnabled(options)) { + stub = MakeRuntimeProjectAttachmentServiceTracingStub(std::move(stub)); + } + return stub; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.h new file mode 100644 index 0000000000000..57b8c74c45bef --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.h @@ -0,0 +1,43 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_STUB_FACTORY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_STUB_FACTORY_H + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +std::shared_ptr +CreateDefaultRuntimeProjectAttachmentServiceStub( + std::shared_ptr auth, + Options const& options); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_STUB_FACTORY_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.cc new file mode 100644 index 0000000000000..474bb1c6c5dbb --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.cc @@ -0,0 +1,118 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.h" +#include "google/cloud/internal/opentelemetry.h" +#include "google/cloud/internal/traced_stream_range.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +RuntimeProjectAttachmentServiceTracingConnection:: + RuntimeProjectAttachmentServiceTracingConnection( + std::shared_ptr + child) + : child_(std::move(child)) {} + +StatusOr +RuntimeProjectAttachmentServiceTracingConnection:: + CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpan( + "apihub_v1::RuntimeProjectAttachmentServiceConnection::" + "CreateRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, + child_->CreateRuntimeProjectAttachment(request)); +} + +StatusOr +RuntimeProjectAttachmentServiceTracingConnection::GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpan( + "apihub_v1::RuntimeProjectAttachmentServiceConnection::" + "GetRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, child_->GetRuntimeProjectAttachment(request)); +} + +StreamRange +RuntimeProjectAttachmentServiceTracingConnection::ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request) { + auto span = internal::MakeSpan( + "apihub_v1::RuntimeProjectAttachmentServiceConnection::" + "ListRuntimeProjectAttachments"); + internal::OTelScope scope(span); + auto sr = child_->ListRuntimeProjectAttachments(std::move(request)); + return internal::MakeTracedStreamRange< + google::cloud::apihub::v1::RuntimeProjectAttachment>(std::move(span), + std::move(sr)); +} + +Status RuntimeProjectAttachmentServiceTracingConnection:: + DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpan( + "apihub_v1::RuntimeProjectAttachmentServiceConnection::" + "DeleteRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, + child_->DeleteRuntimeProjectAttachment(request)); +} + +StatusOr +RuntimeProjectAttachmentServiceTracingConnection:: + LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpan( + "apihub_v1::RuntimeProjectAttachmentServiceConnection::" + "LookupRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + return internal::EndSpan(*span, + child_->LookupRuntimeProjectAttachment(request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeRuntimeProjectAttachmentServiceTracingConnection( + std::shared_ptr + conn) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + if (internal::TracingEnabled(conn->options())) { + conn = std::make_shared( + std::move(conn)); + } +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return conn; +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.h new file mode 100644 index 0000000000000..d9d4b74e4df1c --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.h @@ -0,0 +1,89 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_TRACING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_TRACING_CONNECTION_H + +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class RuntimeProjectAttachmentServiceTracingConnection + : public apihub_v1::RuntimeProjectAttachmentServiceConnection { + public: + ~RuntimeProjectAttachmentServiceTracingConnection() override = default; + + explicit RuntimeProjectAttachmentServiceTracingConnection( + std::shared_ptr + child); + + Options options() override { return child_->options(); } + + StatusOr + CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) override; + + StreamRange + ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request) + override; + + Status DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) override; + + private: + std::shared_ptr child_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Conditionally applies the tracing decorator to the given connection. + * + * The connection is only decorated if tracing is enabled (as determined by the + * connection's options). + */ +std::shared_ptr +MakeRuntimeProjectAttachmentServiceTracingConnection( + std::shared_ptr conn); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_TRACING_CONNECTION_H diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.cc b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.cc new file mode 100644 index 0000000000000..d52e242007fbc --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.cc @@ -0,0 +1,127 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.h" +#include "google/cloud/internal/grpc_opentelemetry.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +RuntimeProjectAttachmentServiceTracingStub:: + RuntimeProjectAttachmentServiceTracingStub( + std::shared_ptr child) + : child_(std::move(child)), propagator_(internal::MakePropagator()) {} + +StatusOr +RuntimeProjectAttachmentServiceTracingStub::CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.RuntimeProjectAttachmentService", + "CreateRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->CreateRuntimeProjectAttachment(context, options, request)); +} + +StatusOr +RuntimeProjectAttachmentServiceTracingStub::GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.RuntimeProjectAttachmentService", + "GetRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->GetRuntimeProjectAttachment(context, options, request)); +} + +StatusOr +RuntimeProjectAttachmentServiceTracingStub::ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.RuntimeProjectAttachmentService", + "ListRuntimeProjectAttachments"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->ListRuntimeProjectAttachments(context, options, request)); +} + +Status +RuntimeProjectAttachmentServiceTracingStub::DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.RuntimeProjectAttachmentService", + "DeleteRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->DeleteRuntimeProjectAttachment(context, options, request)); +} + +StatusOr +RuntimeProjectAttachmentServiceTracingStub::LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) { + auto span = internal::MakeSpanGrpc( + "google.cloud.apihub.v1.RuntimeProjectAttachmentService", + "LookupRuntimeProjectAttachment"); + auto scope = opentelemetry::trace::Scope(span); + internal::InjectTraceContext(context, *propagator_); + return internal::EndSpan( + context, *span, + child_->LookupRuntimeProjectAttachment(context, options, request)); +} + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +std::shared_ptr +MakeRuntimeProjectAttachmentServiceTracingStub( + std::shared_ptr stub) { +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + return std::make_shared( + std::move(stub)); +#else + return stub; +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.h b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.h new file mode 100644 index 0000000000000..2d2ae4cd6e0b2 --- /dev/null +++ b/google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_stub.h @@ -0,0 +1,95 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_TRACING_STUB_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_TRACING_STUB_H + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub.h" +#include "google/cloud/internal/trace_propagator.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_internal { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +#ifdef GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +class RuntimeProjectAttachmentServiceTracingStub + : public RuntimeProjectAttachmentServiceStub { + public: + ~RuntimeProjectAttachmentServiceTracingStub() override = default; + + explicit RuntimeProjectAttachmentServiceTracingStub( + std::shared_ptr child); + + StatusOr + CreateRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + GetRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + ListRuntimeProjectAttachments( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest const& + request) override; + + Status DeleteRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request) override; + + StatusOr + LookupRuntimeProjectAttachment( + grpc::ClientContext& context, Options const& options, + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request) override; + + private: + std::shared_ptr child_; + std::shared_ptr + propagator_; +}; + +#endif // GOOGLE_CLOUD_CPP_HAVE_OPENTELEMETRY + +/** + * Applies the tracing decorator to the given stub. + * + * The stub is only decorated if the library has been compiled with + * OpenTelemetry. + */ +std::shared_ptr +MakeRuntimeProjectAttachmentServiceTracingStub( + std::shared_ptr stub); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_internal +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_INTERNAL_RUNTIME_PROJECT_ATTACHMENT_TRACING_STUB_H diff --git a/google/cloud/apihub/v1/linting_client.cc b/google/cloud/apihub/v1/linting_client.cc new file mode 100644 index 0000000000000..01a5258a5aea8 --- /dev/null +++ b/google/cloud/apihub/v1/linting_client.cc @@ -0,0 +1,96 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/linting_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +LintingServiceClient::LintingServiceClient( + std::shared_ptr connection, Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +LintingServiceClient::~LintingServiceClient() = default; + +StatusOr +LintingServiceClient::GetStyleGuide(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetStyleGuideRequest request; + request.set_name(name); + return connection_->GetStyleGuide(request); +} + +StatusOr +LintingServiceClient::GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetStyleGuide(request); +} + +StatusOr +LintingServiceClient::UpdateStyleGuide( + google::cloud::apihub::v1::StyleGuide const& style_guide, + google::protobuf::FieldMask const& update_mask, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::UpdateStyleGuideRequest request; + *request.mutable_style_guide() = style_guide; + *request.mutable_update_mask() = update_mask; + return connection_->UpdateStyleGuide(request); +} + +StatusOr +LintingServiceClient::UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->UpdateStyleGuide(request); +} + +StatusOr +LintingServiceClient::GetStyleGuideContents(std::string const& name, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetStyleGuideContentsRequest request; + request.set_name(name); + return connection_->GetStyleGuideContents(request); +} + +StatusOr +LintingServiceClient::GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetStyleGuideContents(request); +} + +Status LintingServiceClient::LintSpec( + google::cloud::apihub::v1::LintSpecRequest const& request, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->LintSpec(request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/linting_client.h b/google/cloud/apihub/v1/linting_client.h new file mode 100644 index 0000000000000..d6cd580f0817c --- /dev/null +++ b/google/cloud/apihub/v1/linting_client.h @@ -0,0 +1,302 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CLIENT_H + +#include "google/cloud/apihub/v1/linting_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// This service provides all methods related to the 1p Linter. +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +class LintingServiceClient { + public: + explicit LintingServiceClient( + std::shared_ptr connection, Options opts = {}); + ~LintingServiceClient(); + + ///@{ + /// @name Copy and move support + LintingServiceClient(LintingServiceClient const&) = default; + LintingServiceClient& operator=(LintingServiceClient const&) = default; + LintingServiceClient(LintingServiceClient&&) = default; + LintingServiceClient& operator=(LintingServiceClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(LintingServiceClient const& a, + LintingServiceClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(LintingServiceClient const& a, + LintingServiceClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Get the style guide being used for linting. + /// + /// @param name Required. The name of the spec to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/plugins/{plugin}/styleGuide`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.StyleGuide]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetStyleGuideRequest]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L79} + /// [google.cloud.apihub.v1.StyleGuide]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L137} + /// + // clang-format on + StatusOr GetStyleGuide( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get the style guide being used for linting. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetStyleGuideRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.StyleGuide]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetStyleGuideRequest]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L79} + /// [google.cloud.apihub.v1.StyleGuide]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L137} + /// + // clang-format on + StatusOr GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Update the styleGuide to be used for liniting in by API hub. + /// + /// @param style_guide Required. The Style guide resource to update. + /// @param update_mask Optional. The list of fields to update. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.StyleGuide]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.StyleGuide]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L137} + /// [google.cloud.apihub.v1.UpdateStyleGuideRequest]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L92} + /// + // clang-format on + StatusOr UpdateStyleGuide( + google::cloud::apihub::v1::StyleGuide const& style_guide, + google::protobuf::FieldMask const& update_mask, Options opts = {}); + + // clang-format off + /// + /// Update the styleGuide to be used for liniting in by API hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.UpdateStyleGuideRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.StyleGuide]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.StyleGuide]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L137} + /// [google.cloud.apihub.v1.UpdateStyleGuideRequest]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L92} + /// + // clang-format on + StatusOr UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Get the contents of the style guide. + /// + /// @param name Required. The name of the StyleGuide whose contents need to be retrieved. + /// There is exactly one style guide resource per project per location. + /// The expected format is + /// `projects/{project}/locations/{location}/plugins/{plugin}/styleGuide`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.StyleGuideContents]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetStyleGuideContentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L102} + /// [google.cloud.apihub.v1.StyleGuideContents]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L127} + /// + // clang-format on + StatusOr GetStyleGuideContents( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Get the contents of the style guide. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetStyleGuideContentsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.StyleGuideContents]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetStyleGuideContentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L102} + /// [google.cloud.apihub.v1.StyleGuideContents]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L127} + /// + // clang-format on + StatusOr GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Lints the requested spec and updates the corresponding API Spec with the + /// lint response. This lint response will be available in all subsequent + /// Get and List Spec calls to Core service. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.LintSpecRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.LintSpecRequest]: @googleapis_reference_link{google/cloud/apihub/v1/linting_service.proto#L116} + /// + // clang-format on + Status LintSpec(google::cloud::apihub::v1::LintSpecRequest const& request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CLIENT_H diff --git a/google/cloud/apihub/v1/linting_connection.cc b/google/cloud/apihub/v1/linting_connection.cc new file mode 100644 index 0000000000000..4d8910d98db8f --- /dev/null +++ b/google/cloud/apihub/v1/linting_connection.cc @@ -0,0 +1,83 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/linting_connection.h" +#include "google/cloud/apihub/v1/internal/linting_connection_impl.h" +#include "google/cloud/apihub/v1/internal/linting_option_defaults.h" +#include "google/cloud/apihub/v1/internal/linting_stub_factory.h" +#include "google/cloud/apihub/v1/internal/linting_tracing_connection.h" +#include "google/cloud/apihub/v1/linting_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +LintingServiceConnection::~LintingServiceConnection() = default; + +StatusOr +LintingServiceConnection::GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +LintingServiceConnection::UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +LintingServiceConnection::GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +Status LintingServiceConnection::LintSpec( + google::cloud::apihub::v1::LintSpecRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +std::shared_ptr MakeLintingServiceConnection( + Options options) { + internal::CheckExpectedOptions(options, + __func__); + options = + apihub_v1_internal::LintingServiceDefaultOptions(std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = apihub_v1_internal::CreateDefaultLintingServiceStub( + std::move(auth), options); + return apihub_v1_internal::MakeLintingServiceTracingConnection( + std::make_shared( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/linting_connection.h b/google/cloud/apihub/v1/linting_connection.h new file mode 100644 index 0000000000000..cf6c9b1d52bd9 --- /dev/null +++ b/google/cloud/apihub/v1/linting_connection.h @@ -0,0 +1,227 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CONNECTION_H + +#include "google/cloud/apihub/v1/internal/linting_retry_traits.h" +#include "google/cloud/apihub/v1/linting_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `LintingServiceConnection`. +class LintingServiceRetryPolicy : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() const = 0; +}; + +/** + * A retry policy for `LintingServiceConnection` based on counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class LintingServiceLimitedErrorCountRetryPolicy + : public LintingServiceRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit LintingServiceLimitedErrorCountRetryPolicy(int maximum_failures) + : impl_(maximum_failures) {} + + LintingServiceLimitedErrorCountRetryPolicy( + LintingServiceLimitedErrorCountRetryPolicy&& rhs) noexcept + : LintingServiceLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + LintingServiceLimitedErrorCountRetryPolicy( + LintingServiceLimitedErrorCountRetryPolicy const& rhs) noexcept + : LintingServiceLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = LintingServiceRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + apihub_v1_internal::LintingServiceRetryTraits> + impl_; +}; + +/** + * A retry policy for `LintingServiceConnection` based on elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class LintingServiceLimitedTimeRetryPolicy : public LintingServiceRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit LintingServiceLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + LintingServiceLimitedTimeRetryPolicy( + LintingServiceLimitedTimeRetryPolicy&& rhs) noexcept + : LintingServiceLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + LintingServiceLimitedTimeRetryPolicy( + LintingServiceLimitedTimeRetryPolicy const& rhs) noexcept + : LintingServiceLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = LintingServiceRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + apihub_v1_internal::LintingServiceRetryTraits> + impl_; +}; + +/** + * The `LintingServiceConnection` object for `LintingServiceClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `LintingServiceClient`. This allows users to inject custom behavior + * (e.g., with a Google Mock object) when writing tests that use objects of type + * `LintingServiceClient`. + * + * To create a concrete instance, see `MakeLintingServiceConnection()`. + * + * For mocking, see `apihub_v1_mocks::MockLintingServiceConnection`. + */ +class LintingServiceConnection { + public: + virtual ~LintingServiceConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual StatusOr GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request); + + virtual StatusOr UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request); + + virtual StatusOr + GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request); + + virtual Status LintSpec( + google::cloud::apihub::v1::LintSpecRequest const& request); +}; + +/** + * A factory function to construct an object of type `LintingServiceConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of LintingServiceClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `LintingServiceConnection`. Expected options are any of the types in + * the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::apihub_v1::LintingServicePolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the `LintingServiceConnection` created by + * this function. + */ +std::shared_ptr MakeLintingServiceConnection( + Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CONNECTION_H diff --git a/google/cloud/apihub/v1/linting_connection_idempotency_policy.cc b/google/cloud/apihub/v1/linting_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..dfed2c582898c --- /dev/null +++ b/google/cloud/apihub/v1/linting_connection_idempotency_policy.cc @@ -0,0 +1,65 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/linting_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +LintingServiceConnectionIdempotencyPolicy:: + ~LintingServiceConnectionIdempotencyPolicy() = default; + +std::unique_ptr +LintingServiceConnectionIdempotencyPolicy::clone() const { + return std::make_unique(*this); +} + +Idempotency LintingServiceConnectionIdempotencyPolicy::GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency LintingServiceConnectionIdempotencyPolicy::UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency LintingServiceConnectionIdempotencyPolicy::GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency LintingServiceConnectionIdempotencyPolicy::LintSpec( + google::cloud::apihub::v1::LintSpecRequest const&) { + return Idempotency::kNonIdempotent; +} + +std::unique_ptr +MakeDefaultLintingServiceConnectionIdempotencyPolicy() { + return std::make_unique(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/linting_connection_idempotency_policy.h b/google/cloud/apihub/v1/linting_connection_idempotency_policy.h new file mode 100644 index 0000000000000..3fe2b57ddac2e --- /dev/null +++ b/google/cloud/apihub/v1/linting_connection_idempotency_policy.h @@ -0,0 +1,61 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class LintingServiceConnectionIdempotencyPolicy { + public: + virtual ~LintingServiceConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr clone() + const; + + virtual google::cloud::Idempotency GetStyleGuide( + google::cloud::apihub::v1::GetStyleGuideRequest const& request); + + virtual google::cloud::Idempotency UpdateStyleGuide( + google::cloud::apihub::v1::UpdateStyleGuideRequest const& request); + + virtual google::cloud::Idempotency GetStyleGuideContents( + google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request); + + virtual google::cloud::Idempotency LintSpec( + google::cloud::apihub::v1::LintSpecRequest const& request); +}; + +std::unique_ptr +MakeDefaultLintingServiceConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/apihub/v1/linting_options.h b/google/cloud/apihub/v1/linting_options.h new file mode 100644 index 0000000000000..641387d5095fb --- /dev/null +++ b/google/cloud/apihub/v1/linting_options.h @@ -0,0 +1,76 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_OPTIONS_H + +#include "google/cloud/apihub/v1/linting_connection.h" +#include "google/cloud/apihub/v1/linting_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-apihub-options + */ +struct LintingServiceRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-apihub-options + */ +struct LintingServiceBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-apihub-options + */ +struct LintingServiceConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * The options applicable to LintingService. + * + * @ingroup google-cloud-apihub-options + */ +using LintingServicePolicyOptionList = + OptionList; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_LINTING_OPTIONS_H diff --git a/google/cloud/apihub/v1/mocks/mock_api_hub_connection.h b/google/cloud/apihub/v1/mocks/mock_api_hub_connection.h new file mode 100644 index 0000000000000..16aa1111c9fe5 --- /dev/null +++ b/google/cloud/apihub/v1/mocks/mock_api_hub_connection.h @@ -0,0 +1,210 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_connection.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `ApiHubConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type `ApiHubClient`. To do so, + * construct an object of type `ApiHubClient` with an instance of this + * class. Then use the Google Test framework functions to program the behavior + * of this mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockApiHubConnection : public apihub_v1::ApiHubConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + MOCK_METHOD(StatusOr, CreateApi, + (google::cloud::apihub::v1::CreateApiRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, GetApi, + (google::cloud::apihub::v1::GetApiRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), ListApis, + (google::cloud::apihub::v1::ListApisRequest request), (override)); + + MOCK_METHOD(StatusOr, UpdateApi, + (google::cloud::apihub::v1::UpdateApiRequest const& request), + (override)); + + MOCK_METHOD(Status, DeleteApi, + (google::cloud::apihub::v1::DeleteApiRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, CreateVersion, + (google::cloud::apihub::v1::CreateVersionRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, GetVersion, + (google::cloud::apihub::v1::GetVersionRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), ListVersions, + (google::cloud::apihub::v1::ListVersionsRequest request), + (override)); + + MOCK_METHOD(StatusOr, UpdateVersion, + (google::cloud::apihub::v1::UpdateVersionRequest const& request), + (override)); + + MOCK_METHOD(Status, DeleteVersion, + (google::cloud::apihub::v1::DeleteVersionRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, CreateSpec, + (google::cloud::apihub::v1::CreateSpecRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, GetSpec, + (google::cloud::apihub::v1::GetSpecRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, GetSpecContents, + (google::cloud::apihub::v1::GetSpecContentsRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), ListSpecs, + (google::cloud::apihub::v1::ListSpecsRequest request), + (override)); + + MOCK_METHOD(StatusOr, UpdateSpec, + (google::cloud::apihub::v1::UpdateSpecRequest const& request), + (override)); + + MOCK_METHOD(Status, DeleteSpec, + (google::cloud::apihub::v1::DeleteSpecRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, GetApiOperation, + (google::cloud::apihub::v1::GetApiOperationRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), + ListApiOperations, + (google::cloud::apihub::v1::ListApiOperationsRequest request), + (override)); + + MOCK_METHOD(StatusOr, GetDefinition, + (google::cloud::apihub::v1::GetDefinitionRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, CreateDeployment, + (google::cloud::apihub::v1::CreateDeploymentRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, GetDeployment, + (google::cloud::apihub::v1::GetDeploymentRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), + ListDeployments, + (google::cloud::apihub::v1::ListDeploymentsRequest request), + (override)); + + MOCK_METHOD( + StatusOr, UpdateDeployment, + (google::cloud::apihub::v1::UpdateDeploymentRequest const& request), + (override)); + + MOCK_METHOD( + Status, DeleteDeployment, + (google::cloud::apihub::v1::DeleteDeploymentRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, CreateAttribute, + (google::cloud::apihub::v1::CreateAttributeRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, GetAttribute, + (google::cloud::apihub::v1::GetAttributeRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, UpdateAttribute, + (google::cloud::apihub::v1::UpdateAttributeRequest const& request), + (override)); + + MOCK_METHOD( + Status, DeleteAttribute, + (google::cloud::apihub::v1::DeleteAttributeRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), + ListAttributes, + (google::cloud::apihub::v1::ListAttributesRequest request), + (override)); + + MOCK_METHOD((StreamRange), + SearchResources, + (google::cloud::apihub::v1::SearchResourcesRequest request), + (override)); + + MOCK_METHOD( + StatusOr, CreateExternalApi, + (google::cloud::apihub::v1::CreateExternalApiRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, GetExternalApi, + (google::cloud::apihub::v1::GetExternalApiRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, UpdateExternalApi, + (google::cloud::apihub::v1::UpdateExternalApiRequest const& request), + (override)); + + MOCK_METHOD( + Status, DeleteExternalApi, + (google::cloud::apihub::v1::DeleteExternalApiRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), + ListExternalApis, + (google::cloud::apihub::v1::ListExternalApisRequest request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_CONNECTION_H diff --git a/google/cloud/apihub/v1/mocks/mock_api_hub_dependencies_connection.h b/google/cloud/apihub/v1/mocks/mock_api_hub_dependencies_connection.h new file mode 100644 index 0000000000000..1979de2e6aacf --- /dev/null +++ b/google/cloud/apihub/v1/mocks/mock_api_hub_dependencies_connection.h @@ -0,0 +1,80 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_DEPENDENCIES_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_DEPENDENCIES_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_dependencies_connection.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `ApiHubDependenciesConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type `ApiHubDependenciesClient`. To do + * so, construct an object of type `ApiHubDependenciesClient` with an instance + * of this class. Then use the Google Test framework functions to program the + * behavior of this mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockApiHubDependenciesConnection + : public apihub_v1::ApiHubDependenciesConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + MOCK_METHOD( + StatusOr, CreateDependency, + (google::cloud::apihub::v1::CreateDependencyRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, GetDependency, + (google::cloud::apihub::v1::GetDependencyRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, UpdateDependency, + (google::cloud::apihub::v1::UpdateDependencyRequest const& request), + (override)); + + MOCK_METHOD( + Status, DeleteDependency, + (google::cloud::apihub::v1::DeleteDependencyRequest const& request), + (override)); + + MOCK_METHOD((StreamRange), + ListDependencies, + (google::cloud::apihub::v1::ListDependenciesRequest request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_DEPENDENCIES_CONNECTION_H diff --git a/google/cloud/apihub/v1/mocks/mock_api_hub_plugin_connection.h b/google/cloud/apihub/v1/mocks/mock_api_hub_plugin_connection.h new file mode 100644 index 0000000000000..701f6df258b58 --- /dev/null +++ b/google/cloud/apihub/v1/mocks/mock_api_hub_plugin_connection.h @@ -0,0 +1,67 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_PLUGIN_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_PLUGIN_CONNECTION_H + +#include "google/cloud/apihub/v1/api_hub_plugin_connection.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `ApiHubPluginConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type `ApiHubPluginClient`. To do so, + * construct an object of type `ApiHubPluginClient` with an instance of this + * class. Then use the Google Test framework functions to program the behavior + * of this mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockApiHubPluginConnection : public apihub_v1::ApiHubPluginConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + MOCK_METHOD(StatusOr, GetPlugin, + (google::cloud::apihub::v1::GetPluginRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, EnablePlugin, + (google::cloud::apihub::v1::EnablePluginRequest const& request), + (override)); + + MOCK_METHOD(StatusOr, DisablePlugin, + (google::cloud::apihub::v1::DisablePluginRequest const& request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_API_HUB_PLUGIN_CONNECTION_H diff --git a/google/cloud/apihub/v1/mocks/mock_host_project_registration_connection.h b/google/cloud/apihub/v1/mocks/mock_host_project_registration_connection.h new file mode 100644 index 0000000000000..ef95354f9098a --- /dev/null +++ b/google/cloud/apihub/v1/mocks/mock_host_project_registration_connection.h @@ -0,0 +1,76 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_HOST_PROJECT_REGISTRATION_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_HOST_PROJECT_REGISTRATION_CONNECTION_H + +#include "google/cloud/apihub/v1/host_project_registration_connection.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `HostProjectRegistrationServiceConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type + * `HostProjectRegistrationServiceClient`. To do so, construct an object of type + * `HostProjectRegistrationServiceClient` with an instance of this class. Then + * use the Google Test framework functions to program the behavior of this mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockHostProjectRegistrationServiceConnection + : public apihub_v1::HostProjectRegistrationServiceConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + MOCK_METHOD( + StatusOr, + CreateHostProjectRegistration, + (google::cloud::apihub::v1::CreateHostProjectRegistrationRequest const& + request), + (override)); + + MOCK_METHOD( + StatusOr, + GetHostProjectRegistration, + (google::cloud::apihub::v1::GetHostProjectRegistrationRequest const& + request), + (override)); + + MOCK_METHOD( + (StreamRange), + ListHostProjectRegistrations, + (google::cloud::apihub::v1::ListHostProjectRegistrationsRequest request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_HOST_PROJECT_REGISTRATION_CONNECTION_H diff --git a/google/cloud/apihub/v1/mocks/mock_linting_connection.h b/google/cloud/apihub/v1/mocks/mock_linting_connection.h new file mode 100644 index 0000000000000..af78006983450 --- /dev/null +++ b/google/cloud/apihub/v1/mocks/mock_linting_connection.h @@ -0,0 +1,75 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_LINTING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_LINTING_CONNECTION_H + +#include "google/cloud/apihub/v1/linting_connection.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `LintingServiceConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type `LintingServiceClient`. To do so, + * construct an object of type `LintingServiceClient` with an instance of this + * class. Then use the Google Test framework functions to program the behavior + * of this mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockLintingServiceConnection + : public apihub_v1::LintingServiceConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + MOCK_METHOD(StatusOr, GetStyleGuide, + (google::cloud::apihub::v1::GetStyleGuideRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, UpdateStyleGuide, + (google::cloud::apihub::v1::UpdateStyleGuideRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, + GetStyleGuideContents, + (google::cloud::apihub::v1::GetStyleGuideContentsRequest const& request), + (override)); + + MOCK_METHOD(Status, LintSpec, + (google::cloud::apihub::v1::LintSpecRequest const& request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_LINTING_CONNECTION_H diff --git a/google/cloud/apihub/v1/mocks/mock_provisioning_connection.h b/google/cloud/apihub/v1/mocks/mock_provisioning_connection.h new file mode 100644 index 0000000000000..93ff25285c4c2 --- /dev/null +++ b/google/cloud/apihub/v1/mocks/mock_provisioning_connection.h @@ -0,0 +1,105 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_PROVISIONING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_PROVISIONING_CONNECTION_H + +#include "google/cloud/apihub/v1/provisioning_connection.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `ProvisioningConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type `ProvisioningClient`. To do so, + * construct an object of type `ProvisioningClient` with an instance of this + * class. Then use the Google Test framework functions to program the behavior + * of this mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockProvisioningConnection : public apihub_v1::ProvisioningConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, + /// CreateApiHubInstance(Matcher(_))) + /// @endcode + MOCK_METHOD( + future>, + CreateApiHubInstance, + (google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// EXPECT_CALL(*mock, CreateApiHubInstance(_, _)) + /// @endcode + MOCK_METHOD( + StatusOr, CreateApiHubInstance, + (NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request), + (override)); + + /// To disambiguate calls, use: + /// + /// @code + /// using ::testing::_; + /// using ::testing::Matcher; + /// EXPECT_CALL(*mock, + /// CreateApiHubInstance(Matcher(_))) + /// @endcode + MOCK_METHOD(future>, + CreateApiHubInstance, + (google::longrunning::Operation const& operation), (override)); + + MOCK_METHOD( + StatusOr, GetApiHubInstance, + (google::cloud::apihub::v1::GetApiHubInstanceRequest const& request), + (override)); + + MOCK_METHOD( + StatusOr, + LookupApiHubInstance, + (google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_PROVISIONING_CONNECTION_H diff --git a/google/cloud/apihub/v1/mocks/mock_runtime_project_attachment_connection.h b/google/cloud/apihub/v1/mocks/mock_runtime_project_attachment_connection.h new file mode 100644 index 0000000000000..6b9f669c98242 --- /dev/null +++ b/google/cloud/apihub/v1/mocks/mock_runtime_project_attachment_connection.h @@ -0,0 +1,91 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_H + +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1_mocks { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * A class to mock `RuntimeProjectAttachmentServiceConnection`. + * + * Application developers may want to test their code with simulated responses, + * including errors, from an object of type + * `RuntimeProjectAttachmentServiceClient`. To do so, construct an object of + * type `RuntimeProjectAttachmentServiceClient` with an instance of this class. + * Then use the Google Test framework functions to program the behavior of this + * mock. + * + * @see [This example][bq-mock] for how to test your application with GoogleTest. + * While the example showcases types from the BigQuery library, the underlying + * principles apply for any pair of `*Client` and `*Connection`. + * + * [bq-mock]: @cloud_cpp_docs_link{bigquery,bigquery-read-mock} + */ +class MockRuntimeProjectAttachmentServiceConnection + : public apihub_v1::RuntimeProjectAttachmentServiceConnection { + public: + MOCK_METHOD(Options, options, (), (override)); + + MOCK_METHOD( + StatusOr, + CreateRuntimeProjectAttachment, + (google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request), + (override)); + + MOCK_METHOD( + StatusOr, + GetRuntimeProjectAttachment, + (google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request), + (override)); + + MOCK_METHOD( + (StreamRange), + ListRuntimeProjectAttachments, + (google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request), + (override)); + + MOCK_METHOD( + Status, DeleteRuntimeProjectAttachment, + (google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request), + (override)); + + MOCK_METHOD( + StatusOr< + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentResponse>, + LookupRuntimeProjectAttachment, + (google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request), + (override)); +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1_mocks +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_MOCKS_MOCK_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_H diff --git a/google/cloud/apihub/v1/provisioning_client.cc b/google/cloud/apihub/v1/provisioning_client.cc new file mode 100644 index 0000000000000..eb16ae0cc425b --- /dev/null +++ b/google/cloud/apihub/v1/provisioning_client.cc @@ -0,0 +1,121 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/provisioning_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ProvisioningClient::ProvisioningClient( + std::shared_ptr connection, Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +ProvisioningClient::~ProvisioningClient() = default; + +future> +ProvisioningClient::CreateApiHubInstance( + std::string const& parent, + google::cloud::apihub::v1::ApiHubInstance const& api_hub_instance, + std::string const& api_hub_instance_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateApiHubInstanceRequest request; + request.set_parent(parent); + *request.mutable_api_hub_instance() = api_hub_instance; + request.set_api_hub_instance_id(api_hub_instance_id); + return connection_->CreateApiHubInstance(request); +} + +StatusOr +ProvisioningClient::CreateApiHubInstance( + NoAwaitTag, std::string const& parent, + google::cloud::apihub::v1::ApiHubInstance const& api_hub_instance, + std::string const& api_hub_instance_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateApiHubInstanceRequest request; + request.set_parent(parent); + *request.mutable_api_hub_instance() = api_hub_instance; + request.set_api_hub_instance_id(api_hub_instance_id); + return connection_->CreateApiHubInstance(NoAwaitTag{}, request); +} + +future> +ProvisioningClient::CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateApiHubInstance(request); +} + +StatusOr +ProvisioningClient::CreateApiHubInstance( + NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateApiHubInstance(NoAwaitTag{}, request); +} + +future> +ProvisioningClient::CreateApiHubInstance( + google::longrunning::Operation const& operation, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateApiHubInstance(operation); +} + +StatusOr +ProvisioningClient::GetApiHubInstance(std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetApiHubInstanceRequest request; + request.set_name(name); + return connection_->GetApiHubInstance(request); +} + +StatusOr +ProvisioningClient::GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetApiHubInstance(request); +} + +StatusOr +ProvisioningClient::LookupApiHubInstance(std::string const& parent, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::LookupApiHubInstanceRequest request; + request.set_parent(parent); + return connection_->LookupApiHubInstance(request); +} + +StatusOr +ProvisioningClient::LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->LookupApiHubInstance(request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/provisioning_client.h b/google/cloud/apihub/v1/provisioning_client.h new file mode 100644 index 0000000000000..94c6112b56fce --- /dev/null +++ b/google/cloud/apihub/v1/provisioning_client.h @@ -0,0 +1,349 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CLIENT_H + +#include "google/cloud/apihub/v1/provisioning_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/no_await_tag.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// This service is used for managing the data plane provisioning of the API +/// hub. +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +class ProvisioningClient { + public: + explicit ProvisioningClient( + std::shared_ptr connection, Options opts = {}); + ~ProvisioningClient(); + + ///@{ + /// @name Copy and move support + ProvisioningClient(ProvisioningClient const&) = default; + ProvisioningClient& operator=(ProvisioningClient const&) = default; + ProvisioningClient(ProvisioningClient&&) = default; + ProvisioningClient& operator=(ProvisioningClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(ProvisioningClient const& a, + ProvisioningClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(ProvisioningClient const& a, + ProvisioningClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Provisions instance resources for the API Hub. + /// + /// @param parent Required. The parent resource for the Api Hub instance resource. + /// Format: `projects/{project}/locations/{location}` + /// @param api_hub_instance Required. The ApiHub instance. + /// @param api_hub_instance_id Optional. Identifier to assign to the Api Hub instance. Must be unique + /// within scope of the parent resource. If the field is not provided, system + /// generated id will be used. + /// @n + /// This value should be 4-40 characters, and valid characters + /// are `/[a-z][A-Z][0-9]-_/`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.apihub.v1.ApiHubInstance] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHubInstance]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1180} + /// [google.cloud.apihub.v1.CreateApiHubInstanceRequest]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L77} + /// + // clang-format on + future> + CreateApiHubInstance( + std::string const& parent, + google::cloud::apihub::v1::ApiHubInstance const& api_hub_instance, + std::string const& api_hub_instance_id, Options opts = {}); + + // clang-format off + /// + /// @copybrief CreateApiHubInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr CreateApiHubInstance( + NoAwaitTag, std::string const& parent, + google::cloud::apihub::v1::ApiHubInstance const& api_hub_instance, + std::string const& api_hub_instance_id, Options opts = {}); + + // clang-format off + /// + /// Provisions instance resources for the API Hub. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateApiHubInstanceRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return A [`future`] that becomes satisfied when the LRO + /// ([Long Running Operation]) completes or the polling policy in effect + /// for this call is exhausted. The future is satisfied with an error if + /// the LRO completes with an error or the polling policy is exhausted. + /// In this case the [`StatusOr`] returned by the future contains the + /// error. If the LRO completes successfully the value of the future + /// contains the LRO's result. For this RPC the result is a + /// [google.cloud.apihub.v1.ApiHubInstance] proto message. + /// The C++ class representing this message is created by Protobuf, using + /// the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [Long Running Operation]: https://google.aip.dev/151 + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHubInstance]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1180} + /// [google.cloud.apihub.v1.CreateApiHubInstanceRequest]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L77} + /// + // clang-format on + future> + CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief CreateApiHubInstance + /// + /// Specifying the [`NoAwaitTag`] immediately returns the + /// [`google::longrunning::Operation`] that corresponds to the Long Running + /// Operation that has been started. No polling for operation status occurs. + /// + /// [`NoAwaitTag`]: @ref google::cloud::NoAwaitTag + /// + // clang-format on + StatusOr CreateApiHubInstance( + NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// @copybrief CreateApiHubInstance + /// + /// This method accepts a `google::longrunning::Operation` that corresponds + /// to a previously started Long Running Operation (LRO) and polls the status + /// of the LRO in the background. + /// + // clang-format on + future> + CreateApiHubInstance(google::longrunning::Operation const& operation, + Options opts = {}); + + // clang-format off + /// + /// Gets details of a single API Hub instance. + /// + /// @param name Required. The name of the Api Hub instance to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/apiHubInstances/{apiHubInstance}`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ApiHubInstance]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHubInstance]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1180} + /// [google.cloud.apihub.v1.GetApiHubInstanceRequest]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L102} + /// + // clang-format on + StatusOr GetApiHubInstance( + std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Gets details of a single API Hub instance. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetApiHubInstanceRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.ApiHubInstance]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ApiHubInstance]: @googleapis_reference_link{google/cloud/apihub/v1/common_fields.proto#L1180} + /// [google.cloud.apihub.v1.GetApiHubInstanceRequest]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L102} + /// + // clang-format on + StatusOr GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request, + Options opts = {}); + + // clang-format off + /// + /// Looks up an Api Hub instance in a given GCP project. There will always be + /// only one Api Hub instance for a GCP project across all locations. + /// + /// @param parent Required. There will always be only one Api Hub instance for a GCP project + /// across all locations. + /// The parent resource for the Api Hub instance resource. + /// Format: `projects/{project}/locations/{location}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.LookupApiHubInstanceResponse]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.LookupApiHubInstanceRequest]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L117} + /// [google.cloud.apihub.v1.LookupApiHubInstanceResponse]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L133} + /// + // clang-format on + StatusOr + LookupApiHubInstance(std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// Looks up an Api Hub instance in a given GCP project. There will always be + /// only one Api Hub instance for a GCP project across all locations. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.LookupApiHubInstanceRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.LookupApiHubInstanceResponse]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.LookupApiHubInstanceRequest]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L117} + /// [google.cloud.apihub.v1.LookupApiHubInstanceResponse]: @googleapis_reference_link{google/cloud/apihub/v1/provisioning_service.proto#L133} + /// + // clang-format on + StatusOr + LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CLIENT_H diff --git a/google/cloud/apihub/v1/provisioning_connection.cc b/google/cloud/apihub/v1/provisioning_connection.cc new file mode 100644 index 0000000000000..6a6cb14eadfa9 --- /dev/null +++ b/google/cloud/apihub/v1/provisioning_connection.cc @@ -0,0 +1,94 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/provisioning_connection.h" +#include "google/cloud/apihub/v1/internal/provisioning_connection_impl.h" +#include "google/cloud/apihub/v1/internal/provisioning_option_defaults.h" +#include "google/cloud/apihub/v1/internal/provisioning_stub_factory.h" +#include "google/cloud/apihub/v1/internal/provisioning_tracing_connection.h" +#include "google/cloud/apihub/v1/provisioning_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +ProvisioningConnection::~ProvisioningConnection() = default; + +future> +ProvisioningConnection::CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StatusOr +ProvisioningConnection::CreateApiHubInstance( + NoAwaitTag, google::cloud::apihub::v1::CreateApiHubInstanceRequest const&) { + return StatusOr( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +future> +ProvisioningConnection::CreateApiHubInstance( + google::longrunning::Operation const&) { + return google::cloud::make_ready_future< + StatusOr>( + Status(StatusCode::kUnimplemented, "not implemented")); +} + +StatusOr +ProvisioningConnection::GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +ProvisioningConnection::LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +std::shared_ptr MakeProvisioningConnection( + Options options) { + internal::CheckExpectedOptions(options, + __func__); + options = apihub_v1_internal::ProvisioningDefaultOptions(std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = apihub_v1_internal::CreateDefaultProvisioningStub(std::move(auth), + options); + return apihub_v1_internal::MakeProvisioningTracingConnection( + std::make_shared( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/provisioning_connection.h b/google/cloud/apihub/v1/provisioning_connection.h new file mode 100644 index 0000000000000..1cab6385d7e00 --- /dev/null +++ b/google/cloud/apihub/v1/provisioning_connection.h @@ -0,0 +1,236 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CONNECTION_H + +#include "google/cloud/apihub/v1/internal/provisioning_retry_traits.h" +#include "google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/future.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/no_await_tag.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `ProvisioningConnection`. +class ProvisioningRetryPolicy : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() const = 0; +}; + +/** + * A retry policy for `ProvisioningConnection` based on counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ProvisioningLimitedErrorCountRetryPolicy + : public ProvisioningRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit ProvisioningLimitedErrorCountRetryPolicy(int maximum_failures) + : impl_(maximum_failures) {} + + ProvisioningLimitedErrorCountRetryPolicy( + ProvisioningLimitedErrorCountRetryPolicy&& rhs) noexcept + : ProvisioningLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + ProvisioningLimitedErrorCountRetryPolicy( + ProvisioningLimitedErrorCountRetryPolicy const& rhs) noexcept + : ProvisioningLimitedErrorCountRetryPolicy(rhs.maximum_failures()) {} + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = ProvisioningRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + apihub_v1_internal::ProvisioningRetryTraits> + impl_; +}; + +/** + * A retry policy for `ProvisioningConnection` based on elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class ProvisioningLimitedTimeRetryPolicy : public ProvisioningRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit ProvisioningLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + ProvisioningLimitedTimeRetryPolicy( + ProvisioningLimitedTimeRetryPolicy&& rhs) noexcept + : ProvisioningLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + ProvisioningLimitedTimeRetryPolicy( + ProvisioningLimitedTimeRetryPolicy const& rhs) noexcept + : ProvisioningLimitedTimeRetryPolicy(rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() const override { + return std::make_unique( + maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = ProvisioningRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + apihub_v1_internal::ProvisioningRetryTraits> + impl_; +}; + +/** + * The `ProvisioningConnection` object for `ProvisioningClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `ProvisioningClient`. This allows users to inject custom behavior + * (e.g., with a Google Mock object) when writing tests that use objects of type + * `ProvisioningClient`. + * + * To create a concrete instance, see `MakeProvisioningConnection()`. + * + * For mocking, see `apihub_v1_mocks::MockProvisioningConnection`. + */ +class ProvisioningConnection { + public: + virtual ~ProvisioningConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual future> + CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request); + + virtual StatusOr CreateApiHubInstance( + NoAwaitTag, + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request); + + virtual future> + CreateApiHubInstance(google::longrunning::Operation const& operation); + + virtual StatusOr GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request); + + virtual StatusOr + LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request); +}; + +/** + * A factory function to construct an object of type `ProvisioningConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of ProvisioningClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `ProvisioningConnection`. Expected options are any of the types in + * the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::apihub_v1::ProvisioningPolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the `ProvisioningConnection` created by + * this function. + */ +std::shared_ptr MakeProvisioningConnection( + Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CONNECTION_H diff --git a/google/cloud/apihub/v1/provisioning_connection_idempotency_policy.cc b/google/cloud/apihub/v1/provisioning_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..b0c6e515a7506 --- /dev/null +++ b/google/cloud/apihub/v1/provisioning_connection_idempotency_policy.cc @@ -0,0 +1,60 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +ProvisioningConnectionIdempotencyPolicy:: + ~ProvisioningConnectionIdempotencyPolicy() = default; + +std::unique_ptr +ProvisioningConnectionIdempotencyPolicy::clone() const { + return std::make_unique(*this); +} + +Idempotency ProvisioningConnectionIdempotencyPolicy::CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency ProvisioningConnectionIdempotencyPolicy::GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency ProvisioningConnectionIdempotencyPolicy::LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const&) { + return Idempotency::kIdempotent; +} + +std::unique_ptr +MakeDefaultProvisioningConnectionIdempotencyPolicy() { + return std::make_unique(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h b/google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h new file mode 100644 index 0000000000000..edc8dc613c8fb --- /dev/null +++ b/google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h @@ -0,0 +1,58 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class ProvisioningConnectionIdempotencyPolicy { + public: + virtual ~ProvisioningConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr clone() + const; + + virtual google::cloud::Idempotency CreateApiHubInstance( + google::cloud::apihub::v1::CreateApiHubInstanceRequest const& request); + + virtual google::cloud::Idempotency GetApiHubInstance( + google::cloud::apihub::v1::GetApiHubInstanceRequest const& request); + + virtual google::cloud::Idempotency LookupApiHubInstance( + google::cloud::apihub::v1::LookupApiHubInstanceRequest const& request); +}; + +std::unique_ptr +MakeDefaultProvisioningConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/apihub/v1/provisioning_options.h b/google/cloud/apihub/v1/provisioning_options.h new file mode 100644 index 0000000000000..94411dcaa7d0f --- /dev/null +++ b/google/cloud/apihub/v1/provisioning_options.h @@ -0,0 +1,86 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_OPTIONS_H + +#include "google/cloud/apihub/v1/provisioning_connection.h" +#include "google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ProvisioningRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ProvisioningBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-apihub-options + */ +struct ProvisioningConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the long-running operations + * polling policy. + * + * @ingroup google-cloud-apihub-options + */ +struct ProvisioningPollingPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * The options applicable to Provisioning. + * + * @ingroup google-cloud-apihub-options + */ +using ProvisioningPolicyOptionList = + OptionList; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_PROVISIONING_OPTIONS_H diff --git a/google/cloud/apihub/v1/runtime_project_attachment_client.cc b/google/cloud/apihub/v1/runtime_project_attachment_client.cc new file mode 100644 index 0000000000000..c10b636c63cb5 --- /dev/null +++ b/google/cloud/apihub/v1/runtime_project_attachment_client.cc @@ -0,0 +1,132 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/runtime_project_attachment_client.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +RuntimeProjectAttachmentServiceClient::RuntimeProjectAttachmentServiceClient( + std::shared_ptr connection, + Options opts) + : connection_(std::move(connection)), + options_( + internal::MergeOptions(std::move(opts), connection_->options())) {} +RuntimeProjectAttachmentServiceClient:: + ~RuntimeProjectAttachmentServiceClient() = default; + +StatusOr +RuntimeProjectAttachmentServiceClient::CreateRuntimeProjectAttachment( + std::string const& parent, + google::cloud::apihub::v1::RuntimeProjectAttachment const& + runtime_project_attachment, + std::string const& runtime_project_attachment_id, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest request; + request.set_parent(parent); + *request.mutable_runtime_project_attachment() = runtime_project_attachment; + request.set_runtime_project_attachment_id(runtime_project_attachment_id); + return connection_->CreateRuntimeProjectAttachment(request); +} + +StatusOr +RuntimeProjectAttachmentServiceClient::CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->CreateRuntimeProjectAttachment(request); +} + +StatusOr +RuntimeProjectAttachmentServiceClient::GetRuntimeProjectAttachment( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest request; + request.set_name(name); + return connection_->GetRuntimeProjectAttachment(request); +} + +StatusOr +RuntimeProjectAttachmentServiceClient::GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->GetRuntimeProjectAttachment(request); +} + +StreamRange +RuntimeProjectAttachmentServiceClient::ListRuntimeProjectAttachments( + std::string const& parent, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request; + request.set_parent(parent); + return connection_->ListRuntimeProjectAttachments(request); +} + +StreamRange +RuntimeProjectAttachmentServiceClient::ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->ListRuntimeProjectAttachments(std::move(request)); +} + +Status RuntimeProjectAttachmentServiceClient::DeleteRuntimeProjectAttachment( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest request; + request.set_name(name); + return connection_->DeleteRuntimeProjectAttachment(request); +} + +Status RuntimeProjectAttachmentServiceClient::DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->DeleteRuntimeProjectAttachment(request); +} + +StatusOr +RuntimeProjectAttachmentServiceClient::LookupRuntimeProjectAttachment( + std::string const& name, Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest request; + request.set_name(name); + return connection_->LookupRuntimeProjectAttachment(request); +} + +StatusOr +RuntimeProjectAttachmentServiceClient::LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request, + Options opts) { + internal::OptionsSpan span(internal::MergeOptions(std::move(opts), options_)); + return connection_->LookupRuntimeProjectAttachment(request); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/runtime_project_attachment_client.h b/google/cloud/apihub/v1/runtime_project_attachment_client.h new file mode 100644 index 0000000000000..5f575a6cced2d --- /dev/null +++ b/google/cloud/apihub/v1/runtime_project_attachment_client.h @@ -0,0 +1,424 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CLIENT_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CLIENT_H + +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.h" +#include "google/cloud/future.h" +#include "google/cloud/options.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/status_or.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// +/// This service is used for managing the runtime project attachments. +/// +/// @par Equality +/// +/// Instances of this class created via copy-construction or copy-assignment +/// always compare equal. Instances created with equal +/// `std::shared_ptr<*Connection>` objects compare equal. Objects that compare +/// equal share the same underlying resources. +/// +/// @par Performance +/// +/// Creating a new instance of this class is a relatively expensive operation, +/// new objects establish new connections to the service. In contrast, +/// copy-construction, move-construction, and the corresponding assignment +/// operations are relatively efficient as the copies share all underlying +/// resources. +/// +/// @par Thread Safety +/// +/// Concurrent access to different instances of this class, even if they compare +/// equal, is guaranteed to work. Two or more threads operating on the same +/// instance of this class is not guaranteed to work. Since copy-construction +/// and move-construction is a relatively efficient operation, consider using +/// such a copy when using this class from multiple threads. +/// +class RuntimeProjectAttachmentServiceClient { + public: + explicit RuntimeProjectAttachmentServiceClient( + std::shared_ptr connection, + Options opts = {}); + ~RuntimeProjectAttachmentServiceClient(); + + ///@{ + /// @name Copy and move support + RuntimeProjectAttachmentServiceClient( + RuntimeProjectAttachmentServiceClient const&) = default; + RuntimeProjectAttachmentServiceClient& operator=( + RuntimeProjectAttachmentServiceClient const&) = default; + RuntimeProjectAttachmentServiceClient( + RuntimeProjectAttachmentServiceClient&&) = default; + RuntimeProjectAttachmentServiceClient& operator=( + RuntimeProjectAttachmentServiceClient&&) = default; + ///@} + + ///@{ + /// @name Equality + friend bool operator==(RuntimeProjectAttachmentServiceClient const& a, + RuntimeProjectAttachmentServiceClient const& b) { + return a.connection_ == b.connection_; + } + friend bool operator!=(RuntimeProjectAttachmentServiceClient const& a, + RuntimeProjectAttachmentServiceClient const& b) { + return !(a == b); + } + ///@} + + // clang-format off + /// + /// Attaches a runtime project to the host project. + /// + /// @param parent Required. The parent resource for the Runtime Project Attachment. + /// Format: `projects/{project}/locations/{location}` + /// @param runtime_project_attachment Required. The Runtime Project Attachment to create. + /// @param runtime_project_attachment_id Required. The ID to use for the Runtime Project Attachment, which will + /// become the final component of the Runtime Project Attachment's name. The ID + /// must be the same as the project ID of the Google cloud project specified in + /// the runtime_project_attachment.runtime_project field. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.RuntimeProjectAttachment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L93} + /// [google.cloud.apihub.v1.RuntimeProjectAttachment]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L234} + /// + // clang-format on + StatusOr + CreateRuntimeProjectAttachment( + std::string const& parent, + google::cloud::apihub::v1::RuntimeProjectAttachment const& + runtime_project_attachment, + std::string const& runtime_project_attachment_id, Options opts = {}); + + // clang-format off + /// + /// Attaches a runtime project to the host project. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.CreateRuntimeProjectAttachmentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.RuntimeProjectAttachment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.CreateRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L93} + /// [google.cloud.apihub.v1.RuntimeProjectAttachment]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L234} + /// + // clang-format on + StatusOr + CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request, + Options opts = {}); + + // clang-format off + /// + /// Gets a runtime project attachment. + /// + /// @param name Required. The name of the API resource to retrieve. + /// Format: + /// `projects/{project}/locations/{location}/runtimeProjectAttachments/{runtime_project_attachment}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.RuntimeProjectAttachment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L118} + /// [google.cloud.apihub.v1.RuntimeProjectAttachment]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L234} + /// + // clang-format on + StatusOr + GetRuntimeProjectAttachment(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Gets a runtime project attachment. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.GetRuntimeProjectAttachmentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.RuntimeProjectAttachment]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.GetRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L118} + /// [google.cloud.apihub.v1.RuntimeProjectAttachment]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L234} + /// + // clang-format on + StatusOr + GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request, + Options opts = {}); + + // clang-format off + /// + /// List runtime projects attached to the host project. + /// + /// @param parent Required. The parent, which owns this collection of runtime project + /// attachments. Format: `projects/{project}/locations/{location}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.RuntimeProjectAttachment], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ListRuntimeProjectAttachmentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L133} + /// [google.cloud.apihub.v1.RuntimeProjectAttachment]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L234} + /// + // clang-format on + StreamRange + ListRuntimeProjectAttachments(std::string const& parent, Options opts = {}); + + // clang-format off + /// + /// List runtime projects attached to the host project. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.ListRuntimeProjectAttachmentsRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [StreamRange](@ref google::cloud::StreamRange) + /// to iterate of the results. See the documentation of this type for + /// details. In brief, this class has `begin()` and `end()` member + /// functions returning a iterator class meeting the + /// [input iterator requirements]. The value type for this iterator is a + /// [`StatusOr`] as the iteration may fail even after some values are + /// retrieved successfully, for example, if there is a network disconnect. + /// An empty set of results does not indicate an error, it indicates + /// that there are no resources meeting the request criteria. + /// On a successful iteration the `StatusOr` contains elements of type + /// [google.cloud.apihub.v1.RuntimeProjectAttachment], or rather, + /// the C++ class generated by Protobuf from that type. Please consult the + /// Protobuf documentation for details on the [Protobuf mapping rules]. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.ListRuntimeProjectAttachmentsRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L133} + /// [google.cloud.apihub.v1.RuntimeProjectAttachment]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L234} + /// + // clang-format on + StreamRange + ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request, + Options opts = {}); + + // clang-format off + /// + /// Delete a runtime project attachment in the API Hub. This call will detach + /// the runtime project from the host project. + /// + /// @param name Required. The name of the Runtime Project Attachment to delete. + /// Format: + /// `projects/{project}/locations/{location}/runtimeProjectAttachments/{runtime_project_attachment}` + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L195} + /// + // clang-format on + Status DeleteRuntimeProjectAttachment(std::string const& name, + Options opts = {}); + + // clang-format off + /// + /// Delete a runtime project attachment in the API Hub. This call will detach + /// the runtime project from the host project. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.DeleteRuntimeProjectAttachmentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return a [`Status`] object. If the request failed, the + /// status contains the details of the failure. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.DeleteRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L195} + /// + // clang-format on + Status DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request, + Options opts = {}); + + // clang-format off + /// + /// Look up a runtime project attachment. This API can be called in the context + /// of any project. + /// + /// @param name Required. Runtime project ID to look up runtime project attachment for. + /// Lookup happens across all regions. Expected format: + /// `projects/{project}/locations/{location}`. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.LookupRuntimeProjectAttachmentResponse]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.LookupRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L210} + /// [google.cloud.apihub.v1.LookupRuntimeProjectAttachmentResponse]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L225} + /// + // clang-format on + StatusOr + LookupRuntimeProjectAttachment(std::string const& name, Options opts = {}); + + // clang-format off + /// + /// Look up a runtime project attachment. This API can be called in the context + /// of any project. + /// + /// @param request Unary RPCs, such as the one wrapped by this + /// function, receive a single `request` proto message which includes all + /// the inputs for the RPC. In this case, the proto message is a + /// [google.cloud.apihub.v1.LookupRuntimeProjectAttachmentRequest]. + /// Proto messages are converted to C++ classes by Protobuf, using the + /// [Protobuf mapping rules]. + /// @param opts Optional. Override the class-level options, such as retry and + /// backoff policies. + /// @return the result of the RPC. The response message type + /// ([google.cloud.apihub.v1.LookupRuntimeProjectAttachmentResponse]) + /// is mapped to a C++ class using the [Protobuf mapping rules]. + /// If the request fails, the [`StatusOr`] contains the error details. + /// + /// [Protobuf mapping rules]: https://protobuf.dev/reference/cpp/cpp-generated/ + /// [input iterator requirements]: https://en.cppreference.com/w/cpp/named_req/InputIterator + /// [`std::string`]: https://en.cppreference.com/w/cpp/string/basic_string + /// [`future`]: @ref google::cloud::future + /// [`StatusOr`]: @ref google::cloud::StatusOr + /// [`Status`]: @ref google::cloud::Status + /// [google.cloud.apihub.v1.LookupRuntimeProjectAttachmentRequest]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L210} + /// [google.cloud.apihub.v1.LookupRuntimeProjectAttachmentResponse]: @googleapis_reference_link{google/cloud/apihub/v1/runtime_project_attachment_service.proto#L225} + /// + // clang-format on + StatusOr + LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request, + Options opts = {}); + + private: + std::shared_ptr connection_; + Options options_; +}; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CLIENT_H diff --git a/google/cloud/apihub/v1/runtime_project_attachment_connection.cc b/google/cloud/apihub/v1/runtime_project_attachment_connection.cc new file mode 100644 index 0000000000000..d20c59ea8fd3b --- /dev/null +++ b/google/cloud/apihub/v1/runtime_project_attachment_connection.cc @@ -0,0 +1,96 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_connection_impl.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_option_defaults.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_stub_factory.h" +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_tracing_connection.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_options.h" +#include "google/cloud/background_threads.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/grpc_options.h" +#include "google/cloud/internal/pagination_range.h" +#include "google/cloud/internal/unified_grpc_credentials.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +RuntimeProjectAttachmentServiceConnection:: + ~RuntimeProjectAttachmentServiceConnection() = default; + +StatusOr +RuntimeProjectAttachmentServiceConnection::CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +RuntimeProjectAttachmentServiceConnection::GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StreamRange +RuntimeProjectAttachmentServiceConnection::ListRuntimeProjectAttachments( + google::cloud::apihub::v1:: + ListRuntimeProjectAttachmentsRequest) { // NOLINT(performance-unnecessary-value-param) + return google::cloud::internal::MakeUnimplementedPaginationRange< + StreamRange>(); +} + +Status +RuntimeProjectAttachmentServiceConnection::DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +StatusOr +RuntimeProjectAttachmentServiceConnection::LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const&) { + return Status(StatusCode::kUnimplemented, "not implemented"); +} + +std::shared_ptr +MakeRuntimeProjectAttachmentServiceConnection(Options options) { + internal::CheckExpectedOptions< + CommonOptionList, GrpcOptionList, UnifiedCredentialsOptionList, + RuntimeProjectAttachmentServicePolicyOptionList>(options, __func__); + options = apihub_v1_internal::RuntimeProjectAttachmentServiceDefaultOptions( + std::move(options)); + auto background = internal::MakeBackgroundThreadsFactory(options)(); + auto auth = internal::CreateAuthenticationStrategy(background->cq(), options); + auto stub = + apihub_v1_internal::CreateDefaultRuntimeProjectAttachmentServiceStub( + std::move(auth), options); + return apihub_v1_internal:: + MakeRuntimeProjectAttachmentServiceTracingConnection( + std::make_shared( + std::move(background), std::move(stub), std::move(options))); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/runtime_project_attachment_connection.h b/google/cloud/apihub/v1/runtime_project_attachment_connection.h new file mode 100644 index 0000000000000..b628ef79fc8f6 --- /dev/null +++ b/google/cloud/apihub/v1/runtime_project_attachment_connection.h @@ -0,0 +1,260 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_H + +#include "google/cloud/apihub/v1/internal/runtime_project_attachment_retry_traits.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/internal/retry_policy_impl.h" +#include "google/cloud/options.h" +#include "google/cloud/status_or.h" +#include "google/cloud/stream_range.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/// The retry policy for `RuntimeProjectAttachmentServiceConnection`. +class RuntimeProjectAttachmentServiceRetryPolicy + : public ::google::cloud::RetryPolicy { + public: + /// Creates a new instance of the policy, reset to the initial state. + virtual std::unique_ptr clone() + const = 0; +}; + +/** + * A retry policy for `RuntimeProjectAttachmentServiceConnection` based on + * counting errors. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - More than a prescribed number of transient failures is detected. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy + : public RuntimeProjectAttachmentServiceRetryPolicy { + public: + /** + * Create an instance that tolerates up to @p maximum_failures transient + * errors. + * + * @note Disable the retry loop by providing an instance of this policy with + * @p maximum_failures == 0. + */ + explicit RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy( + int maximum_failures) + : impl_(maximum_failures) {} + + RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy( + RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy&& + rhs) noexcept + : RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy( + rhs.maximum_failures()) {} + RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy( + RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy const& + rhs) noexcept + : RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy( + rhs.maximum_failures()) {} + + int maximum_failures() const { return impl_.maximum_failures(); } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() + const override { + return std::make_unique< + RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy>( + maximum_failures()); + } + + // This is provided only for backwards compatibility. + using BaseType = RuntimeProjectAttachmentServiceRetryPolicy; + + private: + google::cloud::internal::LimitedErrorCountRetryPolicy< + apihub_v1_internal::RuntimeProjectAttachmentServiceRetryTraits> + impl_; +}; + +/** + * A retry policy for `RuntimeProjectAttachmentServiceConnection` based on + * elapsed time. + * + * This policy stops retrying if: + * - An RPC returns a non-transient error. + * - The elapsed time in the retry loop exceeds a prescribed duration. + * + * In this class the following status codes are treated as transient errors: + * - [`kUnavailable`](@ref google::cloud::StatusCode) + */ +class RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy + : public RuntimeProjectAttachmentServiceRetryPolicy { + public: + /** + * Constructor given a `std::chrono::duration<>` object. + * + * @tparam DurationRep a placeholder to match the `Rep` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the underlying + * arithmetic type used to store the number of ticks. For our purposes it + * is simply a formal parameter. + * @tparam DurationPeriod a placeholder to match the `Period` tparam for @p + * duration's type. The semantics of this template parameter are + * documented in `std::chrono::duration<>`. In brief, the length of the + * tick in seconds, expressed as a `std::ratio<>`. For our purposes it is + * simply a formal parameter. + * @param maximum_duration the maximum time allowed before the policy expires. + * While the application can express this time in any units they desire, + * the class truncates to milliseconds. + * + * @see https://en.cppreference.com/w/cpp/chrono/duration for more information + * about `std::chrono::duration`. + */ + template + explicit RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy( + std::chrono::duration maximum_duration) + : impl_(maximum_duration) {} + + RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy( + RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy&& rhs) noexcept + : RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy( + rhs.maximum_duration()) {} + RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy( + RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy const& rhs) noexcept + : RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy( + rhs.maximum_duration()) {} + + std::chrono::milliseconds maximum_duration() const { + return impl_.maximum_duration(); + } + + bool OnFailure(Status const& status) override { + return impl_.OnFailure(status); + } + bool IsExhausted() const override { return impl_.IsExhausted(); } + bool IsPermanentFailure(Status const& status) const override { + return impl_.IsPermanentFailure(status); + } + std::unique_ptr clone() + const override { + return std::make_unique< + RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy>( + maximum_duration()); + } + + // This is provided only for backwards compatibility. + using BaseType = RuntimeProjectAttachmentServiceRetryPolicy; + + private: + google::cloud::internal::LimitedTimeRetryPolicy< + apihub_v1_internal::RuntimeProjectAttachmentServiceRetryTraits> + impl_; +}; + +/** + * The `RuntimeProjectAttachmentServiceConnection` object for + * `RuntimeProjectAttachmentServiceClient`. + * + * This interface defines virtual methods for each of the user-facing overload + * sets in `RuntimeProjectAttachmentServiceClient`. This allows users to inject + * custom behavior (e.g., with a Google Mock object) when writing tests that use + * objects of type `RuntimeProjectAttachmentServiceClient`. + * + * To create a concrete instance, see + * `MakeRuntimeProjectAttachmentServiceConnection()`. + * + * For mocking, see + * `apihub_v1_mocks::MockRuntimeProjectAttachmentServiceConnection`. + */ +class RuntimeProjectAttachmentServiceConnection { + public: + virtual ~RuntimeProjectAttachmentServiceConnection() = 0; + + virtual Options options() { return Options{}; } + + virtual StatusOr + CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request); + + virtual StatusOr + GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request); + + virtual StreamRange + ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request); + + virtual Status DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request); + + virtual StatusOr< + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentResponse> + LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request); +}; + +/** + * A factory function to construct an object of type + * `RuntimeProjectAttachmentServiceConnection`. + * + * The returned connection object should not be used directly; instead it + * should be passed as an argument to the constructor of + * RuntimeProjectAttachmentServiceClient. + * + * The optional @p options argument may be used to configure aspects of the + * returned `RuntimeProjectAttachmentServiceConnection`. Expected options are + * any of the types in the following option lists: + * + * - `google::cloud::CommonOptionList` + * - `google::cloud::GrpcOptionList` + * - `google::cloud::UnifiedCredentialsOptionList` + * - `google::cloud::apihub_v1::RuntimeProjectAttachmentServicePolicyOptionList` + * + * @note Unexpected options will be ignored. To log unexpected options instead, + * set `GOOGLE_CLOUD_CPP_ENABLE_CLOG=yes` in the environment. + * + * @param options (optional) Configure the + * `RuntimeProjectAttachmentServiceConnection` created by this function. + */ +std::shared_ptr +MakeRuntimeProjectAttachmentServiceConnection(Options options = {}); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_H diff --git a/google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.cc b/google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.cc new file mode 100644 index 0000000000000..b1a5ffd8e20fe --- /dev/null +++ b/google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.cc @@ -0,0 +1,81 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +using ::google::cloud::Idempotency; + +RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy:: + ~RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy() = default; + +std::unique_ptr +RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy::clone() const { + return std::make_unique< + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy>(*this); +} + +Idempotency RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy:: + CreateRuntimeProjectAttachment( + google::cloud::apihub::v1:: + CreateRuntimeProjectAttachmentRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy:: + GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const&) { + return Idempotency::kIdempotent; +} + +Idempotency RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy:: + ListRuntimeProjectAttachments( + google::cloud::apihub::v1:: + ListRuntimeProjectAttachmentsRequest) { // NOLINT + return Idempotency::kIdempotent; +} + +Idempotency RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy:: + DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1:: + DeleteRuntimeProjectAttachmentRequest const&) { + return Idempotency::kNonIdempotent; +} + +Idempotency RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy:: + LookupRuntimeProjectAttachment( + google::cloud::apihub::v1:: + LookupRuntimeProjectAttachmentRequest const&) { + return Idempotency::kIdempotent; +} + +std::unique_ptr +MakeDefaultRuntimeProjectAttachmentServiceConnectionIdempotencyPolicy() { + return std::make_unique< + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy>(); +} + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google diff --git a/google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h b/google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h new file mode 100644 index 0000000000000..35d9e28523dc4 --- /dev/null +++ b/google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h @@ -0,0 +1,69 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_IDEMPOTENCY_POLICY_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_IDEMPOTENCY_POLICY_H + +#include "google/cloud/idempotency.h" +#include "google/cloud/version.h" +#include +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +class RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy { + public: + virtual ~RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy(); + + /// Create a new copy of this object. + virtual std::unique_ptr< + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy> + clone() const; + + virtual google::cloud::Idempotency CreateRuntimeProjectAttachment( + google::cloud::apihub::v1::CreateRuntimeProjectAttachmentRequest const& + request); + + virtual google::cloud::Idempotency GetRuntimeProjectAttachment( + google::cloud::apihub::v1::GetRuntimeProjectAttachmentRequest const& + request); + + virtual google::cloud::Idempotency ListRuntimeProjectAttachments( + google::cloud::apihub::v1::ListRuntimeProjectAttachmentsRequest request); + + virtual google::cloud::Idempotency DeleteRuntimeProjectAttachment( + google::cloud::apihub::v1::DeleteRuntimeProjectAttachmentRequest const& + request); + + virtual google::cloud::Idempotency LookupRuntimeProjectAttachment( + google::cloud::apihub::v1::LookupRuntimeProjectAttachmentRequest const& + request); +}; + +std::unique_ptr +MakeDefaultRuntimeProjectAttachmentServiceConnectionIdempotencyPolicy(); + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_CONNECTION_IDEMPOTENCY_POLICY_H diff --git a/google/cloud/apihub/v1/runtime_project_attachment_options.h b/google/cloud/apihub/v1/runtime_project_attachment_options.h new file mode 100644 index 0000000000000..041252bd1a2af --- /dev/null +++ b/google/cloud/apihub/v1/runtime_project_attachment_options.h @@ -0,0 +1,77 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#ifndef GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_OPTIONS_H +#define GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_OPTIONS_H + +#include "google/cloud/apihub/v1/runtime_project_attachment_connection.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h" +#include "google/cloud/backoff_policy.h" +#include "google/cloud/options.h" +#include "google/cloud/version.h" +#include + +namespace google { +namespace cloud { +namespace apihub_v1 { +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN + +/** + * Use with `google::cloud::Options` to configure the retry policy. + * + * @ingroup google-cloud-apihub-options + */ +struct RuntimeProjectAttachmentServiceRetryPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure the backoff policy. + * + * @ingroup google-cloud-apihub-options + */ +struct RuntimeProjectAttachmentServiceBackoffPolicyOption { + using Type = std::shared_ptr; +}; + +/** + * Use with `google::cloud::Options` to configure which operations are retried. + * + * @ingroup google-cloud-apihub-options + */ +struct RuntimeProjectAttachmentServiceConnectionIdempotencyPolicyOption { + using Type = std::shared_ptr< + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy>; +}; + +/** + * The options applicable to RuntimeProjectAttachmentService. + * + * @ingroup google-cloud-apihub-options + */ +using RuntimeProjectAttachmentServicePolicyOptionList = OptionList< + RuntimeProjectAttachmentServiceRetryPolicyOption, + RuntimeProjectAttachmentServiceBackoffPolicyOption, + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicyOption>; + +GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_END +} // namespace apihub_v1 +} // namespace cloud +} // namespace google + +#endif // GOOGLE_CLOUD_CPP_GOOGLE_CLOUD_APIHUB_V1_RUNTIME_PROJECT_ATTACHMENT_OPTIONS_H diff --git a/google/cloud/apihub/v1/samples/api_hub_client_samples.cc b/google/cloud/apihub/v1/samples/api_hub_client_samples.cc new file mode 100644 index 0000000000000..c9cf9e6652d19 --- /dev/null +++ b/google/cloud/apihub/v1/samples/api_hub_client_samples.cc @@ -0,0 +1,153 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_client.h" +#include "google/cloud/apihub/v1/api_hub_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/api_hub_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: apihub_v1::ApiHubClient +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::apihub_v1::ApiHubClient( + google::cloud::apihub_v1::MakeApiHubConnection(options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy + : public google::cloud::apihub_v1::ApiHubConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::apihub_v1::ApiHubLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = google::cloud::apihub_v1::MakeApiHubConnection(options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::apihub_v1::ApiHubClient(connection); + auto c2 = google::cloud::apihub_v1::ApiHubClient(connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::apihub_v1::ApiHubClient( + connection, + google::cloud::Options{} + .set( + google::cloud::apihub_v1::ApiHubLimitedTimeRetryPolicy( + std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::apihub_v1::ApiHubLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::apihub_v1::ApiHubClient( + google::cloud::apihub_v1::MakeApiHubConnection(options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} diff --git a/google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc b/google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc new file mode 100644 index 0000000000000..f1050f60fb57d --- /dev/null +++ b/google/cloud/apihub/v1/samples/api_hub_dependencies_client_samples.cc @@ -0,0 +1,158 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/apihub_service.proto + +#include "google/cloud/apihub/v1/api_hub_dependencies_client.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/api_hub_dependencies_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: apihub_v1::ApiHubDependenciesClient +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::apihub_v1::ApiHubDependenciesClient( + google::cloud::apihub_v1::MakeApiHubDependenciesConnection(options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy + : public google::cloud::apihub_v1:: + ApiHubDependenciesConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr< + google::cloud::apihub_v1::ApiHubDependenciesConnectionIdempotencyPolicy> + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::apihub_v1:: + ApiHubDependenciesLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = + google::cloud::apihub_v1::MakeApiHubDependenciesConnection(options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::apihub_v1::ApiHubDependenciesClient(connection); + auto c2 = google::cloud::apihub_v1::ApiHubDependenciesClient(connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::apihub_v1::ApiHubDependenciesClient( + connection, + google::cloud::Options{} + .set( + google::cloud::apihub_v1:: + ApiHubDependenciesLimitedTimeRetryPolicy( + std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::apihub_v1::ApiHubDependenciesLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::apihub_v1::ApiHubDependenciesClient( + google::cloud::apihub_v1::MakeApiHubDependenciesConnection(options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} diff --git a/google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc b/google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc new file mode 100644 index 0000000000000..ded870a392a58 --- /dev/null +++ b/google/cloud/apihub/v1/samples/api_hub_plugin_client_samples.cc @@ -0,0 +1,156 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/plugin_service.proto + +#include "google/cloud/apihub/v1/api_hub_plugin_client.h" +#include "google/cloud/apihub/v1/api_hub_plugin_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/api_hub_plugin_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: apihub_v1::ApiHubPluginClient +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::apihub_v1::ApiHubPluginClient( + google::cloud::apihub_v1::MakeApiHubPluginConnection(options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy + : public google::cloud::apihub_v1::ApiHubPluginConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr< + google::cloud::apihub_v1::ApiHubPluginConnectionIdempotencyPolicy> + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::apihub_v1:: + ApiHubPluginLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = + google::cloud::apihub_v1::MakeApiHubPluginConnection(options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::apihub_v1::ApiHubPluginClient(connection); + auto c2 = google::cloud::apihub_v1::ApiHubPluginClient(connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::apihub_v1::ApiHubPluginClient( + connection, + google::cloud::Options{} + .set( + google::cloud::apihub_v1::ApiHubPluginLimitedTimeRetryPolicy( + std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::apihub_v1::ApiHubPluginLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::apihub_v1::ApiHubPluginClient( + google::cloud::apihub_v1::MakeApiHubPluginConnection(options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} diff --git a/google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc b/google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc new file mode 100644 index 0000000000000..3e021d0f797a3 --- /dev/null +++ b/google/cloud/apihub/v1/samples/host_project_registration_client_samples.cc @@ -0,0 +1,167 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/host_project_registration_service.proto + +#include "google/cloud/apihub/v1/host_project_registration_client.h" +#include "google/cloud/apihub/v1/host_project_registration_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/host_project_registration_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: apihub_v1::HostProjectRegistrationServiceClient +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::apihub_v1::HostProjectRegistrationServiceClient( + google::cloud::apihub_v1::MakeHostProjectRegistrationServiceConnection( + options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy + : public google::cloud::apihub_v1:: + HostProjectRegistrationServiceConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set< + google::cloud::apihub_v1:: + HostProjectRegistrationServiceConnectionIdempotencyPolicyOption>( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::apihub_v1:: + HostProjectRegistrationServiceLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = + google::cloud::apihub_v1::MakeHostProjectRegistrationServiceConnection( + options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::apihub_v1::HostProjectRegistrationServiceClient( + connection); + auto c2 = google::cloud::apihub_v1::HostProjectRegistrationServiceClient( + connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::apihub_v1::HostProjectRegistrationServiceClient( + connection, + google::cloud::Options{} + .set( + google::cloud::apihub_v1:: + HostProjectRegistrationServiceLimitedTimeRetryPolicy( + std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::apihub_v1::HostProjectRegistrationServiceLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::apihub_v1::HostProjectRegistrationServiceClient( + google::cloud::apihub_v1::MakeHostProjectRegistrationServiceConnection( + options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} diff --git a/google/cloud/apihub/v1/samples/linting_client_samples.cc b/google/cloud/apihub/v1/samples/linting_client_samples.cc new file mode 100644 index 0000000000000..d968230842166 --- /dev/null +++ b/google/cloud/apihub/v1/samples/linting_client_samples.cc @@ -0,0 +1,156 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/linting_service.proto + +#include "google/cloud/apihub/v1/linting_client.h" +#include "google/cloud/apihub/v1/linting_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/linting_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: apihub_v1::LintingServiceClient +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::apihub_v1::LintingServiceClient( + google::cloud::apihub_v1::MakeLintingServiceConnection(options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy : public google::cloud::apihub_v1:: + LintingServiceConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr< + google::cloud::apihub_v1::LintingServiceConnectionIdempotencyPolicy> + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::apihub_v1:: + LintingServiceLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = + google::cloud::apihub_v1::MakeLintingServiceConnection(options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::apihub_v1::LintingServiceClient(connection); + auto c2 = google::cloud::apihub_v1::LintingServiceClient(connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::apihub_v1::LintingServiceClient( + connection, + google::cloud::Options{} + .set( + google::cloud::apihub_v1::LintingServiceLimitedTimeRetryPolicy( + std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::apihub_v1::LintingServiceLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::apihub_v1::LintingServiceClient( + google::cloud::apihub_v1::MakeLintingServiceConnection(options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} diff --git a/google/cloud/apihub/v1/samples/provisioning_client_samples.cc b/google/cloud/apihub/v1/samples/provisioning_client_samples.cc new file mode 100644 index 0000000000000..b873b6118b4d0 --- /dev/null +++ b/google/cloud/apihub/v1/samples/provisioning_client_samples.cc @@ -0,0 +1,200 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/provisioning_service.proto + +#include "google/cloud/apihub/v1/provisioning_client.h" +#include "google/cloud/apihub/v1/provisioning_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/provisioning_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/polling_policy.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: apihub_v1::ProvisioningClient +// lro-marker: true +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::apihub_v1::ProvisioningClient( + google::cloud::apihub_v1::MakeProvisioningConnection(options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy + : public google::cloud::apihub_v1::ProvisioningConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr< + google::cloud::apihub_v1::ProvisioningConnectionIdempotencyPolicy> + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::apihub_v1:: + ProvisioningLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = + google::cloud::apihub_v1::MakeProvisioningConnection(options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::apihub_v1::ProvisioningClient(connection); + auto c2 = google::cloud::apihub_v1::ProvisioningClient(connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::apihub_v1::ProvisioningClient( + connection, + google::cloud::Options{} + .set( + google::cloud::apihub_v1::ProvisioningLimitedTimeRetryPolicy( + std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::apihub_v1::ProvisioningLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void SetPollingPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-policy-policy"}; + } + //! [set-polling-policy] + + // The polling policy controls how the client waits for long-running + // operations. `GenericPollingPolicy<>` combines existing policies. + // In this case, keep polling until the operation completes (with success + // or error) or 45 minutes, whichever happens first. Initially pause for + // 10 seconds between polling requests, increasing the pause by a factor + // of 4 until it becomes 2 minutes. + auto options = + google::cloud::Options{} + .set( + google::cloud::GenericPollingPolicy< + google::cloud::apihub_v1::ProvisioningRetryPolicyOption::Type, + google::cloud::apihub_v1::ProvisioningBackoffPolicyOption:: + Type>( + google::cloud::apihub_v1::ProvisioningLimitedTimeRetryPolicy( + /*maximum_duration=*/std::chrono::minutes(45)) + .clone(), + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::seconds(10), + /*maximum_delay=*/std::chrono::minutes(2), + /*scaling=*/4.0) + .clone()) + .clone()); + + auto connection = + google::cloud::apihub_v1::MakeProvisioningConnection(options); + + // c1 and c2 share the same polling policies. + auto c1 = google::cloud::apihub_v1::ProvisioningClient(connection); + auto c2 = google::cloud::apihub_v1::ProvisioningClient(connection); + //! [set-polling-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::apihub_v1::ProvisioningClient( + google::cloud::apihub_v1::MakeProvisioningConnection(options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning SetPollingPolicy() example" << std::endl; + SetPollingPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"set-polling-policy", SetPollingPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} diff --git a/google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc b/google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc new file mode 100644 index 0000000000000..03f9c10e6e965 --- /dev/null +++ b/google/cloud/apihub/v1/samples/runtime_project_attachment_client_samples.cc @@ -0,0 +1,168 @@ +// Copyright 2024 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. + +// Generated by the Codegen C++ plugin. +// If you make any local changes, they will be lost. +// source: google/cloud/apihub/v1/runtime_project_attachment_service.proto + +#include "google/cloud/apihub/v1/runtime_project_attachment_client.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_connection_idempotency_policy.h" +#include "google/cloud/apihub/v1/runtime_project_attachment_options.h" +#include "google/cloud/common_options.h" +#include "google/cloud/credentials.h" +#include "google/cloud/internal/getenv.h" +#include "google/cloud/testing_util/example_driver.h" +#include +#include +#include +#include + +// clang-format off +// main-dox-marker: apihub_v1::RuntimeProjectAttachmentServiceClient +// clang-format on +namespace { + +void SetClientEndpoint(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-endpoint"}; + } + //! [set-client-endpoint] + // This configuration is common with Private Google Access: + // https://cloud.google.com/vpc/docs/private-google-access + auto options = google::cloud::Options{}.set( + "private.googleapis.com"); + auto client = google::cloud::apihub_v1::RuntimeProjectAttachmentServiceClient( + google::cloud::apihub_v1::MakeRuntimeProjectAttachmentServiceConnection( + options)); + //! [set-client-endpoint] +} + +//! [custom-idempotency-policy] +class CustomIdempotencyPolicy + : public google::cloud::apihub_v1:: + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy { + public: + ~CustomIdempotencyPolicy() override = default; + std::unique_ptr< + google::cloud::apihub_v1:: + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicy> + clone() const override { + return std::make_unique(*this); + } + // Override inherited functions to define as needed. +}; +//! [custom-idempotency-policy] + +void SetRetryPolicy(std::vector const& argv) { + if (!argv.empty()) { + throw google::cloud::testing_util::Usage{"set-client-retry-policy"}; + } + //! [set-retry-policy] + auto options = + google::cloud::Options{} + .set< + google::cloud::apihub_v1:: + RuntimeProjectAttachmentServiceConnectionIdempotencyPolicyOption>( + CustomIdempotencyPolicy().clone()) + .set( + google::cloud::apihub_v1:: + RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy(3) + .clone()) + .set( + google::cloud::ExponentialBackoffPolicy( + /*initial_delay=*/std::chrono::milliseconds(200), + /*maximum_delay=*/std::chrono::seconds(45), + /*scaling=*/2.0) + .clone()); + auto connection = + google::cloud::apihub_v1::MakeRuntimeProjectAttachmentServiceConnection( + options); + + // c1 and c2 share the same retry policies + auto c1 = google::cloud::apihub_v1::RuntimeProjectAttachmentServiceClient( + connection); + auto c2 = google::cloud::apihub_v1::RuntimeProjectAttachmentServiceClient( + connection); + + // You can override any of the policies in a new client. This new client + // will share the policies from c1 (or c2) *except* for the retry policy. + auto c3 = google::cloud::apihub_v1::RuntimeProjectAttachmentServiceClient( + connection, + google::cloud::Options{} + .set( + google::cloud::apihub_v1:: + RuntimeProjectAttachmentServiceLimitedTimeRetryPolicy( + std::chrono::minutes(5)) + .clone())); + + // You can also override the policies in a single call: + // c3.SomeRpc(..., google::cloud::Options{} + // .set( + // google::cloud::apihub_v1::RuntimeProjectAttachmentServiceLimitedErrorCountRetryPolicy(10).clone())); + //! [set-retry-policy] +} + +void WithServiceAccount(std::vector const& argv) { + if (argv.size() != 1 || argv[0] == "--help") { + throw google::cloud::testing_util::Usage{"with-service-account "}; + } + //! [with-service-account] + [](std::string const& keyfile) { + auto is = std::ifstream(keyfile); + is.exceptions(std::ios::badbit); // Minimal error handling in examples + auto contents = std::string(std::istreambuf_iterator(is.rdbuf()), {}); + auto options = + google::cloud::Options{}.set( + google::cloud::MakeServiceAccountCredentials(contents)); + return google::cloud::apihub_v1::RuntimeProjectAttachmentServiceClient( + google::cloud::apihub_v1::MakeRuntimeProjectAttachmentServiceConnection( + options)); + } + //! [with-service-account] + (argv.at(0)); +} + +void AutoRun(std::vector const& argv) { + namespace examples = ::google::cloud::testing_util; + using ::google::cloud::internal::GetEnv; + if (!argv.empty()) throw examples::Usage{"auto"}; + examples::CheckEnvironmentVariablesAreSet( + {"GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE"}); + auto const keyfile = + GetEnv("GOOGLE_CLOUD_CPP_TEST_SERVICE_ACCOUNT_KEYFILE").value(); + + std::cout << "\nRunning SetClientEndpoint() example" << std::endl; + SetClientEndpoint({}); + + std::cout << "\nRunning SetRetryPolicy() example" << std::endl; + SetRetryPolicy({}); + + std::cout << "\nRunning WithServiceAccount() example" << std::endl; + WithServiceAccount({keyfile}); +} + +} // namespace + +int main(int argc, char* argv[]) { // NOLINT(bugprone-exception-escape) + google::cloud::testing_util::Example example({ + {"set-client-endpoint", SetClientEndpoint}, + {"set-retry-policy", SetRetryPolicy}, + {"with-service-account", WithServiceAccount}, + {"auto", AutoRun}, + }); + return example.Run(argc, argv); +} From 83fdd2aeb188d93dfe72da77e5b3c43a48d0245c Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Wed, 7 Aug 2024 14:44:41 -0400 Subject: [PATCH 3/4] Add API baseline --- ...ogle_cloud_cpp_apihub.expected.abi.dump.gz | Bin 0 -> 1112892 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ci/abi-dumps/google_cloud_cpp_apihub.expected.abi.dump.gz diff --git a/ci/abi-dumps/google_cloud_cpp_apihub.expected.abi.dump.gz b/ci/abi-dumps/google_cloud_cpp_apihub.expected.abi.dump.gz new file mode 100644 index 0000000000000000000000000000000000000000..093728253d535a5ba9ebeafc67042b14668f632c GIT binary patch literal 1112892 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

bUvQz8EiP9uUfp_tuc<-8 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 n?QiE%gl+me#T$q;$V0ZkZT0B{- zN&Y8c`$?|o-Q$BHf4$GdK=Nm0$mUg}zHkNPy|FNP$4jb#aJ{kc>BuF&m1~Rvsr_DV zIZE>5i?(klEfyKI4viqr2pefJ5pd&Hl~HI;ix7>&f&~ycU}~-bDBSsluCZz8zkz6( zZFM`HU4jUekC}f8w3AFc){YB~>k|-0~>~7|zXaNo70~(G9TUrfDXUnQ_ z=t%CD;L1)1Xm^xZ_xL^i@zd5_aWf z-RHmNbkFjOTjcT^$g3;7xpNP=p0Iysl;c!Gt$}4(UrK=f^Y_{)V`J0Wx&1-47kEhn z{LCc|eaa~ugo*8>96U=s+C(&`bbdfc$!gfsCUqi^XY@_#rKo5%BatE9bVU0@*Utuj zmW`z)gDx6|6f1$DHU{yRC(INlLLXR^T3W%6#*W21g8e3p(rIs3zO1Nl()p6Vj@c6a z)#ud>o_O6jS#{*n%kNi3PhBr3E1J$uF3XKK;%>gji1X$m=G_nKLcN8Xs61Z@sHJmx z)g;l3N;ULk3dI?lvK!q_Z1$KTV*pIbC;G2o92+{pz>t$Oswmxqr`x57; zV@D*c%R*P zaO*z18SjOlU~mdHdj|`D8^4F?Vy9I*`<17&rD_Z)M*iT+^d~axqrI^mMTjfP<{VV( zx|t{VHc_Kddf|6HRW1!b&nRG<9VB9TsHI8M7$gE_73ED^3Hk+zXwuy24;5O>*8ef< zAxB4;D4S7Y;c#F!#AuvCfc#Qu(g$=8GYhKqB8fDwh;2VXD}j0lgFD+{eXQ_>JS%1R zskhZHh*pm|s1KQ5m`6F?RS%m*a^CAaOd!v`J1MF6Q20l|H6Vw7nF88~Uou(DgELc| z3lB@K!F*)-j!!T{9ItDEaEQba3R%q+H3}lszjZ>>2VDN*SuLXa9(%Vj^Wpx!vHJzv zB}|uBYOl%dIKtjd&SQzlOxp0)jgv|aEMt6&W?C!hzTzRy6ZP1wU16U%T(IGnp2G;i zM(wsU+whuVy~ppKg411gn%QuZ8Qt&N4IJL7K2sbEzEoSVP?OKf5t2*OB`!ABEs1z4%$ueCFKU{ zOU=9G#Get3IsGw!il0c4LXgzrM)VuON%!p!krE0@hU%h>N)E7sp3@v@)Bmzx6ztqa zbD=RZVm+uu-=_4Cl&Ls0qNJ*i(U-KKdhr8Gg`dBm9q-~rsPoRJxBo?q(6v^7rY7fg z!ZX{4I&q!`CPV>*G?Gq)(c%`IHcjJMQb>-sVpTY;{4?MIDu_jc3&F-Hy9#N|J=$KK zKp4iQC5}Dx=dZ;&?I+6EA702MxSq*BhJBlM*yTG)4g0QC2`B6|cO4=@{Mf5(9s3JG zv47EM$-p&fR$*ULWwG7KA&nLuI#IOvn-H5)C2E2-m>soce|k&@uQny|C`eS5NqJUuprkyAp3e`L#bggFdoJ#(8QqO>ymzchJ6#?gE~P; zylm;fsgda63}X0Swb#7Q``;}w_O$JiqFQ{e8)KotCR8 z?h><{Y_s%Gd>0e-Zp*s?FQf7 zHN2ptA;q?Sl=_|Xq%BaOh(}_e=3^XHT#cH$8+E|Vd;61O=^NELyBZf<@E4}8U(fMnL7>b zFA$^^>b!~s=u4=N-JSJ1Mw?$Iw_|@X7g8tHC}8oQe(1P61RI3rby8WB2x$Mym^S{D z!iBV!ZrHq9YHNNO^MfL#qV5@!sOO2L7;60MucEGgnJ^rF>P=;mo5bnsp=ue6sXXYk|_x7=n-nK&x8@k6PR>B2#P(>TuFDa1;`=%XSC8{Jq5ZR~P{%S;?e* z^a)WR1-xpju_dFffRMy9-Q5hKavpKfnGZ}Jaug#X?xoq&iLp+7OWk&Jst+MzcndSV z5R>i_iH_WVy`sd3IB=L^MD~{SaB-AbW1SSX1`{PbxZdL!BQXYrEn0S}OM>AHt~-D` zlV{6Yo3}sqK5(wz43P!^tQf!yswGH|ZFEvO2Hh zbe@KIrTuBWcNlwA=i{#-%w2jmWbLS0WwNGQpq>8mGPmNl)R%cp3*F+uoB6qH|SRt?c~XLBC?tSXv|Z6Ul9D#0A< zI&QjuqEK%IkLD9bzn9-X5b(8DD-8Q8&3DS*(FP9$JDsy_B zYAE$Oe}juyZ7F?UXJ@qNo}jKR^@>=vag@3!nX4N(6D5LA^#TNTkv*Wp@w1zO3}gBz z{FUn+Mb6Z2+@w1M|B&JY#sP9C$bptfr28qV$$PnCplcXvl4IRh3XRR!n zA2q#abGtc)w7LY4QpiHgEW^S@7e|B$L6j*ggg!Sb;#A#1T=`DStomX{Oid?qBJy4P z_Wl;VM~FSoCFeDmerbIC6*75@E~@tz#Y6EeZGZRLv8T5Y1zo9tw;y?(%01c2(_goo zc=BfE#YP?6_%-2VY5mXa=FcsvH!t6VrRkZ^yeVxj&-hVKG)?vE_Wzuie3FPJQ|6p| zQb%H~$AJdI2Cp~@EWiHdA)xU?lR0Z|ePr#TgyJPuV`A-CygUsTDp+2bqqV`~O&$%! z?J7Yj=FYq7Ci1`up2$Y0wzTDqpi<=u%HZy~HZTaC%7#BFyY>BdWw>5?gjY2yPNe->-UcNNmY{F9Y3H zg6V-Ap!kv_5FBqBhaAVXiC39FDX=AF%upMN4QIQo1O* z(WLeI1qCz8LMMKtcAfkRl!DbKsif#8^*{aFTb=e^E%0qpm;U)5`rg*6{gYptZ|#3V zHD8Di@jznVy?o?#D*|y55CAGYWzkgwaTN`&%n%>MHRVaUVf5^%J8q=}dZ6~r_j}AD z_j7l;5x~5a$VM;?_Tgc^(zeP7bQJdW6M$O`(PgoLTUw(6$f4;c0_4hZRWu#%rV+z4 z9Li@o#5KGNGGvE#BR^CA$rdY|Q4&Q5=3_v^9!43=C`Oibe z{IKTVhekSfWFw&>We`|$)yfL=OQ6V#jWwDLI}5{|lS+%BDi|>oC)NpUMDO&ZJ`awi zh%lidea; za=d{>^))?sNLG^@PWr#q79>}>dHd$1Sc9$1g5_^{0nyZ1ftqfsgcXj+^H}-m(mn>+1|NTvM-U5~ zBIr&$>pd0U>-&be2Q38)hxOwvF`v_9#E4ujGG2253=0^~whP&rDq}xgAL}oTi`v<< z19}|1*!l0WGGZVXYy|r!mcjV%uFHdzQFeh4U;QONM~yQ<$9oG0f$o>mjGJ$=Medsm zLXjnH{~n3Jk2MLrl$6KySBr_Tf7qK**?F`umq5pj-?>*wZ~(lWp8NG=+ed8=%tkto zbCsUeD0(R++jW=o3NFVa<}UU#BH290#~tDb_?%dU?`g!{G!FJhSo`-tos+=f({NW(?B37Y&+o+vAv5G8eM)1OwYe?tr8(zuGzt5z z{Pc(FuUO*adiwg-s9CV~nMbY1d!7UU$kOzgm_EPponsS%=pGFiK9rJem3Y{lK%~am zWfCa!67oEfgh61O-$E@LACARsQuv7Qj&N0PG(({GxXd@BjHF2QahsBa{})^E=di3Q zl4e>K4RN$g399Nv8ou9|ts)ywhw`^T+q9Smh+S9-?qB#`g$jwtauk6w&{Y2`7Ci)F zO*|C@i;#+0$u#U{&0M0c#6S+2U)yP;%|=fi6AcUY-2`S6gVBQ^J~sNEUEuMcdwtxg z*mXnTO$UY~;>w-DxSS-jk*Qadj-4;A8srp03)R(zSMC(AQBen`TqArGb>HPBnMhQp z^`-mR#Y?okG$63@evCmfloN}vp+)B_gZTOQ#;(Vgg@>2iS2vg?(8%(MCSzj2oP^e- z_f;lMv{~`n)$Uh`HF!yEJys%bp8b3R(@ZCr0BUBxVN|4^-}zzOu$|-j4w4zs1(h62 zUfnc33uy!8Zxlb*U!X(%%UFBdrw(o<4_)S&c<$}yi1$VxCbt~nO<T5M7*vf2U?v$?4NU%DOHAM&Rma(oYtM^TBG}l-q?pC+UQW4H;DA zMo}!AfU-#2iTPZ1=Kf^y@p<1u$;rPd(*Y{)EMh{lt0C0UQfmo6Flnd3TAt}Jb^kpJ z4?cQ?mm?2SXJTs<*IK7Jdj{EWn(eZG%~77Lt5j|PQxjEMR-Ag%lxdzR4tZVDo>nAVHWhw~Cm1+Jc(#Yr+rbeT3LD?=lW|6-)d{54LMikRiCN(zp_OM-L%AN|-)P2kNNH(*~zXpEz@7P>svQXGF zyO_jbMZ1$rr60{J6n(V)=!fu$9|D@lu*}xP<;Upjg4r=Wl_wrnx(Xf6(jZQ|`PMd- zzNOZ_aR;)hP`{Etlzd0!YV4L++SJ(J@ouE%L(xU$ipd8CbX_M_+*#d5c!a95kS{f^ z?kt4NIk8m%)^4Z#@{9D>?fi>CU^P@2LV$9@{{}MXW5%LUARxE_D7XH z5d*14Gs&D2irK6{^Td1`QggSBF_Ws%r3=QPZ&)=ZRlB+J#q1k~a2 z>XF1&%mD2$yGkEv0#L-eaoEJL7yy<>o)w3w4bz*v^4?$X#b4`l;4->)cy|*-h3r*G zE8iOYqLtzR3PUoU_P>GQEk=C?sxrX?Mps!ddSme3HOs2vgtOz_hy3mQH9y3{!~v4U zW?oGV81}`%u?ZB-34qCzi5W$+W8R~^P`rMMGFK_;0|QQf9W>e*V*^e}DMk4Nz$kVG z4;|KgB6QQ=OCDQ81s%L?Y4IKK;Cb-izivWAh-_&b11Wi2<|n_bxeHpnzZeQXW;!TN zsX~f*DGHS;h0hjx0*+VWmCyy|?KBUAX{!MY0NMEa!V-tSWm3mt^M#SIls{K}Y1@fXt5ea)YXvCg1hpl1*L_WpJ zEt7PCLrJQAN0rgSVsb0kns8=degTnGM>!x%0K=^yp?bWK$h@Nj{FMA& zG=n~G+j{s@?5IqFsb>6g=+5Y_tjc&b?Xg?}%SNF$J?)W~p?+phUs`rL)=|V$Y&v?J zO4cWK%{K5eiVHUHFLbB@^R?}9yET6F9-2)ua@Un|R{O+nLbTXo4=FZ?k~vn!`>W#{ z#FI9u$TglNbNs|Tj&}*fdveZxpvfow=8xLFC z8DIha_yAIA>3Hd(GD#_z>VzfDRTYDz!ckHXiM23vp**`ncse9A*6F7C>M945P72rY zTH~&GzGeZ9#L-XgB94hmv~^W_OS{}BXN_e%A=*=OQDU3`!=<_E2SlYpyGfc?cjZml z*Lr<*TOP)*k4>GYCFY$D1NTFPhKz!5HMlue3QVdZ4Ij^^ZI%kWbk@^QQyiLS@T+Q7 z<2q9#R6w%<;&z6iz|?I+X`%2u)l_9nVXo}6x-EB03c=fVZw|LK>{05e$iXw4&tdEw zup#cx8(FX1^KqoMo}Wr+`(~%g5o2_j6?t}?wFQ#a=Dm|bTj6VH0k}(fGtARqc#zc~ ziV@GjyoQNab>Z-E?#2N^k{_qE4op&~=Em_4Sd2L>ht^2j%&Ph~6f8ONPan2C)U=mI zqP+GsNcH=fWYYQ4mtjeMMM@ctOgripx?T*I!A}Ha9d=aOf+3Eix>c4mmhZ7pa)=jc zd5}kAzeWSg<|cad2<3zOhdteVaUpS9MtnsrB)eo9a{3NI=#HU1}4hA5J z?%FCMX|?>w#Hvxm3~`{qtd7{4oi9=W%+V_?twWxq4*YCSOrnkBx7+(!utOM=S1vw$ z^Obb~Pd_HIUR9|H4#Fn2c_Y?WRlP#N%2kB}`;zGrtn(Qb^m;lBiTQknAms7-uU78g zioEgr#4U`r_S?t7c{lAPwG(eUslDaBrv$A}Jum_UJlhSSzcaSl!1B4vKI-()zubJo zKBjcDMu7_>CjHGidM51NRdSjU<3fBr(uU}KQj8hrzJD@^C=6bjg0uOSIcOZXj(xzOk=`~*380OQo46yOeZd<)a&SZuYM&0%e0vqi>}GA~ORS!~y_q7c5X zrR>x=c)l``k~9otC?vM6e?cM+T&tbAFyQPHJ)Di!Bii=Y{;G~g`jD$?*aG2OLPimb zl~ABSCWhYELWH0KiFDYdlc2MNnR>Y6_HiyN=oYBlj2TC)PC5AlntGl>-ZFuA)!H~o zyb!umyNRq(#-jH=nFA)#U#(DD?|4%+w*ds{NDZdUKoTWy^bFBzQ;#8p&FgPK^Q)@B z-gfCSs?>$Idef8uLahhNX&8cJzOmYUy(o>pgw$ZFM%v$#3d|>#A)VvuP{7R9=ANyE zW&~=N>=KK_WOIW$T<^fcUsc^oEFPI)Q4#3wXd*8LpNXjl?s_AeTTl$BjrZYtRx+vx zmMki@BnSlr3$Y7z2?Y)hF|qP*rp!%K)0~y4t#zfp=p;3=8cIPE3T`BVV4Vy_8+l=| zNGnxn6L!wL&r|DG3)B}EB1rS(nCq(}c4CZKX(gV2XyPVcADREk^eu990LT6Ug&CH% zNX}xS8NY1app~_i<5RLGBg9xgHNICE@uD(vhaK}4dW6>9opp?zDnn;Elw#g<87vj) z&}BgrT9G^7FF$vY=I-qUMm8+FY{BvrOgaZz>akeO+)Rf|=Peo!RbITJ@M5$VCTE7x zCub#PI+Z#~(efyz(4lXtwsKAJ%Z{uhN*5s^6c;6DmJL-oi%AkL{#I)vu;@<2>)SnD zYh_6B&d~3UEX+KW2V+nU4{inx*r%atN9^jSp%lJacav8yJk|Q=;5DVca147Ql{s?d zs9`%7{py@U8$D&jM(;_S6)2(A-2airt6k$KP^>aFWwVGC)&5RY&~2VrojM6q)$ljZ zQHj)6n6N{E_5z&^0(K_v-$pA1Y&pfkBUeW74sTaEo1u-`n`DRoN~0w|D-K{vePh;{ zBcx-cDCc*20#2AHKna^|Q+I)KqL?;u(OrGCYky;-c+_1Bt(eCtmkG~$!lQfd&mp2v z8B}G3)t?YCo=KwQ1PEr$><)$f1s_v`oT=_^&-jAV#TXln&*L+1UP911^J@&rBlhMv zu@vFpyaZA?*2FYw(NXgStTu=8o^|L}SdEK=5<{|~W4bFk@ns>YHGfleo;co@vD>2{ z8(W0N&)N?LPjZ$H!NNGxm~F<7KL@*&nM6&k&QYs=<48dK%F*qO;OpqGi;5Jtk>_Wj;)ok}!S~I9+zwhI z2^naIYO+Oy=|5X6v~*c^|9>&d|E&nBpxlxlIfN&Xp6s<}M^jPGnOo_u1smvjt^g{5 z`9La+0IV3AVOTn1LTZhZS3PV!wQ&L=`9QP(7T11PDhhoW;s6?`%&04TOCu47a6dL# z$Y6#61k>49$nTphA?Tp|WNjv)JpQSkCBfVLvk|%P+AxL+UOwybCMy<#&xZql0EL1i zGaT)Pc=f> zkP?f8aBX=bb|jrS5F;pj4)8%wn0b7|F!Kl}z=l)RS|E}8lRAsjiGIDlv2&Dl2uTJk zn|j`9&?98+-*u@!d8c>XU>+MWxcfmHY`S~Acl|?t2n!3DKv?Hb;gH6!R&x>yeaF8G zn6F4$B|$%l5fQ;G-I@20dpLi^r2+q9@=&dByS*P3CO<9oHW;U?o2V?*6I#wjFC|0F z#N${O0~?t3*Plq)?8;E~5?1gPyN+wBqOKxBEB=*s_!21nz(NXzM;LmGR#`TB!`JOH ze8gEo-ftAXWYw8bgN##NF&Jl-3St~wSYK8dlnt@R>s7=3ovYAP(NCB5k{8KU7Xf2Z zbwuwcc|w!64AWO(#9FJu_TM;RU_jw?C|{WB&^+>fVOTHVAUZmXG$>_}Ls4>oVoOf~ z?NtMD&XI;(VW)J5wEu|%;I3||)c7ZWg-mkEgbW_{Ss zI8dJPl9$O#yS%-o!i}o#Zl54?LX$BMA&1wD&)K3gr;RU>=(~0y*l72Cu)sj^X7+EK z&~+zQA&TT(D(A$r$VTazD1VCmlwIxjk z0p!Tc`23vP&xB-Bn$d4y(U7~}LmavZ^}_Xj@%1!5i)Hn_t}pi%_`BLk#iRS-eWSMM zr=_>CJ}du1tFc6B71w<%51`bAQJx8ZwTkNYrlF1w-BekU-=Qz=5%gU|vL?u@(@dfm zL4h-_#jyUqZbGY|_9tk=k%k(L!?}8hQ02y}X-A6Y$d)|3`2IvGGI*enAZgRbTqB`q zfvu7qpOlc-Ur=Nx9?Yi=(m#5%2U4j~(f$1CgCE8C;jk+&p58CID@1=YJ10pPLV4Z0 zB`0-ext>%k$`eL*mKcPYwm&0H>Kr|vnk?U)4}A01`qR|Gn>a^9wRIS3Yw?e%4#U9A z)wDPgW80DE@H8-ZV1KW-{9qw3lD8~?=!>GlpKodN`a8;DUE`aoKVm@no@(GGZdM9k z?riX`@zx{(HPL4nru{WMrmtl~C&uWo%;>WleE22)4Q=p7J(vs^huRhcJgZN6&T{>B(=1B@5Aax-4Z zrxC*!6~NYuRXIjT0)|JRX%G$y<83K!tUFtet^t3o%FeEf%{i)e>DoiJ?WX2Zrmd7({9|S-BoPiT}OD`tW3@@6zRSctcxD zyQ{kc=qlkRyY5QB5w)keboV+jB)6345^#1dkd`1{OR{rTTVm^t6!?$e7Q3GiHJ#Gh zU=k|lPJExwH5w{dd-$4=3}slCb5lR*Y+Tj8!~%z40FX+u9+z+&uy4eXMWFIkZD6nN z?X4OoCR^NC827hhB|h|$y5~-dcnN{0N+J}^q@pa3=R}%4%>p1s%p{N&xxi*%`f9M%r$3xstZx#EV|848H z-8_3++v0n}x_?=0;X45dV=w5L>Olig%39r3B#C^!Y7G^Aa@wMn4WZpneOsz$Fm-@_`uq&TIPh5gHcioS*DK-IPcG>Vg8L=?K z9Qbmlo3L%ms_#y-9Z=nS(_Xy_Kdm9tf`i6jV=160A_ptl%2r;_ym_7!eMx4cOcmYB zGf0IK4N^7a`Dx=3sL8asQkkexo_uzD6U`E2Uy5i9nIwh2Ezsq75A-?e)Cv(vpi95x z4O!WsOh3wF>BjnE5Y;{Jg8Rg83CoRz#NNf196f!IKd!5pbD^@f|)Y zH>V$-t_%HM!6|pkfWwUd+fq|fsy9_NVz9KoSgYF;sD45`rSmYOuXf6nSuT9Ee5s1~ z%L=yt;_l%H+!0}aR7-O^llp$1oE9N`+_ffrJ;X+Ay5BhPt1jo~?U3{4%e!Oh#O;Wo z0^+rCcl#^-sm{nk4PwP6=)LIl`KWAJIUU%2_fKHTMP)K&;QwsOy&qejc`F#XD0)#z z1W6ob%BBw3L%XFi)&6D2F(#G~_Rign8t zhwCWXR$(ayZSNfkDG9Y-im>agWY)W8xHO2ilm^$Jyb-}A>kv)p*|DiN3o?OB{B(&C=!;X02%F2E0-}n{1+)>%iVsK|jpItwt zFtF)?Kq&(So?y7{vVZly&^xe`C{7JwA~eu(j&MNiXG)+Aq8j`f1u9{+e^rE=Ac?N= zEew~g?TIIZ&p^9!+JtnELD@kbcd{YlPk$mc0uDC( zmE!mf?lzXsXr8AIf$xy5^l`smq>WM$s>FrP=!taLl7eD>|9a0oI>w7QZsHSTDOc%Q zEs9+2W{TsVuOXx zs+C5I(%%i{V+P5loLlOayg50B#q75HcaTlxFXYrY(PfeFhYhs!hG*Wr#zXBM*NIcA zDy%c%e=4`vq}wp-YGjz{G?8`*cFD)|{dddEOx8z=2;be|9g&T*+=cOAS*@#OQU=B! zpT94f=7N13CZQAyEcEafiiaMxmhz&>v6fnHfjJd@MbCDIT<0>{(B#Va_ZrS}F2Zxxc-Crpm4 z?RW*et4&@%^St^@dtdC{>TGAX{MiT}o`6076VFM;6>95I48;xLvkbanP@XoK#+=OU zR`&YaJ5*osa%O=bI5nkEkrue6G7o~uDK8aHcj%vY3v}=!4eUUq*2o)A3E(fR|=w8Y@JVQ8MKG>Ejr26`ibc_X>nDg*oR+0Cmif4`X_?X)|7 z&5yw244>FJXf#5?@#c!2FS;nKO4sLp^)|*RJ~o%oO&^Swu!Ir&|iZLHtRD=R@H zY-`qPworZ#Mnr5Ju{#-Peb+e9+W61q_wj5!5N2uplUu8Fz>o7DJ*c1NeX!|lPv%`RMH zz80w^{OC@(qeo+BzZ~(0lbypeXn%ljly81u8Y5v}3F>R>{{HdbFlb;g^K#J4vGmc; z6m34`V-S*Lj0jtqUWq628Pqh0_A85~0H2C1v+JWh>QZJ18=&UwVsi<51sId#-PtZL zSwUxz7Oe%cQ6t`5Q`pduI3~-Vh^V?e2fK~WGd5@5nn!Hc&!~1TJyyqF?>AkrTN>3u z4Ee4r$TilMUrq$U24X1AZ|81(FY8VXi*enT=9d>ceI<{L+)ERqf*)Naoo%2^rq9zI zLe9;SC3qV-t3mjO`Z9fbJVJczdjyl96H<{lFzT%9~Y(1)ftE_dr;)j zYXl<$3zt$c!E6tCpuGV7~iP@a}ll6DSo3u4m89dPxrx_q!&?Psq zkahwUdz@2qwdF65%Q4j;B*7tibkx=%cOcW=013GkITxILjRoH)yW|J9lBT72~-XnNdc(<`lR~`U|VaKtAhkW)-e^ML%h-A z!NPlY4wH>p4U+n?%4|X9#dv!nTuy-r#a&NAyGtY&w^&JD^Mfj1WG|HVQ59F^B|xA; zz#AgxS||r6X!BOst7QpWT9`A5b;0A}^nA#r;_J+0*caGqi zb{91`2e6#$^s??^w#-5nl$a2M4)!?LFtxS^2wR?8IY4K9CGX=ZNe7u6vmC2u0iF8{QqPJw9=0V4bG2vzOboD&=932YrW^(&7h^XLLp&h5%hF8@+v5W#@iW zz(s+7W@MCUuQfvK3hUnU7kA4@X^DrZsECjxqqGxL^btHw7WUUEkYA} zMuUQ(i6I?c$_)$y}juJ?zs3RvhLDQ5>e7dueQ)TTLtZ?}CzpN#>y zizU97aw0DaKj}L^Kdgnk+w1IZ1)aK_Y!*GiC(KCtN-RuWJN;eE=KS3CoApAH-jF_2 z2}kX&%kx_ujaup@H+Q%0T9rp>C2dU(nSD^Vb~+3E9(1wi)VuZ@cEf2)lJ4CBl=raM zW0NPXRcuvtyct09F;;Z}WYZyo^!UxqvRU z*tL^4qvXdE0dj`YUGW6nogi+nlbmut;7b(f7#%Dsj%u(73x5=Qc6<3pn)3hg(^amU za7Knh2=Znc z=RRD{ZZM_zW1iaJu_MOPMlz6y!;q{uIYa|=vl-r@H5mcQAE)cSbk||P3BagG)NuB4 zup9f{#>n$GYjy{c`Q!BEBS{ zOm~m*@COQo$#J7DQ4E+d9iof#p>@R5nYS0I!nQ0WH!%g`bX?n-$uHBuoiNg z4ZG(i#a`(E1Ohv2zr5VjPFHw1I6Vh9I>L|9}5fV*WZQxda_p`u^ggKU{&5kP3Yf4Lbt#X;=G*TWO`- zervt{t>j^rWc>o1l%5KJ-~10eCr|Ku_gB3`7sjTVF2wnEZQrOG%!!ATFTHkz6taxB zg@tVyPMEF;w0hdLXj$4y1jM3BtM!mJ+6#zesDYG+FdlCUh)D;0}o)rkZ}*A zrHP7V4ujdNe<6LZCI9mS&Yvy5{)fEn9e>z)i>K=o&tM3xqt^u&c5ohYZ5BTN6OXPZ z)9tGrgns7>)$*4ur$rna1*EB|1|R`Asl{7}(B#(h=8w_a*M|yV z_f56yaLTUzy=C9Yqq9#~*s)Tt|F@5tmB0TP1}{Hm5gz$BRd{r<{trA4^BV98_Zr!x zIVLTSecc>g&tR$kK*4~Zr=ahkiU9Y8sIeB2-x^ZjDs@4Y{0LSGrHHQ8AQxE}XVCk< zJ$PP2iR|6XP;Hn29#+`>9SXaA>K_F0G^A$FbrTMW#Ca2_#_Ekt)2vd$CbD6;u zl7>UV1(d3>n{%%UUvoK7DrsS8Cu)ekqw+gCVaqk#0KHK(c)pA;UvKRyw%~Y(k&+Eo zmqNikj_n9cL71W=c>$$WHxDD2lRwKvR}f!`u%H|B(NI4-=Emg-Y`z`D>gNd81 zQnP|BU3n;~tU3=)%5N(lzG{qH?&kq%=Nzg6!@<(k3D`$t zd&_K&hhsqEob@|<4YO@`7FCm{^i+vX=p<8B59NA&=*817W|^M-)b>^fI2_h^0a(fd z<&0q+R_TYS8Kczo_t%$yOcE>n#-C!HuTRHI^s}t@>*E?O=Du8T)+dh{F*(&UTNzOq zBKgaKm*IhBNb3vkoh0X0+c>}9nk5IHh})}lKfPT1vX{Hv)LPTtcU)j5PA+*4eGR(b zY!5}hse5eXd88MQ4s0cS)drYqQsI)A6le3uo#@Ehd z*3g^n5Us5S4XMQ0E%Dx-A6<=r_i@H^*yAKMtzjpT0%O&%>@c}KmVZ!LSTL4<>}A$f zxvIMoWqipjWYmI9e8D87rN!DJ_1I!c-kMXW~3B(ZTK#^&RKwg|E55X3q^UYxBd@Z zwYzjl{&jK%h;xB$0__3Hq{yG6? zg+_uPrM-M?v7LD$>1)q7S24HWKYUd0k|jGE=m59^?bfzQ|Dn}eOKj}auEy5|oM;D4dIhYc0X>AeT&J!~BM z0RA?`V&I*zT1zn+AQBEh)$MQ&SfmtsBDe=Dgz~lRFI=Q4>mRb+AaxmjAE!y=#!7Kc zy*+FaU!;b2bUnL1#&L`p2gB)f6McPadDhw`IKRKw>HzNLeZ|{0&X(|c^-=@}ix+PS zub_L)rjPX(9_tsiC6lana2Vl2j(Fv!dQm^Er0OBZB-_ig*fO_LisP?-BJVOuXh!Kr zCqicKOJPg3j#L3vy#2MY4~mBf6pXa>u>1He7GZpZw zPZF6UMYD;<{_aQGWW-;dXSTEt9`&XjrfH_-|23y=Q#>@TN^bQ?^+l(*hBAA{-sT}B zh_R|ij?OHR?IMYAjU6Hsb4bB|S-D;E#AAd29LTUkH4-Eu0s!e9Y873?-B< ztz$I9;>at1+y6vf3^j(s#f);#&mGVW;mF~0*hr_BoKr2+4$xC8a&@w1H*d+#xvx$W z>VuXDiXn{Z*pH>nhq;h}imObA0`Jnt%ma^=?T{n|t17d}nhUy=Rqp^Zp)cZjKtM3u z@PRtMQBk`nKJ>lH%)f8f$}!;<7y;XiATtf;yolo`OIGYjL{WR2(f#0tng%qs=9XuE zb=vJ^Sp!{c5|Fi7D?^)%{YJMsJFYpMFR{;!vhUU)nZ}tYn%L2OLUjssuF+5QDtr?X z-6*X6|9AIsd~XdS<_zw(WAytPOO__XXt(c%%Gt$fiqD)kxMm6{*P9{aLP$~FQZ#}? z^-earo_L(n6DFTfGW2ZE_B6g0|Asn84++A}PuB*z-yZjYe2iLLY`hP5OKfVGH*`Ln zr9j9Q;!DFN$SIdKHQ+?Vlf*jZ+++~R3I6)!z+m9_i`+t9^`&-4Tic7v!@)TyLUYy{ zkNw039G8Axi+@s)pXeOvGG9pA6lD~9p2V4UCu~S@&)t-kWOM@c+8-J3Q9`W6_Y{yh zfaRVYnio6wow_mZ-&Q9VR*O6D8)}*&#JU;IygIr3Dd70(W8U5U@bd#s={yUm%P+tO z8Tng%0bsFXV(JQluW`jU*m;{8rZlwiY9^mfH;3EHv)zeH8$qp)NBj+Go88lOr4#JO zYxLu$REP<$+ev`lpB%;CTyML(>k_jbtcE5l=j#KJNYV-cV8LV*0}Qk&1~>z8y_ z`5N4SexL5AQXi27-pY^noxTCY2GD2w@P^h&&U|5X<)*6l#=?P!<*V` zY*yw_Hv%Q|1i52CAJ3Phc>@;**1e(&aB4HMjdr=|spqp6o4#so9m*@XIX!S0F2#(&iKDUHc6%b?e&GHflR_7}q{v7Vm`<{)NN2vQh zlEc%FPca-I5DXj%@BVChev3NT?0$0$4)|IV^Nj!X+9PY~mO7EH*iLbZi{%XrdmhfZ z$PW%1^;mln$s=wJ3(<;ZG{Vz+yy}xxU^+~=4{`3ChLTMyk9f2h8}a=vJlT)G*4!{h z^_Vm=ahJ<*iCRl|9W>evK{k>~irBQPH*_rm$8jb`1Xr>pg>gSVV1YL2bwp=W;aj-Ml)p=&-xGs7z>VvTRPsd138< zmUH{n(dGS^>Gf&*WD_f+j(7jwo=Ir96`ws9H|28Er`_ZBbRlTKq!LiplI7Lm=F&Sa z>+Iy_VXBW;0Y2+t-w^W3!0RcW&hqp5L<#*YJsVWH-E(w?>j86oGTryp{jOtlT>0!H zmaHzjJg$(gOCCJl5O`&!i-T#mC&qxvRq9Fdr}h$e9sihr>XUG(We{(&AQM_=Iddl;VjCu(!?CuSkF0ea@2B?@GN8AEi;LZ@ z@Mk2f8%ftEme2n~*Ea=;5-mZF?K`$@+qP}nw(i)r=ZC19xuwpDXT zbUnQKZ}tA)&gSx)$VZd!DSX=fZ;l9e)-oZhpJff@41ROl-=O^z%FR zThp?~W-)Q%ri+11as5x#3`uTjjAnXvyioSobWJj2Wk;=;3TjM7TX4ST2P`Z=A`GsMh3T+h#A6V-0$EkZ~wk+w8 zKkyb^=+J_-CTb!eMFXxo@I~69-U`_Wu`Cky?2WYF2*{@7>~0#dFO+7-Jk^M>#?rsY zgMv%Y@|p<}PS$YfoA{-*y7c4+Yv%N5jGLPyy6(&Nw4a~LE~~^1(Rtcewf6;W?2JFH zdgxGM?$%RW5p_JeQaOL>u&^MQ!>^AcWaf#lq_UDT!yo-KfK* z164eH?pbHdYNDDqDqTnI@W!WjKCq)_U`J2HwaIWf(G&R5xLaPa!xM>t0fcNzU2L!6 zPRkXl8Wst#y|8nNd5ueNSdac>o(`Xc7#DPniaal7*cA}9y7?IvboGW#NukGuhm>In zSvLscSY|7Ly%5wXe3y|wNa!A0r(xw{B^bbU0<7SAnROb-;&>AX?3ZA3EtFvsMKiV0 zHcj!D;BqstIs<`yI0@Cy80_nl*o!dqlfn5mxi2-;w2sZcwtl_bD57xFwm?C^mZKTeKf%j* z@FF%DxJ)*l^)Qi@^nA}P!xy>?bdvYU7`6&s5)=ILa@_elVRB&`qEQm)! z$Va6GRerti`w&1a>vO=j=9!j4+7YewJvM_s z=@Zi<_rz}KYI+&Q_;@+Svyg|^M>X9OQ-6$UIRI+^JwyQq6A@zLYkMIu0fE@=$m)Pc z8uu^et&pvxUv86%*!>AR^4>__at;C2v1H^{ag1cV{{Q3yCrR$dNAxuuv z;OZ|W%;4@ue_TB|PCK*cF2Bh@3UKj$$gth4nuUhr{DX!!3>g?KgjHk%t;w)-N-K!N z`IjlfSKFtwzX#E=;(`bYFU5y4OZgK$hHG@rPx7a4&?PTt#3hfES+=3ZLpa!H%IfzL zHDe2$iZdmpJC&xswKX0S0l3d^ncO!AKwFy1eH9mS7bHTX$lmXs62I17hj;A?@Suq~ zq@anq!n4xTIgWS>`l|}2VsHIHX?x@kt67UuyArvmAqRX%EGm6x5m|il@O>)%FIPEityJZieW+0l6 z*$lkb%f<6bJ8B^{63NcGx*O@9>lOc=P-Leijr0hY4!g$t57hTaH{favaTQG@6oi(WfM z>;LCKhkrys6=p)$$KU=N56t%cPvyml2(5V!)=`&~t4Q~z7age{T7X;~uU;$~yp;@l z*Q>5{7b)6JftkgN$6bQK_QVkU+F-}3=p#OYWMN6YN~irkiJa?U`P^X=(S;(Tg`gM6r+ z=UF7Xh;fCt9@L-Xa6HOMg9(`kTFvSPyDTJj1vA8_jg#! zbpxc?E_3mQ%O`QxenzC3vfOVfCG(2ufT=>~m?NnJS{ z>}UyDblPO)WMxD;N^ikDuYVRa{uQ7zy{~@D%_^XOevvtv_+MZExbE1Q-oHzpZ1WCz zX*y>V!TPgh4p3`BBqO_C;>4r~;E+~aTlDSeimz3l*EWdHylpZ7S zMv#+DiksNStD^-!(AqsmgLW&tcaRW%*LHrq7L(2=h}(G*t?h*YpQ|0aPEDBFVY25# zz`RVoELd5`up0bo+pS6}CS3tTM8Aej_#hNQ*U}LAuyEsKw!_}35xaq~-myqqgsTm} zjbZg}S?t_?OJ{cL1)p;C8>KDDzv$lMtFq-f3ia^oX&RBVU5ZS)6+ImJsW32uZf+f{|a*2ye9=oaOZxK1qYy$6@)Z=Q$ z?j++DJ%Qtmz!?z@oc1~{+UGPfuTMlzLEO*XEr}w(EHZ6l<}7ZpED;l9*O*gSwT+A( zW;(b!jsmc1n&-+6h?BA@0eKy%Zo?rm->VwOVF3uJ)}aZlhh5za*tl#Co*+3NGKRws zZxzBHSankM8){mXNWk!zIqy8Znpw4-j2>z_v^uWhv1+>K-c}c#mfC}+gjxm&KxE^1 zvL}D7hKO?}LEcPrCI<&>ZF$qny2qnVm>4E7`|ANvn@o9?F7e&QJ_7Lc&jIUqj`vR> zI#|bs8@#(%H{4?Of>gR|d|BS9`RM*7_Iy6kRf%z8`aGyXEa^o$He}p*XZ1oSZouun zk2I#q_)(ae|fF=Y6hYWMw%CUHHKu(_Q~ z#lDUhc6)4pZOFZG`%$Z|8ERM)=*cJDN_CIt2K4O30XZ|?VlW;7R**=na9R5Omd8@D zfPZgh;y6B8%61lN0-(My7)=(gJ67?C9xQqxu|d0Kp{V$J!Mg=#;)lBs4c|nojMV!! z>jK+e4MCl_K%Gh{P8Wp(v&3a#V$(C_s*5D}@J9|G2JL7nv2DtLRgR4_z3?Dizw&c~ z1Dt78d9FKY>QblB68nMJ$sKMlb4F8x-8l3X2CfH1ob0hB22!iYyc57%09hopfmBoI z%z$wk@3^n_JT!gl#V-_E7LC!TXI86tI=mEpMu#8jV~>s&lc&~Q_)Mvo8|8ZE;)aS! z3t4k&fG_uNkyj9NO;oB3uLirS2s0`DHRSM4h7POCA6Prrr~~X)xp=qHS_ZY^M9( zFlPQb>|ovwo4s)4+Ca_!k&g2gCmK1%BU+DqJn9Sb!GxM2mVb+1$%1r48zk*2w4ZWhkU4;daGirqzyY9b3DXLhn@OgUjtq7!R&S)B(B zUwGI9O;xCln>m*EjF6K$~rpkRq<+++G+4T zbUb8DpR+^nzhP%Y@P|S%Yb2S>OnSB7A9^!ZO6qScA@<+^$+K%c8Z43N-z|?I;=6LNNfoNU%$3a?Wd9xmU83-e3Eh`CQoH_IG(Ih{6!FO+>`f$vR=JzQt z%Ny3?(erK7-IVFUVg~sR8hz$Uvjb$Akc1;l%BNHbywJM>nYB8$yztu_2+mI<7I0Ix z69~p;;p}v-t4evQ%FQnaZwg_cNq+oEJ}`s)#rq@Q6h*KZbjH~Hyj+GOTV|rB-V+Mr z(l*_Lb0&qUZx>_qxN&qS8pOcvikQowOankSa^5&#sQ&zR!mOTqSBeuGocs130k(@H zTTY5us!<-7Jhjz!l`Iusi+sjW;;xgr$8^Jup~m@R*G2a(@VBdm6G`H}S=-@L&3Tr) zPW)GDgB>niik{o|haOI6jVY#*#o4h-Cr!|2?-hg&W%!d~tt%g-2UXdM=p_Pra1mVb z5WY7!B}gMBv%G6+piN1vlWIXK@318DCk1ShxxdavW1?3y$c!@!X73B9LirrBGXx*X z%nL+*ar`Ua$$`TiW0qf=X3|hANI=(>@{49s8sG7fDKzug(7-@Dd5bWC;DT%w_w=B_ zsf27;A%%U)$ggfpB;s>tFC)&8WG4tOB|-==MT| zY3;<~Zp1b{5>yt6I&gMO>Rs7;>nOR_+k12@{D5pAXK`-n*B{Tkv@Lg#t}m?J_3LQ$qI~YC!0MUE>n_spiUPTukU7_yp=JOvGO}z4Snxbbf4YQT;f_FIlxH@RUArTT(SKi z^kYioQ>1g@SXs*G4cbH*$Vyy>-r7(&&fi8IUJTiIcUWLq2G-8lLnLMKEy$Hsw9~rl zOaA@dlDDbXF^b6Ux|j`x&VmZXh0L4v3#-6lPen0E=I4R9F-T-r zbiV&Wi+mPHpEIjdo2Ii$ciL@v$_ZBi&~a4ayYo>3lmwV@Zm8AGmwF@CuRpm zIG(CML$fndv&>?o>G~Y{p&!}176Sz7%HAXyF=+ntI5Z5bo^n2A(_TgM!4>DwkJ5@6 zjbkoj0f~8soP|S`Kh@pnG}pojbNj2w4Q${-P?VW2T0@~}LIBF_mSBj3wzC)9Xt=_+ zg2@#a?c5-0O!%cN`JJmWm4ENg>%M1(EOjPNL{z^SbRy-91uKKsJ-lj*Zl-jQtxfH& zy;mx}M_>!Da?kl*Wp_JdGdK-0NNv+ztM$IRQdNK09D|5mg2-KX_@K5{o%-K}9G?9C z%-kgqLu3<+ck;(UTHX78#o8i;sa>l5kVy~mjmUn%2*~i<7xq38%{(OHM=0%-o%&iS zJXxLwzGs5%ntLhij}UOJlOebHs)QHfcy@Vu55G`bU8D}l9+I^}DE`#LSVepNDu0%7 zOBqBMbx*|&0UJ#iU8H9VEp|Onp`w8UQpa2v(MoZ^R{BR62Vff7UR7%Xu$Oac1Wcsv z!O|P;DNs{gKd?K6C3k_k`i^()6atKMt6Pntl+IaTq88LAWo|v-Bd~3GX=kx23DvmE z26=I&$0$_~Q}wbc&xI2bRUBrW;2Gex))bEJi)i8djwB!~!67UWG$QkOX;EVv44E-! zP_gztjwa3)j(wTmFJnackS7dzDUJ_nP*s*YYO{TS?F#}&qq#RfL0k(s6AtI!+5Jo~75nXhq?u-~dV@ z7AAwi8G%qyR>MjIo-mSLJ60~Dr6LZZS1gVW zU||s)Lm1|4;gL+V@?2rvlw^G{T#j161s-J~Ku+^&dm)tq1XUa2o#Nc!@~`mJ5xdDd zY$DCnYWSIs>=BgyQAlTyX_#EWK| zg{pq&>xb+TG#&R$V`$Et6d`9DA?Un^bO<;fdyrQfuCgg$hwj*^ucCj zb`4>?6NVwU`$i0yE!Y8|YL1H~I0uWE9=BlzL3bWUQ&Wi1#4KH+au^GCg!o$hV21^_ z4maADT`SZ%ClPacF$K=L6E{;zXtEfMNSGo*U za-Ne33kJfccsH--5s6&#BFYBH zO$*${nl6vX+Ot^qU)nZ3Oo*-L0=kW-(2SG*xn0`7mdG52WrRd3g^5YW-Jpr5y9Y$# zby~VvtV{3U9I}zD3a~?3#_$#T_R%8VY9TeHL;iR{C>BVyX|z*VRheft(U1+BSl*F{ z`i;m98?N|6*9~HcqT@^!v+>1Y870{8Ggh2Blz%Xdw@(f z%2Sy1iJoOuG%+l`Y`&VmYeULUe3I4dygIfv)PJs2TjLgQsddOePmMGqU&y4T4Br~ zO6u1blLuA{O`UKKR5H5}akjlo^%_eHvlp&!ZVheWFw1naPS0O%%z3 zQRNkgsrSrJKs`xGsC)FNOOT|Ev^m0p0fNpe(4Rc=89)|Cl#vNt4(n~%uPE~u=w^+s z)&m3^A_mnmh)krr9!}IdTs;~7ZHE&ZotIraM{o}%_+9{laqUc+?h7!=*NI1Rc6MDa z0D4Q$Rg@X7?tYQ}D66IJ$eAtNTe14+ZkH|}tqS6C4^_l}doa{|?{&FTH)h*>gk&~k z60-wdahF-rU<2DU;WF{C$axYBto4*5HZs9IVum= zk55m}TT_lC50nM>MFPeou$tW1sE%Wg{#-r9r|d$ezf7((&dM_md(FsU;QoY zgpwDQu*Ek_5}I=dx&wD$VlF03khVy^*){T_ZmyK@ZF38Ih8SxozKkiAMg7Z-0HM<~ z2NTPStvwSew{Y|#H}tv?+Z6tp#`jDe{H3gN24GDbgBHMXsqSjURx8&4aA!$p6{D$V ztb_=4d}KJ(ymx*<=_i1)is)9{4cxi~yzDu?B4_d!g&)15PfZsfOiWI6;q&2WW9Rx` zTU3v?!`9p>ub$klyS@lA=T4y>L?rKA_Z0qfh#tIt zSn@Od4=j8U6uPy*^U2E@=q6K8lW5P2{Qm)PjuCQ(h_#L$MhGj!rS%?SqFX-Yxeqfn z+I%*Oe0R<=gYEgy*2+u2S+tgeTxEA2$9d??R7@D%cyc=$O<9~yl>n>UZ1GqIC&wqt z(=-67DQ&(nmuEsxZ8a|3mR>;}l@u_^eW4iqptPy%pDs{VELFT|RWAZ{s0GoeKwQ1E z!FG7@)dq9muwuWtamWjT*dP)3Pufd?ppj#RS#E{mN)tka2>7?^67)$Nyhs$X*QEQK zcJsnCmbdf7HJtw#SnUV)g0ddPrDo-c;x!Mm!4H+E#d6fRf4L<0A;EJ`2)1kr2cL6T z8PpyXR4W@jx4*X!>(V+`oR=}-0ze^|XWv20+6+vyd$G2-4Y!;}=s22c7oxA2r*1~> zGC9gp)$vOi(7sWp-BXc$0-RfDPQ_yl#d}SA@ZVKxO_uEX=iF9Iwq>gG%(ouG-c4$yL`9Jwy#k= zB6*2cEA0?`Ig5;|)(k=uHkf|nSpMLl#q!xS#jJ_)N0QRhx%SCYG{MGQ9&nmdaEuTZ z&V9TM1QwJ92SQ$*A>SFob0_#`*zw0Bq}hGDb!W((#7=TPRsx4Alxm1M1}TXxd$efM zs7|s!M*Z=Zf(gSIc@WrZzy+MxX83wE%Ju@Rs<9(^`z=l*Qd|2s>GK>I`RF7;Lyg9T z|Nepm-Q~-?i|XHE5v(49Ltx96K7{NygB%NG1L&9SK{9LKJ%0W+LUrfcDjJRW5OqZC z&Ez?OyX&vc+3cGecKIoQDs;0<7MJvO6-NWLd)3xo@cF~H4g2WqQ2ofD*wGd7cx#3f zxnp42fw(!XnyVUVkA!~9Y*ulvF%Y|x_F)@I;ylI2I}_Q2Zy%d-m~ z?DB5~=#D=g4B66nMUe#fIKeCG7knFH44LV~0)&RDQ1Le8T&_jknn_$$L2TKB`n|dQ zq7?FQx1|A@usVM5(c1*X6t~9$>=7`plN4FC^DF5++9M#7B@8;q)?dw8X3E?rtRjGRqO4mIxD#!=t7Tt@ zM%c{-3o`_e4D{t1^QF7Y%(gOlws`G}6dnd?{4Rs0!`_&GGdYZp< zk>;T3;b$$#$|i%w7_!+5QSFaCm7FPVgmm%Fq=WU@WIdLn-mzeg@UUM&6p+o#S~<52 z8?Znjh{(V9TKq0pQ5Gll9uz^LHExo{@xz&c+NT1T3gHu~X{*_E8ptc5!VfUcP>Y)} zT{^9h8~l~X`*R81$WOSl(-gu&JZJe$jjFVV9^V3kxy{$&4aQ??d=UKv!}G$!VFt!E zCNAvfajkFq{Ux+ooD!cAi* zv|E#v45bTM^=_0gW8Y0Vwoxu$T;>N}P{CLRxS_(!;wm?<$;w71f?vn53l-Ptc%Kl? z9$0xp4_>ecGYhH(acR;B2*peg2+nDTGdJwAy*(?r z;XP409UXHmcut=E)XOwf;s>K>R$}&A?-P+xjpp`GKZk>YEu^g~D+=qw&qTTc!;&n| zbk#zwuy#YT!Y6A=RAr~FA17GPV`;gS620l~$jfPP^#muwCF;}Gsong5@}(eMbFWKJ zU8^q|>ejFFy?VsN^+{5$Vq(o}KT^)(e9}-d6)~ETA)>P1k}OfiG!e->m(%8o$;4dF zuKs(#kAR4s#bV(|E{OxKvH1@&OG>vVA&xM@#pEw6#3XBud(T5CteC!kqF<5#{U~CK zvH+B|NxrSXI0!3ib@s0XJ?jqdTTKX>nn488qoD3m962~VYlm98qyG_QOnLMHGJ6K4SRbzNc_*!gepzf+3SXri_}r(0`WJ)Qxi|3A7;>>e*>;DbTYX&rN#SQ;II|q&e##YHv zvLttS?0xnK1DBFfZxJ0X&)@Y~`)djl^tXTOdmS+mvcLofFE>Q*J0f)ul`wsXs|*rE zf!bZYyb(fjNL^>NJ{#;Ypi)5qqcVOZDu4aD9{yNRd8EEGT7Q>8dL58?1fWb@VLEfe6|sz|0Ty-{HBNXx?8UefCrl0_NH{cVoZ2- zbbRc#6ze{E|F&#(AxxPy47HxOyLbG=WDK()b))GDkcr~4>$pI~Ql{Az>r=|gsh zSXiqxOhw_#s#$yT-$6}@o##h7NI=oku`moP$h*i3E)KsjgMqd@7{1s5~raLJ!yfS>sfTK(*m6(+eWapSigZnS zEOFTy3>!*tOctM^Mjw}2gweh zmD1)o%LtlHVwI9ezzUIFtFaaAF_PLo#24TU_UUT1$lmmdU{H9m}J@sSmEMee3;Dk-rcLzpjj}(-Dpggvc}d7 z?<^XWfrTaC$eFQ>o7C|$g#p<~#Lg930m*}EGNtY;pd=?-5|vJri4_)O!Tz~Yrcmvh zoDOztEza2ETILpLA314~r7yZ%+!dASL>vXKyAkQ^iP_J3dZK8ZChI^Y(~8Wvmtgrr z-8(x`_

7{XA`O;cm7S*Yl;q|9JjP(B1g%_GN2PegwTeZPDFye~5cAj<#j9Eqtw* zo@dW}()j_k-!Q83Zy&BQy3>X4QNfzS3K}{`z13>YRuh=+whI&^eo{Zic-M|pHVEm0 z=PWq3r!^>5_fyDifoPvUe;IPnknZNfO~A&A-sGm{NzQI)bH17prHLpst8a3&w-p~_ z4W+{0SSct6ktwy%q=1sG`h8$+Xq$)R@;qHo$Q>AI6$NO{(GWYcQboYV4c zU0kZDY!~YWS5a&`R*plnbyw7gMkthAlE?xmW)#gC@b9eY{2VzFe6K?}EEmSGRt|6^iRsr@knT}xD9i!!qLS=1}n%Ay$u8Ei{T|El6ee{*~_^`>@>sfXjvQ+hsK z7sm&MbX!3SjX;D9pp+fFo_ZL%h>O}6k)x|Ed*$;?0I2)h*u@)q63a zVkKScjSb}CD7Wy?S%D@%cP*KRhNSK*4%JdJRP0OHcZ+&S#MP66}@g& zvche!3PQ@a_43xVHkTgD5~WDHM3;G)rI%8s-R+dR~X5v^u!D z$jawe<4PXpu)9XVW`TIMAQQtvlFDI42DU1x=ey#I*#FbS5JgV#+P#X23ErZ_5d}X6 zzYbOdyxu%3D{>~zD9<9p#nJE7jgjUmPo-*LSva?&Ch~1j{|da*20C;q&d(ZWs;GjI z!kHgRqq0NzDjv4@$t(&%OIl1-=Y)jYq_to@x%pW$Z4uS3H32i#kvjK-#izKEgbK7S zEec_GL!<;N$d*=uIfLIr*uAf9*{dd?%nwDe8u&(ut_-sdxcZwJ z2n;Ru(rFBfiFoqf*L#xy|bJ~$a8hlbZx*{ zRoSoDNhCoDB_i!Yu&isyE8h%di_jrn*l$IA@u_T=Fq2JVawKxh`8%w8urPaS>IM65Hc@IHbjU3W}cYUGZcv zMD;IX@?oUOYr@q-nk!fDaVK__xBSyZpjuZglm#NCl-TjlZohImg5!?FvnX+6$`b0+ z;qJ9MFfuymLclz_yt!AChUgEkF0vF|ZGYicsq+lG7QtR#=2nkhlElY ziXD>fMUdCIoNg^|b)|#R)sZH19$$XO_K7uiVMx#mFJiA+pr|dWv3Y-Ni zg05w1t|9;v*xqbK^9$_?+=OI(F{3j$(()Qbjkk3v~%Gf z;m}j`7{DWSgyG-_?On}Rd)dgwk4VP3JcVX85qD-y=(|zNl-~9}^e6q9`Q<7JQ3ur} zx@~Z)K2=3+vno#kYe0)hvtdptRr-_@qQYlcHf8a4_Jskwov zd)Q)kP3ISXJLHuB)m;=A)cjR+P@=oJX%Xb~%&Oo0m`oWgQK92u3A);J z@@lTe^)9{V>ebMHMTW>pE+mV3`0_207f)^KRnW`&i`1wb`iFXGs6s~v(`EFg%py@K zV5`18HW?AO(+nP5IP^5vgjoCNoU7_}?79Gr@aPJpXHY1Q770k|Zt0Juw z=%i$qlyzA4{jxIUwxzW8HvSH6$aFCLIE(8?XUfK>U=wn*ot8BuY%B15h)2hZ#z$Zi z3cg_=*lwEByWUv|(wp`eP!$Cr(Rp+zB8fptX+BugS}N2Ghn<=2Q5*Uil#g-K9{cXK z8%s26|Cpy-sk#+M@fjRlO3%{ku?|PUDtr{dxhvm_R4G8C9oy|^{+$ecB46Wr_o&N8 zLZ-!QdIIrDpX5#gbfM(`^TqTp91WVQj669iSFeebP_<2AIs>fA%g6sUTZPsjcM@<+ zUW!@%CBQHaI%SB<2kkdd;KkRa;;}c!i>n44n#AuXnu_h;)rx?Q@#huW8wQ#$MGUtGT%Jk+385#8iqdarm{QIyV|@)%`Sj4rI&QF zd$SlmlxoDQQ)$=oDA&z%CcVxR`x5_9-V8-Oxl9rZNo9_FZv29J!1Dv!GAYE|_L~_M z8>+~&oK(NMh6{YFP%)tk<5$Uu-sqxs4tibf!&X^gMg?mryEgR&@zre45{bX?Ig%+9 z@({ys@X%MgHG{Y*UE*~SmC4$O+gN>G#(@U#5w`#6NHR{p6??WvaH)hv| zA}S%j)+8UY$${L?woeE2(rPOA`znC@9%x;{dOl!~syTnUGRzL2 zx0#_;rsq``mzUR-ja%xatIPpr_|{3q&*ZoYFU<-#d`F4btB*6tO@=VpU;3kdUo*T2 z4F=k+6((}u9SAF3+G^ZQs=5fO_MVQrB|aL`HOgE*R1FbBO%)I9p8uy5+6+A*)IwS6 zF`XE)=KS`2|EG5C!BIhJywN7w@p@H#K9*e*sj}p$Xshb9%O7D>6TX(R_DpL1E6KG` z(`u(UYZr)|rE2~qZH*?sjieW(9t`c{u{kR!mqwifa4l3-rcF|*96R}Mp4bcoUbze}RleFpYA@k53|D>TdjCr1< z!VsFB2Z^egpT*3Q%0L?T8@dH|7{Hy`&o@q#Fx#66h5{JLJ`SeMtkZ&^LN`KN_O2pq z*GU5mi%P)IxOVZ!YH2$or^CC1+~m5b#$>9j^Rhyy)u6h#K4A{FY8+wX3}|=l5vt{b zciu0&w<5<45>&?mQ`ernv(qxS`}k<9O!S*LOjeQFSIn6>~s>5K619(r(c zd4#G?IHS?Ec151N$DQS3M`MqAUHG5kF_#Vi5)$XkRPENba8tbSp z(X!M&UnAjNHZY&}Xv{Rhh3vU7FO^I>VR+)swLKsn9#0jLh!fh`g+etIAcJ49p;1lc zo2^f19Qsk$Plg;BxRkA(7yd4I2}uzuL=~0dJwj$I+K+9`Nm(J2;we~ zzPS`L9?P=BTQW3^2JGbQPHJa!RL0{h6J@sUGA%}mDd#(}=HFZAr`p}q#>7A#rrqI^ z0}kK6;tBz71NREO)g^O;1JgApXLRlB--)fA%pAD=M$xL>#$`=Sqsx!h4=v{*I2jYc z@W(J~^~FB!x3z>J?bwst+kHohw+fretjXc|Or(Sjde2%73g#dJ=7ZQi;>!Deam?2F z#9=GL8Z1VV}*iC8LzL=N;wnrIFnL(AM!F#A~=;3;LLb9`jF zh5sn^?b19-w&VEZ_A%1f_|u5+D0{m0%@*eH^uoazA}|a5jQ5*?NnQn^oA<%cjiIW! zIjzjdk}t^#q4bpLts>&0Yv+kU!DF2kU_o&8Kknlg9}e=<^FLI`mlE{i!`2m=R>A_7 zYy6290X>ERbp0KKwBFc(72+AJ_0@}UtWj{r;VKJ^x>Pvn5qzpCR9@7_OMWtFPIoz> zBCP4v6)N<9K$pdwk}UAVChwmzqWpHL$gxEQ;r7E zlWKrp%|4D;fREV>|BB2y=rUEEWA!lM5X70UFU!`OTuF_1`Mz*Xupo8}+2XT2p7U2P zHFb7vwwx*AbP%ZfG*{Dn*)>n+is*MGxPB{+#m}G6ow+RR`0YUJ-Q>P`13`b%{E=4_ zqjUWO9|b9i87!2tFZaL`HA`!?SDvnMZ15VD(Q*^H~9NFXS5Qgl-w` z7s(2g7c5?49(2qNSZ!K}gEs(=346DGd#_8p$UED}T|=eeYJ^UMg$lP!rPOq5_9E1T zuvt(8pqJ<4bjZ@0Kbl-Wd2AFX76P%p>p!-|`?=5U%mxwANWFV0P-*n{SM$@Q6tASZ zzxG0-h#%X$pTnY$*!f=sT}DLZK+EENHeDkU{CrS2Eh|}`D#{ZKac5xe%!Fh9_coSy zukT`uPz${T?tykx>eS9oxtc73$*QYFp~_FP%~_*)B3vY8w-Ed^+{@!BuuC9i;3N6u zNHVhlc=ND9@5E_vjskM~)RxyPTx7wq40f4+EO!%7T1;L9-MXsCv@Xnb8b=RT0R_8q zy$M9~A;5T%Wa;K$rptpP0cjlhC)|u8W-A!ahb`ry$K3{51i_#4$k-%1oKnThOT*XV z|6#*;K+_f4m9W9+6AWOaSBrt$4$!(r%JNOvDo_cyM$#gBa$HYoLm+X99Lg#n^l{)aq+(rbVZwD{7thp$uk8uUb;5!~k5NEb&kUWo|7>&C$yvDpd zlo+zm2zZfACrO^0NK#`d9g*So(MM|LMHxt7g~)?e3(0$HhKiE9d!YvBKM9BF_RELA zz931^vYy_bg|xY1EB|%-+FG=zwQJSfJ8f_Uv3$(w2HT6<9SL&(uk%mWR zgAjbxo(am6<nE;^2sKo>N|?!sSgXg!`_L~a zZ!GlHR#UNPMU5j5=E2cA{8!6ye&{LOo%8+-6>QBN+if{huYn>E*B`kY=D{u6o9Csq zHq2;ExF*bcRu{gRSQX6Ye8_2zMamdRTS26TOAhRTRV84I#-i-doIXJBpDCoH&!>CU zNoKhy83t7&rf})f#B|WF#y8zs`<;V*(7&Q*S~BvtV5nr|qOHnD)1!TBHiXiaWuh3C z2j*)kPSA`e9=#%br={e^)l$eqeb3WMNKV)Zc6l-kA+(5g z>{5S~Z?R`$80%(Q$+%axl6Fpnvk_8JbM}V#zSqZV4-Ma;`s3V-!97{+MEtOQe0xJa z*Liy9AmX-wB?5&>mQkR}g9zC}z-o}=^qbP-$p>B)sX!ZB)6g!K2TcvT1A8xsU1QBU&)gM0>eDXQS1dm^-!k+TYgb*@i@7vufHW5OLEve{nL z8m(0&8K`JctNA4QkpeqIumNax(cLgnKJ-M1TEob!o6Qg7vN5{ly%O*jL+A7J25n|0 z^4Ilz$hv;}<5MMa4SvC8$rfynWW(D}US_}rPErvHy~Ytfx@Cwpsfd)q8-RHT2qYa~ z4{1!RvIl3@_BV#3fZaQRZJ-s@75aQPT$;Ba8H;@&5x7h^tW8y0UhCYx{$(XAtDici zQiSd-8kO1mgZs`pU<(Djf-wyePbC*IBpu3xQkm_e0@4dRr}?Vn%G`5$Etelenf*zD z(n}KV$*^4rMNXQq?7E4cZ6QFYuAQ~H55n9_9AK?OC=mrDQ4XPD_xO85{AQ=6ZJulJ z*&e;&V=F|wuIJaQWn5x$+3o*{ZpN4MDyGzrwN%N*{EVC`G`W49WihBbPrl#EmH&Dv z^sbKHJTp)yz_`Q=`001cQ0WiU7eme_5b5vPyE|qh0lG@SDX-2<`WcIOOUjmk{J}l@ z8EPJ~cdnrtM}E1s{bi9#ZXC0IvFz#pr9@MB`d_P=!v62oOr6@7XSHA@96Nfs~fJOJ@>U0UGr_hFsAxzh*x^i zJ*XwOb3Z_vsN7?t*mLtJBPhV9R`Gg%UUy{3isQ%Qvq1IInU#FY9>L}Y|7K0|UGgrp zW!bEA0e+Eb!)7{JJy{*G_8&c(tn>gt;AKc9xYO1*39f*bJSw#tHmWbop#GVrHO&<8y6?#Os{yIxl^YQm`jx(@T{9q-I1HHAeb3(B4Wg)>U*%7UI3vVNzR!XA(6T6%Ge#IpoLuO+H}rKm8c4F zQ_2gZo)DB0Ek72SOu}zI+dFrtjrG)Raf+GyiQlZ+QuqTHqH(R3oQs7A;N!HN2}N_x zss6bzeHi65f9*`xFqAsSK_YXwB^qgduacWW&OgUtPC+hbB(d?^kNZ30^2gg{5A}br z^-j@|hF!OIY}>YN+qOEkI!-#aosMnWwr$(!*h%l|_x--H|2@WkQYUp*^*rld_nLEF zYqTZdgMJJu3OCeU^@)FxA)wu};|L>K*IyC^$EptK&!^iIvC)T{Az6omRK0afU1YO+ zbgP;9(H?5{JV(pe5ArVGuAyXoc&`NHX*geJ`I!{ft!E=zNfk;EmxhXkqr*BvQBw>!!%7NE zq`V{7*MbyDb5S`hc+PWDiezXBz)gM2J5`ZWt|CZlvuT%+o|ZRjn3IR6z`d3|To`WF z4pq_qZs;#5(?*IzcnW?1f|$pUUYNx`vh%7y z31r(jFG82g_K^5JUuNf*a}|m(<6^OXLGXhMlO~KDHC8i~frj#yIr69cQkt2wg*T0H$LU&AfI&%S3(`iUV6^xR|7IhB`fpcrx{yp}eMeSNC{OIzD;6;6p_IuEjw` zGW113K5d)Tz^c;dNz_a#E)l}2QoEy>blaRaXWZG9NxYc2fSiMm*Im`nQ`y6sSla38 zW}=$zz&Q4hnd?dc7guA7J~BP4gnOt{cw2r~)g)T;uRR9n-KoRYq~{G)Jje z8Wsti20jm1l{(XEXw%P$BBWUDP$7JRrG6yHea@Ns;7E4o&`;3)sJ^c)DvcqSaY_@f zK#RvNxv8k6HT9uh!Yg8v(gi&Y6!A7Qu!lp7Gy%o*jHl0`R3G|_w$V}5vevb|d>#9L zZNlk>;pd-s*RRw+d^!g+e!sc6K6N)^dpo-W=C_Pu59_wfGn2!yPGA2w>#f=B_WxwP zp-M2evj2aNR*j~QPTU_~i^hr7_irZ3xW;!Yi>;q^L9myt@)s}JJMXFug4*pd0nK{2OQ#4VMH5L`-dgyn`XP&r7adrx}#d+Tb&xn+0bm#@a(U{&CmJ zroSJx%dYdu7GQgENU;pY-vrA2(Xu49lQsrS0VXb?W)@HcE&-oQ>FA^R2RuCyomDeM z{J;`Oo17?5we|K~x-D&EM4=OEJ#x*ezHIZkncoJv6vD_->c|D2wgRNouU3GrN{fLK zmpj2Ys2p~+nR3k##9BR}-C@aIY22A21WZ+P%_+ipWG#7{L=%Rxv_z7dLZVrL_yy7% zN+2&vFwd?2f(ui}RmZp4J>R-kA#`I>7xqi)*Uusk2SH3o27TM&g69L8SpnUu3l->v zj|U+$kLsfdliEJG*2c{hCtPm@t@hM{m=UXkpoc=X>B`GeZ*{o~ZJT8p-183aRYWEB zO6?Vo#Oe-9M$T!0PI&vzD>DNpJs+LroSyavxGS0?V1!>@(=`KqKUGX~tL^ne1W^c8 z_Q-*&@UQWvSFZ`%L@Ib2bJ{vVFuHj7`LLsD2|Ld22 zINaD~XZastz8YC6kKpV$e^&u17ciL*R2s+vD}A4G+RLmcF?%c2iZ*c+^L8<(a2t@Z zz{I{F`9!RlxkmD`#Zx$OGm}}8-ik-Wcvr1NL@}`8tvwWga0~Djq9WD-wqWp|r8sYc zr6#t0eRi13afyXvsdV-$gWe8f{p8GuMt1lbCkw2FFgQ6*J|2SMh6eq7ex}bVgN-U!i0WHYQ1?~Vo4l@=S711dBl#=li0(HI zSaVTw0fjE+rxz`Foe}fbT4AYH^VZ(1t~=~%=3z2Vbc+oRTFs?enQaxuak^RwILzsr zlt-8%A-z+~X$_jivy@k2`4YLEb!1IiVpR7W+dx&+ZVbhn-vK=d^m3<+T@)k;49yBc zr>_FjXPEg_e|Y`?y+2A?7q1KHcu%?B|8C#ihxG261DjwQG$PY3`YYC6CLlH65mGOi!th zHBlqS;W}4<-tNgQY6;)>+-R>8&Z*~4!b0>zIB2P~1Adh;)?XO`-Srhm^0te*{V7F} z^g5fl`pKGI>089bzMy9Hb4VU!{W{#;&ji;kcJ4cVrygDv7-o-IOE6N^&<464TTFw= zrYgp@$xmz$<8{lyFui)*nDUJ7IjZMURW*PEEu*CTcNCANd8;v215$^9zg?J5f2Umv zh@61Pb56tqat&r+5MH9USi3ez)bw)(d%(G?{yh>Tbr9uG40hSeY@WU_`Br&+w)mRJ z%?r2j)*JJc)}M1Eu!fL<_rCWbSonRj`|UPz^L^KDZHw?xYi2M?=?lU#kk~M{`b4^zYe0U3fftlNjpkgv z!K&jEjb_LbX=EbZio({+BA_8?f0M-T#4VHBGD9F>a_MmqkL?eTi!hFMr^6=f8wT)c zNl|TB=&7m|!{;a@Zq;1JO(b_vSMB5ms3W!C7sU>^7%rC&{V-VSWuBvMC`{CGFNMPY zI6Fe4?pLB_3qQ9{(2QB>?-WldUy-HPiPw7G0?W~&2=F3fDv>3NxWkgBC%RNMAn}An zg2ms~VEhoKLu7_7<7Y8hy_z^(V+WmYTx3`E*Q__8i0;K4$M(ZB5HF4S`5;fdTu1cs zpPQi>@M3v&`Na;L7$Y{c>u`MzCaP(U4fA}${0*IuVfPq$-_#|O1ncZn=viHc)V!n% z73yyTlJWI-hFtp^WH+U+Ur+9&4YIqA=DW925j)E(L3cQBE^vj&PngL5B-_(23A>5}D>;0v6iV>S8z54{`H(y4Dw95Q@vS zD$d9s$7gsGttX#1h1={))L`9RL4O&o4aI5Rv1iFF=X1GGHMogI1B54jce07~d^I6N z3)mjrp$FGw;D?=!{p|Ay@{#)1;FDo5CZ9gCk!DX-Rnx2F7nDDziQpYr0C%gv?KCgC z9DFvBhTa@GK|>nB?E01dZemJv9A`}6Oh3E=>kt2Q=^L%ce2s(v`)4yygzIPjEd)43 zE)yd}Zb2Wr^%a~9_!pN?O-H(bLhg98GOtx=Q3ocEM5~&GbV2(du!i*;LpU%|;`h!$&#vP#T7!IAfl)~>k7q^^nG#z|!{fs7 zc~ME^-fy^(mFOqDA(;;Hk8MaS3JzUJ>@?lV?EM)jJ3{tcD*_zL1L=Esqd5epTs(7! zc%!t-7eFGA2xIY^rf(v@SK66NEOqbZdeZ^~kX&qW-FaC?;Oxh_igsvUch_KYNSg$U z+-Fm33E1WUZ7ph!r$&9xiOM$@1b`SG%$8EXd)}*pyRqUyqXl@vGOaZ zqLUdaA}K-rKJ&mi;GsICtm*u;P)tNA_~GBJnEL6UfHZ8*5tWZ-!~t_4-dxQaR768Rey5wrGA^((g9JbwBh7K=+ z2qI^M>~op)Z(Tw{*WtCIFnC>>C7GMsCQ!W#>F1{YZKZ0p=TiNe`?q)CP^RWYTLKQL z@|GlCzALV)OPqW{;tHW&kZjT*)iySXcF9pF+F~i-b*5X z7>Rol$-?Lt5f=v9VpL}m?sv$51Ud7OESb7m*&ivypM-=ER*1r0<&)+%BgXEzW^^qn zL?-pAP~CVh<_tw)30h8M98%B_{!5{2Ox0FFe^HBWzao8bwKzj!cuw>BaxSX3B6dtaHadnl%mJ%h35nkD!QcPF9EgKuwQm{0iL+s? zEFMb$psVneriHMQ_N>w+d0BF}Ip87~=np8CX-1>M@}XtDnG`lp@TC+BGl{vn_n2|PqAJ=zk^Qj`yW)cF?7!QGFWI(R%o z{q4EprxV}~u<56Lvbg&4FANFZxpjJZ&V~A{#WcBjr`og8FqGM8Je?iCU63Q) zOhXW<&P)gjvck$*?()j-Pe^RHdwe8?6Ld`^ZZD{nFy$5jI6cDAm9I!2rByCI?hKQ< zrsS~@N1#+7NxDGt2ODo;f^7&FNk<7nP{>eOD}CR(e*=PM0Nm%^t26i8!A2ZY3P43{3IeNPz`sx!nstaeQ5GO^ zV&Ba?TGwM;$YoJ%qAIafmc>G|jMOjc**AbtI|Y-4FXNwqs0ps{&ThF90fK#~J5 zKP=zDw^kFypKDfEAH)a>b8Om@fT=*ekta`c5H;R~Or=xagUZo-(qxTg(!vw2yXz{` z{jsAMd3r1ozMA$Eyl)aoum8oz7QT1AO$2Y)X}Js%qkd&^1G)nJ8|Kzc$NEN9YMs|} zn!itdq4}ieTMl9eV%qgZXL*})FF6^9kJ#VTrCHZYQxa2)waRusyX|BNzDmpMrHlIE zLp$NzZ!f@M_@Z-ScIi27a7+{ zH-{7gq9733PJ2-v>UccB-m~+1np71}94!nf!yvV#I)796p#WJfOASYS%q%^M^b^%; z|J`Ftx8mjny*%qY#ZA$kZs8N?rM=2(N%L>8Jo;DZ3$LpYi}XXUxtWfi*+^Hv*p^3p z+G$|4`S$~#1BB2*_R{32qRe_|8oU!3hj$(FN3`n=G`;pVIo+54n$?H)o(;c$T+1g+ zG+#oO!i4QuqC0-UBJL|m7DCW=L+JnqRCks2EIXfHFi2H0s2y6ELJT?+mCK?-hS>kfZeu6&%>rQvfdzL3~efs7wOMmzL=S6)DeH%Z}0(K z1$`Dp*tNgr#R%p3Ih(`vIh^AW21)!fRC;Nvhgp$eE(Ay>2%}=o#Cz+bg>Hjb*8Tbe ztXr-CJIPnNI=}+tTj6em9p}Q{)im|QZ))#!iuru~Bke}_gJ7-o_Y{ol_4#_qg&U=x z)7dX>G{2tB@r^krMxHm16>ihxpKn3j-w0*%`yJLmoQcYL>9=f803HNf=NA-9qXLDZ zfmQAk$MtqaZX6yBj_cRS3~b?lM)vx)F@G|3ug;j)71qFrEz`;_w$;|7YvY$HIA_l~ zWvG>Nm99d&vyqVbx&`y&-Y)8?{4nnhGc8x&oycl_)fFakj~HeK1WuOU&CjD$g;9>Er!m; zne7W?RS5c)sN3Z-(nd8@`7--xKnXGl1nGm3A?TCT>oWC1ltxx+s@PnKi^yqjo7)aG z6>MtNR7;4!ZS2Z~Uwh6T3Ppq!{hlKHwkOdSndQVym2uHW7o^PHqbfml41m-z8G8SB zsSc(^;FHXPof4VO`;l7EuJ!jNN++k zuwiZqaYYUGmY8pkR0JE#$HZz=@i+r>4CQe)%mmbtcc3Gc9YZ^x25au_*)?_*gOwdT zb4QKXw%iKIhBg!}UV+C|@-tJlxkdXx+Sw67Ov5%eAbzeKxi%asjx2M!=G0OR}DxtQkTbk<6u&%#{ZIm=n~j3# z0*~$dM3WGyaPVJxOc=KgoLkcmP;?z>uYYC*Xq|blHgkh-gG*C4pYF;7&%5@qNSSw; zp6nJ2nc6=LOmSrZKgdwD_GMY`1Fe;GK<$5!R zh1+xT#N=X!#0!|BswR=Z%K7;CI1=|7CF~wShp*Y|I4yf{RJ$*nUos836^+BHdVG9U zQTHMI^G7%%>v0Qnk{DTI165)~m+%Zf)%liE4w^Wj7xu4@a8g9`FDan!Nm6L5Ve9v9 zRRoc`q7T9MqMQY{EuC&GF69GN1<%&0hoHFLz@(Fy4UP*_)2)&TEq($V?3b94SXB}{F9!tJq@fZ0O%IPYGZ51@?8EVDytu&eZ?U90!pQ!I7 z--%{%5Ax)0fk$xw45j|!*N^D{=0_3IDlx=os3T8bY?rB=zSODKvQsd9nsOb=zUCH@ zW8CKwZ|KTYsUFnWA(idw59 z74enEeW#^<+6)4#osRO*10r}wz-)9eqJ!v)@o$RVx@NfbS1%w8)@TRz!~S>U!L=vI zW|J`f$0oG;uFuDGW@pT6>8K}jdnMuDCq;CTd8-2LVb1%9DF&Zmq?y0RlNGZ9k%TP_ zzPoBkUb{U8L$=I*SI;$^?lZXiP}`mkH=msD{qTZdnKG-~@GfNioU>K_EXZE54l4wbJ-P8UU%vBSv%Lk@sVoo%^I*@m6obwOLKp3G4 zze~Up;%XaiqsJh%zB-=`pZLhj<0fMSK|jYRrj0!rP$_mkhs*pd+qH* z?UvYt8FY{vS?a&W8{Pf&^cQz?%sKcu>@n7^2qs>{2}lC8=(dmzqPjud&^+N<48q0+ z^_q4b3a^I~ln+!_XJLUz%w{6H=UP=&Vl4kuLUzkZIkgK;_YO`c{19vhc#dS~+wlut zu1E4WV%Y=#PZ-His(XG{@v5Q|1w*=0*_=}%@&~e+0&`CQE(6SH-%gbkzNqe?#fxK5 z*PV57I?Xacy&ja=OYlu3I&|-}eVhG+x!ui3F-42{T`WexGZs~8NG*k%Q^`H!2e+y| zkvA;X@TVR&<_(H8`Y{#nf+*f})K8Z|f8#{I=X$STJMZBdrH95Vm}V4H%`=qz)We;r z5CE}4>;_7GU8jn)sdc5qUR*obB!;ma&KpN`?xSm}M??i@s2R?)Ti+o8f4zuY*) zGO1lc;MAL_kxu}lxn)p&fo;8q>pbhmR#6-1;s{zq13?=}GKoJEHb{T4a^gzy@%P(v z5EV~yGTzZzj+P+QO#?3Xyb^Iy=GbFUOvV@z@Cq)4=19)p$mTA4Mr{&P+qL-(u9RGe z1{xc9_+V!zI-Z&NfwWgs$BGDtY!BueoKh5x8gDa)Eg1?bTgpBD`O@q-Eo=YdO4A(s z=Ss`NYc;>R(?qkj^-l*lB(fQI#FuwA!-QJDQCZo{;{B_ zi3%QzIk?oxFfAXn8?6L-OBKnv8(n9i3E?&ClNDg_rOyEYhzd;2*h(h4Duwmr0 z`r!y3S8}?i`n`CyP}wm2{yyI|c#kB``a7Abp6i1qXsZuZtg+uyi^;4zMcCPWIi39= zftAYpXFB`u2}9d{*xqpiJUxbx2$43un|g#NLQ~AOR741po%dd}{S)dKGJn~9@N2$P z#=}?FXIq&A+^amid+o!jaF6ItVFd(Oh)}3O=YyC0*I-iyovwhg3qL z4y^7ExeJs())#S~3Iv30gC9k<<#%M8SIE?;UJxbFZ4D-hv-fQMaYJEf9@0RAsk8Im z_z^5uSwW{AXB!Lnht_!&$Cy03V(M`c1G4|bG5EQ%bh~=Eg_kZM#B&FHqU!Vokfxc+ zdy22$z`qb|RaVnk_SEmXUiD1H!E2NC{%(FbUy%nIn6LizG6>EYi*wPDVuP?2NM=zN zR(r1uqiLL>mVU=xq6IzDBjFx;gES3L*z2e13RUH&pV2sdw-R*2;}ly_lodci?s5*2 z)k8--95z?bgN`FC+H8~NblE0ju0ra;mSus0fB53+0qVvIxsgaxKC5=e9(kR3vC}FG za1N~iRx2w)ADE5iT^tu7Q}+s=%U~RiRNKe5a-=L=1(K0xsUxLxi`1853Zq8-+FiUq z7fnxH{5kx5*}7fv2w^Z~Y37MlCxHCtL#4gvSE>E%7-8h@U5yrN%R?5~z`Mx;0#nLg z*)H;8Y?2}23u0k7X?OI3HS+A`%V+LkNy>u;)i z#UspzRJvbT4h?syj0d#7deOt2OMmY*o#!ySh0th)MLa=B^rsszK;S`ll?LPzKfxK5PCBgCM^{Sj?XMLN9`Hqox*{)NM> zo^WN?MrDJ{X=>?JbpBq*#W_+frU7r@G|Tl8t^4y^|5wwtb+&Q0D)ZVDQOq{yHC`(U zD}*qwm+{D-mUBg=;T!A>`L;G41T%QODl{!j$`HB?ku0<}@gunG)ueYC36mQ720S{kjy`65QDqfg! z53P=om$!Yfp$r}C;P#$`GZOR%^m0ufO?ZN0zeM?~j4H5NcGy^|{iX9NJVXl|gvvrG zYJeQYAv;0hQxOKEUcw$hpNOxox|F|BuEUj$a`R8#mb9IOR4=(LOt9={xij~7y7jqn z7fZXQ5}z8rIN^9Q?WKXFH4Pob_6&+$iL zX>ON+bVNN+SYGRsxR_`~?1$n%w3_ESzjPRpgXe9dj~nss?RE2&^Pq79cgP}C&R`$g zIL|Lm;m_q&xCi2Yh6Xg#Xe%jL*%cGD(&)b?Lx}4Kfach4X^bk1)B22HBUc3rt#X;P zm${bH&wR&kUju28`jDv^Wefo|x=qYK9K>B&zB^Iat6(`8)i?e#K3B^&y9>Mh!S(|z z|E2AoU0wXy!k~Fzu&Y5`=HT8l+T5ycAlbfwb}QzO=S`Ik-sT(7GlX-AF?}Yy<*2WY zS|X;PK^7ru2+LV(xh101qct!l=`FHa(m@ItWQ$wrgT@BhCOH=y;Tx{6;8`%YMb~r zj9J7dD)Qj<;h=-h?Oi7b9R~Ehr(1SbkdDUiJtnF-BiD?P3bkFF32SOj2SStp_0XYY z=O!b-GA5|aqc@Str+;^eH!Zl|;z6KIhpdlYAh(>shG}LCj_#uatXuo&@-4AJl@#j} z=EHqkfyopCbAzs6iT{DU5dYL>rF#Gw4<0eV?u8KPl=R%hAkZIoUfNk`W*bqM*8KZ+ zukPx0NJjK)+7k)Ywn&+11jLNy2tLI20>X~04C%5v6ne12NydUmOQTV5m9`u*=V}Rs zM!lx1#WxkcUgZK9-XCJ7Epy<&LcuIxEQQkSFON+f!>g1&E=;n6Qa~YvQ3`$%x(j0E zTzrIrQA%PJddLP7e;v#=7#%J>f|6M-`&V{t z12J3y5Gh(y$5wG#APug9n|)%lnUMH-vzfrxI64gn4t^zM4UZZrxzK3&E-*#hptJ4F z=0+|z(HTZIHOC#bl;oxI6?b67&qYC-AFY7o!^>`K`{#x(3jlp~tK~-^?EHo|GGLc( ziDOcv=;;zmly&Lw?l5A&hh!%<=gmc-VHvF6XXc*CcTZ*yr+}-qB_>G19bp!(wzrdy zR;S@edl*V^_O3tCGlw7e=UY1kJH+D41q<716;Qlq;WQ2h#`WBavUqYQ9%_7F7Kty1 z{ZZnKgd8EciS9X}A=@q>4Z}T2nPmISoeLe)^G^X_kEH)aV?GJO7d$T{Zz(w$Sd%g5 zNSsPlz=vO#S(10a@5N5MdmvUrI7YGjT+&3BDU4o1+?5rPCTarKw|e$rxewLyLo(Oo z1Kca!zL%su^gQ${va3k*5}lXoQoH~yJbL9CJ=v^<#tE;jx}dLfMe(g7ZHY-$-G){$ zXbJL$ng4DWN3nsv!qy`1s&NyG2k=;TnXg_gGMBdD< z|4(niYIADYvqFz^VvR(3Ofo9|3x{`PSxEBGx_k-1CNE1vpB?t@97!MwUm46mN(a>v z&@9dbS@Nf3a6cIF_fPYN03~B}KX5>FehnPbdVWSSN*i@QyhHW(m(WpknL|->xG#zv zh8Myn>Nrm)rlLAMPv1OGFPzt@BU*BE->ql$C+&J`QbNj={XoM{76($~%th;7evQbf zsRpM9J&4^yw`;O2Kke(dn=w_<7=Ac#PC!q=`;Epqb*6$z0xFUktxzepOjGXLkAR{c za3NB(iY%u6J0~U8$529Xk=-72Y4W!Xzm4-}ix;Aob2b+5 znf!e~IEyf6+mQMllY#9?9#B!X?E}SK5OW5vj_9g<1a?=Uy}wpIL|0q$2nj*Z z+jsnO&HhSCBf$?yk1agYQTBvd|HxMmBST>=ZVJR*!1_I6*aj@7Oun^O3_S>6DmER2 z+tmjh9fbR@p@HLITB|D@H57&Pg5#h9#WiNEr;w9NP_-F%W%Z0-tGuhD7mN0Zur5Ur|ExA0{HkvoZGSXnLl`ErJ&_f2@JGDe-fn(=hqh*|R1?n@F7o``aWhAB4_@?+bB zJam#pXHh-sE+$%(D1P#DPvPn|5CvTrkZ@lmf)jMJE*WsG#>C^zb~|p5-=EJs+^) zP@^S}K$HwN3lff07;33}mHo{>!?{d=A^bQxtTp!^E|(wssQlvOX2SyS#;Dfmo7tLx z^nq&GnM|Q&4fnIuNqMTZzORc-G?t`1QEe&6dkxEJ6mtyRosyR0@AHEsq*JOF99~&i$Je^PNS+V z9=zWoY9rFqSCF>hd{CFC?!ruJF*kbNQ15g_qBdPT?x0T;frPz#hW^R>vF&=B`&sk! z|UNUTcR-8aCs7jm8KkXpc@)=iU2vNZunAS2rUW|apyq%jACV*d&Btd zj4cGmWHpJRab~8tbuiYJuKD^5O0n&NM8jHl^*JN^gOCvBW`O|lb zm+g|V3>W|hu9%les0!QgX^C#cB4L9-o=8@>D1z{zG&?)7nF_;Z>U(Y}5 z*j|Cy*D0x}{-jZfm52RkB~p!GP{T)XzbM30Lr#iQJ|7CV=EXl|`d1h9QWo}nD>-X05TUy>{Q)?@}KiHyl|6XrT?k*x% zN&T*rSN?n2j|drIR;h&Whz49rQO$DnDPd*zQ(to^c57y$5Q|Lv>)z*p~; z2sG*=$h~#a$QW>Rz@R$dG$FM@!V2OL*GF@y`52q5RFzThr)+q~br!j8v*L^^+r+uR|CtEaK_B$*UXQzG(wRSrySL zs&ptuV|5ugpr9rt@;g$vut2F*$8Z65gc`U8@VDAVFYXD@0=&C$j#uZ{IYh-A7Sc$n zX{>v0)UFFw;$sO?Q%x(ylM`(0<*6+u*N*^OCKTERHSi3y8aWD2`=Yc9FS?0W+;X}N zx+V+bh#9}*1RhezPQxVAywRBQtN3?LiXwIO}iRdnDGr<$dR85-e25JSd9 zywezYr!iAaz?ji3QS{K4hqjU!YkzBzwF@tBE%+^Vh-)7M6#`T^Wvm!JKco%8Blo-7 z>+DK7#>!&OYgzU>|}aAw}Tthk8^wu zMo2e9&aC^JduDk!gXo>{b`w4Lr6vyA35DgRk<5vBju0yL8hQJz7re)np6t~^dQP1= zYVsQBSU=n?YVb}|H`q=j?08)dRmzYKyNMUFcxoNS;p7(Tyo@<(R%D5g_0teAC(-Tt zaS80Ue>IO1x4qE14qx3UGD~a}UwwPrNfN!y)Coz66_fDloOxv{fWTz>qV7b=gVn=u z8k9ma#;$e&#?;)UeetpbsfZZ7<7&RR$Tc9vwLDNpl&hv{_P*dycHcgV9$EZwg#NCe zZS$Z)Bb;i%WVB(xh~O|~o>sm6RR)x?HbUu5O$m9gCd*`-YT zrE+Om9lR9kNOlX#Wmzz3Oe&gEV$c!ix=g!V&4+YWp;N(@2p6MwJ=SZ4skJD-^^Z{i zlbm@rTu0KdUo;t^TGce}L@BjE#7;NbVXAkHe@h2Q=LYc{@Qo&<7xqH&R%uEyyAW?NrsKx&Cf{h~0n_oj})ys*YL zcpq2WJtWHk2=NL!FnZrp1B95s__GHO5wU;4agIduUfC@<*pB^A$o7b)FI~yr zUIR4i&SdtiCckDPkAZgxlTo9kNRbwaILsSP zxu={4E6l?yNCR7-Y4%>s2x!!mpe*XcNxknxnH^31OlV*vG-vG3Dr-M$lxI4uaizqn z&KKWi_x9=TV-{nh8G1m?Ze*{w^UFZ+O$zeYke2&t^;6eRi(c`-z z)1QNAL*U(C`R@Q5klX%e8q-asH7fcKLq9gI@~`(>#YL~;Tj%#?XKHULsa67=W~T9} z))Hd2kAWN|_S&fB6BC42qQ7d=3bqqMXw%499#bCRrcr=Qc%)aCAjopR*I?1L4V*&f zYD5xvob0-dDw!fm>y0tBII9)r)R@&@H_=^~*r(*EKe2^Cvyd~Sy_8tsZiXY^?6Nu0 zBrz;HZ1==<3NW0TqXZU+AE)6%pS~n94vnjQVnlR~9JzaIXjCq_k~?K}l_(mF3W#qM zusr=fSI5OcFedDQ%r*|Kj=pq{D2k-{#y=;H9UbNxGZL!zXZz6NAK=Kk{IRqiav>C~ zPxUHGiD}J>c`%HC)()B?0$xZSkty=}nt3JOtK#r4Q&yJ z$Z$0k+g_XAOt1shLwEbQy6?}Y+i1TtjfQZ=ZVZJT^bZ|)4zATI4k)bmaX~>@c{>VR z5vS&~ViW?>QEW3s*3$?w$PGm5zM5P9!+yAc8e*S_36UsVL%DqeI4G4Giw5GK)cy@8 z1mZ^00mF$`@8Snb6H&KU0Qv#p2LS!>%7CmAKGfJr8J$6>TovaZXyX!z%Z}B?7(?Il z_P=pDUtL}zc_!Z9F_Ma(!GL0`S)&04|(H>XXy8e^$6;7AjXFVZ`#L$aqmcE-{f(cm>URyug|phA`Eog4Ce%6k7plyPDn z8nh@zVH0wmX#CtJsnirz;5DCfq2N|A7Y~dbl%LloUS!QGk_DmXM0IF!EtzR#y2Mut z$(a^!ris%6r>sT-2K^IPEz z_)9SB9xm{{QQry$9eN%YGI`iT_ei9DTiwleCS>&7;W2bK!xGO5)d{XXE^ci1M2+t1 zWoXF}*Q%*V+8QQH`F0S?i2Do`3`}Nltgsy}BM3gnKhH{}ZB;U>=V*VqspqGB=fnv{ zfc}9TxBqY&Y2Za+9+G`Tp;h^islQ^2Nr+m5XGE78M9T8vr$&du$K01y^#JdywGdZq zC9?4kEA35J#o`m&1J|Z+7HB|59<^PR_DtL>f!`&?lxJ) zKq(io$(8V;>EdRb2cHw2MVB)(nUh1&YAYS-bmE7Sfwrw^L%k`nLy=HwLbG@2j;s{ zlF^tuA!w-`+PhbB;BxQ{b8j-EZXYI_0^!lCDopp3($2X`ppa=z9J0-u^FL{0kDq%A zw{WCi{s7|rbY6IKO#0DDco0h;94<(1ZiPHZMw~F;3*#{=bwG*PR7MwBP`iv>&CAc! z8n9hdKYMS%bA2+cI78@~O_*S%YWS$LnDD1mnxCrVnQsTK6~rLU9JHGqb)jv=^X;Qw z+Po2ac|B}a;aBo8ilB$ZC#FwCK-Eyj*8UMx5{o9{pEUlx){mjF4FF^GTxM!KU0p|i zg|6HC+IgqUtO5XhKQ_XU%VZNE$~=q;(=cCdzf>^)?b7mk^Iv`nY#N9?JvsZ};~IOq zLU?Qx;YkC!(4qEP;GN^LH+e7U>{8sV(7EU3+5+GjV%GJ%UC$d zRgA({!j||boL2QmD{e^6eM5e7ah^3|(r9-*7ORw2pi>(y6c&oZ zw%S{^jtLPoOR=#;`s!u-8~v#^VElMUSa01oN$x&N0-o|{uwGT>&GAIlVC&&xz9mYLd5S-$Uf z)P|E-<~S}^o%o*%6-3DW;E@N@sT$?_bMIfq0*oW*0WV1hp6yg2AfFqE6Fy(cSPwT+ zLr9D)aG)byis$&2bc}a*F{~7r%$@&#Z@ma4bb7O6F?>h6AIP^fZJ$dn`3e|Br@Ij8G$g@TdXo=Eb7}Tk==1S zphCEXN`u|C@EftwGqvYPlsdUX3tAJrlfDH~DkA$K8+a?s1EGVNn*^>f z;GAp20`GyaZbHEYc4J{609QsNamIE|S5U{>Sc+aYD}GHDH=BHK5<#vokA4c8fKeCF z*Wj*op-nkdy&|q|bfSCETUpHOFk^W5okvlJC6h{4?a8Y|?Fb3)mbc?%)KKlIz`G~A zt!b{^oN6$hqZTR>G9OFzT(nZM>%?y(%$?nKpRzw_aPXKp@hlXceuuLc6PCIWR*(kZ9(h z#iStwmTw$*>dW7TzWysDQQFPK2GCpL`QCCbBOrnEoxHRTF%r#0PgFI{x$1^2;TwP| za+XvClJI2uuZoz4#f}21NPITbM1+a78&s{|Z~Os`z$+vJk|Lxm6L+OocmpYBLJXLh zd1@z5PBl_^hMc4SZ4P2}WewQhl;0_RmQvCo4CI)iOEDBC*EU1z{e`hm(2!S&Gx-h5 z;DueN>MNs3!hc8X074chv4D_88#02iXjXjgd*_EVu5Y0>Oj6K1g4kG~^1G!(Q2gxe zJM=-mfbc;d>P6{{gxQAH;FEq)epI0<{r$z@d;+$G=RYJ9ek41l0Q7hFALFbhsZF9z zto1KI4`9LI=7EvZ?s09BL3CCwCJcVZV7y8xoY>If)3dJ1tc$@9Z^NvdzcKHbS1H1- zr%C2?Z4qX&S|R;+feAaLMK~l;rvkgd=m*X>$5*zDYed^zf{D^Yw&yctQ|Ak$|q7T#`;Klq%?eHVgQ*qd-< z>0j7Gl3BaBa3xwahR+@Qm+A}rFV(NeGG+&;PZp;W06^Wn%hz8#$KzJ&>N)@EOv0o8 ze_;>*z~mzuz4x--NHBoggw3M{}=WQ+990Y zZuVY5j9=9fA-!W`9TS#u;w6N1Otn<82^z4DgpFT-DK|&++7H>yEEMN@lclY6j`0X# z1`X=d_B44I@@Te5Ce6lP4uOibnA6?$vP}W4=b}W`nLn`Dog3m~z7>Qg0YQlT@O~D} z?P(Y3n)N^^aq>YQO2~Zn(~>{8VgeWXm%>Ix-jO;<)Fquaxr1f|Sc-#{pi9If6qa8r z&J$1CW>0)&$BPk-b!3K(mW}$h~%mo)D zsvsMbd=l`{HPN&_(Z!Ts-d@z%n3j9E!qdL&lv7gW6bHOENLq-i5+axIRlxy8o!p2G z5EV&U_fL6bkM_;QSfA&Se>KmgSN!7L{ZA=Zv(HUIl4LS+SJ3!=-P!G#GRq~u%}5HG z?ofJ5%h87~u9ztedW9=KE@fo}4MCJ!rtvE!u(R|8-X!@LAg7?(-vALz#($tAg;!DD z3q+h#MJa-vb{J2gXV83fSarBz@cB zmk6VRhrg$fb=B<-79wt9jaqgVK^F9c)3lNXx)W2^i8);Kas)LZX}wzqMODn+sd|Jn zFvkg@@Br<#LU{T;)4WmQW(hMM^1E7+n?91CXMmTRWt!lTI6f4kky=IV25kd2^~JQDtOB{5|%QxQMvyrSgVycuozl7tr`0Z#C$V{j_5 z8%lBlCD$PoKAg(%e^k?&2}HFcp$oG}jiYz!i3sey8FqyN~(VS{n8CA$}Swb|pvX^)ziOSV6*V5^sTvKskt zyeWS@U(@)wBQXQv91VDik@0o^XxJ9I`}s(K^01R0o&}ZAbZ~u>V@*1Vw9>D< zD~~05n$z3`rJS~>T5COxd>3ezRQsVrB|#_E$W@71uD9HlwDQOMCg8H)Sa>ndRXqew z>y=g5^Et;SsN&zuvtxs~|Lc1F`QB+aLMA3-842t?*V92cO%@m12PAkqttRgHPcuU<-b& zlF=xv5EVH@t%o5~3y&O0GQ*?gb=CE#ot=ssgU4U(%&`H>;It&v7OJkK2CnH9`VV5J z0U)cIi~0$~YyKkuuF;9SPY(8_Fo94Iu~9gBUxY+~u!%4pZ01nYT22x!4cn4sVJ<)G z8qtPnux0f~qL7{&*%J5QZvVku10x}3-t@O_4#RKV9fr&f0`e2dy;dPnT?NEUy|v7J zqS+KjYIRtmkO3XFV=+J1i?yiH41E+7#HLI(QdaFhj0&JWrw8?v0v068gdNi)aXx$^ z7Sz+GH)7JVYr3KzLtsK?e}5je?Ktm0<#Ga;p7#b?GMM-O%fKRDQ*-fqB69Ho9fDut z&V3Yo*inu`^R5ofY6+LZ%!Q_cSD0O(Sfv$0)_I>@ApGe!E#! z!dO?p-A;FgNRE$SbQl zq$){dr=Kq8D+YB9CLdhB*-0087l-F@E*zL=>!07t_G?nQ5aZ0EBaT8^-gP!^VdMRt z4Bj%T$0Ck;1C68ZyStqd8JN>iyG)0(f*maOeNc6uDvEkwrNN`f@tPXJI)L^QVz1-w zt6XI+%5pMC=!Nf&&XL~_l~+RU4%MjdUH6--5Y(H3CxZz{S*N92i5;{|-N?Q~BIT-69&u3rxkIgdF+NCp9yPeF@ ztccf(%^HvcC;%p(xvf@Kmf+?R(T95GJ7)owMbhf#RRQU zHu$qaLD4wi3kx?lTR3Muq^wEDKivw3igr6q2!g+orE-5_gt)+8C*97uyH$tSpa^l9 z686EFg@!(R=m!yOowt-?j{VZXg}>ZzakK4C?q};JaiGQBig>V|Op^s*X0HbAWK%*J zL9PJTSn#hWSih&Gt=Wy8?6nKO=uYvo(Cl^_mD6H860iR5`=En{)J}Id)jU9iMEigA zrv;>FJ9?q}K;&F*;mzyaA2kz05tALX6kI-<=E~tsq%FPxZ{$ionIs{8{8hl zq)(qSHQ_tgrmr5-C4cA8E?r;jcfjtV#926D)Z(n#qj92=Bg_}aBSmekxYCGaC-3nI zyN7hbJjwVh{KYopcSD@Hc>wV^)PP*e2Bc-FsUN$kClpNRI=JWAW?LU;*vFrc;pm*% zkY-xYSF9PuW4RZ>sUnzwN$!u>3AURVsz=i!?bEQ6Wi4W@(8=aP9O0e>7~5VMv6bP; ztQj2uJV!N9b7==bcj@C-?X_k?p|{I}WN2JZ>GqE~of_7Zlh2ctQEd;_G=fM7|amBt&0IPUTx+ChP-&OnT(o=_9m5WUO2 zRSS_~t&PIbmr5XKkt5*2k)pAz@m-%r>fkf!k!;S%fbNo`j?aS}{8d~Kqav$p)hV;P;GvU@nP z0Kl%cxM6%RIC%|T9=*V*z()<4ohCvbWXDs%lRvx12_8?FsV^cN<+{JRp)5ZIP(XRU zPp+l~F5<-+7l?IWk24YPvOj&bE#rT-4MJ${icvx?XoL}OG?15ByO+qii@sV%^NZ^^ zp_|eKBmWp)0kXlbfB)Nc(Ry>CotTSe0CaeX)jpr8x|e)CpYNUl9`!Dt1nV7Ez1oC=|^w!JSFus^sw*Zb856LT>;~KSAu5GqU9bLQng%p1;&%|MQ4( zKp3=rv1j@s>)1L2^*wwVi54DVws7Q%><5p=aS|l5^9rD@UNfs*Yb$A@rTl=&0MdC8 zF;OMgD-_a$KG|!OO*{k3P#f*Ba_2%OuJ1Vf6T&(sCojtggZJl9q#*&!Y#}x#pf#kz z_ap=X?iDR`V*v@tiC&_m9mWe=33EPn^?PSoQSVZSSL#!nGpTJLczTm>mb~$|fjkBB zAs4QJ)$*Xsi~#HETxzi&1Og73?EK?C!Yf|r|M0FZZL%6U@0aRU+`Fga3+IoRObWijH z(s0dWFbse&HWQM`n!dELl$qeFbtvG(#op}5rNoCj0&bNxqo5b1DEVH_U z?_68M9cNsZYZ;{!6=^^0oI3mr3QsLjys18F&!xM(V2S%}^PJ4E0HJS~hN(f-pwz&qXaHy!Z`h<L1MMe~(!_wzcnyYyriy>AS{nNI$l(y!FjJE`pnh|0f|cGv!I zM3y28xR4}spJJmh^Dh)~g4RITiy-%3cRHL?->sGw9IY9Eq^wgK)*g`O=pxyqnAM?5TZwe`6>$VLq z+`fbVK17rs1@Yk8%-TuqnoubZEVXewV~FZl?5g#{k$Mj7DsTO%il^eFp~EH z)19youJK6;Brv%?$Tp1V`kPDx5ia-n9G1qf54U}WkmZ2^Jy?!{l@g_|o#7=~gB1gzV+{sBO-R+#2|! ziRe`P6z1`Mv;=f-Cyu=9HJV2G1o2f`iaB9qrba}T%T1qgL5-HwINPoTp=ubSOYvaq z-wrl``7=_3pCkaqs$_0r25t$;?IpNrbvu%LZSU>hmT5Igjxh|4agUwT;VaFRuPo~& zk;0&`_jXXgD!!m+^bw8Y9@kkE{hJv6jl_dKJzbaHw_7mN&LB$eI>MoP=LBZus^(F3JD z=aA6;6WpiKuX1Iq`%KLRRHizms9#V*6Sqq&q5{bKV@du`-an`}z9z&(NHr&#PXlcF z@aq1iiDw)g8)l-AL23j-AP8LbsgX!SFC5T~CE^b#PMj9dNLs&YZj2-pM8U zljn3IqllHCSyXv$%)@O|{(1r$QTIsu*jz~cDgNh^T?nk}-=OSYbbSNq#(D!ZN$>U+ z_;vlcoK9$xwOqV`ybGzUy!vW#s$B}L;a)`a9IYHx_j>Ah+i_nuDy^J;R<~cSV}qPa z1rameNd7n$7iY-C<+`28EJoUvYXG%fu9VbeY~U-Kk=)O}(%j#P zg>`<16ar)@L@1LK_8od%0ow`2{^cdtqsGu*8d)pa#K9)cSV7O1Wj1@8v3eTs%apTp zNIU_w0Ku0bu@Z)~?a<=9i6vLR(2)w$^w(|aZQUU0%OYOvlq9mUv}*-^SFskLve|P; zTZWgN>#aYZwQ}Uq&QP|V_&b&IGdE^x%vyy3Gvl~k75GcP91Y>H^){=glCA({U}|#Kcx6PVQT)rcP3i_ zD_tC+U^or#L=wQF_Hk~F8FN7ep0||n(bX-eY)nJ9TKJ#C%QzCGPEf z`s|@zrMi`d-Fg!~I>`f2x9ds-AV znL`Q4So+O8Q5e*(qI#M?_T>6p(9ZVch#g&xc6fK9Ai8y@FT0Nu{_tqGis4FZ{WtFe z%UzHjx0k_AYh0CF)u>faVJPS|cka%=M*`nWi+fza)0yumgSoc^`^4U}p&H@58^k}z1u3g1>*U=`-~o zfbZVbL<>ueAYUY|=Jc*WW$E%YLHpq8g*eTWq+lH_n^))vyVaCX?efq@`6wf5$fih7 ziSxjQ@sIdvr@;il9lx3nMCZ?zxlyVNdPyOTm_4+I(3uc;$v8x$`ctbXg<((V&TCAZ zjnEiIn5378+^983FL*SYEeRJgiJU8zEgyEGLjm)rc(r6(N!|6Fq^KJ{E*y3u0@FG51SBSrS7lfTX;C z1(ET#O?R16D#K$YI{o)aBcYgF#_zzFl9M61MS;+4Tn`|jr+w~WVoDT{7+N{K5Bc5r z+zii~9kkt~+~b_?_dJDw-ojNn6s>b$3?jSC#t``oJ*W!;WV8>F{OLgbI#PTElM`gP zb?k`RcwDe5(DN>3;`Wj{NFnTJ@@%EfbXs4_6LrAev^FJ%11BD>3^9r@2Oe#}34+Zm zs=_x%wsj9hx@Wxy4kCnwj2t`RgyU?HPEoTkuu*s!DceGqxCGDo%led!g86~siyL2` z{DLNZY>Eb!TG==^@?-v~L;N3k7|}!}bLMT)Xv#P*qC8~nUoF3haT`*?bafn4e?D~p zas0k$ax}pyXRilEH_ES_%jX7Re-SBvgDNC_X*t*v@!#1GMO!hh=s_3207@%~qU6Gm z{`d?Gf#mtP0^;*8z!BdSm|>&}ffUUjw0L7jCmbu2*V!Mef1!gz!vR7IAd@1NISD-> zn8aUOsm_F)imMx#LhTDOA?U4<7p#f#A!#c`O#75HKNp}5wEi4V9V+(X{cA5MXUkPR zqo*nj#teZAUK7Fal!>(w=lX|?;q5|3Xj>#ZG~@%Id>_E&)#NS4^pfb>O$dUW0MYt$ z+~poe(>#62h>(BAI4{MsBF9SD%44Oz8|=+#{qM6{SXy)CSmf&lquFVBi^Ap%_Hx9p zd}RT%a0G>DYhn3xF#WA<_CVU(lhnzPF#gx$>4DH)Q5TPLVfvfkMU%!jKCidR1C^tq z=hh@~vo`|x(2!M4JB)~TYsm`44Mry+^FipI_M>b#uKAA%a&er39x7;u|ib{I-*zx~z} z{F^)rE=_ws+|(|J1a={bn+(NqA`3vQo*^H~C#Hga3L{<^q3m3c9VLblHGEQig4o`1 z2;JR8dR4U3K-LM;#v4_5@|Y2)vP^JAk>`+oCS#ZXPO|!oc*gazDAaz3Wr&5L7y~BF zRZcAyUwVA_IOxPZAX1$fmMX_otEej^BmI6;8)Qv`gR-Nx<$pmJa*BS5i9w^3knDW_ zPSA0eCtZPL$WFVZ1cy#@smf8Ocd3I9MiWBOxDHRGsNV^E@pU7MI1Z2868wt3#B1WpAUt({+1bl(Vm+2nKb z5NLyFyT~XX^J{-MGpuBlNedBy5vIF{!0kMg-b0=WrH5c9TAw*nf5Tzdr=ifgOG8Y) z2sA61d8V>2sL$evQ$N92C7Uxh)__!*?iCaR8y5rWT|Z!xt_L>Ab}Dqp8i7sS@_gSM z*!ih8gF@g8)CcZQ23sMT0bPMngUv)~(%twMN$>9}E}Z|XVCxOE9hQBy81`QD?Lw;f zdT(GV{aRn9C*cfmB$v~XwOhj#&|>sxH61lzJ|E&rA==~ z%ecIMTz0OFnl+%A_hy>m=?-$R+zQZ508mv=fBW}9+;H@Ctg4>Pdop*dx@yXWULYS& zc4bnQZCsoWn;Xq(wQ1Tu;XAMf;DbgjRy-WSglaefuti!%!Tm%kZx(7hdMk*8PDYr;+q@U4ywV32kn*{;FMC8G=Kv!%_aC~hI7Jr+@1>OY;yOni zDbwU4KJWSMQc};igI_zWri|4}Wi|@4d&Ptq zzkWO@+(b)(a=oUF^zg=2L1{q17ywE1i=p)551X7omJ;Wsm-Z~=j6>CYfv_>H+BSmh z($gCTw;T`yRD-8UAfpIk`eBlEynpbOW%|MZR#T)Av;ia>e!~h9;xCx}C)a2RRiU3K zV<<}~jk+D(f0E-`_{&g{QBf?oc-T$=eiKwRM?En@!~Tz^a1No0n41PG1V0>{&D9k} zWBHFGvR^bxF$EMP6MHHkYnS2BRzT6LASW2PxtwHX@UoP{>M5vtEyibnryd9o5V~w^ z;`G}iSD4!Pn^9^O1b!7QgDiP&5Q&O zVwkBcgvIG?E@(xim&PZ#a*p)tgDp~0<_)frmG6>YL|(~hq{9*lg;WUJP#(fYhd%=vz~|$TNYN?!1H}?_ZxMNjte=+ zsz%dY;)v_kW#`++**%*1<`GFms)OZ+!O)}8O0V%UkkP1J#bo#Q+=b$2Be(b6CMTxD z%g`UflWRU$DsH4#D8{_jCr|ym#;oq3d%)sTiC3dtW{4m=7%hIWzlbanDOqoZ5jhty zYkB=gRQv?GNi4T0gfmIJL4Ch_KtD&4Xe0y&$M+&g8H(;kEaE#*YPsMQRY<=6TlLtB z3Zu)Or=d{jK$g!!o`5L`gA5L~r*5XXo}r512Ov}xP}mY1$#$}+wnA6lay2z=w?aqW zk%Ez0g|;IdMf}rS5RlvMbZB&CPT2-vk`JxJD#_e&_gFnT;N`VTco?Q89 zYr^ckG6@z$A?tq7q+9{i>K;ECLKKy6v*#krI2)kaHtH_gX6vN5N4Yxpmq7Vl;3fd{ z-u=x~Q>qOfrnGFVd32%jhVz#K+umNZjIfj#)J5V-Y}_)G7Q3ev^d1rPo5ruhKo?lY z8%yy4(&qKxex34Ey&8R6zbs(g$JRFeYfrm}?e5iHY!<6eibhXMby9h>o^zP>Aet-h z@2D@$4NmA3{RmsNj;Z;|K^ll<{>E_C>n6!>e4EUH@g8&=T7%7--sZry3@0BZR^oq)u8O zx0Hp6>ewo%nPnUvOCh5S0|Z_hKM*zTtkjgqQh~WX6EV>rd&5JnshDNF&-dNPPuvGP zib@FoHX2JJ!(RVYh1?CElC>=DhMI2pTCjuGgaQp>z(*R5Zam*YutVEIUF!3CDBRdkRiKUHx&ZhmOojXT0ZaJp zC_3locjrkiyM0OF8aMiKg z*WQY-a5ppc3sDEnVT6x*thIfsjIo*=JmfXgh=vp2r{HtKz<0#yc+!SL6qI#sjl;;7 zU6uofWaU=lFmT%yTSSt`5je;{f6Y?ELQi2ROsx+n9g!g0!#}VFy&P5{<2QunVK4>% z`e&rFc_dN=9AQJsglp0kskE&B1a&4Jp`Xh{Gv-B4rhIp2GGExr=#X8(UdE5Qx_@-a zfHvsU>ij1!uyq|ITi#MpZdhofv%MNfK--gjju?d7SaVrd1u)glWEXQ|M z8T0+6BF83#`dy7%-T(Cc()nE)klDgn0eG`8mSoD{I@Dyd6A!|`@+CdjLe%e8w1+TR z&Hg1>G*>T{+$%sE2LpwKn1XZI#ui?H)5PrWb6FNy(Zbw>)PPQ3Z`Yppea9AFfzt{Y z0&!gy-ysQi4)kAdcdn;WVs#?NiP+G_jJwymc%s;f{7q*YLMLV@-hNJE-X#m1ql#6< z(_tepthopInR6zjoAP_cZj{~Y2Z=>f(c)*v@7<$?z#3c&OFPu038PuO zy32#Tp+{YK!t$@Olq-a%v8UmHJ^y`;q|O2VzI%+{zhSz0tU4@n%@S$)*n~` zby0wa1nY^OSA_v$FTHO4eHnU@cK zRrjVjdoIx3WW@xdLQSTv{gRv3w4w~a3pS7T zXg?GGttdfS$g8(m%WCOMK-=G&e9**RA*zrOrip@{ZQX*Zf)M`)v0Xy=>7WUyg8OGu zJ^V>5WTZ~9%)!3UE4w%z7K^?|?}lGN{&IW=aHb=o1{C|6Y#|OvwH}wepa2{WvrA3@ zz%B`Ry?tqho4&%OF4yDVMCQtX0WgtS?0G$d90Qa^tdQEC`(8{`^c|-hx+de)4Qk!! zzOP4D!K*3dBCRdk+$_1HuDW0h)!>G{lw(8LE>b)+ORQ0f6xH7?|1(k|YF@yE7I$+z z4xUYK5A|xIKjVv^{X!+Kv<)&rBSukTASf3(0?u~_a=4FwXG0$A$^{gy5*qWaau3KI z-QoV;|L!`*8eQOb89b&MU%>@hy=~`-viWX~nr$)4`5;dC0Jx3p*PR+aPd@0l_XBCj zD@(ed-;*Fef@)X!{XOxO)9iaXqC?q@b~-_#V#8FU(wJ^oxM%bcx&6zlN`N+d%(lbzbeEqz z>q)(34Jhck+7&&Cn{y(>wdgt?#8K0CK{Sg)62j)ZreakeEpQUMOT5p*^_%Bsvr>NA zH0|pP^(@DB;Gc%>=?kgyQJk{HBH&7BZ~Gtnj7;)bDa^J;vd}z9TEDL{Y-q?>UZx(O z6sPuR14BqZVch+4A)WeMW82CFp*eAlPY#4hH9>szxeNCPt6cw8?$8r zr9%Iq2}j^-ljnYN>T0@MY^OJhsr-22mbwTgTTm=0r|A;e@u`L~XgqrG-0S zf##)*Z98zLk?lo8XKng{K9b2*aU~HRVu=4>EWrV7-k+&>j_~soW=2jxx`Ua^1IFoj z?B*PW;VXQ^-DnKkNBB)K8mlIdrgovr>SBuZ~6gYcRtaeP-}aa#R&^&(-UbcNue zr~{(=&*qUD8P12oa4%V#1Q|b1E}XnMF=x?x_$RXhUIcczRb-XrNjKVHP$K#VK)YlB z*=_B}-6Qc7^lwCvmf=q@Jcg_knq1-taTU?PIxbNjNQLaJ(M$l|ebxf=Eugj}8BvLk zOc!09cQj=Y=+SUf_fz-wwAkQ7{9|de9lq()!L3P!9+a-lLk|9w6B$F3RV@=HSOV!q z<*)X5yfPcvM!9=uC)ox$^Cw^#0agsKj6hcrm}aHy>l%YTy!jMw*Dii;dO4yqU(Clk zf{eQrB)}cH;)?1f@Kt&(kIk{<{MO)Uw)gRpb&#f5aZg&G_TL&2AK3mJcXok~4IiC( zdYz|9_0j&n$gVJkBO zh?ytWKC1-Q_j`s{_oe?65kg6!u}Pmu9eg;xCMs{N`o=+|?;;4JrS4{zPBQ*N%SPG@ zF=&*L^~+`n)YcDGId1uMemk+J#uCidWwGM>;Xlpvqud)-EBtl%k<{ovX3=4CW{cK= z7D4JQpgcrlH&{)?ul2 z4#}F$96`!YDzAJKEjt?gy10ZyhTpb^3okivtJxg!fg!k>aoTU5H_&lTz3>7-DhuCi z5y)?hhWN!WW&oEVyDZ^6o%}eOcN%AN%`RuDf3_FSu7o&u!i#qCs9PnC+PLryI)t0X z!Tb(16sS~TaR}52qC*ItvWv{10gz;Lfio?DT3{Po_)jE&ykmt}6j9dimG4vz`H_HY z#7=8Wjl`;fiH(U9%(hhp@Axf2Z|ImatAI4if$XfdyM^TA>k#w=wi&uaWB?gCDq-=& zE*krU-oBqd8}(cutn)N^wl6D-pmEBzR1IDghO2}z8fKjV?@R0A38qM8r}1us+Gl{w zW7d`z#~$js0M*PI<`?&zkh|q$zRGXMDuVqz9H53O39#_MrXfj3i{p%nADZd6{!U`jmU-3WLtBii8LTA+p+Oj>jS>=4G478_gq(}yq;#FadiT>oAoAx4Y z7wi;o1`8N-zEj-vo@DFTuyOMAk5xl?6USRjL9Ovgi>Z>XOGy~1z}@ZXZ?)CrFd-4#+7@)ULB z$VsO;sYHeeE#8L2#9S;e&ND7~q$$vv1)*rvXkL9qR}+TrDg*jq%s=!J;^H}f^y>dX z^NKM~Pdvluumiy$_H1HS8|mq@n1GP`&yCB@m8bvsq;bY*FiiO&N@h3CZS zRFY?fvg}@OV!d-mY+YNdWP2c9oK-2TW!`xjx-17B7jP{;S=l-%47W&0J+9vri=x#`S*_Jo{ z7*_U(^Uk)NEBT1Cffu3^M7xksHVLc+8BsIO_C7=);mSAmn7Rvoce z8Nzl`tBE4W-}}e#5M_{x>|BCSGAP#edhk59H&XL?%i@?!{)Gc5MO6ciQw*5xy*|@; zt~u^-PZc&K?#5ixK$E5!w?r9ee|&5CYpc4kU6tpRRc7_rx~j9*z`^qMY!V;)k`HRRDd?a*!nYy7BL#s}CzapQ2?OO6%i&j3(Wrn~qVu8ju z(lgO7^<9uo|7mt8J#Cdu!}PJ1nr7=d_+4zs;s>{(-c6Nz$Qyqv1rd}`30nr(|A9SJ z&R^^1iK>6cB(-TwV;DDSO%&}{s{#*bQ)R(xfT$dn=EuKamWGIV4}0l8KU#eWd9VrW z6y#dQK9RX(&@{uQdt-d-Vqg`|=O6quAVWVfQ}PwV4)Ox+tRi2+3F^sv#rUm^WVq7` zwxv;6CPE$NcUUwmdhr$qYbmFY5Btz+Jb2jWkQ{!%PiVM@n#lSbJhg;W}_xo ziLnL5-FSr}AfYDh{3qAR%A-W=e)Yj#N2>09vL6&F*78h#rUu*!n@`*SOyKpYO{?Ng zlzT@|!_ybZ4=MyvTlRcxnQe!7oZvWJqFx#1Dt33P3n+Pi)j+W~ef)I(i1+=1jpfjk z;XZ!$B=nz!fJCojpo*Wr7SGe=KBInYMUXd02-py+tUUov=pxuPB2 zsO&a)f7EJe zrM{pX&+Ftb5Msu}?8y%GNoFWm&T#RkWPn+V!;7Zm^^o$XSfp1}Zmh*BN02-WNtzue z2kgXks0(viC~fMyCD^HqH|0^Dk$%%`pl?U5@R@#V-5KZjUcHNLH4N}!7P;s|j-MKQ zeYr!=XMa{iAnNMrhxHR~4;@ zS{&mMa=Z8H&a^EJy}CFpCfhF0%3pIy%n&J>bVSTWk&vbfQQOJ7He0YBklTCoo*-v& z4!37==(GmzK_Oj8F*DJ)oYSns>n*%A7D{Mbxgi+W=pe29@q*T6rzmub7v(c~oXt~Z{{gHjdmjB}BSLz%Oz6?T$jdN`O3w|Bqp;c`5ZH?!MpU6d zeu=lQpMrwdHnOiCo8OAMf_QfBfIzh2BP!dZb-V#Lxl||5IRE{p)>fVv-i&fRr#$$% zJ(pQhF(4^TpWN7|iap`n+uA{qUUA3QL{4>{m)Jzyg$RNjdw9yic|HB=MjN^Cgh|_6 z;U{g%a-4`}tW4c9HNzr4zKJ+bN9Dj;ZxLD?(L8IUhi>y$_<2Kk)~sq&-F?1!joEaz z6n?vA<}wN`+;p+Ry4^hY%bfaM_#u#oTAzd`hcPN1Yt<=+od^&T-$6Z|xgKu|p~)|^Y< zuWtLjd;R*70QF0b1xH){zqMMC0^b{@5|g=cQ`dR~#ZDX%L>w+}h5;NJcTbrkq^yq; zu@M+*8Y~W zw)_1o5N|p-74ZgW&8Q22r({L)-q!dnM}1b&<$=Cl`0}biia9j;ensq@w0C>mFL!@b ze?NAAy)APIBb-gQ+Zzm%c_x0(o_sebevj*3e`Q~Me{rn&h^zUEswGJ3jCkt2i*A2^ z^p0*EJh(SyKljzg++S@XUbRnuGwcO*`pLeGL36dBKJk>IR&{rUYg0Txeq6uu-JM$1 zQ-95Up%IRCY*aKW`hP9#E^ID^4&r&dy@g%-d@fHDZqTmr&T~yjgI&Uusp|N4`#c{~ zZC4CpLVax=IhWsmEmy8?IOE0y?7wW@h-b2YeZHj_JZ4NsxI-I!R$&S<0NXgcO$5~; zS(vF079WdrDi4qP4N}dKvt{kkIMK|bboLyY*0IFCr zyxmLWUrGc_MVRp?S-d-tLQQGdBhx^{<7$>zNh%gK*>%30tUb@XZ58A$_iLkIAy-`d zc7(PIbniD)`jNMLS763@ouW?#`?|jT|9MCF-+Ga)#xC7L zgB2a75N6`6B0(NW4GvzCq2_HJa2W^Bfx}5EPV%$pn9SsZrTO0=PrYK0u zb})76y~ra#2h+5%+Y$GR_3MqyTcMYkar+WR0^H!Z66L)I0hc-Dk7f@5GRz5+4h&3* zDSIdG%2#Hx5aIFkh)R(NtiPyPq$9rFnho-i2YM0OW z6MmQHp`;CWRL=xz+aU|^9cmgBr#kOnrE`rcwzK$*lylZ@)YTM(({EL87wW%}4>Ls0 zZwH}EmE;)*Gn5+LOu?l@A z!DnJgZ#=!J35C|&>Bjv3T=cbvz3C&54#@m6w-NMPH4~oWNT-&>c(ta za5t2`;XEd{xhG->S-?MXV{^OB4STSKC~zV(fk-gfm|_c2!8m~d8zBw!FtC>5h^(Ws zKm?pR1Pu5^4!Ea5Pm5(-(*0eKIw=~@RRHEd3AJFUaQw8ACyE)cKLdItqjy>|z&%j( zM}`pj!3M-%dd@#AjK7C@?ty02q$W;^1#N}i&kq#2**Zsp1(p3BtcBWZHwT98uillT z?1@Hw*U5Mniw^zSFSqW#@U7E$?sm)8>@mHpe#@7BT0j(<s~&dnZIVo{s5i z3WNq`IkP7Ep$V(0@<7>1-+3D~3WJ^4yCdm$-CE@M{$9sZ&;5T%_1GC^$Mz;MaYM)V zRQm4tyXLDLA*i;R=6>B>Ge{q>RV%205j&Vpk9p({2;76em~@lQ5lgo8Hx1gBRU17n z^<|nzrSev~C1>@L4nJ54hb+F|w^$zEvMnWWH3dg!VP#2Nj(y4?9CxP}SN6W(xQ z|0HLYs&e(azIvoDozFH}k0DO1j70BhS#nFR?g5DdR_nf-qSAu+3ECP?fKj&JB7T!>KabKm`=4e zeSo*FI(OJ6^IjwOPL}Q2`R;*OwSY`6&8(V5Pn(x*O4)I3I6%3@AdBu-ImtV>b`q`{ z%Eyc3#?z>JgYI5qHo|R6Lkw`BND=mb!YY+{WBKw)HOARFN2Z~k7zeU z^ng~7(nA!{58XoVVaLuU_}1qQ8?LubcT@}{Xd($~k$I~IM|P*(qC-jq9VIx-ZIK~C zSz6%t-S0`X?T*&a0~eATMb(>5jcJK({&>VY!G|d%wA~mb&)T0^v2<{eNtoQ*dq3x^83Jwrv|L$%<{; zwrx9Ev2EM7ZQD*x_C9s0?!&E`kK<|7tUh}0-}kqMDw?YLJOAF760USp>CEp7K|?5?g?_~CDWa~BTz8{imj9Lk(lyED@L9;Mm5b*2wR;n`-DQsu(&M)|^e zt{?77MwSeibBr40F~q?e6F0>4yRlV2M52eUQFM(!i4k=3z{^Q(OIG|M=2>6|7Om3c z??~xVlCw3DcMQcN!a(w{Mby+;01)54m##a}O~edqDD~|MdF6`R-hTJCTJI;#Z>c8* zn)GcV7vSjZP!BMEhTEJRt&SYPO!8R+GLnkl`)*>$FC8-gx=KACdN)(Lg>1ZE;kT1o zKf9jWU+*#NDSQrrL6FsH?{!azrlFKTKLnFF(M zY4Y%?{BTnaN467NnK_e0?4{i;I2E(ftDe_JZ>$Tc;zWs`?q;2B(^a&1B<`2npQ1$t}PZ9Vb6 zzPp00Z14wxuE=|*6IM0_P|0sS9-l*7N>+b_1?M^Y75aJ%3_uz%A;u3L*EcL!)y-^fp(BV1ch^ z_pIgtwxCz9g4{lTioyZ*@_roT5nR6+E&`55=ZYqiyTxV(jO+d$E0n**RP=q*!}bOA zU5Lk@KLHe4mc!ETKbl%?39*dnN~^GVX1%I^5n9i&>N+Z;=f4+5sY6y=-|K*gUAixftYkiKw}V8*R=(7+rwNwhF?6$EJpz0pfU8AuXeb*&Yhf6yydZlm%uC?jEK;nGf!1e0dS7eUBWvL;)ReCh& zIedO9q5}?RvaW0O-oB17A*OP=`T_eNObcgO!oD|?;joK$bgKd7zS^j9@U(vJC-OvJ zP2uE#SGS>gIiqd>jH}}Neew~s?kc?g3BWY{$=kFLLt#J<>c&T+^DF?>_|SPGi>>MJ zU%sffGtb*+(=H-HJFy-k0c>p`3^SD%aoe$fxtaCdxpOw2J_FuMjEo$z4wIT55i!hS!gw;HqVdX#<$2`sKn^H~W4{<1=$N&U($vne2y% z17*cpPV5>Y*!XX6=&fX($MnfiCkP|_ojqyEjNr6%Zzaer!O+MFC?|d}t2z!aWq9re zev2Z*)>Wz{g6fBkIHD@KfNI35ut@Og{WOks6m2ySo?**SXh)I3y`3|ad+LQl6J{zz zu0=Fy6#S0kXz05Dg*wR}coEls6hLGoN(`8_CH_ER8xAXGkBDr9P~(P;pVACz z;2cC{(AZ?VBzah52~AuM8Rx$jMGO0T{?1F<pe6?_8NpEV^W4|xv`HAN^5XWx~-Dsi=Ye-fJdWzwAA2VfC+3>pSd8UpJIE@Y=fA8_YeF08BDZ#uzt^nb+2H>IbjsoOL# zyuJ)*B3bNkO!WVXXc>)d2@l^Inivd}a0s&bB_;R!Y_vN~Wd%dc=%s5(1?dIHqj|-t z13FlOV^Pduug}x@=KZyeOjOjK8uz@xbPnPe9f0Wn#&s>E#NuqXZ4a)T`WF^wZGYnh z&cYI{Y|r*A%e@DGF;?5AO`?G0#a)e=3Ve%y-vAyj7kI

zpYoh!3HU9nRorxh8(^ud{#+8GG=w50vNS%2+ToyMO^~NwKcMKp*%vs#%<63q04sf7 zmsEotV5e?sxlup8Ik4;xC9kRT*jgFBpTMfQF+v1zzNIlhy`d20d;MmO7{9XAL<%-% z!kz#fTKK3d9YRz% z5`rhTr(a&$mE*dR4hDpX^w{zn6Uq$3q zwszd3N5O?~@Snd;f`8o?Di#JWU$y_lN30gB=4pBkD?Txm5yh0S+-vi)n#M4#12)-- zHCZH-S>0PhL@+21(U98i1xFdhV?!_W^7^j#ULubg)BJ)vBUML>N5K>aLrztGe^JJr z{WlJ2T#-(;=mL#()%y0@{PzKcE%+eW!5$&g*#+g$Or!n)OFOzR_`L@UbsZ?W0F()q zm8bI8@=0ytqpZy-@j!sLfpx`kOUDd)H9)~tG0`?k-KD9aB+(2Ohw9!`-8Q~JUf<`K z5mRpS(OQQDSg@Z(E5zkN;g5d(EPwY$-F%Oq{Ih-UD_uJ{{mtZ=|%Y~$idWg7B-qh~9s8rs1c+Z?{vN zSfmvGMof#RrLbg|r2&lmRr!Sw#WG461^#9Y;PKG(5mx63zZ116_2UE5g2HTo>jfF= z1T3RW|66q0ziGjI{ngF8D#7jOEW<^!*E{(2oF)&vYWbSy9LlLYetPLhN!J-d^fxwM2=B-%xS@#k<*q z%0Hg8) zIopXF8Bkv>D97JCa^P~@{zsl?{OXT|efR%(<#~f8nXx#Yysit_hFm;MWIS3j*+#k# zAJ9+1VS;2XJ-_S`-ylN%tCas8LA!t(FSs`l7x#$SrWPQe5wRVCdzzh|bLV}2xyWH_ za46>_3v@m?g#QO2%Fl7@RrY3IK*(@*5K?{4CwB7G$`A1pWjS&h-w(1GCV_SXf>-Jy z)uK`;+n8drvMyqf?qp8%u7n>Gw`naP>@EaYKlPW9ViwfusI+sZ)Qe^OB=T)1;_dj& zmRt0hJy+&j%Xh%l8V*PpC{_F!rw4gb++5kS)z$asHJ6jN0xU7@4HpN_QH7UNtgu!Y{b=5zO z<@ywzn=4)oxz;MVsXx1b@nRNehndLbYWIY#G=bg~t4#>-%XQ7$H+sBlAn6Fu0lkp| z-u6KjDh}JAk$Key99YuD@bE+BX|d{S8lDq@%FSm}Elvnjnq$YNXu{ee4QOBJqJz!F{fQv&nwkhujisa39MJ5vnkEpbhz5x17Nd%fiQfF5?-f*~<5NOBqys zhmZ+l2OL4LpyZEa9BYD)5RgkW3;w$C`MR^{{yd6pv@)kT_#`b~GXF5qpxoqu!j)+jmu9l-$NvVJo>M~Cr!Xd*SM`eZC8ol=1!fAvr$C_HEI*PU-Q$|%B}y&qO-Ks` zV3#HMuH>C~V%7JD9@1)fAl`V6@$Z>Ra9t$o%eCMAMnf4jIchV!a2lL}E5^vlA9~N} z;PVW8?h(LLB)zpF=X%2fb&1gWJ%r79FT;4G$Eu%{S2Uc{d36EJoeY)zP4*3b(G(i7 zO@CrF20oF-LHHDZ3Y*CVmY;WF$RRZK5DAa~?Zt)g>(6i!&K3)W$ewDC!giOz43b6p zaQusk0>>3L&xc%dbB5=K)@1h%Ku@8h6lPfl=*~?lfGUVWTWH`R+;@#DnCRaRb-tu5 z_qDB^^MW}2XwEclR$=2F09~2EK1xTSaqqW)DjCX9iqFk`y%fFE*dqHER-@w_KU~fe zmE($|w&VmcK2;O6CH8h!Uuth}n%}!q$KBuU&uB=Tgzgz=O`re`y36rkSy%sRDgoes z@U<_KJT3T`h=xGEap9whaAk2)--lYI_-b3Bs1)4>!^%3I*Rc`7@me`@x1I*iZjs1t z)R7;!zVdtpinjQ4;CIRBRF4S`k`Z5= zK03@~T9&(z&y9a&^Z=LUMQX!e8u9OJ26E2q8}!nx1fcJ(rs`c4qvwtiT3!9yPXqJe zvktXrmek|LO3eDMo61;*!TV@(e!$H5q;lhfBX-X?KojQV@qpIR^wzy<-}%~J4bUg- zCX1>!4)?D+D%!t^RiFtp@UI|un9n@FSj>%I#X8+A_NvvnbzQ|H1#D_(%h$-eKOF_q zGMm!+F*f!34zS#?%E04O(u6OEKzS)a1hm!X|hHAU)<>L zmqxF5x#J@zElSGY9OAl;M7OM1WxhC~Tmy0+rR?D2{-Y~C0!0OPAVP_`j9aDfS1rpv zp3v^qP${d+S0a}aqBoL61Gx82Ma5J~sBat@U&VYl8C zy-7?(k`=}JNlm29*~L1&Rm}+@^yUOhp&n7Vl7T@46(HDUlTa7WP|!;n<-)Ks7!p^Z z{FMn$@Aaqg8Namy0+gy1!&^Ax=Ck$Hr4ppc?pNK?By^HF41@GO5!J>j66*LMtL zaCyh{pnXiuV6~t@eHF~eiCk*egDw8jPOs^!P2{zJU7q3i-E}TTq3D<8W`vG;Oh#cd z>%_hh`UuIRJflkdsT^@iikSNk)doe&C;vkfv!=V;2j9sBPvtMg7U)`<9$Uw?N7mf7*)073-2kdfTz38%F2HL`I@gRn~E<& zEskRw5EPWy8}b+5V!*g+Mk|_0bD{UBs>UM3_=}rO(~EZ*-6jsQXO@pFnCWiPwon>0 zxAZ&c9u%fTl)6bjgaf+1U*(`_(}BW;d9E`(zA6iyzQm`dfAgb^MpW(>uATX*EKm4D z_zK5s!vJF;LMs5|qUnQDAu)5TXtav61Eo&dgWv3MbA^FhC+I$MZZu>iX8_$1yE~@8 zG15Ng{>^CECTH8#*rO~VljBs7=!wTeh2)))94HPH?oAnFR7G)yG!6MRJ#Z$}93^l8 z75y~55jw~qE#`k9qBw8YUvLEj;KU|h;d2=_@m`7>&h?lWEzo|VUy73 zCg_ne{u10Gd!9a017hq~*?f+7a0SDt6^0){&{JaacSTvzZrlc}1CxN=&?&Ibax!T$ zY1~Wqx(lJ0p^vT!AokEGa8^3ECtX7fhrNT6My^;>+jpCf2-0iPo_^UZ+tTTY6J z5DbC*J{Jvnw*!v_Hv*d9&5u^qbnSHleFb$tv!>+0O1rxFVWj1t#OtX)WM$_rsV1jd z!PEHSmzvBsF)kV^J4(yQ@hk`Pb>@dp^Gll_2A06?yXZgLQ{8?SlpXNbf@d)ZkEX}g zRUUTzoklH+LsboCwq>#{hr6-D@H}Z_WXq|g-8mhpf3p~WR`;xZ2GD3u7O_UzU^)KV zZ2rhL^-vpj)Vx_uo>^=X25AYuj3tOV2+Jj&)|eoXMBx-R zGa79I+xwPM*(L=GN*P~=bZCQ_(L$`=3Nwrg6w4IDGnZ{w?%vFcZ@fDEigMn!r9se- zQdt2Sw0LTeS6Wi_zxEl45(pkOTMzWmhmRGpUnk5O=*7}%Zro9#7v=XiZQYi6r##Pq z;xCv`#_A;ttb>IO_H<*Cd7ME3>TGbN!5t1Jp8+bK#=(Wz4ZV<}L3pYl# z;N-nCO$Mf!k4rrsxC#G-!!C(xb>X)sFKYOKkHS?)AEl_vA4Xwi7L=Nd1HU>0Am&S+ zEWK6%mk6upCAa){#2YTM9wW8?BVQ9rE~l~^8@Jiho#F9u4f6J#ex*M1@^fE6YxNIx z*C*-Ol_=JmdX3{OKa>d>UPkUGN8*_W{#YqsqqU2buetzD5-lExE|+AT_|h-D5_gLabW zKNn}d>a6RIdB9bw&^%sU83&=>hGB%6#AxSQRJk zi_Qf;%2&*I+#3-j+)pbmboxP^h%><$QHGer0Osg%OftOw_DfbTOCEn;`V)UN@%kjY zB~bEG@fxI=589+`qC<-0Wv^0{kwr;l4rmNf=@*UowI)8lrL8!1a&;Xu%Da5hu=tXL zB(cZrcjb6W%%8-mhX+*(l*Og$XZ<@;Y=yE*E(V>1E90yD`CdoiaAgg%z`qNey~OsZ z?=iPnBia>2Su>s|6c~oWO4zYp-DyA8%;<&R%`0fWz~f!d#UkTGpZ8EIkNQ$R71u%2 zDM8i1Eu^F88s?u5ND|{v8=7HEWxOte%$TH);;!~a2%&=isObytf@URqUqtd5j9H$3 z9gZq#NZBwV`b^i}Pl1(8fb_#%+zUpVo|be%j|foga36RV2SpJn6LxPh^obO$40FYr zUGDn%;8e$os_7X0BS9^TWXpL$d^!}3`EUmxW2j5cZD|l(kA4;B*RAC-73Xw`tX1W7 zQ8>P*V>o#l69zifS3;P%;fZ;TJ9ORdt18=^~)c5+;CO8e)gk-<;bD~s@Kh!di(ca;QwWuX%PeuO#4VEB1?ZHZ!rKbUwOo$zNBYR~- z^vDR!Cc+Z96h$|tIl{W_5qME=D!MZ(q^#Q(^5CXpIw7((`GdhL+=Td5Q53DHwz#FW ztg!OtG})!IzE}QGXxt51+z%Jm6vx#8HeQ+78UZY+*JJRU?=8lV+W$l(q^7MA$Sh&6 z43$r+h_5odN1jCm8@gQWR`a+v>D%H ztnf+|P!wlU+EiZf>G0623VB6HsMw@52yvYp#lcs6{mu^ZsmL~?j;u(Ja$7ghJvcPj zc%7$yURcFvMyHKdTQ1K+Z%qd0=Q;^}4a#;omCBf%2I(ao{C@GF@G${yKT!((26c6s z3;rt%;?GACHq?JVam=Lqtmrl1baCC`i&{XP+dW3(k`+_zu>Qp(iVlZ zaAb5jl1%Tr%-s>2+gE)kc4RjMcu#IP zab)sq;Oykg8`6F&UepPw_?RI0KL#Oi_*zl^2CL7b$cvaiFK-_I(cM~b`Fe5tjH}X1 z3|`#0jjzb6mUX$w<{Qn+3CTV4tn#>piRBXw z_&e4t9_-ZFk?wCJPTF2AIUk;Z4Vmp>P&8kZgf!zrp1DGa>|$E^HsA?fP``&S-&y)j1%Wqs&wp{&Gf@!{l9;vqnRlttbGgB@ z9<`@%wF*rWKTkJXn0B+vYA5|}kwNFuZ;!Opf9J_e3f-~!W*2?K)!_q=TU?9Ir2wJ$ z0_9YLwNC z^}be7ON`*D5qt((exx^vh-y0ODuy_yi74#zG@59#)xofs^#wne2ERYWbSe#OF3ogo zIS=l9I)o5<;quv&bmegRYtyS%<#I4-uD{R|qJM|DrW*tZE7dL`E1M-c6eIDLvp&fo z%g55{%kcb!6YM{u8kfg<4q5LJlTiCOux`Sv=8h!>R$r6c*TLPl_d;SB;xrQuCI-P> zGKm*TU~moNi_hQw`4IjVSWR!lBo-o5n#lC*$>SP6` zONBvMjd832Ijr>GK$?cxHfXyvFyczYM!-o{XMys7GmH z*Xc~en<3=e(G^JY+x=)br-Q5z-#>9XtTRMpc+jd%WagxELD5n7EiSAtBCGYsiI-f* zo@$dL)>ctrCc_nB@=uE;Z(_J!x2bw^nRB*C;FVtMkf`;!ndz#ClOfZ+9XiYE+2!pk zk^!*H7T&X{^+$IEmhP<0@76>PJKhbcotmL}vVv3#gU8&mTeJezGy5agSVq@+Q)#Pf z1K3I2+7fMcPt^m?^^CSvN6?Bjy(1L@;|&>UZ6j4noQuf~XtlDeJYY@EjMCZo!RK&V zBN*JLg#?N+B#^(eDhu3=2ONN|cC66`d_Pn&zs`_~ z{wht*RXdT+jeQx?#TQ2g(XzCxaKlOQCqrHjpX=t$O9X5Fvr&J3RwqZ4GuK9jUfy7m z95@v#mY!K#z)_DHH@NL}jK*p0`?Lcd$7w;A-p)!kv(Z5$^n-g<0-i)!r23U8i?ca9UW@`n} z`A!`70;ZrE) z=}m3_x61nR8~ApvfkMy&Ox6qyY@FZx+^c3_@@WJC#|3M7M1Q|2d2Oj5o*jHV%|z}` zw5sKQ?G>agO9(?KIL92Gc>Muf{YyazAY0b;?FK)#+-u! zpCpDH9G3u zhfsiM)qyB3UAm}(2AlGi#|b_h!d=i0l$YI;4}#`ue2U+?4mV#tn0K8ic=NzetQ7h> zerHE~fEUn#O_}?pb0hWB2I&Qqcgq`g!>a-EUqg8tiCbJ$8c$`broIFadwL0YV5kU)<@NT{hE1-+Ns*}Ikt@Rxuu*{8N`2r0J z`N|o*eu0)mDfjN%`BFl9ctl?SN#_gH19-$QX}9JB;i1OrxQXduaCi$kanFE90!hC& zI289fp(+Ag{S6cpXI&6F^5aKVQ;QHni@eSdCqR!SI(7}(P%-3#rNc|NP<6FvIGa!Z z-iPw;!&W0KGr^d|`a)U(Kl7k^xK=_{T(0yKBIp~>Q?1IXnK}l8DO3LU)age1+E?3c zA-6Mu`4?Td_pkY5?QsMw3|8RvI!+GRx(~#gNR`vAOHw3aaW`=!ng^+B~3K*aX7kFbPntG*bcaK_*kk9gbLf5Yw>LZb}I5S3$ABTF&1 zH}OgxbhG)*Mv!0yYQ{$JfSFei8or@3iSE;dWFwjjVuXLt5wjZXN!*azA6z96ibE7v zMALrU?9s4EPC*_JBniFh4C*$E!rvpcgpEb6l5BG3M(p<3r#VL~rw^h}ivP>7iNFl| z{of25XfWp-sKUqNi`QrPy_ytY*MD;6d|=gznz_>~26Pfjf~f7FRugh}K5q&Wcq^f1C9IKp;jc$Vq6Bc^ErE}-)FB56Pljyc z<);phd!!8&iw&%U6OO$mZvdw0c5~0EOlEEJ`T}W!&~iVQfN?J7mhMDMixyzIF2&9t z9jdFzOR*=5gq6Qqiy~S?SJ3P1xmnLuavIT1HLOcZvO|w|5*^G+z9Thr=bl%2C z6;f{@uWf-K<11#lhFm!)x{XWSDUBoN7xxD6YQk9`69&9ZaOShZ2Ojz$cn$v5NM&HX zqI930^ax&6$bED%!1RW7 zn{fZY-_XI~Lcr@w$x*TC;cuVq>)a|`P@_#Fr;J#}|36nlK=oav%C-S~^flO-t$Y%66q6wE2n^Mw{!SZMi4%Ybt09d5l1fhg5hFb3z z({`bR&%zAPj^_-E!!_U%gB);j@p4BTg}q+C>S^%m13)ZqIFwtHZnbcJl*CI;U7^O> zN;p2hmcb`Hp5Bf3n)?47oT#fm_e zyb@k~Sn7DeEko-IHEVk2Ze+#X5=*T7x;NDqv*0c75D*gxxdih|=-e1|` zz$h2Z{c6rIuLDx5&0P7>hy`GC)Q){@Td!U!ClTC;@)}~Rqbx|$R386$ld{`^cTdNz z7A+hBlVhuV_W@{Dhe`^YV?O8qlH)ndRDbi~TPm}DGBNPz4m6^#D3CvhQ(`e6F9X$F z7q=+dZov=>pVKDEbbs1G?rc&v>j)f8y4p&G>dvt6_Zq`jK=pg_6MfR}&hcwupqwQl z@Gj3pE1TZ!*+;-b!@7u{g%zTva#SU_nv;n}2kl?{ogCbHCw}WBNK&qq09PgJw#CI6 z0n6v|tYYv_|8{XGZ?r`Kv5~bL8T;^GN#Cwo(Tp92f!&mTI(``Xw9R}|`rILw_`#Ml zvsM}FQ3e+&iU(#-$&mWG!*EizPK(ab$9h%%0V!3_gyIa`GV|I4Fb6vEi0TK62!i*Z%RF}wu zVI|ZHc_pnZ4#2<>n_Ry>Uria2G{cfJ5c&^m_N>}$Hi8_@Tp1!3#~V7yBgV{{KSHhi z^GG9}Nk{P?0Nbytyg}TABVG9ZCn33;_}+vHB%FoqPcAQIy_1iuN*+p`A#`2_i*+EO z3_Z{eBN&(|JbDI*F}-KLW2_Fi>pA&YbCz2QlwGiGoxqis2TW zMd+)mIXdf#r3y@w?{dB$=ZbU~@K%9e4nV7^o0KrZOr+dSYTBkQv z8rre#JJcPXzX?TAp|bn#HpC2g>XTV?!k?uEZDha_!F69b6>X(r7HsNN|nTymYO2$WVh{8A5H|j2Ai(nxCs& zDLMn28m)*_966g>j0k@K+5Mmk)RO^skzDmBfNqD5;3btmwGx^T7Hj^bP?)e#Z0(0_ zb6Mtly+d*=|ClNAZ>nSlu@>afdZn?WB&2MIi3R`X$8{s|-F~7gBycXf02l)oadM?d zf!cqrVU6#L?T1D8)4zr@4?C$!0&}|LCS}5auZ$$^-p*q@X8yHs>R_#%y7zM(vwrG9 z@H!)jj}YmblOxY}@?K$(zi}i`D~rmThvbVGeB|Nx?~hv7V~dAZ+6K`Uq5PiK3!SiW z)`+`MGelge^9ply%(w@pJC2V$rLuR-_?6^KMV0&*yR`piJcW3rzDK4yo`Z_HT-N(1AOvK=IvJxm2HwM1<5^ zibbZejoN|Ntoq#0zJ<20OuJ;Sw^ps`#R9L?Iqn>8i znDOnq48vE$HrqV5yo6$?AXb6T>UvBYpr)i3gs;3kOXk4MXPf6oDM>bREaN%I1M081 z$kpO=Pf!a#rAoAmaGyw;G3!f$5&A#^zr zlIL$#itm2fY%l!vpEJ9F?#e-VaCm1Zs>bbAAz!VpWQVHFvbF&@qb<0x0+y0%%4?{q zj+kiesk(q)uIZtL!Uea|iy5Me?&^)lHR;JjP{?^S>VV?SL}|#U*+ydT+w!)2m-4dL zM3Po4-cA{lBr4DBA77GuDT9l)VGD!95#?!%yJ|YOCp@OlF1-%we=W>~`fxm_so3n3 zT7BKG>PYWui;ijNCwn7dgKRX&r_VI{e9k{_hcKFUHQdokZ`eZvhRS2saQr?yW>-7V zT72PfgEng=2>3W(U!uHR`PbGP`^(rEEuNXc+}XWeIs&7FF+h+XT=d?`g+)W`EF9w# zY$QkvGwW1Lw4H++AuC20AxP17@E)$SFZV1AF|dm3z<^h^VPuP*WgLLj5F!+;draO` z3aD(QN8+D{i8c+5{(JQo5`&KaEbegRw88-wYk`EC?9Z_@n_O2tiOl? zjq$j<5~5ZsVm_|d`KTdtKWyT>ywrZ(7Gq(jtKAMT82sGx9+mvq(I56XCEv(+cf1#_ zLO}k3$>|S+CaN6Dl$#)lCQi@A#oA;^kLiR%)6+qiZ8&bwRs}S7+#>-a_o^WgMTC1A zab+zk3aX$^T5dkLrkXyBhD}q;9*>~B)?v~0&&+nuOLH`d=fSJyoh~=J5&EUc0~rXg z5fig%05d1{;2LkQ>zzO@>H0A}Q&|y(Y-g|gO^?mrX3`4-XH|J4R?Qhl7o?H=s&-vI zW#jFIT5+aPrDd@R>uUr(3N8fJvMTf#w_3wfl*M8P)_S4 zAW0_Q82=vRyWJtdFPNuGi%L3QBz8oMT|UGQVONw5CVk+`M8jT)tcO~__(8_qa0L{G zKg1fws~-wJzVh^!;t-6xL4&P-v}Sro`QK1vulTNnjjzIK(Mpjp!e2(WeHe#Bw$gBb ziP3}j##;y0*aNLs`KZ0n!1`(R7>BJM+FnhB{lWl+q4zO(VKKm;%d z%Hl{zCk8at!fv(J>jdDv8S>BSTvi6kv8_W-40j`i2;*W68!P15Zef8DMW&E6_6EFy zxXrz-1QAxqVP0W4y@{roa8`o5ICt)>eweYd^#SDiF-(VE*4#{lJN^9y<)2Vz0q)m0 zOlGQO@C_lAF(4lPSeZsO0Ct`kR>lyW9MVv@>-njV-c7}Tzyh}u8KTT`owGGJ@iLD; zA?b9=#6iIrNgYDYPFqeC_JjRI0oK_M_jju#$NDeX2k0Xz4T=GN)vkVCT3m2MZ zmyHf^O01nH2%wkad1MihLZl4-nxhaadIicj1?xEMP%+F}zpeigOryXsXblR_f(9(J zfpO0Go;pVu>ACrkW4d^F!r0{?!)@^JfH^Qk0198Y{0*i>1=r4;g9xn_vF_%Nz&P*& zx8k?fp;IZmlOY?=TlvA{*`@Gr(cSsl9^E`|$x2#!w$su*~Gk$KG;5%I?uf2$#LQ;h|E`&VP>6ow;LfVJe`a}cDXVCv@vZX&> zgCyZ;jJG-AeYlfOX&bycuu(Wa4ZYJC?^E9A?o`!0#@9;tJ~~J@Y8wpXhaIZ`7(imy zcl|?HbmfpOZI$S5$9@xUYntDRY7iqw6WIkYE5zH$_QSz{zkkeBas41stWb5dq}bOV zKtm0LUX16yL0qktM+Z^xUWY#Ht$?n%3GSxz9pC3|7>ybMjHjt;&SF}8aV@2;=da^; z(vSbJ43E#_mECRCbb9hhZ%GK}jwxwPpnT&fb6e%|dg--%!cm3ZdB7 z1rr;-!4o97nHG-WzG8=MVFcJ>5EQRQgf|{R8HAzFkqp&iMvc~QSIQK4!kxvcC8J-e zWW`hHE+ezHTZb^rUPgiTRY(=$%C^Eo-b;&JUyh+a86V-XhKNWcML_iu?8WBV6tU5W zV;Oh^EDO);(4y*9*FWrU4-wlHL)VTnIKUpnn3h(7xx!Z#j2cxp7rVN*Z$Arma#N19 z0ugle!n+8u&LgPCQ?m*FJa^&G3@Rw^hS2EvVlyj)3+&g6x%-EQPV%x%3!S)=p%HUQxm0cagN5RzrjkWQRpRk)g z3{yY1X)sLNUVll|N%d=FyfoRUX@SRpF7-Y|5Nq{wc`a@Xx^Z1l6HW1zKO+Efc7|hJ zd`pU!t(06ZInD4dCKR1avz~=m(7%qP_ObLts+nlFzjx|()h%;vuEWh+zXkL>s{VqQ z@lVm5UIQvrbihrWR^F9(q1>%dvtx!!DXgyJ{FnpHzS4*v@|zCOUpuxM-$&7Ony^4Q z00~HdxJA`v4TO)<1}YhQ>u6UJS41LB>Nd%>jS#%yd(<7T0&m+j3o%mpd-T2|HU$Gx z->TaV3<}B}ctP4OzWUYti}ZvsjO&%qChzwdBj{suA$VYM<0?tAsf|&wG-FAFJ^?Yi zk%J*?4daDky)+rJHG{ew+5^vKd(w~WSohBa$p|r9x>hCOvF(n^(zA{AQL$11QhNeF zS{E;}HN=I#-von=u&JJ7_|OLP;slEU5UZT;?IZ}}T=UC-Ds4S_C~3lIw;+acReM&p zZU({9!f8yB2?CE|$}|wAph9;Ay3dhZ{8kU-Y)-aB{&I@q`y4Dg%8^rO7eI_bM~%FX zbZ87%5efW5a|zeMt>jji+^4t=7z+#F{r3*XeAL zS&%sdEI`N{0^_l$mic2tDiLr56$-fVW#Q9UG&sfKD2l^-#T6^m#m7*WATUKxx4{?- zqT0X*>r3yfm>m(Cu+O~^R}}$P6`7sHK5H{Oxv-=o7zAMPU$d-zVq4*!19;rTgV6Xg z^0v7-&8*lEu7)ULj+BR=N_Hy*K12}sP(-HaX(P(p5O79ti9frcu_L042%31}!X6_C zdnZQ50@oUo3D@l~F9}%I8BdsJ+O2#+?{zQovQF#e;_pW%Z0(9D6O;mIg0xW0kPS9O zn4yQE5J`+=fXp~yLBtt)a7WO&VIs}~c)Pg=EU>{#hw#R7PmB_MR~^DT$ZL*v&I>F2 zHN17q{2(xf+nq#j`JwBqs29Zj0lXP}Mp9d0_XCE}eh+af5m?0_#t2t(zSY zU2L!WA+9usr;Etj<28%i?Eb<+8cyoB8 zyl2MB0+)``6pxIvixzldgI`Z%rVM0@+NEe5X>FcoKji|}SaD?Uj3j;4L3gC&@OK-Y|tJI6ha>z zjs?{gI1XXW;J&fOigF7E>Y$H`V@FzvfiU19H`g6W_F8cTP|*L;HQ`=7w_zT5q{)L#&Abcd*eY+u?HI;0Q~(OIv9%02H42;(%3vJ6;y~zsK{s zS_Qf0{BR-Fi|4L*jFM?4Al20PDv1EKM8cD8v>%4)iCR_49@>wo?+m%PrtRO#evR$b_-)CQrsrz3-=Ds>8( zQLLvigpiI#Sz$j>pjZR2pLXQ3DB!LkaGQ3f1ILMVwEK)W-7(N#J_|q@rqZfqru3>` zDrG?cih>|x00dc|*=t2Kgn>e{Re|k@fH073)^eD(_r=()<41rItRA!0meMX9&$gBn zYk6#iAC7fPeQM-UN?P;Vs50Gu#>=KKH(pH2dG@zkozj}5@%nT5I+HTrea!Bzbft6i z{T|@W&reAwlWehA{r>YRzn4VN;p*OJ7EcP07uV$&{Jiq|dXd$uCu-Fa_CBqCR_=%~ z$ur3F{?FjeM+JKOrBPG9RFbP(uD+b7lf%!~dD^Fy?7aK=L-ROhRMgfnD4X_VmP!%E zD`{gOWqsj;ARK-58tQ54Db-l%5%CZZ12pRkSc{(qqivYBWEfytt0R8u{6$b_A-n{k zT>)dwANidcasHCuS$Ekh<`_8GK68nF+RQO9tU|=SWsxQ24UTb)t>JdB`D8#FG5eIl?1MGmq zA$n{66XTo}RuKbn*ZatuxM{>#s}|_txBH-AHn0u@aYxXr*-<#cxC}>;d9+my10yG` zCCX~{7EXXz%Qg%rClZu1jOS#V4PFid*+x<2EJ)r^0BaloSnG;)R%CA&z!8dyXGeUA zfd-K-59L@H>?Xs3y0Hxg5{}_mv%0@bvceRiEH&fC`v?&mEwqC{9|LX?K=x6!t}s?` z$$H;oMU3F%ATB!Y9~0LVjKy3%*A?0ff`cp?mlGnVL5@QgPaHx}p^)M9h+E>24N(CG z2qTDnb46;AKla?&@-dbo1+g%1+MkI{HVlFI7zm4=J16>O9v_aeSo6BaT(Y6g<6|Hy zdah1(WUd(KiBRqT12`$810e_4;#!G^pW84T4!l^4%`g~lg*C=NZG?VoUK%0Aa~r~0 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�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

QVQ3Kn+)gc0wDE3;JaBzZn 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 IeGVZWhU3eGcQ=XpPdp-b*=8tGUGCp?-2O9= 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 literal 0 HcmV?d00001 From 10d7f797834c915376b03ce4b0c1fb439a376f65 Mon Sep 17 00:00:00 2001 From: Scott Hart Date: Wed, 7 Aug 2024 17:26:09 -0400 Subject: [PATCH 4/4] Manually update READMEs, quickstart, and top-level stuff --- CHANGELOG.md | 7 +++++++ cmake/GoogleCloudCppFeatures.cmake | 1 + google/cloud/apihub/CMakeLists.txt | 3 +-- google/cloud/apihub/README.md | 9 +++------ google/cloud/apihub/doc/main.dox | 2 -- google/cloud/apihub/quickstart/README.md | 2 +- google/cloud/apihub/quickstart/quickstart.cc | 7 +++---- libraries.bzl | 1 + 8 files changed, 17 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd31f8dc7ec9e..cab4f749e0f30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,13 @@ breaking changes in the upcoming 3.x release. This release is scheduled for ## v2.28.0 - TBD +### New Libraries + +We are happy to announce the following GA libraries. Unless specifically noted, +the APIs in these libraries are stable, and are ready for production use. + +- [ApiHub API](/google/cloud/apihub/README.md) + ## v2.27.0 - 2024-08 - We now link our mocking libraries against GoogleTest in CMake. diff --git a/cmake/GoogleCloudCppFeatures.cmake b/cmake/GoogleCloudCppFeatures.cmake index 2360cdbf67f33..9e9ad2e8c33ff 100644 --- a/cmake/GoogleCloudCppFeatures.cmake +++ b/cmake/GoogleCloudCppFeatures.cmake @@ -49,6 +49,7 @@ set(GOOGLE_CLOUD_CPP_GA_LIBRARIES "alloydb" "apigateway" "apigeeconnect" + "apihub" "apikeys" "appengine" "apphub" diff --git a/google/cloud/apihub/CMakeLists.txt b/google/cloud/apihub/CMakeLists.txt index 63f1fb785ed34..61e3e11ae8d97 100644 --- a/google/cloud/apihub/CMakeLists.txt +++ b/google/cloud/apihub/CMakeLists.txt @@ -27,8 +27,7 @@ if (BUILD_TESTING AND GOOGLE_CLOUD_CPP_ENABLE_CXX_EXCEPTIONS) COMMAND cmake -P "${PROJECT_SOURCE_DIR}/cmake/quickstart-runner.cmake" $ GOOGLE_CLOUD_PROJECT - GOOGLE_CLOUD_CPP_TEST_REGION # EDIT HERE - ) + GOOGLE_CLOUD_CPP_TEST_REGION) set_tests_properties(apihub_quickstart PROPERTIES LABELS "integration-test;quickstart") endif () diff --git a/google/cloud/apihub/README.md b/google/cloud/apihub/README.md index d9010cae8ca0c..bf3cb09bbad6c 100644 --- a/google/cloud/apihub/README.md +++ b/google/cloud/apihub/README.md @@ -3,8 +3,6 @@ This directory contains an idiomatic C++ client library for the [API hub API][cloud-service-docs]. -\ - While this library is **GA**, please note that the Google Cloud C++ client libraries do **not** follow [Semantic Versioning](https://semver.org/). @@ -18,7 +16,7 @@ this library. ```cc -#include "google/cloud/apihub/v1/ EDIT HERE _client.h" +#include "google/cloud/apihub/v1/api_hub_client.h" #include "google/cloud/location.h" #include @@ -31,10 +29,9 @@ int main(int argc, char* argv[]) try { auto const location = google::cloud::Location(argv[1], argv[2]); namespace apihub = ::google::cloud::apihub_v1; - auto client = - apihub::ServiceClient(apihub::MakeServiceConnection()); // EDIT HERE + auto client = apihub::ApiHubClient(apihub::MakeApiHubConnection()); - for (auto r : client.List /*EDIT HERE*/ (location.FullName())) { + for (auto r : client.ListApis(location.FullName())) { if (!r) throw std::move(r).status(); std::cout << r->DebugString() << "\n"; } diff --git a/google/cloud/apihub/doc/main.dox b/google/cloud/apihub/doc/main.dox index 10b8bca1ec4cb..8a276f46c3b6b 100644 --- a/google/cloud/apihub/doc/main.dox +++ b/google/cloud/apihub/doc/main.dox @@ -4,8 +4,6 @@ An idiomatic C++ client library for the [API hub API][cloud-service-docs]. - - While this library is **GA**, please note that the Google Cloud C++ client libraries do **not** follow [Semantic Versioning](https://semver.org/). diff --git a/google/cloud/apihub/quickstart/README.md b/google/cloud/apihub/quickstart/README.md index 438c13a40473f..29422800b282d 100644 --- a/google/cloud/apihub/quickstart/README.md +++ b/google/cloud/apihub/quickstart/README.md @@ -151,4 +151,4 @@ set GRPC_DEFAULT_SSL_ROOTS_FILE_PATH=%cd%\roots.pem [grpc-roots-pem-bug]: https://github.com/grpc/grpc/issues/16571 [homebrew-cmake-link]: https://formulae.brew.sh/formula/cmake [howto-setup-dev-workstation]: /doc/contributor/howto-guide-setup-development-workstation.md -[quickstart-link]: https://cloud.google.com/apihub/docs/quickstart +[quickstart-link]: https://cloud.google.com/apigee/docs/apihub/quickstart-intro diff --git a/google/cloud/apihub/quickstart/quickstart.cc b/google/cloud/apihub/quickstart/quickstart.cc index 53860e285a160..068e13c67ad3b 100644 --- a/google/cloud/apihub/quickstart/quickstart.cc +++ b/google/cloud/apihub/quickstart/quickstart.cc @@ -13,7 +13,7 @@ // limitations under the License. //! [all] -#include "google/cloud/apihub/v1/ EDIT HERE _client.h" +#include "google/cloud/apihub/v1/api_hub_client.h" #include "google/cloud/location.h" #include @@ -26,10 +26,9 @@ int main(int argc, char* argv[]) try { auto const location = google::cloud::Location(argv[1], argv[2]); namespace apihub = ::google::cloud::apihub_v1; - auto client = - apihub::ServiceClient(apihub::MakeServiceConnection()); // EDIT HERE + auto client = apihub::ApiHubClient(apihub::MakeApiHubConnection()); - for (auto r : client.List /*EDIT HERE*/ (location.FullName())) { + for (auto r : client.ListApis(location.FullName())) { if (!r) throw std::move(r).status(); std::cout << r->DebugString() << "\n"; } diff --git a/libraries.bzl b/libraries.bzl index f62c08aab10bb..6ac58b4d2f2ff 100644 --- a/libraries.bzl +++ b/libraries.bzl @@ -32,6 +32,7 @@ GOOGLE_CLOUD_CPP_GA_LIBRARIES = [ "alloydb", "apigateway", "apigeeconnect", + "apihub", "apikeys", "appengine", "apphub",