diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_async_mixins.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_async_mixins.py.j2 index 9f5ba3369b6f..e268ed117414 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_async_mixins.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_async_mixins.py.j2 @@ -45,6 +45,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -101,6 +102,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -160,6 +162,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -214,6 +217,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -271,6 +275,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -397,6 +402,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -519,6 +525,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -579,6 +586,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -638,6 +646,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -693,6 +702,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_client_macros.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_client_macros.j2 index 08da6aaa052b..7821112d5a61 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_client_macros.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_client_macros.j2 @@ -174,6 +174,11 @@ {% endif %} ) {% if method.lro %} + {% if service.version %} + lro_metadata = None + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + lro_metadata = [version_header.to_api_version_header("{{ service.version }}")] + {% endif %} # Wrap the response in an operation future. response = {{ method.client_output.ident.module_alias or method.client_output.ident.module }}.from_gapic( @@ -181,6 +186,9 @@ self._transport.operations_client, {{ method.lro.response_type.ident }}, metadata_type={{ method.lro.metadata_type.ident }}, + {% if service.version %} + grpc_metadata=lro_metadata, + {% endif %} ) {% elif method.paged_result_field %} diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_mixins.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_mixins.py.j2 index 4d02f0d91e4c..66450f5bf245 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_mixins.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/_mixins.py.j2 @@ -43,6 +43,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -103,6 +104,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -166,6 +168,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -220,6 +223,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -277,6 +281,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -407,6 +412,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -533,6 +539,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -597,6 +604,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -660,6 +668,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -719,6 +728,7 @@ gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/async_client.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/async_client.py.j2 index 8d96ab289388..d94ad0f893f9 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/async_client.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/async_client.py.j2 @@ -430,6 +430,11 @@ class {{ service.async_client_name }}: {% endif %} ) {% if method.lro %} + {% if service.version %} + lro_metadata = None + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + lro_metadata = [version_header.to_api_version_header("{{ service.version }}")] + {% endif %} # Wrap the response in an operation future. response = {{ method.client_output_async.ident.module_alias or method.client_output_async.ident.module }}.from_gapic( @@ -437,6 +442,9 @@ class {{ service.async_client_name }}: self._client._transport.operations_client, {{ method.lro.response_type.ident }}, metadata_type={{ method.lro.metadata_type.ident }}, + {% if service.version %} + grpc_metadata=lro_metadata, + {% endif %} ) {% elif method.paged_result_field %} @@ -569,6 +577,7 @@ class {{ service.async_client_name }}: metadata = tuple(metadata) + ( gapic_v1.routing_header.to_grpc_metadata((("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -687,6 +696,7 @@ class {{ service.async_client_name }}: metadata = tuple(metadata) + ( gapic_v1.routing_header.to_grpc_metadata((("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() @@ -743,6 +753,7 @@ class {{ service.async_client_name }}: metadata = tuple(metadata) + ( gapic_v1.routing_header.to_grpc_metadata((("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._client._validate_universe_domain() diff --git a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/client.py.j2 b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/client.py.j2 index 85c6855ebce1..4c0a016dbe75 100644 --- a/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/client.py.j2 +++ b/packages/gapic-generator/gapic/templates/%namespace/%name_%version/%sub/services/%service/client.py.j2 @@ -721,6 +721,7 @@ class {{ service.client_name }}(metaclass={{ service.client_name }}Meta): gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -849,6 +850,7 @@ class {{ service.client_name }}(metaclass={{ service.client_name }}Meta): gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() @@ -915,6 +917,7 @@ class {{ service.client_name }}(metaclass={{ service.client_name }}Meta): gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) +{{ shared_macros.add_api_version_header_to_metadata(service.version) }} # Validate the universe domain. self._validate_universe_domain() diff --git a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/_test_mixins.py.j2 b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/_test_mixins.py.j2 index c838c421be8c..d71834b205fd 100644 --- a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/_test_mixins.py.j2 +++ b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/_test_mixins.py.j2 @@ -1,3 +1,13 @@ +{% macro assert_api_version_header(service_version) -%} +{% if service_version %} + + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "{{ service_version }}", + ) in kw["metadata"] +{%- endif -%} +{% endmacro -%} {% if api.has_operations_mixin and ('grpc' in opts.transport or 'grpc_asyncio' in opts.transport) %} {% if "DeleteOperation" in api.mixin_api_methods %} @@ -86,6 +96,7 @@ def test_delete_operation_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -254,6 +265,7 @@ def test_cancel_operation_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -421,6 +433,7 @@ def test_wait_operation_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -589,6 +602,7 @@ def test_get_operation_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -757,6 +771,7 @@ def test_list_operations_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -931,6 +946,7 @@ def test_list_locations_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -1100,6 +1116,7 @@ def test_get_location_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations/abc",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -1277,6 +1294,7 @@ def test_set_iam_policy_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -1445,6 +1463,7 @@ def test_get_iam_policy_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} @pytest.mark.asyncio @@ -1474,6 +1493,7 @@ async def test_get_iam_policy_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} def test_get_iam_policy_from_dict(): @@ -1642,6 +1662,7 @@ def test_test_iam_permissions_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} @pytest.mark.asyncio @@ -1673,6 +1694,7 @@ async def test_test_iam_permissions_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} def test_test_iam_permissions_from_dict(): @@ -1849,6 +1871,7 @@ def test_set_iam_policy_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} {% endfor %} @@ -2018,6 +2041,7 @@ def test_get_iam_policy_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} @pytest.mark.asyncio @@ -2047,6 +2071,7 @@ async def test_get_iam_policy_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} def test_get_iam_policy_from_dict(): @@ -2216,6 +2241,7 @@ def test_test_iam_permissions_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} @pytest.mark.asyncio @@ -2247,6 +2273,7 @@ async def test_test_iam_permissions_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] +{{- assert_api_version_header(service.version) }} def test_test_iam_permissions_from_dict(): diff --git a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 index ab53d4699321..02309963a429 100644 --- a/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 +++ b/packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2 @@ -216,10 +216,11 @@ def test_{{ method_name }}_api_version_header(transport_name): '__call__' ) as call: call.return_value = {{ method.output.ident }}() + {% set response_prefix = "response = " if method.lro else "" %} {% if mode == "async" %} - await client.{{ method_name }}() + {{ response_prefix }}await client.{{ method_name }}() {% else %} - client.{{ method_name }}() + {{ response_prefix }}client.{{ method_name }}() {% endif %} # Establish that the api version header was sent. @@ -228,6 +229,16 @@ def test_{{ method_name }}_api_version_header(transport_name): version_header.API_VERSION_METADATA_KEY, "{{ service.version }}", ) in kw['metadata'] + {% if method.lro %} + assert ( + version_header.API_VERSION_METADATA_KEY, + "{{ service.version }}", + ) in response._refresh.keywords["metadata"] + assert ( + version_header.API_VERSION_METADATA_KEY, + "{{ service.version }}", + ) in response._cancel.keywords["metadata"] + {% endif %} else: pytest.skip("google-api-core>=2.19.0 is required for `google.api_core.version_header`") {% endfor %}{# mode #} diff --git a/packages/gapic-generator/tests/fragments/test_api_version.proto b/packages/gapic-generator/tests/fragments/test_api_version.proto index d75134d8457b..851a246c6016 100644 --- a/packages/gapic-generator/tests/fragments/test_api_version.proto +++ b/packages/gapic-generator/tests/fragments/test_api_version.proto @@ -17,7 +17,9 @@ syntax = "proto3"; package google.fragment; import "google/protobuf/struct.proto"; +import "google/api/annotations.proto"; import "google/api/client.proto"; +import "google/longrunning/operations.proto"; service MyServiceWithVersion { option (google.api.api_version) = "v1_20230601"; @@ -26,6 +28,17 @@ service MyServiceWithVersion { rpc MyMethod(MethodRequest) returns (MethodResponse) { option (google.api.method_signature) = "parameter"; } + + rpc MyLroMethod(MethodRequest) returns (google.longrunning.Operation) { + option (google.api.http) = { + post: "/v1/my_lro_method" + body: "*" + }; + option (google.longrunning.operation_info) = { + response_type: "MethodResponse" + metadata_type: "MethodMetadata" + }; + } } message MethodRequest { @@ -35,3 +48,5 @@ message MethodRequest { message MethodResponse { google.protobuf.Value result = 1; } + +message MethodMetadata {} diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/async_client.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/async_client.py index 08e073fc4054..a0443c1535f8 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/async_client.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/async_client.py @@ -1274,6 +1274,9 @@ async def sample_wait(): timeout=timeout, metadata=metadata, ) + lro_metadata = None + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + lro_metadata = [version_header.to_api_version_header("v1_20240408")] # Wrap the response in an operation future. response = operation_async.from_gapic( @@ -1281,6 +1284,7 @@ async def sample_wait(): self._client._transport.operations_client, gs_echo.WaitResponse, metadata_type=gs_echo.WaitMetadata, + grpc_metadata=lro_metadata, ) # Done; return the response. @@ -1412,6 +1416,10 @@ async def list_operations( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1468,6 +1476,10 @@ async def get_operation( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1528,6 +1540,10 @@ async def delete_operation( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1583,6 +1599,10 @@ async def cancel_operation( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1701,6 +1721,10 @@ async def set_iam_policy( gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1824,6 +1848,10 @@ async def get_iam_policy( gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1885,6 +1913,10 @@ async def test_iam_permissions( gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1941,6 +1973,10 @@ async def get_location( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() @@ -1997,6 +2033,10 @@ async def list_locations( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._client._validate_universe_domain() diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/client.py b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/client.py index 50586844102c..b364917567ac 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/client.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/google/showcase_v1beta1/services/echo/client.py @@ -1522,6 +1522,9 @@ def sample_wait(): timeout=timeout, metadata=metadata, ) + lro_metadata = None + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + lro_metadata = [version_header.to_api_version_header("v1_20240408")] # Wrap the response in an operation future. response = operation.from_gapic( @@ -1529,6 +1532,7 @@ def sample_wait(): self._transport.operations_client, gs_echo.WaitResponse, metadata_type=gs_echo.WaitMetadata, + grpc_metadata=lro_metadata, ) # Done; return the response. @@ -1673,6 +1677,10 @@ def list_operations( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -1733,6 +1741,10 @@ def get_operation( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -1797,6 +1809,10 @@ def delete_operation( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -1852,6 +1868,10 @@ def cancel_operation( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -1970,6 +1990,10 @@ def set_iam_policy( gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -2097,6 +2121,10 @@ def get_iam_policy( gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -2162,6 +2190,10 @@ def test_iam_permissions( gapic_v1.routing_header.to_grpc_metadata( (("resource", request_pb.resource),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -2222,6 +2254,10 @@ def get_location( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() @@ -2282,6 +2318,10 @@ def list_locations( gapic_v1.routing_header.to_grpc_metadata( (("name", request_pb.name),)), ) + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + metadata = tuple(metadata) + ( + version_header.to_api_version_header("v1_20240408"), + ) # Validate the universe domain. self._validate_universe_domain() diff --git a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py index 11c8bc0ee587..2189e24dfdfd 100755 --- a/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py +++ b/packages/gapic-generator/tests/integration/goldens/showcase/tests/unit/gapic/showcase_v1beta1/test_echo.py @@ -407,7 +407,7 @@ def test_wait_api_version_header(transport_name): '__call__' ) as call: call.return_value = operations_pb2.Operation() - client.wait() + response = client.wait() # Establish that the api version header was sent. _, _, kw = call.mock_calls[0] @@ -415,6 +415,14 @@ def test_wait_api_version_header(transport_name): version_header.API_VERSION_METADATA_KEY, "v1_20240408", ) in kw['metadata'] + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in response._refresh.keywords["metadata"] + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in response._cancel.keywords["metadata"] else: pytest.skip("google-api-core>=2.19.0 is required for `google.api_core.version_header`") @pytest.mark.parametrize("transport_name", [ @@ -8206,6 +8214,11 @@ def test_delete_operation_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio async def test_delete_operation_field_headers_async(): @@ -8232,6 +8245,11 @@ async def test_delete_operation_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_delete_operation_from_dict(): @@ -8373,6 +8391,11 @@ def test_cancel_operation_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio async def test_cancel_operation_field_headers_async(): @@ -8399,6 +8422,11 @@ async def test_cancel_operation_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_cancel_operation_from_dict(): @@ -8540,6 +8568,11 @@ def test_get_operation_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio async def test_get_operation_field_headers_async(): @@ -8566,6 +8599,11 @@ async def test_get_operation_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_get_operation_from_dict(): @@ -8707,6 +8745,11 @@ def test_list_operations_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio async def test_list_operations_field_headers_async(): @@ -8733,6 +8776,11 @@ async def test_list_operations_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_list_operations_from_dict(): @@ -8874,6 +8922,11 @@ def test_list_locations_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio async def test_list_locations_field_headers_async(): @@ -8900,6 +8953,11 @@ async def test_list_locations_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_list_locations_from_dict(): @@ -9040,6 +9098,11 @@ def test_get_location_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations/abc",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio async def test_get_location_field_headers_async(): @@ -9066,6 +9129,11 @@ async def test_get_location_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "name=locations/abc",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_get_location_from_dict(): @@ -9219,6 +9287,11 @@ def test_set_iam_policy_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio async def test_set_iam_policy_field_headers_async(): @@ -9245,6 +9318,11 @@ async def test_set_iam_policy_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_set_iam_policy_from_dict(): @@ -9411,6 +9489,11 @@ def test_get_iam_policy_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio @@ -9440,6 +9523,11 @@ async def test_get_iam_policy_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_get_iam_policy_from_dict(): @@ -9607,6 +9695,11 @@ def test_test_iam_permissions_field_headers(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] @pytest.mark.asyncio @@ -9638,6 +9731,11 @@ async def test_test_iam_permissions_field_headers_async(): # Establish that the field header was sent. _, _, kw = call.mock_calls[0] assert ("x-goog-request-params", "resource=resource/value",) in kw["metadata"] + if HAS_GOOGLE_API_CORE_VERSION_HEADER: # pragma: NO COVER + assert ( + version_header.API_VERSION_METADATA_KEY, + "v1_20240408", + ) in kw["metadata"] def test_test_iam_permissions_from_dict():