diff --git a/packages/google-cloud-compute/google/cloud/compute/__init__.py b/packages/google-cloud-compute/google/cloud/compute/__init__.py index 54c6e19c54b0..1667f83c457e 100644 --- a/packages/google-cloud-compute/google/cloud/compute/__init__.py +++ b/packages/google-cloud-compute/google/cloud/compute/__init__.py @@ -270,6 +270,7 @@ AddHealthCheckTargetPoolRequest, AddInstancesInstanceGroupRequest, AddInstanceTargetPoolRequest, + AddNetworkInterfaceInstanceRequest, AddNodesNodeGroupRequest, AddPacketMirroringRuleNetworkFirewallPolicyRequest, AddPeeringNetworkRequest, @@ -488,6 +489,7 @@ DeleteNetworkEdgeSecurityServiceRequest, DeleteNetworkEndpointGroupRequest, DeleteNetworkFirewallPolicyRequest, + DeleteNetworkInterfaceInstanceRequest, DeleteNetworkRequest, DeleteNodeGroupRequest, DeleteNodesNodeGroupRequest, @@ -1245,6 +1247,7 @@ NetworkProfile, NetworkProfileLocation, NetworkProfileNetworkFeatures, + NetworkProfileProfileType, NetworkProfilesListResponse, NetworkRoutingConfig, NetworksAddPeeringRequest, @@ -1520,6 +1523,7 @@ RouterNatRuleAction, RouterNatSubnetworkToNat, RouterNatSubnetworkToNat64, + RouterParams, RoutersGetRoutePolicyResponse, RoutersListBgpRoutes, RoutersListRoutePolicies, @@ -1798,12 +1802,15 @@ TargetVpnGatewaysScopedList, TCPHealthCheck, TestFailure, + TestIamPermissionsAddressRequest, TestIamPermissionsBackendBucketRequest, TestIamPermissionsBackendServiceRequest, TestIamPermissionsDiskRequest, TestIamPermissionsExternalVpnGatewayRequest, TestIamPermissionsFirewallPolicyRequest, + TestIamPermissionsGlobalAddressRequest, TestIamPermissionsImageRequest, + TestIamPermissionsInstanceGroupRequest, TestIamPermissionsInstanceRequest, TestIamPermissionsInstanceTemplateRequest, TestIamPermissionsInstantSnapshotRequest, @@ -1820,6 +1827,7 @@ TestIamPermissionsPacketMirroringRequest, TestIamPermissionsRegionBackendServiceRequest, TestIamPermissionsRegionDiskRequest, + TestIamPermissionsRegionInstanceGroupRequest, TestIamPermissionsRegionInstantSnapshotRequest, TestIamPermissionsRegionNetworkFirewallPolicyRequest, TestIamPermissionsReservationRequest, @@ -1828,6 +1836,8 @@ TestIamPermissionsSnapshotRequest, TestIamPermissionsStoragePoolRequest, TestIamPermissionsSubnetworkRequest, + TestIamPermissionsTargetInstanceRequest, + TestIamPermissionsTargetPoolRequest, TestIamPermissionsVpnGatewayRequest, TestPermissionsRequest, TestPermissionsResponse, @@ -1892,7 +1902,10 @@ VpnGatewayVpnGatewayInterface, VpnTunnel, VpnTunnelAggregatedList, + VpnTunnelCipherSuite, VpnTunnelList, + VpnTunnelPhase1Algorithms, + VpnTunnelPhase2Algorithms, VpnTunnelsScopedList, WafExpressionSet, WafExpressionSetExpression, @@ -2032,6 +2045,7 @@ "AddHealthCheckTargetPoolRequest", "AddInstancesInstanceGroupRequest", "AddInstanceTargetPoolRequest", + "AddNetworkInterfaceInstanceRequest", "AddNodesNodeGroupRequest", "AddPacketMirroringRuleNetworkFirewallPolicyRequest", "AddPeeringNetworkRequest", @@ -2250,6 +2264,7 @@ "DeleteNetworkEdgeSecurityServiceRequest", "DeleteNetworkEndpointGroupRequest", "DeleteNetworkFirewallPolicyRequest", + "DeleteNetworkInterfaceInstanceRequest", "DeleteNetworkRequest", "DeleteNodeGroupRequest", "DeleteNodesNodeGroupRequest", @@ -3007,6 +3022,7 @@ "NetworkProfile", "NetworkProfileLocation", "NetworkProfileNetworkFeatures", + "NetworkProfileProfileType", "NetworkProfilesListResponse", "NetworkRoutingConfig", "NetworksAddPeeringRequest", @@ -3282,6 +3298,7 @@ "RouterNatRuleAction", "RouterNatSubnetworkToNat", "RouterNatSubnetworkToNat64", + "RouterParams", "RoutersGetRoutePolicyResponse", "RoutersListBgpRoutes", "RoutersListRoutePolicies", @@ -3560,12 +3577,15 @@ "TargetVpnGatewaysScopedList", "TCPHealthCheck", "TestFailure", + "TestIamPermissionsAddressRequest", "TestIamPermissionsBackendBucketRequest", "TestIamPermissionsBackendServiceRequest", "TestIamPermissionsDiskRequest", "TestIamPermissionsExternalVpnGatewayRequest", "TestIamPermissionsFirewallPolicyRequest", + "TestIamPermissionsGlobalAddressRequest", "TestIamPermissionsImageRequest", + "TestIamPermissionsInstanceGroupRequest", "TestIamPermissionsInstanceRequest", "TestIamPermissionsInstanceTemplateRequest", "TestIamPermissionsInstantSnapshotRequest", @@ -3582,6 +3602,7 @@ "TestIamPermissionsPacketMirroringRequest", "TestIamPermissionsRegionBackendServiceRequest", "TestIamPermissionsRegionDiskRequest", + "TestIamPermissionsRegionInstanceGroupRequest", "TestIamPermissionsRegionInstantSnapshotRequest", "TestIamPermissionsRegionNetworkFirewallPolicyRequest", "TestIamPermissionsReservationRequest", @@ -3590,6 +3611,8 @@ "TestIamPermissionsSnapshotRequest", "TestIamPermissionsStoragePoolRequest", "TestIamPermissionsSubnetworkRequest", + "TestIamPermissionsTargetInstanceRequest", + "TestIamPermissionsTargetPoolRequest", "TestIamPermissionsVpnGatewayRequest", "TestPermissionsRequest", "TestPermissionsResponse", @@ -3654,7 +3677,10 @@ "VpnGatewayVpnGatewayInterface", "VpnTunnel", "VpnTunnelAggregatedList", + "VpnTunnelCipherSuite", "VpnTunnelList", + "VpnTunnelPhase1Algorithms", + "VpnTunnelPhase2Algorithms", "VpnTunnelsScopedList", "WafExpressionSet", "WafExpressionSetExpression", diff --git a/packages/google-cloud-compute/google/cloud/compute/gapic_version.py b/packages/google-cloud-compute/google/cloud/compute/gapic_version.py index 6b2628ca8e26..20a9cd975b02 100644 --- a/packages/google-cloud-compute/google/cloud/compute/gapic_version.py +++ b/packages/google-cloud-compute/google/cloud/compute/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.37.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/__init__.py b/packages/google-cloud-compute/google/cloud/compute_v1/__init__.py index ad70083613ae..356c8e33d716 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/__init__.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/__init__.py @@ -144,6 +144,7 @@ AddHealthCheckTargetPoolRequest, AddInstancesInstanceGroupRequest, AddInstanceTargetPoolRequest, + AddNetworkInterfaceInstanceRequest, AddNodesNodeGroupRequest, AddPacketMirroringRuleNetworkFirewallPolicyRequest, AddPeeringNetworkRequest, @@ -362,6 +363,7 @@ DeleteNetworkEdgeSecurityServiceRequest, DeleteNetworkEndpointGroupRequest, DeleteNetworkFirewallPolicyRequest, + DeleteNetworkInterfaceInstanceRequest, DeleteNetworkRequest, DeleteNodeGroupRequest, DeleteNodesNodeGroupRequest, @@ -1119,6 +1121,7 @@ NetworkProfile, NetworkProfileLocation, NetworkProfileNetworkFeatures, + NetworkProfileProfileType, NetworkProfilesListResponse, NetworkRoutingConfig, NetworksAddPeeringRequest, @@ -1394,6 +1397,7 @@ RouterNatRuleAction, RouterNatSubnetworkToNat, RouterNatSubnetworkToNat64, + RouterParams, RoutersGetRoutePolicyResponse, RoutersListBgpRoutes, RoutersListRoutePolicies, @@ -1672,12 +1676,15 @@ TargetVpnGatewaysScopedList, TCPHealthCheck, TestFailure, + TestIamPermissionsAddressRequest, TestIamPermissionsBackendBucketRequest, TestIamPermissionsBackendServiceRequest, TestIamPermissionsDiskRequest, TestIamPermissionsExternalVpnGatewayRequest, TestIamPermissionsFirewallPolicyRequest, + TestIamPermissionsGlobalAddressRequest, TestIamPermissionsImageRequest, + TestIamPermissionsInstanceGroupRequest, TestIamPermissionsInstanceRequest, TestIamPermissionsInstanceTemplateRequest, TestIamPermissionsInstantSnapshotRequest, @@ -1694,6 +1701,7 @@ TestIamPermissionsPacketMirroringRequest, TestIamPermissionsRegionBackendServiceRequest, TestIamPermissionsRegionDiskRequest, + TestIamPermissionsRegionInstanceGroupRequest, TestIamPermissionsRegionInstantSnapshotRequest, TestIamPermissionsRegionNetworkFirewallPolicyRequest, TestIamPermissionsReservationRequest, @@ -1702,6 +1710,8 @@ TestIamPermissionsSnapshotRequest, TestIamPermissionsStoragePoolRequest, TestIamPermissionsSubnetworkRequest, + TestIamPermissionsTargetInstanceRequest, + TestIamPermissionsTargetPoolRequest, TestIamPermissionsVpnGatewayRequest, TestPermissionsRequest, TestPermissionsResponse, @@ -1766,7 +1776,10 @@ VpnGatewayVpnGatewayInterface, VpnTunnel, VpnTunnelAggregatedList, + VpnTunnelCipherSuite, VpnTunnelList, + VpnTunnelPhase1Algorithms, + VpnTunnelPhase2Algorithms, VpnTunnelsScopedList, WafExpressionSet, WafExpressionSetExpression, @@ -1805,6 +1818,7 @@ "AddHealthCheckTargetPoolRequest", "AddInstanceTargetPoolRequest", "AddInstancesInstanceGroupRequest", + "AddNetworkInterfaceInstanceRequest", "AddNodesNodeGroupRequest", "AddPacketMirroringRuleNetworkFirewallPolicyRequest", "AddPeeringNetworkRequest", @@ -2026,6 +2040,7 @@ "DeleteNetworkEdgeSecurityServiceRequest", "DeleteNetworkEndpointGroupRequest", "DeleteNetworkFirewallPolicyRequest", + "DeleteNetworkInterfaceInstanceRequest", "DeleteNetworkRequest", "DeleteNodeGroupRequest", "DeleteNodeTemplateRequest", @@ -2819,6 +2834,7 @@ "NetworkProfile", "NetworkProfileLocation", "NetworkProfileNetworkFeatures", + "NetworkProfileProfileType", "NetworkProfilesClient", "NetworkProfilesListResponse", "NetworkRoutingConfig", @@ -3132,6 +3148,7 @@ "RouterNatRuleAction", "RouterNatSubnetworkToNat", "RouterNatSubnetworkToNat64", + "RouterParams", "RouterStatus", "RouterStatusBgpPeerStatus", "RouterStatusNatStatus", @@ -3429,12 +3446,15 @@ "TargetVpnGatewaysClient", "TargetVpnGatewaysScopedList", "TestFailure", + "TestIamPermissionsAddressRequest", "TestIamPermissionsBackendBucketRequest", "TestIamPermissionsBackendServiceRequest", "TestIamPermissionsDiskRequest", "TestIamPermissionsExternalVpnGatewayRequest", "TestIamPermissionsFirewallPolicyRequest", + "TestIamPermissionsGlobalAddressRequest", "TestIamPermissionsImageRequest", + "TestIamPermissionsInstanceGroupRequest", "TestIamPermissionsInstanceRequest", "TestIamPermissionsInstanceTemplateRequest", "TestIamPermissionsInstantSnapshotRequest", @@ -3451,6 +3471,7 @@ "TestIamPermissionsPacketMirroringRequest", "TestIamPermissionsRegionBackendServiceRequest", "TestIamPermissionsRegionDiskRequest", + "TestIamPermissionsRegionInstanceGroupRequest", "TestIamPermissionsRegionInstantSnapshotRequest", "TestIamPermissionsRegionNetworkFirewallPolicyRequest", "TestIamPermissionsReservationRequest", @@ -3459,6 +3480,8 @@ "TestIamPermissionsSnapshotRequest", "TestIamPermissionsStoragePoolRequest", "TestIamPermissionsSubnetworkRequest", + "TestIamPermissionsTargetInstanceRequest", + "TestIamPermissionsTargetPoolRequest", "TestIamPermissionsVpnGatewayRequest", "TestPermissionsRequest", "TestPermissionsResponse", @@ -3525,7 +3548,10 @@ "VpnGatewaysScopedList", "VpnTunnel", "VpnTunnelAggregatedList", + "VpnTunnelCipherSuite", "VpnTunnelList", + "VpnTunnelPhase1Algorithms", + "VpnTunnelPhase2Algorithms", "VpnTunnelsClient", "VpnTunnelsScopedList", "WafExpressionSet", diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/gapic_metadata.json b/packages/google-cloud-compute/google/cloud/compute_v1/gapic_metadata.json index 28e6e44eccf3..2efeb36f3997 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/gapic_metadata.json +++ b/packages/google-cloud-compute/google/cloud/compute_v1/gapic_metadata.json @@ -68,6 +68,11 @@ "methods": [ "set_labels" ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] } } } @@ -663,6 +668,11 @@ "methods": [ "set_labels" ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] } } } @@ -1182,6 +1192,11 @@ "methods": [ "set_named_ports" ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] } } } @@ -1265,6 +1280,11 @@ "add_access_config" ] }, + "AddNetworkInterface": { + "methods": [ + "add_network_interface" + ] + }, "AddResourcePolicies": { "methods": [ "add_resource_policies" @@ -1295,6 +1315,11 @@ "delete_access_config" ] }, + "DeleteNetworkInterface": { + "methods": [ + "delete_network_interface" + ] + }, "DetachDisk": { "methods": [ "detach_disk" @@ -3141,6 +3166,11 @@ "methods": [ "set_named_ports" ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] } } } @@ -4631,6 +4661,11 @@ "methods": [ "set_security_policy" ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] } } } @@ -4700,6 +4735,11 @@ "methods": [ "set_security_policy" ] + }, + "TestIamPermissions": { + "methods": [ + "test_iam_permissions" + ] } } } diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py b/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py index 6b2628ca8e26..20a9cd975b02 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.37.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py index 36c3987f1652..910356c727af 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py @@ -2306,6 +2306,157 @@ def error_code(self): # Done; return the response. return response + def test_iam_permissions( + self, + request: Optional[Union[compute.TestIamPermissionsAddressRequest, dict]] = None, + *, + project: Optional[str] = None, + region: Optional[str] = None, + resource: Optional[str] = None, + test_permissions_request_resource: Optional[ + compute.TestPermissionsRequest + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Returns permissions that a caller has on the + specified resource. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_test_iam_permissions(): + # Create a client + client = compute_v1.AddressesClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsAddressRequest( + project="project_value", + region="region_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.TestIamPermissionsAddressRequest, dict]): + The request object. A request message for + Addresses.TestIamPermissions. See the + method description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + region (str): + The name of the region for this + request. + + This corresponds to the ``region`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + resource (str): + Name or id of the resource for this + request. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + This corresponds to the ``test_permissions_request_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.compute_v1.types.TestPermissionsResponse: + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [ + project, + region, + resource, + test_permissions_request_resource, + ] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.TestIamPermissionsAddressRequest): + request = compute.TestIamPermissionsAddressRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if region is not None: + request.region = region + if resource is not None: + request.resource = resource + if test_permissions_request_resource is not None: + request.test_permissions_request_resource = ( + test_permissions_request_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.test_iam_permissions] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("region", request.region), + ("resource", request.resource), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + def __enter__(self) -> "AddressesClient": return self diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/base.py index e3a18375481e..eaa840a43404 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/base.py @@ -172,6 +172,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.test_iam_permissions: gapic_v1.method.wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), } def close(self): @@ -245,6 +250,17 @@ def set_labels( ]: raise NotImplementedError() + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsAddressRequest], + Union[ + compute.TestPermissionsResponse, Awaitable[compute.TestPermissionsResponse] + ], + ]: + raise NotImplementedError() + @property def kind(self) -> str: raise NotImplementedError() diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest.py index 5bb788612d3e..61bdc52e0eac 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest.py @@ -128,6 +128,14 @@ def post_set_labels(self, response): logging.log(f"Received response: {response}") return response + def pre_test_iam_permissions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_test_iam_permissions(self, response): + logging.log(f"Received response: {response}") + return response + transport = AddressesRestTransport(interceptor=MyCustomAddressesInterceptor()) client = AddressesClient(transport=transport) @@ -448,6 +456,57 @@ def post_set_labels_with_metadata( """ return response, metadata + def pre_test_iam_permissions( + self, + request: compute.TestIamPermissionsAddressRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestIamPermissionsAddressRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the request or metadata + before they are sent to the Addresses server. + """ + return request, metadata + + def post_test_iam_permissions( + self, response: compute.TestPermissionsResponse + ) -> compute.TestPermissionsResponse: + """Post-rpc interceptor for test_iam_permissions + + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the Addresses server but before + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. + """ + return response + + def post_test_iam_permissions_with_metadata( + self, + response: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Addresses server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AddressesRestStub: @@ -1645,6 +1704,160 @@ def __call__( ) return resp + class _TestIamPermissions( + _BaseAddressesRestTransport._BaseTestIamPermissions, AddressesRestStub + ): + def __hash__(self): + return hash("AddressesRestTransport.TestIamPermissions") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__( + self, + request: compute.TestIamPermissionsAddressRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Call the test iam permissions method over HTTP. + + Args: + request (~.compute.TestIamPermissionsAddressRequest): + The request object. A request message for + Addresses.TestIamPermissions. See the + method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.TestPermissionsResponse: + + """ + + http_options = ( + _BaseAddressesRestTransport._BaseTestIamPermissions._get_http_options() + ) + + request, metadata = self._interceptor.pre_test_iam_permissions( + request, metadata + ) + transcoded_request = _BaseAddressesRestTransport._BaseTestIamPermissions._get_transcoded_request( + http_options, request + ) + + body = _BaseAddressesRestTransport._BaseTestIamPermissions._get_request_body_json( + transcoded_request + ) + + # Jsonify the query params + query_params = _BaseAddressesRestTransport._BaseTestIamPermissions._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.AddressesClient.TestIamPermissions", + extra={ + "serviceName": "google.cloud.compute.v1.Addresses", + "rpcName": "TestIamPermissions", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = AddressesRestTransport._TestIamPermissions._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.TestPermissionsResponse() + pb_resp = compute.TestPermissionsResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.TestPermissionsResponse.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.AddressesClient.test_iam_permissions", + extra={ + "serviceName": "google.cloud.compute.v1.Addresses", + "rpcName": "TestIamPermissions", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + @property def aggregated_list( self, @@ -1693,6 +1906,16 @@ def set_labels( # In C++ this would require a dynamic_cast return self._SetLabels(self._session, self._host, self._interceptor) # type: ignore + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsAddressRequest], compute.TestPermissionsResponse + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._TestIamPermissions(self._session, self._host, self._interceptor) # type: ignore + @property def kind(self) -> str: return "rest" diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest_base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest_base.py index a7cce469b441..075030ea9b2d 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest_base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest_base.py @@ -439,5 +439,61 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseTestIamPermissions: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/regions/{region}/addresses/{resource}/testIamPermissions", + "body": "test_permissions_request_resource", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.TestIamPermissionsAddressRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], use_integers_for_enums=False + ) + return body + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseAddressesRestTransport._BaseTestIamPermissions._get_unset_required_fields( + query_params + ) + ) + + return query_params + __all__ = ("_BaseAddressesRestTransport",) diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py index a6378859a255..c0a138310747 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py @@ -2060,6 +2060,142 @@ def error_code(self): # Done; return the response. return response + def test_iam_permissions( + self, + request: Optional[ + Union[compute.TestIamPermissionsGlobalAddressRequest, dict] + ] = None, + *, + project: Optional[str] = None, + resource: Optional[str] = None, + test_permissions_request_resource: Optional[ + compute.TestPermissionsRequest + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Returns permissions that a caller has on the + specified resource. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_test_iam_permissions(): + # Create a client + client = compute_v1.GlobalAddressesClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsGlobalAddressRequest( + project="project_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.TestIamPermissionsGlobalAddressRequest, dict]): + The request object. A request message for + GlobalAddresses.TestIamPermissions. See + the method description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + resource (str): + Name or id of the resource for this + request. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + This corresponds to the ``test_permissions_request_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.compute_v1.types.TestPermissionsResponse: + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [project, resource, test_permissions_request_resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.TestIamPermissionsGlobalAddressRequest): + request = compute.TestIamPermissionsGlobalAddressRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if resource is not None: + request.resource = resource + if test_permissions_request_resource is not None: + request.test_permissions_request_resource = ( + test_permissions_request_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.test_iam_permissions] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("resource", request.resource), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + def __enter__(self) -> "GlobalAddressesClient": return self diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/base.py index 590cb3c18267..24db720ad812 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/base.py @@ -167,6 +167,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.test_iam_permissions: gapic_v1.method.wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), } def close(self): @@ -232,6 +237,17 @@ def set_labels( ]: raise NotImplementedError() + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsGlobalAddressRequest], + Union[ + compute.TestPermissionsResponse, Awaitable[compute.TestPermissionsResponse] + ], + ]: + raise NotImplementedError() + @property def kind(self) -> str: raise NotImplementedError() diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py index 9e262b8cab92..9c2ed5b87a71 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py @@ -120,6 +120,14 @@ def post_set_labels(self, response): logging.log(f"Received response: {response}") return response + def pre_test_iam_permissions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_test_iam_permissions(self, response): + logging.log(f"Received response: {response}") + return response + transport = GlobalAddressesRestTransport(interceptor=MyCustomGlobalAddressesInterceptor()) client = GlobalAddressesClient(transport=transport) @@ -402,6 +410,57 @@ def post_set_labels_with_metadata( """ return response, metadata + def pre_test_iam_permissions( + self, + request: compute.TestIamPermissionsGlobalAddressRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestIamPermissionsGlobalAddressRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the request or metadata + before they are sent to the GlobalAddresses server. + """ + return request, metadata + + def post_test_iam_permissions( + self, response: compute.TestPermissionsResponse + ) -> compute.TestPermissionsResponse: + """Post-rpc interceptor for test_iam_permissions + + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the GlobalAddresses server but before + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. + """ + return response + + def post_test_iam_permissions_with_metadata( + self, + response: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalAddresses server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GlobalAddressesRestStub: @@ -1474,6 +1533,161 @@ def __call__( ) return resp + class _TestIamPermissions( + _BaseGlobalAddressesRestTransport._BaseTestIamPermissions, + GlobalAddressesRestStub, + ): + def __hash__(self): + return hash("GlobalAddressesRestTransport.TestIamPermissions") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__( + self, + request: compute.TestIamPermissionsGlobalAddressRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Call the test iam permissions method over HTTP. + + Args: + request (~.compute.TestIamPermissionsGlobalAddressRequest): + The request object. A request message for + GlobalAddresses.TestIamPermissions. See + the method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.TestPermissionsResponse: + + """ + + http_options = ( + _BaseGlobalAddressesRestTransport._BaseTestIamPermissions._get_http_options() + ) + + request, metadata = self._interceptor.pre_test_iam_permissions( + request, metadata + ) + transcoded_request = _BaseGlobalAddressesRestTransport._BaseTestIamPermissions._get_transcoded_request( + http_options, request + ) + + body = _BaseGlobalAddressesRestTransport._BaseTestIamPermissions._get_request_body_json( + transcoded_request + ) + + # Jsonify the query params + query_params = _BaseGlobalAddressesRestTransport._BaseTestIamPermissions._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.GlobalAddressesClient.TestIamPermissions", + extra={ + "serviceName": "google.cloud.compute.v1.GlobalAddresses", + "rpcName": "TestIamPermissions", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = GlobalAddressesRestTransport._TestIamPermissions._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.TestPermissionsResponse() + pb_resp = compute.TestPermissionsResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.TestPermissionsResponse.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.GlobalAddressesClient.test_iam_permissions", + extra={ + "serviceName": "google.cloud.compute.v1.GlobalAddresses", + "rpcName": "TestIamPermissions", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + @property def delete( self, @@ -1518,6 +1732,17 @@ def set_labels( # In C++ this would require a dynamic_cast return self._SetLabels(self._session, self._host, self._interceptor) # type: ignore + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsGlobalAddressRequest], + compute.TestPermissionsResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._TestIamPermissions(self._session, self._host, self._interceptor) # type: ignore + @property def kind(self) -> str: return "rest" diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest_base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest_base.py index 9f87882557b3..d1cdfa2b9521 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest_base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest_base.py @@ -393,5 +393,61 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseTestIamPermissions: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/global/addresses/{resource}/testIamPermissions", + "body": "test_permissions_request_resource", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.TestIamPermissionsGlobalAddressRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], use_integers_for_enums=False + ) + return body + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseGlobalAddressesRestTransport._BaseTestIamPermissions._get_unset_required_fields( + query_params + ) + ) + + return query_params + __all__ = ("_BaseGlobalAddressesRestTransport",) diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py index 62f85b229c24..cfce5a0a389a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py @@ -2878,6 +2878,154 @@ def error_code(self): # Done; return the response. return response + def test_iam_permissions( + self, + request: Optional[ + Union[compute.TestIamPermissionsInstanceGroupRequest, dict] + ] = None, + *, + project: Optional[str] = None, + zone: Optional[str] = None, + resource: Optional[str] = None, + test_permissions_request_resource: Optional[ + compute.TestPermissionsRequest + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Returns permissions that a caller has on the + specified resource. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_test_iam_permissions(): + # Create a client + client = compute_v1.InstanceGroupsClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsInstanceGroupRequest( + project="project_value", + resource="resource_value", + zone="zone_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.TestIamPermissionsInstanceGroupRequest, dict]): + The request object. A request message for + InstanceGroups.TestIamPermissions. See + the method description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + zone (str): + The name of the zone for this + request. + + This corresponds to the ``zone`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + resource (str): + Name or id of the resource for this + request. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + This corresponds to the ``test_permissions_request_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.compute_v1.types.TestPermissionsResponse: + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [project, zone, resource, test_permissions_request_resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.TestIamPermissionsInstanceGroupRequest): + request = compute.TestIamPermissionsInstanceGroupRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if zone is not None: + request.zone = zone + if resource is not None: + request.resource = resource + if test_permissions_request_resource is not None: + request.test_permissions_request_resource = ( + test_permissions_request_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.test_iam_permissions] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("zone", request.zone), + ("resource", request.resource), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + def __enter__(self) -> "InstanceGroupsClient": return self diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/base.py index 5d52dbecf66b..1f0a29a34f39 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/base.py @@ -182,6 +182,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.test_iam_permissions: gapic_v1.method.wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), } def close(self): @@ -280,6 +285,17 @@ def set_named_ports( ]: raise NotImplementedError() + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsInstanceGroupRequest], + Union[ + compute.TestPermissionsResponse, Awaitable[compute.TestPermissionsResponse] + ], + ]: + raise NotImplementedError() + @property def kind(self) -> str: raise NotImplementedError() diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py index 5a2a5f201039..5d2f353369c2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py @@ -144,6 +144,14 @@ def post_set_named_ports(self, response): logging.log(f"Received response: {response}") return response + def pre_test_iam_permissions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_test_iam_permissions(self, response): + logging.log(f"Received response: {response}") + return response + transport = InstanceGroupsRestTransport(interceptor=MyCustomInstanceGroupsInterceptor()) client = InstanceGroupsClient(transport=transport) @@ -579,6 +587,57 @@ def post_set_named_ports_with_metadata( """ return response, metadata + def pre_test_iam_permissions( + self, + request: compute.TestIamPermissionsInstanceGroupRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestIamPermissionsInstanceGroupRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the request or metadata + before they are sent to the InstanceGroups server. + """ + return request, metadata + + def post_test_iam_permissions( + self, response: compute.TestPermissionsResponse + ) -> compute.TestPermissionsResponse: + """Post-rpc interceptor for test_iam_permissions + + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the InstanceGroups server but before + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. + """ + return response + + def post_test_iam_permissions_with_metadata( + self, + response: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InstanceGroupsRestStub: @@ -2121,6 +2180,160 @@ def __call__( ) return resp + class _TestIamPermissions( + _BaseInstanceGroupsRestTransport._BaseTestIamPermissions, InstanceGroupsRestStub + ): + def __hash__(self): + return hash("InstanceGroupsRestTransport.TestIamPermissions") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__( + self, + request: compute.TestIamPermissionsInstanceGroupRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Call the test iam permissions method over HTTP. + + Args: + request (~.compute.TestIamPermissionsInstanceGroupRequest): + The request object. A request message for + InstanceGroups.TestIamPermissions. See + the method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.TestPermissionsResponse: + + """ + + http_options = ( + _BaseInstanceGroupsRestTransport._BaseTestIamPermissions._get_http_options() + ) + + request, metadata = self._interceptor.pre_test_iam_permissions( + request, metadata + ) + transcoded_request = _BaseInstanceGroupsRestTransport._BaseTestIamPermissions._get_transcoded_request( + http_options, request + ) + + body = _BaseInstanceGroupsRestTransport._BaseTestIamPermissions._get_request_body_json( + transcoded_request + ) + + # Jsonify the query params + query_params = _BaseInstanceGroupsRestTransport._BaseTestIamPermissions._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.InstanceGroupsClient.TestIamPermissions", + extra={ + "serviceName": "google.cloud.compute.v1.InstanceGroups", + "rpcName": "TestIamPermissions", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = InstanceGroupsRestTransport._TestIamPermissions._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.TestPermissionsResponse() + pb_resp = compute.TestPermissionsResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.TestPermissionsResponse.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.InstanceGroupsClient.test_iam_permissions", + extra={ + "serviceName": "google.cloud.compute.v1.InstanceGroups", + "rpcName": "TestIamPermissions", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + @property def add_instances( self, @@ -2197,6 +2410,17 @@ def set_named_ports( # In C++ this would require a dynamic_cast return self._SetNamedPorts(self._session, self._host, self._interceptor) # type: ignore + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsInstanceGroupRequest], + compute.TestPermissionsResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._TestIamPermissions(self._session, self._host, self._interceptor) # type: ignore + @property def kind(self) -> str: return "rest" diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest_base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest_base.py index 2d2f08899529..03b81a94c67c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest_base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest_base.py @@ -551,5 +551,61 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseTestIamPermissions: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{resource}/testIamPermissions", + "body": "test_permissions_request_resource", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.TestIamPermissionsInstanceGroupRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], use_integers_for_enums=False + ) + return body + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseInstanceGroupsRestTransport._BaseTestIamPermissions._get_unset_required_fields( + query_params + ) + ) + + return query_params + __all__ = ("_BaseInstanceGroupsRestTransport",) diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/client.py index a080867d7223..35bc79361b1e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/client.py @@ -1028,25 +1028,22 @@ def error_code(self): # Done; return the response. return response - def add_resource_policies_unary( + def add_network_interface_unary( self, request: Optional[ - Union[compute.AddResourcePoliciesInstanceRequest, dict] + Union[compute.AddNetworkInterfaceInstanceRequest, dict] ] = None, *, project: Optional[str] = None, zone: Optional[str] = None, instance: Optional[str] = None, - instances_add_resource_policies_request_resource: Optional[ - compute.InstancesAddResourcePoliciesRequest - ] = None, + network_interface_resource: Optional[compute.NetworkInterface] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> compute.Operation: - r"""Adds existing resource policies to an instance. You - can only add one policy right now which will be applied - to this instance for scheduling live migrations. + r"""Adds one dynamic network interface to an active + instance. .. code-block:: python @@ -1059,27 +1056,27 @@ def add_resource_policies_unary( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_add_resource_policies(): + def sample_add_network_interface(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.AddResourcePoliciesInstanceRequest( + request = compute_v1.AddNetworkInterfaceInstanceRequest( instance="instance_value", project="project_value", zone="zone_value", ) # Make the request - response = client.add_resource_policies(request=request) + response = client.add_network_interface(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.AddResourcePoliciesInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.AddNetworkInterfaceInstanceRequest, dict]): The request object. A request message for - Instances.AddResourcePolicies. See the + Instances.AddNetworkInterface. See the method description for details. project (str): Project ID for this request. @@ -1094,13 +1091,16 @@ def sample_add_resource_policies(): on the ``request`` instance; if ``request`` is provided, this should not be set. instance (str): - The instance name for this request. + The instance name for this request stored as + resource_id. Name should conform to RFC1035 or be an + unsigned long integer. + This corresponds to the ``instance`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - instances_add_resource_policies_request_resource (google.cloud.compute_v1.types.InstancesAddResourcePoliciesRequest): + network_interface_resource (google.cloud.compute_v1.types.NetworkInterface): The body resource for this request - This corresponds to the ``instances_add_resource_policies_request_resource`` field + This corresponds to the ``network_interface_resource`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -1120,12 +1120,7 @@ def sample_add_resource_policies(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [ - project, - zone, - instance, - instances_add_resource_policies_request_resource, - ] + flattened_params = [project, zone, instance, network_interface_resource] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -1137,8 +1132,8 @@ def sample_add_resource_policies(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.AddResourcePoliciesInstanceRequest): - request = compute.AddResourcePoliciesInstanceRequest(request) + if not isinstance(request, compute.AddNetworkInterfaceInstanceRequest): + request = compute.AddNetworkInterfaceInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: @@ -1147,14 +1142,12 @@ def sample_add_resource_policies(): request.zone = zone if instance is not None: request.instance = instance - if instances_add_resource_policies_request_resource is not None: - request.instances_add_resource_policies_request_resource = ( - instances_add_resource_policies_request_resource - ) + if network_interface_resource is not None: + request.network_interface_resource = network_interface_resource # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.add_resource_policies] + rpc = self._transport._wrapped_methods[self._transport.add_network_interface] # Certain fields should be provided within the metadata header; # add these here. @@ -1182,25 +1175,22 @@ def sample_add_resource_policies(): # Done; return the response. return response - def add_resource_policies( + def add_network_interface( self, request: Optional[ - Union[compute.AddResourcePoliciesInstanceRequest, dict] + Union[compute.AddNetworkInterfaceInstanceRequest, dict] ] = None, *, project: Optional[str] = None, zone: Optional[str] = None, instance: Optional[str] = None, - instances_add_resource_policies_request_resource: Optional[ - compute.InstancesAddResourcePoliciesRequest - ] = None, + network_interface_resource: Optional[compute.NetworkInterface] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> extended_operation.ExtendedOperation: - r"""Adds existing resource policies to an instance. You - can only add one policy right now which will be applied - to this instance for scheduling live migrations. + r"""Adds one dynamic network interface to an active + instance. .. code-block:: python @@ -1213,27 +1203,27 @@ def add_resource_policies( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_add_resource_policies(): + def sample_add_network_interface(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.AddResourcePoliciesInstanceRequest( + request = compute_v1.AddNetworkInterfaceInstanceRequest( instance="instance_value", project="project_value", zone="zone_value", ) # Make the request - response = client.add_resource_policies(request=request) + response = client.add_network_interface(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.AddResourcePoliciesInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.AddNetworkInterfaceInstanceRequest, dict]): The request object. A request message for - Instances.AddResourcePolicies. See the + Instances.AddNetworkInterface. See the method description for details. project (str): Project ID for this request. @@ -1248,13 +1238,16 @@ def sample_add_resource_policies(): on the ``request`` instance; if ``request`` is provided, this should not be set. instance (str): - The instance name for this request. + The instance name for this request stored as + resource_id. Name should conform to RFC1035 or be an + unsigned long integer. + This corresponds to the ``instance`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - instances_add_resource_policies_request_resource (google.cloud.compute_v1.types.InstancesAddResourcePoliciesRequest): + network_interface_resource (google.cloud.compute_v1.types.NetworkInterface): The body resource for this request - This corresponds to the ``instances_add_resource_policies_request_resource`` field + This corresponds to the ``network_interface_resource`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -1274,12 +1267,7 @@ def sample_add_resource_policies(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [ - project, - zone, - instance, - instances_add_resource_policies_request_resource, - ] + flattened_params = [project, zone, instance, network_interface_resource] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -1291,8 +1279,8 @@ def sample_add_resource_policies(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.AddResourcePoliciesInstanceRequest): - request = compute.AddResourcePoliciesInstanceRequest(request) + if not isinstance(request, compute.AddNetworkInterfaceInstanceRequest): + request = compute.AddNetworkInterfaceInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: @@ -1301,14 +1289,12 @@ def sample_add_resource_policies(): request.zone = zone if instance is not None: request.instance = instance - if instances_add_resource_policies_request_resource is not None: - request.instances_add_resource_policies_request_resource = ( - instances_add_resource_policies_request_resource - ) + if network_interface_resource is not None: + request.network_interface_resource = network_interface_resource # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.add_resource_policies] + rpc = self._transport._wrapped_methods[self._transport.add_network_interface] # Certain fields should be provided within the metadata header; # add these here. @@ -1361,21 +1347,25 @@ def error_code(self): # Done; return the response. return response - def aggregated_list( + def add_resource_policies_unary( self, - request: Optional[Union[compute.AggregatedListInstancesRequest, dict]] = None, + request: Optional[ + Union[compute.AddResourcePoliciesInstanceRequest, dict] + ] = None, *, project: Optional[str] = None, + zone: Optional[str] = None, + instance: Optional[str] = None, + instances_add_resource_policies_request_resource: Optional[ + compute.InstancesAddResourcePoliciesRequest + ] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), - ) -> pagers.AggregatedListPager: - r"""Retrieves an aggregated list of all of the instances in your - project across all regions and zones. The performance of this - method degrades when a filter is specified on a project that has - a very large number of instances. To prevent failure, Google - recommends that you set the ``returnPartialSuccess`` parameter - to ``true``. + ) -> compute.Operation: + r"""Adds existing resource policies to an instance. You + can only add one policy right now which will be applied + to this instance for scheduling live migrations. .. code-block:: python @@ -1388,32 +1378,50 @@ def aggregated_list( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_aggregated_list(): + def sample_add_resource_policies(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.AggregatedListInstancesRequest( + request = compute_v1.AddResourcePoliciesInstanceRequest( + instance="instance_value", project="project_value", + zone="zone_value", ) # Make the request - page_result = client.aggregated_list(request=request) + response = client.add_resource_policies(request=request) # Handle the response - for response in page_result: - print(response) + print(response) Args: - request (Union[google.cloud.compute_v1.types.AggregatedListInstancesRequest, dict]): + request (Union[google.cloud.compute_v1.types.AddResourcePoliciesInstanceRequest, dict]): The request object. A request message for - Instances.AggregatedList. See the method - description for details. + Instances.AddResourcePolicies. See the + method description for details. project (str): Project ID for this request. This corresponds to the ``project`` field on the ``request`` instance; if ``request`` is provided, this should not be set. + zone (str): + The name of the zone for this + request. + + This corresponds to the ``zone`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + instance (str): + The instance name for this request. + This corresponds to the ``instance`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + instances_add_resource_policies_request_resource (google.cloud.compute_v1.types.InstancesAddResourcePoliciesRequest): + The body resource for this request + This corresponds to the ``instances_add_resource_policies_request_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, should be retried. timeout (float): The timeout for this request. @@ -1423,16 +1431,20 @@ def sample_aggregated_list(): be of type `bytes`. Returns: - google.cloud.compute_v1.services.instances.pagers.AggregatedListPager: - Iterating over this object will yield - results and resolve additional pages - automatically. + google.api_core.extended_operation.ExtendedOperation: + An object representing a extended + long-running operation. """ # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project] + flattened_params = [ + project, + zone, + instance, + instances_add_resource_policies_request_resource, + ] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -1444,21 +1456,35 @@ def sample_aggregated_list(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.AggregatedListInstancesRequest): - request = compute.AggregatedListInstancesRequest(request) + if not isinstance(request, compute.AddResourcePoliciesInstanceRequest): + request = compute.AddResourcePoliciesInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: request.project = project + if zone is not None: + request.zone = zone + if instance is not None: + request.instance = instance + if instances_add_resource_policies_request_resource is not None: + request.instances_add_resource_policies_request_resource = ( + instances_add_resource_policies_request_resource + ) # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.aggregated_list] + rpc = self._transport._wrapped_methods[self._transport.add_resource_policies] # Certain fields should be provided within the metadata header; # add these here. metadata = tuple(metadata) + ( - gapic_v1.routing_header.to_grpc_metadata((("project", request.project),)), + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("zone", request.zone), + ("instance", request.instance), + ) + ), ) # Validate the universe domain. @@ -1472,37 +1498,28 @@ def sample_aggregated_list(): metadata=metadata, ) - # This method is paged; wrap the response in a pager, which provides - # an `__iter__` convenience method. - response = pagers.AggregatedListPager( - method=rpc, - request=request, - response=response, - retry=retry, - timeout=timeout, - metadata=metadata, - ) - # Done; return the response. return response - def attach_disk_unary( + def add_resource_policies( self, - request: Optional[Union[compute.AttachDiskInstanceRequest, dict]] = None, + request: Optional[ + Union[compute.AddResourcePoliciesInstanceRequest, dict] + ] = None, *, project: Optional[str] = None, zone: Optional[str] = None, instance: Optional[str] = None, - attached_disk_resource: Optional[compute.AttachedDisk] = None, + instances_add_resource_policies_request_resource: Optional[ + compute.InstancesAddResourcePoliciesRequest + ] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), - ) -> compute.Operation: - r"""Attaches an existing Disk resource to an instance. - You must first create the disk before you can attach it. - It is not possible to create and attach a disk at the - same time. For more information, read Adding a - persistent disk to your instance. + ) -> extended_operation.ExtendedOperation: + r"""Adds existing resource policies to an instance. You + can only add one policy right now which will be applied + to this instance for scheduling live migrations. .. code-block:: python @@ -1515,28 +1532,28 @@ def attach_disk_unary( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_attach_disk(): + def sample_add_resource_policies(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.AttachDiskInstanceRequest( + request = compute_v1.AddResourcePoliciesInstanceRequest( instance="instance_value", project="project_value", zone="zone_value", ) # Make the request - response = client.attach_disk(request=request) + response = client.add_resource_policies(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.AttachDiskInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.AddResourcePoliciesInstanceRequest, dict]): The request object. A request message for - Instances.AttachDisk. See the method - description for details. + Instances.AddResourcePolicies. See the + method description for details. project (str): Project ID for this request. This corresponds to the ``project`` field @@ -1554,9 +1571,9 @@ def sample_attach_disk(): This corresponds to the ``instance`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - attached_disk_resource (google.cloud.compute_v1.types.AttachedDisk): + instances_add_resource_policies_request_resource (google.cloud.compute_v1.types.InstancesAddResourcePoliciesRequest): The body resource for this request - This corresponds to the ``attached_disk_resource`` field + This corresponds to the ``instances_add_resource_policies_request_resource`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -1576,7 +1593,12 @@ def sample_attach_disk(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project, zone, instance, attached_disk_resource] + flattened_params = [ + project, + zone, + instance, + instances_add_resource_policies_request_resource, + ] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -1588,8 +1610,8 @@ def sample_attach_disk(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.AttachDiskInstanceRequest): - request = compute.AttachDiskInstanceRequest(request) + if not isinstance(request, compute.AddResourcePoliciesInstanceRequest): + request = compute.AddResourcePoliciesInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: @@ -1598,12 +1620,14 @@ def sample_attach_disk(): request.zone = zone if instance is not None: request.instance = instance - if attached_disk_resource is not None: - request.attached_disk_resource = attached_disk_resource + if instances_add_resource_policies_request_resource is not None: + request.instances_add_resource_policies_request_resource = ( + instances_add_resource_policies_request_resource + ) # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.attach_disk] + rpc = self._transport._wrapped_methods[self._transport.add_resource_policies] # Certain fields should be provided within the metadata header; # add these here. @@ -1628,10 +1652,160 @@ def sample_attach_disk(): metadata=metadata, ) + operation_service = self._transport._zone_operations_client + operation_request = compute.GetZoneOperationRequest() + operation_request.project = request.project + operation_request.zone = request.zone + operation_request.operation = response.name + + get_operation = functools.partial(operation_service.get, operation_request) + # Cancel is not part of extended operations yet. + cancel_operation = lambda: None + + # Note: this class is an implementation detail to provide a uniform + # set of names for certain fields in the extended operation proto message. + # See google.api_core.extended_operation.ExtendedOperation for details + # on these properties and the expected interface. + class _CustomOperation(extended_operation.ExtendedOperation): + @property + def error_message(self): + return self._extended_operation.http_error_message + + @property + def error_code(self): + return self._extended_operation.http_error_status_code + + response = _CustomOperation.make(get_operation, cancel_operation, response) + # Done; return the response. return response - def attach_disk( + def aggregated_list( + self, + request: Optional[Union[compute.AggregatedListInstancesRequest, dict]] = None, + *, + project: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> pagers.AggregatedListPager: + r"""Retrieves an aggregated list of all of the instances in your + project across all regions and zones. The performance of this + method degrades when a filter is specified on a project that has + a very large number of instances. To prevent failure, Google + recommends that you set the ``returnPartialSuccess`` parameter + to ``true``. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_aggregated_list(): + # Create a client + client = compute_v1.InstancesClient() + + # Initialize request argument(s) + request = compute_v1.AggregatedListInstancesRequest( + project="project_value", + ) + + # Make the request + page_result = client.aggregated_list(request=request) + + # Handle the response + for response in page_result: + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.AggregatedListInstancesRequest, dict]): + The request object. A request message for + Instances.AggregatedList. See the method + description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.compute_v1.services.instances.pagers.AggregatedListPager: + Iterating over this object will yield + results and resolve additional pages + automatically. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [project] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.AggregatedListInstancesRequest): + request = compute.AggregatedListInstancesRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.aggregated_list] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata((("project", request.project),)), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # This method is paged; wrap the response in a pager, which provides + # an `__iter__` convenience method. + response = pagers.AggregatedListPager( + method=rpc, + request=request, + response=response, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def attach_disk_unary( self, request: Optional[Union[compute.AttachDiskInstanceRequest, dict]] = None, *, @@ -1642,7 +1816,7 @@ def attach_disk( retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), - ) -> extended_operation.ExtendedOperation: + ) -> compute.Operation: r"""Attaches an existing Disk resource to an instance. You must first create the disk before you can attach it. It is not possible to create and attach a disk at the @@ -1773,50 +1947,491 @@ def sample_attach_disk(): metadata=metadata, ) - operation_service = self._transport._zone_operations_client - operation_request = compute.GetZoneOperationRequest() - operation_request.project = request.project - operation_request.zone = request.zone - operation_request.operation = response.name - - get_operation = functools.partial(operation_service.get, operation_request) - # Cancel is not part of extended operations yet. - cancel_operation = lambda: None - - # Note: this class is an implementation detail to provide a uniform - # set of names for certain fields in the extended operation proto message. - # See google.api_core.extended_operation.ExtendedOperation for details - # on these properties and the expected interface. - class _CustomOperation(extended_operation.ExtendedOperation): - @property - def error_message(self): - return self._extended_operation.http_error_message - - @property - def error_code(self): - return self._extended_operation.http_error_status_code - - response = _CustomOperation.make(get_operation, cancel_operation, response) - # Done; return the response. return response - def bulk_insert_unary( + def attach_disk( self, - request: Optional[Union[compute.BulkInsertInstanceRequest, dict]] = None, + request: Optional[Union[compute.AttachDiskInstanceRequest, dict]] = None, *, project: Optional[str] = None, zone: Optional[str] = None, - bulk_insert_instance_resource_resource: Optional[ - compute.BulkInsertInstanceResource - ] = None, + instance: Optional[str] = None, + attached_disk_resource: Optional[compute.AttachedDisk] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), - ) -> compute.Operation: - r"""Creates multiple instances. Count specifies the - number of instances to create. For more information, see - About bulk creation of VMs. + ) -> extended_operation.ExtendedOperation: + r"""Attaches an existing Disk resource to an instance. + You must first create the disk before you can attach it. + It is not possible to create and attach a disk at the + same time. For more information, read Adding a + persistent disk to your instance. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_attach_disk(): + # Create a client + client = compute_v1.InstancesClient() + + # Initialize request argument(s) + request = compute_v1.AttachDiskInstanceRequest( + instance="instance_value", + project="project_value", + zone="zone_value", + ) + + # Make the request + response = client.attach_disk(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.AttachDiskInstanceRequest, dict]): + The request object. A request message for + Instances.AttachDisk. See the method + description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + zone (str): + The name of the zone for this + request. + + This corresponds to the ``zone`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + instance (str): + The instance name for this request. + This corresponds to the ``instance`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + attached_disk_resource (google.cloud.compute_v1.types.AttachedDisk): + The body resource for this request + This corresponds to the ``attached_disk_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.api_core.extended_operation.ExtendedOperation: + An object representing a extended + long-running operation. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [project, zone, instance, attached_disk_resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.AttachDiskInstanceRequest): + request = compute.AttachDiskInstanceRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if zone is not None: + request.zone = zone + if instance is not None: + request.instance = instance + if attached_disk_resource is not None: + request.attached_disk_resource = attached_disk_resource + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.attach_disk] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("zone", request.zone), + ("instance", request.instance), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + operation_service = self._transport._zone_operations_client + operation_request = compute.GetZoneOperationRequest() + operation_request.project = request.project + operation_request.zone = request.zone + operation_request.operation = response.name + + get_operation = functools.partial(operation_service.get, operation_request) + # Cancel is not part of extended operations yet. + cancel_operation = lambda: None + + # Note: this class is an implementation detail to provide a uniform + # set of names for certain fields in the extended operation proto message. + # See google.api_core.extended_operation.ExtendedOperation for details + # on these properties and the expected interface. + class _CustomOperation(extended_operation.ExtendedOperation): + @property + def error_message(self): + return self._extended_operation.http_error_message + + @property + def error_code(self): + return self._extended_operation.http_error_status_code + + response = _CustomOperation.make(get_operation, cancel_operation, response) + + # Done; return the response. + return response + + def bulk_insert_unary( + self, + request: Optional[Union[compute.BulkInsertInstanceRequest, dict]] = None, + *, + project: Optional[str] = None, + zone: Optional[str] = None, + bulk_insert_instance_resource_resource: Optional[ + compute.BulkInsertInstanceResource + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.Operation: + r"""Creates multiple instances. Count specifies the + number of instances to create. For more information, see + About bulk creation of VMs. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_bulk_insert(): + # Create a client + client = compute_v1.InstancesClient() + + # Initialize request argument(s) + request = compute_v1.BulkInsertInstanceRequest( + project="project_value", + zone="zone_value", + ) + + # Make the request + response = client.bulk_insert(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.BulkInsertInstanceRequest, dict]): + The request object. A request message for + Instances.BulkInsert. See the method + description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + zone (str): + The name of the zone for this + request. + + This corresponds to the ``zone`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + bulk_insert_instance_resource_resource (google.cloud.compute_v1.types.BulkInsertInstanceResource): + The body resource for this request + This corresponds to the ``bulk_insert_instance_resource_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.api_core.extended_operation.ExtendedOperation: + An object representing a extended + long-running operation. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [project, zone, bulk_insert_instance_resource_resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.BulkInsertInstanceRequest): + request = compute.BulkInsertInstanceRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if zone is not None: + request.zone = zone + if bulk_insert_instance_resource_resource is not None: + request.bulk_insert_instance_resource_resource = ( + bulk_insert_instance_resource_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.bulk_insert] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("zone", request.zone), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + + def bulk_insert( + self, + request: Optional[Union[compute.BulkInsertInstanceRequest, dict]] = None, + *, + project: Optional[str] = None, + zone: Optional[str] = None, + bulk_insert_instance_resource_resource: Optional[ + compute.BulkInsertInstanceResource + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> extended_operation.ExtendedOperation: + r"""Creates multiple instances. Count specifies the + number of instances to create. For more information, see + About bulk creation of VMs. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_bulk_insert(): + # Create a client + client = compute_v1.InstancesClient() + + # Initialize request argument(s) + request = compute_v1.BulkInsertInstanceRequest( + project="project_value", + zone="zone_value", + ) + + # Make the request + response = client.bulk_insert(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.BulkInsertInstanceRequest, dict]): + The request object. A request message for + Instances.BulkInsert. See the method + description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + zone (str): + The name of the zone for this + request. + + This corresponds to the ``zone`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + bulk_insert_instance_resource_resource (google.cloud.compute_v1.types.BulkInsertInstanceResource): + The body resource for this request + This corresponds to the ``bulk_insert_instance_resource_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.api_core.extended_operation.ExtendedOperation: + An object representing a extended + long-running operation. + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [project, zone, bulk_insert_instance_resource_resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.BulkInsertInstanceRequest): + request = compute.BulkInsertInstanceRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if zone is not None: + request.zone = zone + if bulk_insert_instance_resource_resource is not None: + request.bulk_insert_instance_resource_resource = ( + bulk_insert_instance_resource_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.bulk_insert] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("zone", request.zone), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + operation_service = self._transport._zone_operations_client + operation_request = compute.GetZoneOperationRequest() + operation_request.project = request.project + operation_request.zone = request.zone + operation_request.operation = response.name + + get_operation = functools.partial(operation_service.get, operation_request) + # Cancel is not part of extended operations yet. + cancel_operation = lambda: None + + # Note: this class is an implementation detail to provide a uniform + # set of names for certain fields in the extended operation proto message. + # See google.api_core.extended_operation.ExtendedOperation for details + # on these properties and the expected interface. + class _CustomOperation(extended_operation.ExtendedOperation): + @property + def error_message(self): + return self._extended_operation.http_error_message + + @property + def error_code(self): + return self._extended_operation.http_error_status_code + + response = _CustomOperation.make(get_operation, cancel_operation, response) + + # Done; return the response. + return response + + def delete_unary( + self, + request: Optional[Union[compute.DeleteInstanceRequest, dict]] = None, + *, + project: Optional[str] = None, + zone: Optional[str] = None, + instance: Optional[str] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.Operation: + r"""Deletes the specified Instance resource. For more + information, see Deleting an instance. .. code-block:: python @@ -1829,26 +2444,27 @@ def bulk_insert_unary( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_bulk_insert(): + def sample_delete(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.BulkInsertInstanceRequest( + request = compute_v1.DeleteInstanceRequest( + instance="instance_value", project="project_value", zone="zone_value", ) # Make the request - response = client.bulk_insert(request=request) + response = client.delete(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.BulkInsertInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.DeleteInstanceRequest, dict]): The request object. A request message for - Instances.BulkInsert. See the method + Instances.Delete. See the method description for details. project (str): Project ID for this request. @@ -1862,9 +2478,11 @@ def sample_bulk_insert(): This corresponds to the ``zone`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - bulk_insert_instance_resource_resource (google.cloud.compute_v1.types.BulkInsertInstanceResource): - The body resource for this request - This corresponds to the ``bulk_insert_instance_resource_resource`` field + instance (str): + Name of the instance resource to + delete. + + This corresponds to the ``instance`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -1884,7 +2502,7 @@ def sample_bulk_insert(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project, zone, bulk_insert_instance_resource_resource] + flattened_params = [project, zone, instance] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -1896,22 +2514,20 @@ def sample_bulk_insert(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.BulkInsertInstanceRequest): - request = compute.BulkInsertInstanceRequest(request) + if not isinstance(request, compute.DeleteInstanceRequest): + request = compute.DeleteInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: request.project = project if zone is not None: request.zone = zone - if bulk_insert_instance_resource_resource is not None: - request.bulk_insert_instance_resource_resource = ( - bulk_insert_instance_resource_resource - ) + if instance is not None: + request.instance = instance # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.bulk_insert] + rpc = self._transport._wrapped_methods[self._transport.delete] # Certain fields should be provided within the metadata header; # add these here. @@ -1920,6 +2536,7 @@ def sample_bulk_insert(): ( ("project", request.project), ("zone", request.zone), + ("instance", request.instance), ) ), ) @@ -1938,22 +2555,19 @@ def sample_bulk_insert(): # Done; return the response. return response - def bulk_insert( + def delete( self, - request: Optional[Union[compute.BulkInsertInstanceRequest, dict]] = None, + request: Optional[Union[compute.DeleteInstanceRequest, dict]] = None, *, project: Optional[str] = None, zone: Optional[str] = None, - bulk_insert_instance_resource_resource: Optional[ - compute.BulkInsertInstanceResource - ] = None, + instance: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> extended_operation.ExtendedOperation: - r"""Creates multiple instances. Count specifies the - number of instances to create. For more information, see - About bulk creation of VMs. + r"""Deletes the specified Instance resource. For more + information, see Deleting an instance. .. code-block:: python @@ -1966,26 +2580,27 @@ def bulk_insert( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_bulk_insert(): + def sample_delete(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.BulkInsertInstanceRequest( + request = compute_v1.DeleteInstanceRequest( + instance="instance_value", project="project_value", zone="zone_value", ) # Make the request - response = client.bulk_insert(request=request) + response = client.delete(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.BulkInsertInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.DeleteInstanceRequest, dict]): The request object. A request message for - Instances.BulkInsert. See the method + Instances.Delete. See the method description for details. project (str): Project ID for this request. @@ -1999,9 +2614,11 @@ def sample_bulk_insert(): This corresponds to the ``zone`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - bulk_insert_instance_resource_resource (google.cloud.compute_v1.types.BulkInsertInstanceResource): - The body resource for this request - This corresponds to the ``bulk_insert_instance_resource_resource`` field + instance (str): + Name of the instance resource to + delete. + + This corresponds to the ``instance`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -2021,7 +2638,7 @@ def sample_bulk_insert(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project, zone, bulk_insert_instance_resource_resource] + flattened_params = [project, zone, instance] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -2033,22 +2650,20 @@ def sample_bulk_insert(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.BulkInsertInstanceRequest): - request = compute.BulkInsertInstanceRequest(request) + if not isinstance(request, compute.DeleteInstanceRequest): + request = compute.DeleteInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: request.project = project if zone is not None: request.zone = zone - if bulk_insert_instance_resource_resource is not None: - request.bulk_insert_instance_resource_resource = ( - bulk_insert_instance_resource_resource - ) + if instance is not None: + request.instance = instance # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.bulk_insert] + rpc = self._transport._wrapped_methods[self._transport.delete] # Certain fields should be provided within the metadata header; # add these here. @@ -2057,6 +2672,7 @@ def sample_bulk_insert(): ( ("project", request.project), ("zone", request.zone), + ("instance", request.instance), ) ), ) @@ -2100,19 +2716,23 @@ def error_code(self): # Done; return the response. return response - def delete_unary( + def delete_access_config_unary( self, - request: Optional[Union[compute.DeleteInstanceRequest, dict]] = None, + request: Optional[ + Union[compute.DeleteAccessConfigInstanceRequest, dict] + ] = None, *, project: Optional[str] = None, zone: Optional[str] = None, instance: Optional[str] = None, + access_config: Optional[str] = None, + network_interface: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> compute.Operation: - r"""Deletes the specified Instance resource. For more - information, see Deleting an instance. + r"""Deletes an access config from an instance's network + interface. .. code-block:: python @@ -2125,28 +2745,30 @@ def delete_unary( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_delete(): + def sample_delete_access_config(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.DeleteInstanceRequest( + request = compute_v1.DeleteAccessConfigInstanceRequest( + access_config="access_config_value", instance="instance_value", + network_interface="network_interface_value", project="project_value", zone="zone_value", ) # Make the request - response = client.delete(request=request) + response = client.delete_access_config(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.DeleteInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.DeleteAccessConfigInstanceRequest, dict]): The request object. A request message for - Instances.Delete. See the method - description for details. + Instances.DeleteAccessConfig. See the + method description for details. project (str): Project ID for this request. This corresponds to the ``project`` field @@ -2160,10 +2782,20 @@ def sample_delete(): on the ``request`` instance; if ``request`` is provided, this should not be set. instance (str): - Name of the instance resource to + The instance name for this request. + This corresponds to the ``instance`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + access_config (str): + The name of the access config to delete. - This corresponds to the ``instance`` field + This corresponds to the ``access_config`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + network_interface (str): + The name of the network interface. + This corresponds to the ``network_interface`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -2183,7 +2815,7 @@ def sample_delete(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project, zone, instance] + flattened_params = [project, zone, instance, access_config, network_interface] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -2195,8 +2827,8 @@ def sample_delete(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.DeleteInstanceRequest): - request = compute.DeleteInstanceRequest(request) + if not isinstance(request, compute.DeleteAccessConfigInstanceRequest): + request = compute.DeleteAccessConfigInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: @@ -2205,10 +2837,14 @@ def sample_delete(): request.zone = zone if instance is not None: request.instance = instance + if access_config is not None: + request.access_config = access_config + if network_interface is not None: + request.network_interface = network_interface # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.delete] + rpc = self._transport._wrapped_methods[self._transport.delete_access_config] # Certain fields should be provided within the metadata header; # add these here. @@ -2236,19 +2872,23 @@ def sample_delete(): # Done; return the response. return response - def delete( + def delete_access_config( self, - request: Optional[Union[compute.DeleteInstanceRequest, dict]] = None, + request: Optional[ + Union[compute.DeleteAccessConfigInstanceRequest, dict] + ] = None, *, project: Optional[str] = None, zone: Optional[str] = None, instance: Optional[str] = None, + access_config: Optional[str] = None, + network_interface: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> extended_operation.ExtendedOperation: - r"""Deletes the specified Instance resource. For more - information, see Deleting an instance. + r"""Deletes an access config from an instance's network + interface. .. code-block:: python @@ -2261,28 +2901,30 @@ def delete( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_delete(): + def sample_delete_access_config(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.DeleteInstanceRequest( + request = compute_v1.DeleteAccessConfigInstanceRequest( + access_config="access_config_value", instance="instance_value", + network_interface="network_interface_value", project="project_value", zone="zone_value", ) # Make the request - response = client.delete(request=request) + response = client.delete_access_config(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.DeleteInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.DeleteAccessConfigInstanceRequest, dict]): The request object. A request message for - Instances.Delete. See the method - description for details. + Instances.DeleteAccessConfig. See the + method description for details. project (str): Project ID for this request. This corresponds to the ``project`` field @@ -2296,10 +2938,20 @@ def sample_delete(): on the ``request`` instance; if ``request`` is provided, this should not be set. instance (str): - Name of the instance resource to + The instance name for this request. + This corresponds to the ``instance`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + access_config (str): + The name of the access config to delete. - This corresponds to the ``instance`` field + This corresponds to the ``access_config`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + network_interface (str): + The name of the network interface. + This corresponds to the ``network_interface`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -2319,7 +2971,7 @@ def sample_delete(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project, zone, instance] + flattened_params = [project, zone, instance, access_config, network_interface] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -2331,8 +2983,8 @@ def sample_delete(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.DeleteInstanceRequest): - request = compute.DeleteInstanceRequest(request) + if not isinstance(request, compute.DeleteAccessConfigInstanceRequest): + request = compute.DeleteAccessConfigInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: @@ -2341,10 +2993,14 @@ def sample_delete(): request.zone = zone if instance is not None: request.instance = instance + if access_config is not None: + request.access_config = access_config + if network_interface is not None: + request.network_interface = network_interface # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.delete] + rpc = self._transport._wrapped_methods[self._transport.delete_access_config] # Certain fields should be provided within the metadata header; # add these here. @@ -2397,23 +3053,25 @@ def error_code(self): # Done; return the response. return response - def delete_access_config_unary( + def delete_network_interface_unary( self, request: Optional[ - Union[compute.DeleteAccessConfigInstanceRequest, dict] + Union[compute.DeleteNetworkInterfaceInstanceRequest, dict] ] = None, *, project: Optional[str] = None, zone: Optional[str] = None, instance: Optional[str] = None, - access_config: Optional[str] = None, - network_interface: Optional[str] = None, + network_interface_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> compute.Operation: - r"""Deletes an access config from an instance's network - interface. + r"""Deletes one dynamic network interface from an active instance. + InstancesDeleteNetworkInterfaceRequest indicates: - instance + from which to delete, using project+zone+resource_id fields; - + dynamic network interface to be deleted, using + network_interface_name field; .. code-block:: python @@ -2426,30 +3084,29 @@ def delete_access_config_unary( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_delete_access_config(): + def sample_delete_network_interface(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.DeleteAccessConfigInstanceRequest( - access_config="access_config_value", + request = compute_v1.DeleteNetworkInterfaceInstanceRequest( instance="instance_value", - network_interface="network_interface_value", + network_interface_name="network_interface_name_value", project="project_value", zone="zone_value", ) # Make the request - response = client.delete_access_config(request=request) + response = client.delete_network_interface(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.DeleteAccessConfigInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.DeleteNetworkInterfaceInstanceRequest, dict]): The request object. A request message for - Instances.DeleteAccessConfig. See the - method description for details. + Instances.DeleteNetworkInterface. See + the method description for details. project (str): Project ID for this request. This corresponds to the ``project`` field @@ -2463,20 +3120,19 @@ def sample_delete_access_config(): on the ``request`` instance; if ``request`` is provided, this should not be set. instance (str): - The instance name for this request. + The instance name for this request stored as + resource_id. Name should conform to RFC1035 or be an + unsigned long integer. + This corresponds to the ``instance`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - access_config (str): - The name of the access config to - delete. + network_interface_name (str): + The name of the dynamic network + interface to be deleted from the + instance. - This corresponds to the ``access_config`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - network_interface (str): - The name of the network interface. - This corresponds to the ``network_interface`` field + This corresponds to the ``network_interface_name`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -2496,7 +3152,7 @@ def sample_delete_access_config(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project, zone, instance, access_config, network_interface] + flattened_params = [project, zone, instance, network_interface_name] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -2508,8 +3164,8 @@ def sample_delete_access_config(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.DeleteAccessConfigInstanceRequest): - request = compute.DeleteAccessConfigInstanceRequest(request) + if not isinstance(request, compute.DeleteNetworkInterfaceInstanceRequest): + request = compute.DeleteNetworkInterfaceInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: @@ -2518,14 +3174,12 @@ def sample_delete_access_config(): request.zone = zone if instance is not None: request.instance = instance - if access_config is not None: - request.access_config = access_config - if network_interface is not None: - request.network_interface = network_interface + if network_interface_name is not None: + request.network_interface_name = network_interface_name # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.delete_access_config] + rpc = self._transport._wrapped_methods[self._transport.delete_network_interface] # Certain fields should be provided within the metadata header; # add these here. @@ -2553,23 +3207,25 @@ def sample_delete_access_config(): # Done; return the response. return response - def delete_access_config( + def delete_network_interface( self, request: Optional[ - Union[compute.DeleteAccessConfigInstanceRequest, dict] + Union[compute.DeleteNetworkInterfaceInstanceRequest, dict] ] = None, *, project: Optional[str] = None, zone: Optional[str] = None, instance: Optional[str] = None, - access_config: Optional[str] = None, - network_interface: Optional[str] = None, + network_interface_name: Optional[str] = None, retry: OptionalRetry = gapic_v1.method.DEFAULT, timeout: Union[float, object] = gapic_v1.method.DEFAULT, metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), ) -> extended_operation.ExtendedOperation: - r"""Deletes an access config from an instance's network - interface. + r"""Deletes one dynamic network interface from an active instance. + InstancesDeleteNetworkInterfaceRequest indicates: - instance + from which to delete, using project+zone+resource_id fields; - + dynamic network interface to be deleted, using + network_interface_name field; .. code-block:: python @@ -2582,30 +3238,29 @@ def delete_access_config( # https://googleapis.dev/python/google-api-core/latest/client_options.html from google.cloud import compute_v1 - def sample_delete_access_config(): + def sample_delete_network_interface(): # Create a client client = compute_v1.InstancesClient() # Initialize request argument(s) - request = compute_v1.DeleteAccessConfigInstanceRequest( - access_config="access_config_value", + request = compute_v1.DeleteNetworkInterfaceInstanceRequest( instance="instance_value", - network_interface="network_interface_value", + network_interface_name="network_interface_name_value", project="project_value", zone="zone_value", ) # Make the request - response = client.delete_access_config(request=request) + response = client.delete_network_interface(request=request) # Handle the response print(response) Args: - request (Union[google.cloud.compute_v1.types.DeleteAccessConfigInstanceRequest, dict]): + request (Union[google.cloud.compute_v1.types.DeleteNetworkInterfaceInstanceRequest, dict]): The request object. A request message for - Instances.DeleteAccessConfig. See the - method description for details. + Instances.DeleteNetworkInterface. See + the method description for details. project (str): Project ID for this request. This corresponds to the ``project`` field @@ -2619,20 +3274,19 @@ def sample_delete_access_config(): on the ``request`` instance; if ``request`` is provided, this should not be set. instance (str): - The instance name for this request. + The instance name for this request stored as + resource_id. Name should conform to RFC1035 or be an + unsigned long integer. + This corresponds to the ``instance`` field on the ``request`` instance; if ``request`` is provided, this should not be set. - access_config (str): - The name of the access config to - delete. + network_interface_name (str): + The name of the dynamic network + interface to be deleted from the + instance. - This corresponds to the ``access_config`` field - on the ``request`` instance; if ``request`` is provided, this - should not be set. - network_interface (str): - The name of the network interface. - This corresponds to the ``network_interface`` field + This corresponds to the ``network_interface_name`` field on the ``request`` instance; if ``request`` is provided, this should not be set. retry (google.api_core.retry.Retry): Designation of what errors, if any, @@ -2652,7 +3306,7 @@ def sample_delete_access_config(): # Create or coerce a protobuf request object. # - Quick check: If we got a request object, we should *not* have # gotten any keyword arguments that map to the request. - flattened_params = [project, zone, instance, access_config, network_interface] + flattened_params = [project, zone, instance, network_interface_name] has_flattened_params = ( len([param for param in flattened_params if param is not None]) > 0 ) @@ -2664,8 +3318,8 @@ def sample_delete_access_config(): # - Use the request object if provided (there's no risk of modifying the input as # there are no flattened fields), or create one. - if not isinstance(request, compute.DeleteAccessConfigInstanceRequest): - request = compute.DeleteAccessConfigInstanceRequest(request) + if not isinstance(request, compute.DeleteNetworkInterfaceInstanceRequest): + request = compute.DeleteNetworkInterfaceInstanceRequest(request) # If we have keyword arguments corresponding to fields on the # request, apply these. if project is not None: @@ -2674,14 +3328,12 @@ def sample_delete_access_config(): request.zone = zone if instance is not None: request.instance = instance - if access_config is not None: - request.access_config = access_config - if network_interface is not None: - request.network_interface = network_interface + if network_interface_name is not None: + request.network_interface_name = network_interface_name # Wrap the RPC method; this adds retry and timeout information, # and friendly error handling. - rpc = self._transport._wrapped_methods[self._transport.delete_access_config] + rpc = self._transport._wrapped_methods[self._transport.delete_network_interface] # Certain fields should be provided within the metadata header; # add these here. diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/base.py index cdf5d6450e78..118c26bb39c3 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/base.py @@ -142,6 +142,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.add_network_interface: gapic_v1.method.wrap_method( + self.add_network_interface, + default_timeout=None, + client_info=client_info, + ), self.add_resource_policies: gapic_v1.method.wrap_method( self.add_resource_policies, default_timeout=None, @@ -172,6 +177,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.delete_network_interface: gapic_v1.method.wrap_method( + self.delete_network_interface, + default_timeout=None, + client_info=client_info, + ), self.detach_disk: gapic_v1.method.wrap_method( self.detach_disk, default_timeout=None, @@ -402,6 +412,15 @@ def add_access_config( ]: raise NotImplementedError() + @property + def add_network_interface( + self, + ) -> Callable[ + [compute.AddNetworkInterfaceInstanceRequest], + Union[compute.Operation, Awaitable[compute.Operation]], + ]: + raise NotImplementedError() + @property def add_resource_policies( self, @@ -458,6 +477,15 @@ def delete_access_config( ]: raise NotImplementedError() + @property + def delete_network_interface( + self, + ) -> Callable[ + [compute.DeleteNetworkInterfaceInstanceRequest], + Union[compute.Operation, Awaitable[compute.Operation]], + ]: + raise NotImplementedError() + @property def detach_disk( self, diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest.py index ed44fc404860..07ec36bd6438 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest.py @@ -80,6 +80,14 @@ def post_add_access_config(self, response): logging.log(f"Received response: {response}") return response + def pre_add_network_interface(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_add_network_interface(self, response): + logging.log(f"Received response: {response}") + return response + def pre_add_resource_policies(self, request, metadata): logging.log(f"Received request: {request}") return request, metadata @@ -128,6 +136,14 @@ def post_delete_access_config(self, response): logging.log(f"Received response: {response}") return response + def pre_delete_network_interface(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_delete_network_interface(self, response): + logging.log(f"Received response: {response}") + return response + def pre_detach_disk(self, request, metadata): logging.log(f"Received request: {request}") return request, metadata @@ -516,6 +532,55 @@ def post_add_access_config_with_metadata( """ return response, metadata + def pre_add_network_interface( + self, + request: compute.AddNetworkInterfaceInstanceRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.AddNetworkInterfaceInstanceRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for add_network_interface + + Override in a subclass to manipulate the request or metadata + before they are sent to the Instances server. + """ + return request, metadata + + def post_add_network_interface( + self, response: compute.Operation + ) -> compute.Operation: + """Post-rpc interceptor for add_network_interface + + DEPRECATED. Please use the `post_add_network_interface_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the Instances server but before + it is returned to user code. This `post_add_network_interface` interceptor runs + before the `post_add_network_interface_with_metadata` interceptor. + """ + return response + + def post_add_network_interface_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_network_interface + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_add_network_interface_with_metadata` + interceptor in new development instead of the `post_add_network_interface` interceptor. + When both interceptors are used, this `post_add_network_interface_with_metadata` interceptor runs after the + `post_add_network_interface` interceptor. The (possibly modified) response returned by + `post_add_network_interface` will be passed to + `post_add_network_interface_with_metadata`. + """ + return response, metadata + def pre_add_resource_policies( self, request: compute.AddResourcePoliciesInstanceRequest, @@ -798,6 +863,55 @@ def post_delete_access_config_with_metadata( """ return response, metadata + def pre_delete_network_interface( + self, + request: compute.DeleteNetworkInterfaceInstanceRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.DeleteNetworkInterfaceInstanceRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for delete_network_interface + + Override in a subclass to manipulate the request or metadata + before they are sent to the Instances server. + """ + return request, metadata + + def post_delete_network_interface( + self, response: compute.Operation + ) -> compute.Operation: + """Post-rpc interceptor for delete_network_interface + + DEPRECATED. Please use the `post_delete_network_interface_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the Instances server but before + it is returned to user code. This `post_delete_network_interface` interceptor runs + before the `post_delete_network_interface_with_metadata` interceptor. + """ + return response + + def post_delete_network_interface_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_network_interface + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_delete_network_interface_with_metadata` + interceptor in new development instead of the `post_delete_network_interface` interceptor. + When both interceptors are used, this `post_delete_network_interface_with_metadata` interceptor runs after the + `post_delete_network_interface` interceptor. The (possibly modified) response returned by + `post_delete_network_interface` will be passed to + `post_delete_network_interface_with_metadata`. + """ + return response, metadata + def pre_detach_disk( self, request: compute.DetachDiskInstanceRequest, @@ -3052,6 +3166,177 @@ def __call__( ) return resp + class _AddNetworkInterface( + _BaseInstancesRestTransport._BaseAddNetworkInterface, InstancesRestStub + ): + def __hash__(self): + return hash("InstancesRestTransport.AddNetworkInterface") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__( + self, + request: compute.AddNetworkInterfaceInstanceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.Operation: + r"""Call the add network interface method over HTTP. + + Args: + request (~.compute.AddNetworkInterfaceInstanceRequest): + The request object. A request message for + Instances.AddNetworkInterface. See the + method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.Operation: + Represents an Operation resource. Google Compute Engine + has three Operation resources: \* + `Global `__ + \* + `Regional `__ + \* + `Zonal `__ + You can use an operation resource to manage asynchronous + API requests. For more information, read Handling API + responses. Operations can be global, regional or zonal. + - For global operations, use the ``globalOperations`` + resource. - For regional operations, use the + ``regionOperations`` resource. - For zonal operations, + use the ``zoneOperations`` resource. For more + information, read Global, Regional, and Zonal Resources. + Note that completed Operation resources have a limited + retention period. + + """ + + http_options = ( + _BaseInstancesRestTransport._BaseAddNetworkInterface._get_http_options() + ) + + request, metadata = self._interceptor.pre_add_network_interface( + request, metadata + ) + transcoded_request = _BaseInstancesRestTransport._BaseAddNetworkInterface._get_transcoded_request( + http_options, request + ) + + body = _BaseInstancesRestTransport._BaseAddNetworkInterface._get_request_body_json( + transcoded_request + ) + + # Jsonify the query params + query_params = _BaseInstancesRestTransport._BaseAddNetworkInterface._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.InstancesClient.AddNetworkInterface", + extra={ + "serviceName": "google.cloud.compute.v1.Instances", + "rpcName": "AddNetworkInterface", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = InstancesRestTransport._AddNetworkInterface._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.Operation() + pb_resp = compute.Operation.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_add_network_interface(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_network_interface_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.Operation.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.InstancesClient.add_network_interface", + extra={ + "serviceName": "google.cloud.compute.v1.Instances", + "rpcName": "AddNetworkInterface", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + class _AddResourcePolicies( _BaseInstancesRestTransport._BaseAddResourcePolicies, InstancesRestStub ): @@ -4043,6 +4328,171 @@ def __call__( ) return resp + class _DeleteNetworkInterface( + _BaseInstancesRestTransport._BaseDeleteNetworkInterface, InstancesRestStub + ): + def __hash__(self): + return hash("InstancesRestTransport.DeleteNetworkInterface") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + ) + return response + + def __call__( + self, + request: compute.DeleteNetworkInterfaceInstanceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.Operation: + r"""Call the delete network interface method over HTTP. + + Args: + request (~.compute.DeleteNetworkInterfaceInstanceRequest): + The request object. A request message for + Instances.DeleteNetworkInterface. See + the method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.Operation: + Represents an Operation resource. Google Compute Engine + has three Operation resources: \* + `Global `__ + \* + `Regional `__ + \* + `Zonal `__ + You can use an operation resource to manage asynchronous + API requests. For more information, read Handling API + responses. Operations can be global, regional or zonal. + - For global operations, use the ``globalOperations`` + resource. - For regional operations, use the + ``regionOperations`` resource. - For zonal operations, + use the ``zoneOperations`` resource. For more + information, read Global, Regional, and Zonal Resources. + Note that completed Operation resources have a limited + retention period. + + """ + + http_options = ( + _BaseInstancesRestTransport._BaseDeleteNetworkInterface._get_http_options() + ) + + request, metadata = self._interceptor.pre_delete_network_interface( + request, metadata + ) + transcoded_request = _BaseInstancesRestTransport._BaseDeleteNetworkInterface._get_transcoded_request( + http_options, request + ) + + # Jsonify the query params + query_params = _BaseInstancesRestTransport._BaseDeleteNetworkInterface._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.InstancesClient.DeleteNetworkInterface", + extra={ + "serviceName": "google.cloud.compute.v1.Instances", + "rpcName": "DeleteNetworkInterface", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = InstancesRestTransport._DeleteNetworkInterface._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.Operation() + pb_resp = compute.Operation.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_delete_network_interface(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_network_interface_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.Operation.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.InstancesClient.delete_network_interface", + extra={ + "serviceName": "google.cloud.compute.v1.Instances", + "rpcName": "DeleteNetworkInterface", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + class _DetachDisk(_BaseInstancesRestTransport._BaseDetachDisk, InstancesRestStub): def __hash__(self): return hash("InstancesRestTransport.DetachDisk") @@ -10975,6 +11425,14 @@ def add_access_config( # In C++ this would require a dynamic_cast return self._AddAccessConfig(self._session, self._host, self._interceptor) # type: ignore + @property + def add_network_interface( + self, + ) -> Callable[[compute.AddNetworkInterfaceInstanceRequest], compute.Operation]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._AddNetworkInterface(self._session, self._host, self._interceptor) # type: ignore + @property def add_resource_policies( self, @@ -11023,6 +11481,14 @@ def delete_access_config( # In C++ this would require a dynamic_cast return self._DeleteAccessConfig(self._session, self._host, self._interceptor) # type: ignore + @property + def delete_network_interface( + self, + ) -> Callable[[compute.DeleteNetworkInterfaceInstanceRequest], compute.Operation]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._DeleteNetworkInterface(self._session, self._host, self._interceptor) # type: ignore + @property def detach_disk( self, diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest_base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest_base.py index d40fcd58428f..a0b45da75ed8 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest_base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest_base.py @@ -145,6 +145,62 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseAddNetworkInterface: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addNetworkInterface", + "body": "network_interface_resource", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.AddNetworkInterfaceInstanceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], use_integers_for_enums=False + ) + return body + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseInstancesRestTransport._BaseAddNetworkInterface._get_unset_required_fields( + query_params + ) + ) + + return query_params + class _BaseAddResourcePolicies: def __hash__(self): # pragma: NO COVER return NotImplementedError("__hash__ must be implemented.") @@ -454,6 +510,54 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseDeleteNetworkInterface: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = { + "networkInterfaceName": "", + } + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteNetworkInterface", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.DeleteNetworkInterfaceInstanceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseInstancesRestTransport._BaseDeleteNetworkInterface._get_unset_required_fields( + query_params + ) + ) + + return query_params + class _BaseDetachDisk: def __hash__(self): # pragma: NO COVER return NotImplementedError("__hash__ must be implemented.") diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py index 709832ffaaa6..f5fc9f5e59d1 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py @@ -1487,6 +1487,161 @@ def error_code(self): # Done; return the response. return response + def test_iam_permissions( + self, + request: Optional[ + Union[compute.TestIamPermissionsRegionInstanceGroupRequest, dict] + ] = None, + *, + project: Optional[str] = None, + region: Optional[str] = None, + resource: Optional[str] = None, + test_permissions_request_resource: Optional[ + compute.TestPermissionsRequest + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Returns permissions that a caller has on the + specified resource. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_test_iam_permissions(): + # Create a client + client = compute_v1.RegionInstanceGroupsClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsRegionInstanceGroupRequest( + project="project_value", + region="region_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.TestIamPermissionsRegionInstanceGroupRequest, dict]): + The request object. A request message for + RegionInstanceGroups.TestIamPermissions. + See the method description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + region (str): + The name of the region for this + request. + + This corresponds to the ``region`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + resource (str): + Name or id of the resource for this + request. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + This corresponds to the ``test_permissions_request_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.compute_v1.types.TestPermissionsResponse: + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [ + project, + region, + resource, + test_permissions_request_resource, + ] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance( + request, compute.TestIamPermissionsRegionInstanceGroupRequest + ): + request = compute.TestIamPermissionsRegionInstanceGroupRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if region is not None: + request.region = region + if resource is not None: + request.resource = resource + if test_permissions_request_resource is not None: + request.test_permissions_request_resource = ( + test_permissions_request_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.test_iam_permissions] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("region", request.region), + ("resource", request.resource), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + def __enter__(self) -> "RegionInstanceGroupsClient": return self diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/base.py index c71a696e000f..8da9b9d011fc 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/base.py @@ -157,6 +157,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.test_iam_permissions: gapic_v1.method.wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), } def close(self): @@ -209,6 +214,17 @@ def set_named_ports( ]: raise NotImplementedError() + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsRegionInstanceGroupRequest], + Union[ + compute.TestPermissionsResponse, Awaitable[compute.TestPermissionsResponse] + ], + ]: + raise NotImplementedError() + @property def kind(self) -> str: raise NotImplementedError() diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py index 263b0ec45574..ec6f44d49a94 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py @@ -104,6 +104,14 @@ def post_set_named_ports(self, response): logging.log(f"Received response: {response}") return response + def pre_test_iam_permissions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_test_iam_permissions(self, response): + logging.log(f"Received response: {response}") + return response + transport = RegionInstanceGroupsRestTransport(interceptor=MyCustomRegionInstanceGroupsInterceptor()) client = RegionInstanceGroupsClient(transport=transport) @@ -305,6 +313,57 @@ def post_set_named_ports_with_metadata( """ return response, metadata + def pre_test_iam_permissions( + self, + request: compute.TestIamPermissionsRegionInstanceGroupRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestIamPermissionsRegionInstanceGroupRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the request or metadata + before they are sent to the RegionInstanceGroups server. + """ + return request, metadata + + def post_test_iam_permissions( + self, response: compute.TestPermissionsResponse + ) -> compute.TestPermissionsResponse: + """Post-rpc interceptor for test_iam_permissions + + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the RegionInstanceGroups server but before + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. + """ + return response + + def post_test_iam_permissions_with_metadata( + self, + response: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroups server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionInstanceGroupsRestStub: @@ -1031,6 +1090,163 @@ def __call__( ) return resp + class _TestIamPermissions( + _BaseRegionInstanceGroupsRestTransport._BaseTestIamPermissions, + RegionInstanceGroupsRestStub, + ): + def __hash__(self): + return hash("RegionInstanceGroupsRestTransport.TestIamPermissions") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__( + self, + request: compute.TestIamPermissionsRegionInstanceGroupRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Call the test iam permissions method over HTTP. + + Args: + request (~.compute.TestIamPermissionsRegionInstanceGroupRequest): + The request object. A request message for + RegionInstanceGroups.TestIamPermissions. + See the method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.TestPermissionsResponse: + + """ + + http_options = ( + _BaseRegionInstanceGroupsRestTransport._BaseTestIamPermissions._get_http_options() + ) + + request, metadata = self._interceptor.pre_test_iam_permissions( + request, metadata + ) + transcoded_request = _BaseRegionInstanceGroupsRestTransport._BaseTestIamPermissions._get_transcoded_request( + http_options, request + ) + + body = _BaseRegionInstanceGroupsRestTransport._BaseTestIamPermissions._get_request_body_json( + transcoded_request + ) + + # Jsonify the query params + query_params = _BaseRegionInstanceGroupsRestTransport._BaseTestIamPermissions._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.RegionInstanceGroupsClient.TestIamPermissions", + extra={ + "serviceName": "google.cloud.compute.v1.RegionInstanceGroups", + "rpcName": "TestIamPermissions", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = ( + RegionInstanceGroupsRestTransport._TestIamPermissions._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + body, + ) + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.TestPermissionsResponse() + pb_resp = compute.TestPermissionsResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.TestPermissionsResponse.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.RegionInstanceGroupsClient.test_iam_permissions", + extra={ + "serviceName": "google.cloud.compute.v1.RegionInstanceGroups", + "rpcName": "TestIamPermissions", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + @property def get( self, @@ -1068,6 +1284,17 @@ def set_named_ports( # In C++ this would require a dynamic_cast return self._SetNamedPorts(self._session, self._host, self._interceptor) # type: ignore + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsRegionInstanceGroupRequest], + compute.TestPermissionsResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._TestIamPermissions(self._session, self._host, self._interceptor) # type: ignore + @property def kind(self) -> str: return "rest" diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest_base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest_base.py index 5b5b5d26e298..b63228ec866b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest_base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest_base.py @@ -291,5 +291,63 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseTestIamPermissions: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/regions/{region}/instanceGroups/{resource}/testIamPermissions", + "body": "test_permissions_request_resource", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.TestIamPermissionsRegionInstanceGroupRequest.pb( + request + ) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], use_integers_for_enums=False + ) + return body + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseRegionInstanceGroupsRestTransport._BaseTestIamPermissions._get_unset_required_fields( + query_params + ) + ) + + return query_params + __all__ = ("_BaseRegionInstanceGroupsRestTransport",) diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py index f157d9ec8fe6..4c2fd1af8003 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py @@ -2019,6 +2019,154 @@ def error_code(self): # Done; return the response. return response + def test_iam_permissions( + self, + request: Optional[ + Union[compute.TestIamPermissionsTargetInstanceRequest, dict] + ] = None, + *, + project: Optional[str] = None, + zone: Optional[str] = None, + resource: Optional[str] = None, + test_permissions_request_resource: Optional[ + compute.TestPermissionsRequest + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Returns permissions that a caller has on the + specified resource. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_test_iam_permissions(): + # Create a client + client = compute_v1.TargetInstancesClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsTargetInstanceRequest( + project="project_value", + resource="resource_value", + zone="zone_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.TestIamPermissionsTargetInstanceRequest, dict]): + The request object. A request message for + TargetInstances.TestIamPermissions. See + the method description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + zone (str): + The name of the zone for this + request. + + This corresponds to the ``zone`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + resource (str): + Name or id of the resource for this + request. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + This corresponds to the ``test_permissions_request_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.compute_v1.types.TestPermissionsResponse: + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [project, zone, resource, test_permissions_request_resource] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.TestIamPermissionsTargetInstanceRequest): + request = compute.TestIamPermissionsTargetInstanceRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if zone is not None: + request.zone = zone + if resource is not None: + request.resource = resource + if test_permissions_request_resource is not None: + request.test_permissions_request_resource = ( + test_permissions_request_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.test_iam_permissions] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("zone", request.zone), + ("resource", request.resource), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + def __enter__(self) -> "TargetInstancesClient": return self diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/base.py index f28a08fe255c..b65f9ce50e6e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/base.py @@ -167,6 +167,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.test_iam_permissions: gapic_v1.method.wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), } def close(self): @@ -235,6 +240,17 @@ def set_security_policy( ]: raise NotImplementedError() + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsTargetInstanceRequest], + Union[ + compute.TestPermissionsResponse, Awaitable[compute.TestPermissionsResponse] + ], + ]: + raise NotImplementedError() + @property def kind(self) -> str: raise NotImplementedError() diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py index 9cc91996e2a0..1985ae868340 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py @@ -120,6 +120,14 @@ def post_set_security_policy(self, response): logging.log(f"Received response: {response}") return response + def pre_test_iam_permissions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_test_iam_permissions(self, response): + logging.log(f"Received response: {response}") + return response + transport = TargetInstancesRestTransport(interceptor=MyCustomTargetInstancesInterceptor()) client = TargetInstancesClient(transport=transport) @@ -412,6 +420,57 @@ def post_set_security_policy_with_metadata( """ return response, metadata + def pre_test_iam_permissions( + self, + request: compute.TestIamPermissionsTargetInstanceRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestIamPermissionsTargetInstanceRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the request or metadata + before they are sent to the TargetInstances server. + """ + return request, metadata + + def post_test_iam_permissions( + self, response: compute.TestPermissionsResponse + ) -> compute.TestPermissionsResponse: + """Post-rpc interceptor for test_iam_permissions + + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the TargetInstances server but before + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. + """ + return response + + def post_test_iam_permissions_with_metadata( + self, + response: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetInstances server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetInstancesRestStub: @@ -1465,6 +1524,161 @@ def __call__( ) return resp + class _TestIamPermissions( + _BaseTargetInstancesRestTransport._BaseTestIamPermissions, + TargetInstancesRestStub, + ): + def __hash__(self): + return hash("TargetInstancesRestTransport.TestIamPermissions") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__( + self, + request: compute.TestIamPermissionsTargetInstanceRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Call the test iam permissions method over HTTP. + + Args: + request (~.compute.TestIamPermissionsTargetInstanceRequest): + The request object. A request message for + TargetInstances.TestIamPermissions. See + the method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.TestPermissionsResponse: + + """ + + http_options = ( + _BaseTargetInstancesRestTransport._BaseTestIamPermissions._get_http_options() + ) + + request, metadata = self._interceptor.pre_test_iam_permissions( + request, metadata + ) + transcoded_request = _BaseTargetInstancesRestTransport._BaseTestIamPermissions._get_transcoded_request( + http_options, request + ) + + body = _BaseTargetInstancesRestTransport._BaseTestIamPermissions._get_request_body_json( + transcoded_request + ) + + # Jsonify the query params + query_params = _BaseTargetInstancesRestTransport._BaseTestIamPermissions._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.TargetInstancesClient.TestIamPermissions", + extra={ + "serviceName": "google.cloud.compute.v1.TargetInstances", + "rpcName": "TestIamPermissions", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = TargetInstancesRestTransport._TestIamPermissions._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.TestPermissionsResponse() + pb_resp = compute.TestPermissionsResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.TestPermissionsResponse.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.TargetInstancesClient.test_iam_permissions", + extra={ + "serviceName": "google.cloud.compute.v1.TargetInstances", + "rpcName": "TestIamPermissions", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + @property def aggregated_list( self, @@ -1516,6 +1730,17 @@ def set_security_policy( # In C++ this would require a dynamic_cast return self._SetSecurityPolicy(self._session, self._host, self._interceptor) # type: ignore + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsTargetInstanceRequest], + compute.TestPermissionsResponse, + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._TestIamPermissions(self._session, self._host, self._interceptor) # type: ignore + @property def kind(self) -> str: return "rest" diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest_base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest_base.py index 482b8bca9f64..b5fbc8ae718f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest_base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest_base.py @@ -383,5 +383,61 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseTestIamPermissions: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/zones/{zone}/targetInstances/{resource}/testIamPermissions", + "body": "test_permissions_request_resource", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.TestIamPermissionsTargetInstanceRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], use_integers_for_enums=False + ) + return body + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseTargetInstancesRestTransport._BaseTestIamPermissions._get_unset_required_fields( + query_params + ) + ) + + return query_params + __all__ = ("_BaseTargetInstancesRestTransport",) diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py index 1a222f741157..ae0c1b5d3372 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py @@ -3780,6 +3780,159 @@ def error_code(self): # Done; return the response. return response + def test_iam_permissions( + self, + request: Optional[ + Union[compute.TestIamPermissionsTargetPoolRequest, dict] + ] = None, + *, + project: Optional[str] = None, + region: Optional[str] = None, + resource: Optional[str] = None, + test_permissions_request_resource: Optional[ + compute.TestPermissionsRequest + ] = None, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Union[float, object] = gapic_v1.method.DEFAULT, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Returns permissions that a caller has on the + specified resource. + + .. code-block:: python + + # This snippet has been automatically generated and should be regarded as a + # code template only. + # It will require modifications to work: + # - It may require correct/in-range values for request initialization. + # - It may require specifying regional endpoints when creating the service + # client as shown in: + # https://googleapis.dev/python/google-api-core/latest/client_options.html + from google.cloud import compute_v1 + + def sample_test_iam_permissions(): + # Create a client + client = compute_v1.TargetPoolsClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsTargetPoolRequest( + project="project_value", + region="region_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + + Args: + request (Union[google.cloud.compute_v1.types.TestIamPermissionsTargetPoolRequest, dict]): + The request object. A request message for + TargetPools.TestIamPermissions. See the + method description for details. + project (str): + Project ID for this request. + This corresponds to the ``project`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + region (str): + The name of the region for this + request. + + This corresponds to the ``region`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + resource (str): + Name or id of the resource for this + request. + + This corresponds to the ``resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + This corresponds to the ``test_permissions_request_resource`` field + on the ``request`` instance; if ``request`` is provided, this + should not be set. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + google.cloud.compute_v1.types.TestPermissionsResponse: + + """ + # Create or coerce a protobuf request object. + # - Quick check: If we got a request object, we should *not* have + # gotten any keyword arguments that map to the request. + flattened_params = [ + project, + region, + resource, + test_permissions_request_resource, + ] + has_flattened_params = ( + len([param for param in flattened_params if param is not None]) > 0 + ) + if request is not None and has_flattened_params: + raise ValueError( + "If the `request` argument is set, then none of " + "the individual field arguments should be set." + ) + + # - Use the request object if provided (there's no risk of modifying the input as + # there are no flattened fields), or create one. + if not isinstance(request, compute.TestIamPermissionsTargetPoolRequest): + request = compute.TestIamPermissionsTargetPoolRequest(request) + # If we have keyword arguments corresponding to fields on the + # request, apply these. + if project is not None: + request.project = project + if region is not None: + request.region = region + if resource is not None: + request.resource = resource + if test_permissions_request_resource is not None: + request.test_permissions_request_resource = ( + test_permissions_request_resource + ) + + # Wrap the RPC method; this adds retry and timeout information, + # and friendly error handling. + rpc = self._transport._wrapped_methods[self._transport.test_iam_permissions] + + # Certain fields should be provided within the metadata header; + # add these here. + metadata = tuple(metadata) + ( + gapic_v1.routing_header.to_grpc_metadata( + ( + ("project", request.project), + ("region", request.region), + ("resource", request.resource), + ) + ), + ) + + # Validate the universe domain. + self._validate_universe_domain() + + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) + + # Done; return the response. + return response + def __enter__(self) -> "TargetPoolsClient": return self diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/base.py index f2ff5b20d211..b450db0f39d2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/base.py @@ -197,6 +197,11 @@ def _prep_wrapped_messages(self, client_info): default_timeout=None, client_info=client_info, ), + self.test_iam_permissions: gapic_v1.method.wrap_method( + self.test_iam_permissions, + default_timeout=None, + client_info=client_info, + ), } def close(self): @@ -322,6 +327,17 @@ def set_security_policy( ]: raise NotImplementedError() + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsTargetPoolRequest], + Union[ + compute.TestPermissionsResponse, Awaitable[compute.TestPermissionsResponse] + ], + ]: + raise NotImplementedError() + @property def kind(self) -> str: raise NotImplementedError() diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py index dc703ff60190..9ad450f2e762 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py @@ -168,6 +168,14 @@ def post_set_security_policy(self, response): logging.log(f"Received response: {response}") return response + def pre_test_iam_permissions(self, request, metadata): + logging.log(f"Received request: {request}") + return request, metadata + + def post_test_iam_permissions(self, response): + logging.log(f"Received response: {response}") + return response + transport = TargetPoolsRestTransport(interceptor=MyCustomTargetPoolsInterceptor()) client = TargetPoolsClient(transport=transport) @@ -737,6 +745,57 @@ def post_set_security_policy_with_metadata( """ return response, metadata + def pre_test_iam_permissions( + self, + request: compute.TestIamPermissionsTargetPoolRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestIamPermissionsTargetPoolRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Pre-rpc interceptor for test_iam_permissions + + Override in a subclass to manipulate the request or metadata + before they are sent to the TargetPools server. + """ + return request, metadata + + def post_test_iam_permissions( + self, response: compute.TestPermissionsResponse + ) -> compute.TestPermissionsResponse: + """Post-rpc interceptor for test_iam_permissions + + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response + after it is returned by the TargetPools server but before + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. + """ + return response + + def post_test_iam_permissions_with_metadata( + self, + response: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions` interceptor. + When both interceptors are used, this `post_test_iam_permissions_with_metadata` interceptor runs after the + `post_test_iam_permissions` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions` will be passed to + `post_test_iam_permissions_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetPoolsRestStub: @@ -2790,6 +2849,160 @@ def __call__( ) return resp + class _TestIamPermissions( + _BaseTargetPoolsRestTransport._BaseTestIamPermissions, TargetPoolsRestStub + ): + def __hash__(self): + return hash("TargetPoolsRestTransport.TestIamPermissions") + + @staticmethod + def _get_response( + host, + metadata, + query_params, + session, + timeout, + transcoded_request, + body=None, + ): + uri = transcoded_request["uri"] + method = transcoded_request["method"] + headers = dict(metadata) + headers["Content-Type"] = "application/json" + response = getattr(session, method)( + "{host}{uri}".format(host=host, uri=uri), + timeout=timeout, + headers=headers, + params=rest_helpers.flatten_query_params(query_params, strict=True), + data=body, + ) + return response + + def __call__( + self, + request: compute.TestIamPermissionsTargetPoolRequest, + *, + retry: OptionalRetry = gapic_v1.method.DEFAULT, + timeout: Optional[float] = None, + metadata: Sequence[Tuple[str, Union[str, bytes]]] = (), + ) -> compute.TestPermissionsResponse: + r"""Call the test iam permissions method over HTTP. + + Args: + request (~.compute.TestIamPermissionsTargetPoolRequest): + The request object. A request message for + TargetPools.TestIamPermissions. See the + method description for details. + retry (google.api_core.retry.Retry): Designation of what errors, if any, + should be retried. + timeout (float): The timeout for this request. + metadata (Sequence[Tuple[str, Union[str, bytes]]]): Key/value pairs which should be + sent along with the request as metadata. Normally, each value must be of type `str`, + but for metadata keys ending with the suffix `-bin`, the corresponding values must + be of type `bytes`. + + Returns: + ~.compute.TestPermissionsResponse: + + """ + + http_options = ( + _BaseTargetPoolsRestTransport._BaseTestIamPermissions._get_http_options() + ) + + request, metadata = self._interceptor.pre_test_iam_permissions( + request, metadata + ) + transcoded_request = _BaseTargetPoolsRestTransport._BaseTestIamPermissions._get_transcoded_request( + http_options, request + ) + + body = _BaseTargetPoolsRestTransport._BaseTestIamPermissions._get_request_body_json( + transcoded_request + ) + + # Jsonify the query params + query_params = _BaseTargetPoolsRestTransport._BaseTestIamPermissions._get_query_params_json( + transcoded_request + ) + + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + request_url = "{host}{uri}".format( + host=self._host, uri=transcoded_request["uri"] + ) + method = transcoded_request["method"] + try: + request_payload = type(request).to_json(request) + except: + request_payload = None + http_request = { + "payload": request_payload, + "requestMethod": method, + "requestUrl": request_url, + "headers": dict(metadata), + } + _LOGGER.debug( + f"Sending request for google.cloud.compute_v1.TargetPoolsClient.TestIamPermissions", + extra={ + "serviceName": "google.cloud.compute.v1.TargetPools", + "rpcName": "TestIamPermissions", + "httpRequest": http_request, + "metadata": http_request["headers"], + }, + ) + + # Send the request + response = TargetPoolsRestTransport._TestIamPermissions._get_response( + self._host, + metadata, + query_params, + self._session, + timeout, + transcoded_request, + body, + ) + + # In case of error, raise the appropriate core_exceptions.GoogleAPICallError exception + # subclass. + if response.status_code >= 400: + raise core_exceptions.from_http_response(response) + + # Return the response + resp = compute.TestPermissionsResponse() + pb_resp = compute.TestPermissionsResponse.pb(resp) + + json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) + + resp = self._interceptor.post_test_iam_permissions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_with_metadata( + resp, response_metadata + ) + if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( + logging.DEBUG + ): # pragma: NO COVER + try: + response_payload = compute.TestPermissionsResponse.to_json(response) + except: + response_payload = None + http_response = { + "payload": response_payload, + "headers": dict(response.headers), + "status": response.status_code, + } + _LOGGER.debug( + "Received response for google.cloud.compute_v1.TargetPoolsClient.test_iam_permissions", + extra={ + "serviceName": "google.cloud.compute.v1.TargetPools", + "rpcName": "TestIamPermissions", + "metadata": http_response["headers"], + "httpResponse": http_response, + }, + ) + return resp + @property def add_health_check( self, @@ -2884,6 +3097,16 @@ def set_security_policy( # In C++ this would require a dynamic_cast return self._SetSecurityPolicy(self._session, self._host, self._interceptor) # type: ignore + @property + def test_iam_permissions( + self, + ) -> Callable[ + [compute.TestIamPermissionsTargetPoolRequest], compute.TestPermissionsResponse + ]: + # The return type is fine, but mypy isn't sophisticated enough to determine what's going on here. + # In C++ this would require a dynamic_cast + return self._TestIamPermissions(self._session, self._host, self._interceptor) # type: ignore + @property def kind(self) -> str: return "rest" diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest_base.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest_base.py index 6cacc5687d33..a5e64e961c4b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest_base.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest_base.py @@ -719,5 +719,61 @@ def _get_query_params_json(transcoded_request): return query_params + class _BaseTestIamPermissions: + def __hash__(self): # pragma: NO COVER + return NotImplementedError("__hash__ must be implemented.") + + __REQUIRED_FIELDS_DEFAULT_VALUES: Dict[str, Any] = {} + + @classmethod + def _get_unset_required_fields(cls, message_dict): + return { + k: v + for k, v in cls.__REQUIRED_FIELDS_DEFAULT_VALUES.items() + if k not in message_dict + } + + @staticmethod + def _get_http_options(): + http_options: List[Dict[str, str]] = [ + { + "method": "post", + "uri": "/compute/v1/projects/{project}/regions/{region}/targetPools/{resource}/testIamPermissions", + "body": "test_permissions_request_resource", + }, + ] + return http_options + + @staticmethod + def _get_transcoded_request(http_options, request): + pb_request = compute.TestIamPermissionsTargetPoolRequest.pb(request) + transcoded_request = path_template.transcode(http_options, pb_request) + return transcoded_request + + @staticmethod + def _get_request_body_json(transcoded_request): + # Jsonify the request body + + body = json_format.MessageToJson( + transcoded_request["body"], use_integers_for_enums=False + ) + return body + + @staticmethod + def _get_query_params_json(transcoded_request): + query_params = json.loads( + json_format.MessageToJson( + transcoded_request["query_params"], + use_integers_for_enums=False, + ) + ) + query_params.update( + _BaseTargetPoolsRestTransport._BaseTestIamPermissions._get_unset_required_fields( + query_params + ) + ) + + return query_params + __all__ = ("_BaseTargetPoolsRestTransport",) diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/types/__init__.py b/packages/google-cloud-compute/google/cloud/compute_v1/types/__init__.py index 591a53ab5ff0..0a211eb44f15 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/types/__init__.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/types/__init__.py @@ -30,6 +30,7 @@ AddHealthCheckTargetPoolRequest, AddInstancesInstanceGroupRequest, AddInstanceTargetPoolRequest, + AddNetworkInterfaceInstanceRequest, AddNodesNodeGroupRequest, AddPacketMirroringRuleNetworkFirewallPolicyRequest, AddPeeringNetworkRequest, @@ -248,6 +249,7 @@ DeleteNetworkEdgeSecurityServiceRequest, DeleteNetworkEndpointGroupRequest, DeleteNetworkFirewallPolicyRequest, + DeleteNetworkInterfaceInstanceRequest, DeleteNetworkRequest, DeleteNodeGroupRequest, DeleteNodesNodeGroupRequest, @@ -1005,6 +1007,7 @@ NetworkProfile, NetworkProfileLocation, NetworkProfileNetworkFeatures, + NetworkProfileProfileType, NetworkProfilesListResponse, NetworkRoutingConfig, NetworksAddPeeringRequest, @@ -1280,6 +1283,7 @@ RouterNatRuleAction, RouterNatSubnetworkToNat, RouterNatSubnetworkToNat64, + RouterParams, RoutersGetRoutePolicyResponse, RoutersListBgpRoutes, RoutersListRoutePolicies, @@ -1558,12 +1562,15 @@ TargetVpnGatewaysScopedList, TCPHealthCheck, TestFailure, + TestIamPermissionsAddressRequest, TestIamPermissionsBackendBucketRequest, TestIamPermissionsBackendServiceRequest, TestIamPermissionsDiskRequest, TestIamPermissionsExternalVpnGatewayRequest, TestIamPermissionsFirewallPolicyRequest, + TestIamPermissionsGlobalAddressRequest, TestIamPermissionsImageRequest, + TestIamPermissionsInstanceGroupRequest, TestIamPermissionsInstanceRequest, TestIamPermissionsInstanceTemplateRequest, TestIamPermissionsInstantSnapshotRequest, @@ -1580,6 +1587,7 @@ TestIamPermissionsPacketMirroringRequest, TestIamPermissionsRegionBackendServiceRequest, TestIamPermissionsRegionDiskRequest, + TestIamPermissionsRegionInstanceGroupRequest, TestIamPermissionsRegionInstantSnapshotRequest, TestIamPermissionsRegionNetworkFirewallPolicyRequest, TestIamPermissionsReservationRequest, @@ -1588,6 +1596,8 @@ TestIamPermissionsSnapshotRequest, TestIamPermissionsStoragePoolRequest, TestIamPermissionsSubnetworkRequest, + TestIamPermissionsTargetInstanceRequest, + TestIamPermissionsTargetPoolRequest, TestIamPermissionsVpnGatewayRequest, TestPermissionsRequest, TestPermissionsResponse, @@ -1652,7 +1662,10 @@ VpnGatewayVpnGatewayInterface, VpnTunnel, VpnTunnelAggregatedList, + VpnTunnelCipherSuite, VpnTunnelList, + VpnTunnelPhase1Algorithms, + VpnTunnelPhase2Algorithms, VpnTunnelsScopedList, WafExpressionSet, WafExpressionSetExpression, @@ -1689,6 +1702,7 @@ "AddHealthCheckTargetPoolRequest", "AddInstancesInstanceGroupRequest", "AddInstanceTargetPoolRequest", + "AddNetworkInterfaceInstanceRequest", "AddNodesNodeGroupRequest", "AddPacketMirroringRuleNetworkFirewallPolicyRequest", "AddPeeringNetworkRequest", @@ -1907,6 +1921,7 @@ "DeleteNetworkEdgeSecurityServiceRequest", "DeleteNetworkEndpointGroupRequest", "DeleteNetworkFirewallPolicyRequest", + "DeleteNetworkInterfaceInstanceRequest", "DeleteNetworkRequest", "DeleteNodeGroupRequest", "DeleteNodesNodeGroupRequest", @@ -2664,6 +2679,7 @@ "NetworkProfile", "NetworkProfileLocation", "NetworkProfileNetworkFeatures", + "NetworkProfileProfileType", "NetworkProfilesListResponse", "NetworkRoutingConfig", "NetworksAddPeeringRequest", @@ -2939,6 +2955,7 @@ "RouterNatRuleAction", "RouterNatSubnetworkToNat", "RouterNatSubnetworkToNat64", + "RouterParams", "RoutersGetRoutePolicyResponse", "RoutersListBgpRoutes", "RoutersListRoutePolicies", @@ -3217,12 +3234,15 @@ "TargetVpnGatewaysScopedList", "TCPHealthCheck", "TestFailure", + "TestIamPermissionsAddressRequest", "TestIamPermissionsBackendBucketRequest", "TestIamPermissionsBackendServiceRequest", "TestIamPermissionsDiskRequest", "TestIamPermissionsExternalVpnGatewayRequest", "TestIamPermissionsFirewallPolicyRequest", + "TestIamPermissionsGlobalAddressRequest", "TestIamPermissionsImageRequest", + "TestIamPermissionsInstanceGroupRequest", "TestIamPermissionsInstanceRequest", "TestIamPermissionsInstanceTemplateRequest", "TestIamPermissionsInstantSnapshotRequest", @@ -3239,6 +3259,7 @@ "TestIamPermissionsPacketMirroringRequest", "TestIamPermissionsRegionBackendServiceRequest", "TestIamPermissionsRegionDiskRequest", + "TestIamPermissionsRegionInstanceGroupRequest", "TestIamPermissionsRegionInstantSnapshotRequest", "TestIamPermissionsRegionNetworkFirewallPolicyRequest", "TestIamPermissionsReservationRequest", @@ -3247,6 +3268,8 @@ "TestIamPermissionsSnapshotRequest", "TestIamPermissionsStoragePoolRequest", "TestIamPermissionsSubnetworkRequest", + "TestIamPermissionsTargetInstanceRequest", + "TestIamPermissionsTargetPoolRequest", "TestIamPermissionsVpnGatewayRequest", "TestPermissionsRequest", "TestPermissionsResponse", @@ -3311,7 +3334,10 @@ "VpnGatewayVpnGatewayInterface", "VpnTunnel", "VpnTunnelAggregatedList", + "VpnTunnelCipherSuite", "VpnTunnelList", + "VpnTunnelPhase1Algorithms", + "VpnTunnelPhase2Algorithms", "VpnTunnelsScopedList", "WafExpressionSet", "WafExpressionSetExpression", diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py b/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py index 8cae1af1451b..75954a61316c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py @@ -40,6 +40,7 @@ "AddHealthCheckTargetPoolRequest", "AddInstanceTargetPoolRequest", "AddInstancesInstanceGroupRequest", + "AddNetworkInterfaceInstanceRequest", "AddNodesNodeGroupRequest", "AddPacketMirroringRuleNetworkFirewallPolicyRequest", "AddPeeringNetworkRequest", @@ -257,6 +258,7 @@ "DeleteNetworkEdgeSecurityServiceRequest", "DeleteNetworkEndpointGroupRequest", "DeleteNetworkFirewallPolicyRequest", + "DeleteNetworkInterfaceInstanceRequest", "DeleteNetworkRequest", "DeleteNodeGroupRequest", "DeleteNodeTemplateRequest", @@ -1014,6 +1016,7 @@ "NetworkProfile", "NetworkProfileLocation", "NetworkProfileNetworkFeatures", + "NetworkProfileProfileType", "NetworkProfilesListResponse", "NetworkRoutingConfig", "NetworksAddPeeringRequest", @@ -1289,6 +1292,7 @@ "RouterNatRuleAction", "RouterNatSubnetworkToNat", "RouterNatSubnetworkToNat64", + "RouterParams", "RouterStatus", "RouterStatusBgpPeerStatus", "RouterStatusNatStatus", @@ -1567,12 +1571,15 @@ "TargetVpnGatewayList", "TargetVpnGatewaysScopedList", "TestFailure", + "TestIamPermissionsAddressRequest", "TestIamPermissionsBackendBucketRequest", "TestIamPermissionsBackendServiceRequest", "TestIamPermissionsDiskRequest", "TestIamPermissionsExternalVpnGatewayRequest", "TestIamPermissionsFirewallPolicyRequest", + "TestIamPermissionsGlobalAddressRequest", "TestIamPermissionsImageRequest", + "TestIamPermissionsInstanceGroupRequest", "TestIamPermissionsInstanceRequest", "TestIamPermissionsInstanceTemplateRequest", "TestIamPermissionsInstantSnapshotRequest", @@ -1589,6 +1596,7 @@ "TestIamPermissionsPacketMirroringRequest", "TestIamPermissionsRegionBackendServiceRequest", "TestIamPermissionsRegionDiskRequest", + "TestIamPermissionsRegionInstanceGroupRequest", "TestIamPermissionsRegionInstantSnapshotRequest", "TestIamPermissionsRegionNetworkFirewallPolicyRequest", "TestIamPermissionsReservationRequest", @@ -1597,6 +1605,8 @@ "TestIamPermissionsSnapshotRequest", "TestIamPermissionsStoragePoolRequest", "TestIamPermissionsSubnetworkRequest", + "TestIamPermissionsTargetInstanceRequest", + "TestIamPermissionsTargetPoolRequest", "TestIamPermissionsVpnGatewayRequest", "TestPermissionsRequest", "TestPermissionsResponse", @@ -1661,7 +1671,10 @@ "VpnGatewaysScopedList", "VpnTunnel", "VpnTunnelAggregatedList", + "VpnTunnelCipherSuite", "VpnTunnelList", + "VpnTunnelPhase1Algorithms", + "VpnTunnelPhase2Algorithms", "VpnTunnelsScopedList", "WafExpressionSet", "WafExpressionSetExpression", @@ -2882,6 +2895,68 @@ class AddInstancesInstanceGroupRequest(proto.Message): ) +class AddNetworkInterfaceInstanceRequest(proto.Message): + r"""A request message for Instances.AddNetworkInterface. See the + method description for details. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + instance (str): + The instance name for this request stored as resource_id. + Name should conform to RFC1035 or be an unsigned long + integer. + network_interface_resource (google.cloud.compute_v1.types.NetworkInterface): + The body resource for this request + project (str): + Project ID for this request. + request_id (str): + An optional request ID to identify requests. + Specify a unique request ID so that if you must + retry your request, the server will know to + ignore the request if it has already been + completed. For example, consider a situation + where you make an initial request and the + request times out. If you make the request again + with the same request ID, the server can check + if original operation with the same request ID + was received, and if so, will ignore the second + request. This prevents clients from accidentally + creating duplicate commitments. The request ID + must be a valid UUID with the exception that + zero UUID is not supported ( + 00000000-0000-0000-0000-000000000000). + + This field is a member of `oneof`_ ``_request_id``. + zone (str): + The name of the zone for this request. + """ + + instance: str = proto.Field( + proto.STRING, + number=18257045, + ) + network_interface_resource: "NetworkInterface" = proto.Field( + proto.MESSAGE, + number=325814789, + message="NetworkInterface", + ) + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + request_id: str = proto.Field( + proto.STRING, + number=37109963, + optional=True, + ) + zone: str = proto.Field( + proto.STRING, + number=3744684, + ) + + class AddNodesNodeGroupRequest(proto.Message): r"""A request message for NodeGroups.AddNodes. See the method description for details. @@ -14883,9 +14958,9 @@ class BackendBucketCdnPolicy(proto.Message): apply the following default TTLs to these status codes: HTTP 300 (Multiple Choice), 301, 308 (Permanent Redirects): 10m HTTP 404 (Not Found), 410 (Gone), 451 (Unavailable For Legal - Reasons): 120s HTTP 405 (Method Not Found), 421 (Misdirected - Request), 501 (Not Implemented): 60s. These defaults can be - overridden in negative_caching_policy. + Reasons): 120s HTTP 405 (Method Not Found), 501 (Not + Implemented): 60s. These defaults can be overridden in + negative_caching_policy. This field is a member of `oneof`_ ``_negative_caching``. negative_caching_policy (MutableSequence[google.cloud.compute_v1.types.BackendBucketCdnPolicyNegativeCachingPolicy]): @@ -16645,9 +16720,9 @@ class BackendServiceCdnPolicy(proto.Message): apply the following default TTLs to these status codes: HTTP 300 (Multiple Choice), 301, 308 (Permanent Redirects): 10m HTTP 404 (Not Found), 410 (Gone), 451 (Unavailable For Legal - Reasons): 120s HTTP 405 (Method Not Found), 421 (Misdirected - Request), 501 (Not Implemented): 60s. These defaults can be - overridden in negative_caching_policy. + Reasons): 120s HTTP 405 (Method Not Found), 501 (Not + Implemented): 60s. These defaults can be overridden in + negative_caching_policy. This field is a member of `oneof`_ ``_negative_caching``. negative_caching_policy (MutableSequence[google.cloud.compute_v1.types.BackendServiceCdnPolicyNegativeCachingPolicy]): @@ -23249,6 +23324,68 @@ class DeleteNetworkFirewallPolicyRequest(proto.Message): ) +class DeleteNetworkInterfaceInstanceRequest(proto.Message): + r"""A request message for Instances.DeleteNetworkInterface. See + the method description for details. + + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + instance (str): + The instance name for this request stored as resource_id. + Name should conform to RFC1035 or be an unsigned long + integer. + network_interface_name (str): + The name of the dynamic network interface to + be deleted from the instance. + project (str): + Project ID for this request. + request_id (str): + An optional request ID to identify requests. + Specify a unique request ID so that if you must + retry your request, the server will know to + ignore the request if it has already been + completed. For example, consider a situation + where you make an initial request and the + request times out. If you make the request again + with the same request ID, the server can check + if original operation with the same request ID + was received, and if so, will ignore the second + request. This prevents clients from accidentally + creating duplicate commitments. The request ID + must be a valid UUID with the exception that + zero UUID is not supported ( + 00000000-0000-0000-0000-000000000000). + + This field is a member of `oneof`_ ``_request_id``. + zone (str): + The name of the zone for this request. + """ + + instance: str = proto.Field( + proto.STRING, + number=18257045, + ) + network_interface_name: str = proto.Field( + proto.STRING, + number=381342722, + ) + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + request_id: str = proto.Field( + proto.STRING, + number=37109963, + optional=True, + ) + zone: str = proto.Field( + proto.STRING, + number=3744684, + ) + + class DeleteNetworkRequest(proto.Message): r"""A request message for Networks.Delete. See the method description for details. @@ -35883,6 +36020,9 @@ class GetServiceAttachmentRequest(proto.Message): r"""A request message for ServiceAttachments.Get. See the method description for details. + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: project (str): Project ID for this request. @@ -35891,6 +36031,11 @@ class GetServiceAttachmentRequest(proto.Message): service_attachment (str): Name of the ServiceAttachment resource to return. + show_nat_ips (bool): + Indicates whether NAT IPs should be included + in the response. + + This field is a member of `oneof`_ ``_show_nat_ips``. """ project: str = proto.Field( @@ -35905,6 +36050,11 @@ class GetServiceAttachmentRequest(proto.Message): proto.STRING, number=338957549, ) + show_nat_ips: bool = proto.Field( + proto.BOOL, + number=485502156, + optional=True, + ) class GetShieldedInstanceIdentityInstanceRequest(proto.Message): @@ -45035,6 +45185,10 @@ class Status(proto.Enum): The instance is halted and we are performing tear down tasks like network deprogramming, releasing quota, IP, tearing down disks etc. + PENDING (35394935): + For Flex Start provisioning instance is + waiting for available capacity from Dynamic + Workload Scheduler (DWS). PROVISIONING (290896621): Resources are being allocated for the instance. @@ -45060,6 +45214,7 @@ class Status(proto.Enum): """ UNDEFINED_STATUS = 0 DEPROVISIONING = 428935662 + PENDING = 35394935 PROVISIONING = 290896621 REPAIRING = 413483285 RUNNING = 121282975 @@ -48801,7 +48956,14 @@ class InstanceMoveRequest(proto.Message): class InstanceParams(proto.Message): r"""Additional instance params. + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + Attributes: + request_valid_for_duration (google.cloud.compute_v1.types.Duration): + Relative deadline for waiting for capacity. + Relevant only for Instances.Insert API. + + This field is a member of `oneof`_ ``_request_valid_for_duration``. resource_manager_tags (MutableMapping[str, str]): Resource manager tags to be bound to the instance. Tag keys and values have the same definition as resource manager @@ -48810,6 +48972,12 @@ class InstanceParams(proto.Message): ignored (both PUT & PATCH) when empty. """ + request_valid_for_duration: "Duration" = proto.Field( + proto.MESSAGE, + number=116247389, + optional=True, + message="Duration", + ) resource_manager_tags: MutableMapping[str, str] = proto.MapField( proto.STRING, proto.STRING, @@ -49613,6 +49781,10 @@ class Status(proto.Enum): The instance is halted and we are performing tear down tasks like network deprogramming, releasing quota, IP, tearing down disks etc. + PENDING (35394935): + For Flex Start provisioning instance is + waiting for available capacity from Dynamic + Workload Scheduler (DWS). PROVISIONING (290896621): Resources are being allocated for the instance. @@ -49638,6 +49810,7 @@ class Status(proto.Enum): """ UNDEFINED_STATUS = 0 DEPROVISIONING = 428935662 + PENDING = 35394935 PROVISIONING = 290896621 REPAIRING = 413483285 RUNNING = 121282975 @@ -53132,11 +53305,9 @@ class InterconnectAttachmentGroupsOperationalStatusAttachmentStatus(proto.Messag This field is a member of `oneof`_ ``_is_active``. status (str): - Whether this Attachment is active, and if so, whether BGP is - up. This is based on the statuses available in the Pantheon - UI here: - http://google3/java/com/google/cloud/boq/clientapi/gce/hybrid/api/interconnect_models.proto - Check the Status enum for the list of possible values. + Whether this Attachment is active, and if so, + whether BGP is up. Check the Status enum for the + list of possible values. This field is a member of `oneof`_ ``_status``. """ @@ -53164,9 +53335,8 @@ class IsActive(proto.Enum): UNSPECIFIED = 526786327 class Status(proto.Enum): - r"""Whether this Attachment is active, and if so, whether BGP is up. - This is based on the statuses available in the Pantheon UI here: - http://google3/java/com/google/cloud/boq/clientapi/gce/hybrid/api/interconnect_models.proto + r"""Whether this Attachment is active, and if so, whether BGP is + up. Values: UNDEFINED_STATUS (0): @@ -74022,6 +74192,10 @@ class InstanceStatus(proto.Enum): The instance is halted and we are performing tear down tasks like network deprogramming, releasing quota, IP, tearing down disks etc. + PENDING (35394935): + For Flex Start provisioning instance is + waiting for available capacity from Dynamic + Workload Scheduler (DWS). PROVISIONING (290896621): Resources are being allocated for the instance. @@ -74046,6 +74220,7 @@ class InstanceStatus(proto.Enum): """ UNDEFINED_INSTANCE_STATUS = 0 DEPROVISIONING = 428935662 + PENDING = 35394935 PROVISIONING = 290896621 REPAIRING = 413483285 RUNNING = 121282975 @@ -77023,6 +77198,11 @@ class NetworkInterface(proto.Message): values. This field is a member of `oneof`_ ``_nic_type``. + parent_nic_name (str): + Name of the parent network interface of a + dynamic network interface. + + This field is a member of `oneof`_ ``_parent_nic_name``. queue_count (int): The networking queue count that's specified by users for the network interface. Both Rx and @@ -77054,6 +77234,12 @@ class NetworkInterface(proto.Message): regions/region/subnetworks/subnetwork This field is a member of `oneof`_ ``_subnetwork``. + vlan (int): + VLAN tag of a dynamic network interface, must + be an integer in the range from 2 to 255 + inclusively. + + This field is a member of `oneof`_ ``_vlan``. """ class Ipv6AccessType(proto.Enum): @@ -77202,6 +77388,11 @@ class StackType(proto.Enum): number=59810577, optional=True, ) + parent_nic_name: str = proto.Field( + proto.STRING, + number=418764375, + optional=True, + ) queue_count: int = proto.Field( proto.INT32, number=503708769, @@ -77217,6 +77408,11 @@ class StackType(proto.Enum): number=307827694, optional=True, ) + vlan: int = proto.Field( + proto.INT32, + number=3622243, + optional=True, + ) class NetworkList(proto.Message): @@ -77901,6 +78097,10 @@ class NetworkProfile(proto.Message): [Output Only] Name of the resource. This field is a member of `oneof`_ ``_name``. + profile_type (google.cloud.compute_v1.types.NetworkProfileProfileType): + [Output Only] Type of the network profile. + + This field is a member of `oneof`_ ``_profile_type``. self_link (str): [Output Only] Server-defined URL for the resource. @@ -77952,6 +78152,12 @@ class NetworkProfile(proto.Message): number=3373707, optional=True, ) + profile_type: "NetworkProfileProfileType" = proto.Field( + proto.MESSAGE, + number=150167568, + optional=True, + message="NetworkProfileProfileType", + ) self_link: str = proto.Field( proto.STRING, number=456214797, @@ -78851,6 +79057,120 @@ class Unicast(proto.Enum): ) +class NetworkProfileProfileType(proto.Message): + r""" + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + network_type (str): + Check the NetworkType enum for the list of + possible values. + + This field is a member of `oneof`_ ``_network_type``. + rdma_subtype (str): + Check the RdmaSubtype enum for the list of + possible values. + + This field is a member of `oneof`_ ``_rdma_subtype``. + ull_subtype (str): + Check the UllSubtype enum for the list of + possible values. + + This field is a member of `oneof`_ ``_ull_subtype``. + vpc_subtype (str): + Check the VpcSubtype enum for the list of + possible values. + + This field is a member of `oneof`_ ``_vpc_subtype``. + """ + + class NetworkType(proto.Enum): + r""" + + Values: + UNDEFINED_NETWORK_TYPE (0): + A value indicating that the enum field is not + set. + RDMA (2510662): + RDMA network. + ULL (84117): + ULL network. + VPC (85193): + VPC network. + """ + UNDEFINED_NETWORK_TYPE = 0 + RDMA = 2510662 + ULL = 84117 + VPC = 85193 + + class RdmaSubtype(proto.Enum): + r""" + + Values: + UNDEFINED_RDMA_SUBTYPE (0): + A value indicating that the enum field is not + set. + FALCON (455787729): + RDMA over Falcon. + ROCE (2520927): + RDMA over Converged Ethernet (RoCE). + """ + UNDEFINED_RDMA_SUBTYPE = 0 + FALCON = 455787729 + ROCE = 2520927 + + class UllSubtype(proto.Enum): + r""" + + Values: + UNDEFINED_ULL_SUBTYPE (0): + A value indicating that the enum field is not + set. + OPERATOR (282073252): + Exchange operator. + PARTICIPANT (236028691): + Exchange participant. + """ + UNDEFINED_ULL_SUBTYPE = 0 + OPERATOR = 282073252 + PARTICIPANT = 236028691 + + class VpcSubtype(proto.Enum): + r""" + + Values: + UNDEFINED_VPC_SUBTYPE (0): + A value indicating that the enum field is not + set. + REGIONAL (92288543): + Regionally bound VPC network. + """ + UNDEFINED_VPC_SUBTYPE = 0 + REGIONAL = 92288543 + + network_type: str = proto.Field( + proto.STRING, + number=517413547, + optional=True, + ) + rdma_subtype: str = proto.Field( + proto.STRING, + number=82019713, + optional=True, + ) + ull_subtype: str = proto.Field( + proto.STRING, + number=94311408, + optional=True, + ) + vpc_subtype: str = proto.Field( + proto.STRING, + number=356623396, + optional=True, + ) + + class NetworkProfilesListResponse(proto.Message): r"""Contains a list of network profiles. @@ -96475,6 +96795,11 @@ class Router(proto.Message): belongs. This field is a member of `oneof`_ ``_network``. + params (google.cloud.compute_v1.types.RouterParams): + Input only. [Input Only] Additional params passed with the + request, but not persisted as part of resource payload. + + This field is a member of `oneof`_ ``_params``. region (str): [Output Only] URI of the region where the router resides. You must specify this field as part of the HTTP request URL. @@ -96550,6 +96875,12 @@ class Router(proto.Message): number=232872494, optional=True, ) + params: "RouterParams" = proto.Field( + proto.MESSAGE, + number=78313862, + optional=True, + message="RouterParams", + ) region: str = proto.Field( proto.STRING, number=138946292, @@ -98278,6 +98609,32 @@ class RouterNatSubnetworkToNat64(proto.Message): ) +class RouterParams(proto.Message): + r"""Additional router parameters. + + Attributes: + resource_manager_tags (MutableMapping[str, str]): + Tag keys/values directly bound to this resource. The field + is allowed for INSERT only. The keys/values to set on the + resource should be specified in either ID { : } or + Namespaced format { : }. For example the following are valid + inputs: \* {"tagKeys/333" : "tagValues/444", "tagKeys/123" : + "tagValues/456"} \* {"123/environment" : "production", + "345/abc" : "xyz"} Note: \* Invalid combinations of ID & + namespaced format is not supported. For instance: + {"123/environment" : "tagValues/444"} is invalid. \* + Inconsistent format is not supported. For instance: + {"tagKeys/333" : "tagValues/444", "123/env" : "prod"} is + invalid. + """ + + resource_manager_tags: MutableMapping[str, str] = proto.MapField( + proto.STRING, + proto.STRING, + number=377671164, + ) + + class RouterStatus(proto.Message): r""" @@ -99698,6 +100055,13 @@ class Scheduling(proto.Message): the list of possible values. This field is a member of `oneof`_ ``_provisioning_model``. + skip_guest_os_shutdown (bool): + Default is false and there will be 120 + seconds between GCE ACPI G2 Soft Off and ACPI G3 + Mechanical Off for Standard VMs and 30 seconds + for Spot VMs. + + This field is a member of `oneof`_ ``_skip_guest_os_shutdown``. termination_time (str): Specifies the timestamp, when the instance will be terminated, in RFC3339 text format. If @@ -99762,6 +100126,9 @@ class ProvisioningModel(proto.Enum): UNDEFINED_PROVISIONING_MODEL (0): A value indicating that the enum field is not set. + FLEX_START (101746812): + Instance is provisioned using the Flex Start + provisioning model and has a limited runtime. RESERVATION_BOUND (293538571): Bound to the lifecycle of the reservation in which it is provisioned. @@ -99772,6 +100139,7 @@ class ProvisioningModel(proto.Enum): runtime, no discounts. """ UNDEFINED_PROVISIONING_MODEL = 0 + FLEX_START = 101746812 RESERVATION_BOUND = 293538571 SPOT = 2552066 STANDARD = 484642493 @@ -99844,6 +100212,11 @@ class ProvisioningModel(proto.Enum): number=494423, optional=True, ) + skip_guest_os_shutdown: bool = proto.Field( + proto.BOOL, + number=201662378, + optional=True, + ) termination_time: str = proto.Field( proto.STRING, number=428082984, @@ -101138,12 +101511,12 @@ class SecurityPolicyRuleMatcher(proto.Message): User defined CEVAL expression. A CEVAL expression is used to specify match criteria such as origin.ip, source.region_code and contents in the request header. Expressions containing - ``evaluateThreatIntelligence`` require Cloud Armor Managed - Protection Plus tier and are not supported in Edge Policies - nor in Regional Policies. Expressions containing - ``evaluatePreconfiguredExpr('sourceiplist-*')`` require - Cloud Armor Managed Protection Plus tier and are only - supported in Global Security Policies. + ``evaluateThreatIntelligence`` require a Cloud Armor + Enterprise subscription and are not supported in Edge + Policies nor in Regional Policies. Expressions containing + ``evaluatePreconfiguredExpr('sourceiplist-*')`` require a + Cloud Armor Enterprise subscription and are only supported + in Global Security Policies. This field is a member of `oneof`_ ``_expr``. expr_options (google.cloud.compute_v1.types.SecurityPolicyRuleMatcherExprOptions): @@ -102709,6 +103082,9 @@ class ServiceAttachmentConnectedEndpoint(proto.Message): The url of a connected endpoint. This field is a member of `oneof`_ ``_endpoint``. + nat_ips (MutableSequence[str]): + NAT IPs of the connected PSC endpoint and + those of other endpoints propagated from it. propagated_connection_count (int): The number of consumer Network Connectivity Center spokes that the connected Private Service @@ -102774,6 +103150,10 @@ class Status(proto.Enum): number=130489749, optional=True, ) + nat_ips: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=117635086, + ) propagated_connection_count: int = proto.Field( proto.UINT32, number=324594130, @@ -116913,6 +117293,40 @@ class TestFailure(proto.Message): ) +class TestIamPermissionsAddressRequest(proto.Message): + r"""A request message for Addresses.TestIamPermissions. See the + method description for details. + + Attributes: + project (str): + Project ID for this request. + region (str): + The name of the region for this request. + resource (str): + Name or id of the resource for this request. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + """ + + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + region: str = proto.Field( + proto.STRING, + number=138946292, + ) + resource: str = proto.Field( + proto.STRING, + number=195806222, + ) + test_permissions_request_resource: "TestPermissionsRequest" = proto.Field( + proto.MESSAGE, + number=439214758, + message="TestPermissionsRequest", + ) + + class TestIamPermissionsBackendBucketRequest(proto.Message): r"""A request message for BackendBuckets.TestIamPermissions. See the method description for details. @@ -117053,6 +117467,34 @@ class TestIamPermissionsFirewallPolicyRequest(proto.Message): ) +class TestIamPermissionsGlobalAddressRequest(proto.Message): + r"""A request message for GlobalAddresses.TestIamPermissions. See + the method description for details. + + Attributes: + project (str): + Project ID for this request. + resource (str): + Name or id of the resource for this request. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + """ + + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + resource: str = proto.Field( + proto.STRING, + number=195806222, + ) + test_permissions_request_resource: "TestPermissionsRequest" = proto.Field( + proto.MESSAGE, + number=439214758, + message="TestPermissionsRequest", + ) + + class TestIamPermissionsImageRequest(proto.Message): r"""A request message for Images.TestIamPermissions. See the method description for details. @@ -117081,6 +117523,40 @@ class TestIamPermissionsImageRequest(proto.Message): ) +class TestIamPermissionsInstanceGroupRequest(proto.Message): + r"""A request message for InstanceGroups.TestIamPermissions. See + the method description for details. + + Attributes: + project (str): + Project ID for this request. + resource (str): + Name or id of the resource for this request. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + zone (str): + The name of the zone for this request. + """ + + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + resource: str = proto.Field( + proto.STRING, + number=195806222, + ) + test_permissions_request_resource: "TestPermissionsRequest" = proto.Field( + proto.MESSAGE, + number=439214758, + message="TestPermissionsRequest", + ) + zone: str = proto.Field( + proto.STRING, + number=3744684, + ) + + class TestIamPermissionsInstanceRequest(proto.Message): r"""A request message for Instances.TestIamPermissions. See the method description for details. @@ -117587,6 +118063,41 @@ class TestIamPermissionsRegionDiskRequest(proto.Message): ) +class TestIamPermissionsRegionInstanceGroupRequest(proto.Message): + r"""A request message for + RegionInstanceGroups.TestIamPermissions. See the method + description for details. + + Attributes: + project (str): + Project ID for this request. + region (str): + The name of the region for this request. + resource (str): + Name or id of the resource for this request. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + """ + + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + region: str = proto.Field( + proto.STRING, + number=138946292, + ) + resource: str = proto.Field( + proto.STRING, + number=195806222, + ) + test_permissions_request_resource: "TestPermissionsRequest" = proto.Field( + proto.MESSAGE, + number=439214758, + message="TestPermissionsRequest", + ) + + class TestIamPermissionsRegionInstantSnapshotRequest(proto.Message): r"""A request message for RegionInstantSnapshots.TestIamPermissions. See the method @@ -117855,6 +118366,74 @@ class TestIamPermissionsSubnetworkRequest(proto.Message): ) +class TestIamPermissionsTargetInstanceRequest(proto.Message): + r"""A request message for TargetInstances.TestIamPermissions. See + the method description for details. + + Attributes: + project (str): + Project ID for this request. + resource (str): + Name or id of the resource for this request. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + zone (str): + The name of the zone for this request. + """ + + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + resource: str = proto.Field( + proto.STRING, + number=195806222, + ) + test_permissions_request_resource: "TestPermissionsRequest" = proto.Field( + proto.MESSAGE, + number=439214758, + message="TestPermissionsRequest", + ) + zone: str = proto.Field( + proto.STRING, + number=3744684, + ) + + +class TestIamPermissionsTargetPoolRequest(proto.Message): + r"""A request message for TargetPools.TestIamPermissions. See the + method description for details. + + Attributes: + project (str): + Project ID for this request. + region (str): + The name of the region for this request. + resource (str): + Name or id of the resource for this request. + test_permissions_request_resource (google.cloud.compute_v1.types.TestPermissionsRequest): + The body resource for this request + """ + + project: str = proto.Field( + proto.STRING, + number=227560217, + ) + region: str = proto.Field( + proto.STRING, + number=138946292, + ) + resource: str = proto.Field( + proto.STRING, + number=195806222, + ) + test_permissions_request_resource: "TestPermissionsRequest" = proto.Field( + proto.MESSAGE, + number=439214758, + message="TestPermissionsRequest", + ) + + class TestIamPermissionsVpnGatewayRequest(proto.Message): r"""A request message for VpnGateways.TestIamPermissions. See the method description for details. @@ -118008,6 +118587,12 @@ class MaintenanceReasons(proto.Enum): Maintenance due to disk errors. FAILURE_GPU (467876919): Maintenance due to GPU errors. + FAILURE_GPU_MULTIPLE_FAULTY_HOSTS_CUSTOMER_REPORTED (223284959): + Maintenance due to customer reported multiple + faulty hosts via R&R Subblock API. + FAILURE_GPU_NVLINK_SWITCH_CUSTOMER_REPORTED (88487838): + Maintenance due to customer reported NVLink + switch failure via R&R Subblock API. FAILURE_GPU_TEMPERATURE (24926540): Maintenance due to high GPU temperature. FAILURE_GPU_XID (51956587): @@ -118038,6 +118623,8 @@ class MaintenanceReasons(proto.Enum): UNDEFINED_MAINTENANCE_REASONS = 0 FAILURE_DISK = 8573778 FAILURE_GPU = 467876919 + FAILURE_GPU_MULTIPLE_FAULTY_HOSTS_CUSTOMER_REPORTED = 223284959 + FAILURE_GPU_NVLINK_SWITCH_CUSTOMER_REPORTED = 88487838 FAILURE_GPU_TEMPERATURE = 24926540 FAILURE_GPU_XID = 51956587 FAILURE_INFRA = 270541467 @@ -122008,6 +122595,11 @@ class VpnTunnel(proto.Message): .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields Attributes: + cipher_suite (google.cloud.compute_v1.types.VpnTunnelCipherSuite): + User specified list of ciphers to use for the + phase 1 and phase 2 of the IKE protocol. + + This field is a member of `oneof`_ ``_cipher_suite``. creation_timestamp (str): [Output Only] Creation timestamp in RFC3339 text format. @@ -122273,6 +122865,12 @@ class Status(proto.Enum): STOPPED = 444276141 WAITING_FOR_FULL_CONFIG = 41640522 + cipher_suite: "VpnTunnelCipherSuite" = proto.Field( + proto.MESSAGE, + number=443788228, + optional=True, + message="VpnTunnelCipherSuite", + ) creation_timestamp: str = proto.Field( proto.STRING, number=30525366, @@ -122474,6 +123072,34 @@ def raw_page(self): ) +class VpnTunnelCipherSuite(proto.Message): + r""" + + .. _oneof: https://proto-plus-python.readthedocs.io/en/stable/fields.html#oneofs-mutually-exclusive-fields + + Attributes: + phase1 (google.cloud.compute_v1.types.VpnTunnelPhase1Algorithms): + + This field is a member of `oneof`_ ``_phase1``. + phase2 (google.cloud.compute_v1.types.VpnTunnelPhase2Algorithms): + + This field is a member of `oneof`_ ``_phase2``. + """ + + phase1: "VpnTunnelPhase1Algorithms" = proto.Field( + proto.MESSAGE, + number=84289046, + optional=True, + message="VpnTunnelPhase1Algorithms", + ) + phase2: "VpnTunnelPhase2Algorithms" = proto.Field( + proto.MESSAGE, + number=84289047, + optional=True, + message="VpnTunnelPhase2Algorithms", + ) + + class VpnTunnelList(proto.Message): r"""Contains a list of VpnTunnel resources. @@ -122548,6 +123174,64 @@ def raw_page(self): ) +class VpnTunnelPhase1Algorithms(proto.Message): + r""" + + Attributes: + dh (MutableSequence[str]): + + encryption (MutableSequence[str]): + + integrity (MutableSequence[str]): + + prf (MutableSequence[str]): + + """ + + dh: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=3204, + ) + encryption: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=97980291, + ) + integrity: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=492830541, + ) + prf: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=111268, + ) + + +class VpnTunnelPhase2Algorithms(proto.Message): + r""" + + Attributes: + encryption (MutableSequence[str]): + + integrity (MutableSequence[str]): + + pfs (MutableSequence[str]): + + """ + + encryption: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=97980291, + ) + integrity: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=492830541, + ) + pfs: MutableSequence[str] = proto.RepeatedField( + proto.STRING, + number=110909, + ) + + class VpnTunnelsScopedList(proto.Message): r""" diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_addresses_test_iam_permissions_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_addresses_test_iam_permissions_sync.py new file mode 100644 index 000000000000..00b3fce5f7eb --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_addresses_test_iam_permissions_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_Addresses_TestIamPermissions_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_test_iam_permissions(): + # Create a client + client = compute_v1.AddressesClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsAddressRequest( + project="project_value", + region="region_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_Addresses_TestIamPermissions_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_global_addresses_test_iam_permissions_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_global_addresses_test_iam_permissions_sync.py new file mode 100644 index 000000000000..5d03f8fa0411 --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_global_addresses_test_iam_permissions_sync.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_GlobalAddresses_TestIamPermissions_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_test_iam_permissions(): + # Create a client + client = compute_v1.GlobalAddressesClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsGlobalAddressRequest( + project="project_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_GlobalAddresses_TestIamPermissions_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instance_groups_test_iam_permissions_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instance_groups_test_iam_permissions_sync.py new file mode 100644 index 000000000000..3b3522870b1f --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instance_groups_test_iam_permissions_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_InstanceGroups_TestIamPermissions_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_test_iam_permissions(): + # Create a client + client = compute_v1.InstanceGroupsClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsInstanceGroupRequest( + project="project_value", + resource="resource_value", + zone="zone_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_InstanceGroups_TestIamPermissions_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instances_add_network_interface_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instances_add_network_interface_sync.py new file mode 100644 index 000000000000..91da9878d7ca --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instances_add_network_interface_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for AddNetworkInterface +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_Instances_AddNetworkInterface_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_add_network_interface(): + # Create a client + client = compute_v1.InstancesClient() + + # Initialize request argument(s) + request = compute_v1.AddNetworkInterfaceInstanceRequest( + instance="instance_value", + project="project_value", + zone="zone_value", + ) + + # Make the request + response = client.add_network_interface(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_Instances_AddNetworkInterface_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instances_delete_network_interface_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instances_delete_network_interface_sync.py new file mode 100644 index 000000000000..ee123fb2bd04 --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_instances_delete_network_interface_sync.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for DeleteNetworkInterface +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_Instances_DeleteNetworkInterface_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_delete_network_interface(): + # Create a client + client = compute_v1.InstancesClient() + + # Initialize request argument(s) + request = compute_v1.DeleteNetworkInterfaceInstanceRequest( + instance="instance_value", + network_interface_name="network_interface_name_value", + project="project_value", + zone="zone_value", + ) + + # Make the request + response = client.delete_network_interface(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_Instances_DeleteNetworkInterface_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_region_instance_groups_test_iam_permissions_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_region_instance_groups_test_iam_permissions_sync.py new file mode 100644 index 000000000000..c9c9006c2798 --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_region_instance_groups_test_iam_permissions_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_RegionInstanceGroups_TestIamPermissions_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_test_iam_permissions(): + # Create a client + client = compute_v1.RegionInstanceGroupsClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsRegionInstanceGroupRequest( + project="project_value", + region="region_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_RegionInstanceGroups_TestIamPermissions_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_target_instances_test_iam_permissions_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_target_instances_test_iam_permissions_sync.py new file mode 100644 index 000000000000..2bef6078c682 --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_target_instances_test_iam_permissions_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_TargetInstances_TestIamPermissions_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_test_iam_permissions(): + # Create a client + client = compute_v1.TargetInstancesClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsTargetInstanceRequest( + project="project_value", + resource="resource_value", + zone="zone_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_TargetInstances_TestIamPermissions_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_target_pools_test_iam_permissions_sync.py b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_target_pools_test_iam_permissions_sync.py new file mode 100644 index 000000000000..a0c85677db79 --- /dev/null +++ b/packages/google-cloud-compute/samples/generated_samples/compute_v1_generated_target_pools_test_iam_permissions_sync.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated code. DO NOT EDIT! +# +# Snippet for TestIamPermissions +# NOTE: This snippet has been automatically generated for illustrative purposes only. +# It may require modifications to work in your environment. + +# To install the latest published package dependency, execute the following: +# python3 -m pip install google-cloud-compute + + +# [START compute_v1_generated_TargetPools_TestIamPermissions_sync] +# This snippet has been automatically generated and should be regarded as a +# code template only. +# It will require modifications to work: +# - It may require correct/in-range values for request initialization. +# - It may require specifying regional endpoints when creating the service +# client as shown in: +# https://googleapis.dev/python/google-api-core/latest/client_options.html +from google.cloud import compute_v1 + + +def sample_test_iam_permissions(): + # Create a client + client = compute_v1.TargetPoolsClient() + + # Initialize request argument(s) + request = compute_v1.TestIamPermissionsTargetPoolRequest( + project="project_value", + region="region_value", + resource="resource_value", + ) + + # Make the request + response = client.test_iam_permissions(request=request) + + # Handle the response + print(response) + +# [END compute_v1_generated_TargetPools_TestIamPermissions_sync] diff --git a/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json b/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json index dad025980c24..3a7a51a04ebd 100644 --- a/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json +++ b/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-compute", - "version": "1.37.0" + "version": "0.1.0" }, "snippets": [ { @@ -875,6 +875,98 @@ ], "title": "compute_v1_generated_addresses_set_labels_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.AddressesClient", + "shortName": "AddressesClient" + }, + "fullName": "google.cloud.compute_v1.AddressesClient.test_iam_permissions", + "method": { + "fullName": "google.cloud.compute.v1.Addresses.TestIamPermissions", + "service": { + "fullName": "google.cloud.compute.v1.Addresses", + "shortName": "Addresses" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.TestIamPermissionsAddressRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "region", + "type": "str" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "test_permissions_request_resource", + "type": "google.cloud.compute_v1.types.TestPermissionsRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.compute_v1.types.TestPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "compute_v1_generated_addresses_test_iam_permissions_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_Addresses_TestIamPermissions_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_addresses_test_iam_permissions_sync.py" + }, { "canonical": true, "clientMethod": { @@ -9519,6 +9611,94 @@ ], "title": "compute_v1_generated_global_addresses_set_labels_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.GlobalAddressesClient", + "shortName": "GlobalAddressesClient" + }, + "fullName": "google.cloud.compute_v1.GlobalAddressesClient.test_iam_permissions", + "method": { + "fullName": "google.cloud.compute.v1.GlobalAddresses.TestIamPermissions", + "service": { + "fullName": "google.cloud.compute.v1.GlobalAddresses", + "shortName": "GlobalAddresses" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.TestIamPermissionsGlobalAddressRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "test_permissions_request_resource", + "type": "google.cloud.compute_v1.types.TestPermissionsRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.compute_v1.types.TestPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "compute_v1_generated_global_addresses_test_iam_permissions_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_GlobalAddresses_TestIamPermissions_sync", + "segments": [ + { + "end": 52, + "start": 27, + "type": "FULL" + }, + { + "end": 52, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 46, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 49, + "start": 47, + "type": "REQUEST_EXECUTION" + }, + { + "end": 53, + "start": 50, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_global_addresses_test_iam_permissions_sync.py" + }, { "canonical": true, "clientMethod": { @@ -16807,6 +16987,98 @@ ], "title": "compute_v1_generated_instance_groups_set_named_ports_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.InstanceGroupsClient", + "shortName": "InstanceGroupsClient" + }, + "fullName": "google.cloud.compute_v1.InstanceGroupsClient.test_iam_permissions", + "method": { + "fullName": "google.cloud.compute.v1.InstanceGroups.TestIamPermissions", + "service": { + "fullName": "google.cloud.compute.v1.InstanceGroups", + "shortName": "InstanceGroups" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.TestIamPermissionsInstanceGroupRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "zone", + "type": "str" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "test_permissions_request_resource", + "type": "google.cloud.compute_v1.types.TestPermissionsRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.compute_v1.types.TestPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "compute_v1_generated_instance_groups_test_iam_permissions_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_InstanceGroups_TestIamPermissions_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_instance_groups_test_iam_permissions_sync.py" + }, { "canonical": true, "clientMethod": { @@ -17747,6 +18019,98 @@ ], "title": "compute_v1_generated_instances_add_access_config_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.InstancesClient", + "shortName": "InstancesClient" + }, + "fullName": "google.cloud.compute_v1.InstancesClient.add_network_interface", + "method": { + "fullName": "google.cloud.compute.v1.Instances.AddNetworkInterface", + "service": { + "fullName": "google.cloud.compute.v1.Instances", + "shortName": "Instances" + }, + "shortName": "AddNetworkInterface" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.AddNetworkInterfaceInstanceRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "zone", + "type": "str" + }, + { + "name": "instance", + "type": "str" + }, + { + "name": "network_interface_resource", + "type": "google.cloud.compute_v1.types.NetworkInterface" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.api_core.extended_operation.ExtendedOperation", + "shortName": "add_network_interface" + }, + "description": "Sample for AddNetworkInterface", + "file": "compute_v1_generated_instances_add_network_interface_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_Instances_AddNetworkInterface_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_instances_add_network_interface_sync.py" + }, { "canonical": true, "clientMethod": { @@ -18195,6 +18559,98 @@ ], "title": "compute_v1_generated_instances_delete_access_config_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.InstancesClient", + "shortName": "InstancesClient" + }, + "fullName": "google.cloud.compute_v1.InstancesClient.delete_network_interface", + "method": { + "fullName": "google.cloud.compute.v1.Instances.DeleteNetworkInterface", + "service": { + "fullName": "google.cloud.compute.v1.Instances", + "shortName": "Instances" + }, + "shortName": "DeleteNetworkInterface" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.DeleteNetworkInterfaceInstanceRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "zone", + "type": "str" + }, + { + "name": "instance", + "type": "str" + }, + { + "name": "network_interface_name", + "type": "str" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.api_core.extended_operation.ExtendedOperation", + "shortName": "delete_network_interface" + }, + "description": "Sample for DeleteNetworkInterface", + "file": "compute_v1_generated_instances_delete_network_interface_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_Instances_DeleteNetworkInterface_sync", + "segments": [ + { + "end": 54, + "start": 27, + "type": "FULL" + }, + { + "end": 54, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 48, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 51, + "start": 49, + "type": "REQUEST_EXECUTION" + }, + { + "end": 55, + "start": 52, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_instances_delete_network_interface_sync.py" + }, { "canonical": true, "clientMethod": { @@ -45379,6 +45835,98 @@ ], "title": "compute_v1_generated_region_instance_groups_set_named_ports_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.RegionInstanceGroupsClient", + "shortName": "RegionInstanceGroupsClient" + }, + "fullName": "google.cloud.compute_v1.RegionInstanceGroupsClient.test_iam_permissions", + "method": { + "fullName": "google.cloud.compute.v1.RegionInstanceGroups.TestIamPermissions", + "service": { + "fullName": "google.cloud.compute.v1.RegionInstanceGroups", + "shortName": "RegionInstanceGroups" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.TestIamPermissionsRegionInstanceGroupRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "region", + "type": "str" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "test_permissions_request_resource", + "type": "google.cloud.compute_v1.types.TestPermissionsRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.compute_v1.types.TestPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "compute_v1_generated_region_instance_groups_test_iam_permissions_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_RegionInstanceGroups_TestIamPermissions_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_region_instance_groups_test_iam_permissions_sync.py" + }, { "canonical": true, "clientMethod": { @@ -65855,6 +66403,98 @@ ], "title": "compute_v1_generated_target_instances_set_security_policy_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.TargetInstancesClient", + "shortName": "TargetInstancesClient" + }, + "fullName": "google.cloud.compute_v1.TargetInstancesClient.test_iam_permissions", + "method": { + "fullName": "google.cloud.compute.v1.TargetInstances.TestIamPermissions", + "service": { + "fullName": "google.cloud.compute.v1.TargetInstances", + "shortName": "TargetInstances" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.TestIamPermissionsTargetInstanceRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "zone", + "type": "str" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "test_permissions_request_resource", + "type": "google.cloud.compute_v1.types.TestPermissionsRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.compute_v1.types.TestPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "compute_v1_generated_target_instances_test_iam_permissions_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_TargetInstances_TestIamPermissions_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_target_instances_test_iam_permissions_sync.py" + }, { "canonical": true, "clientMethod": { @@ -66927,6 +67567,98 @@ ], "title": "compute_v1_generated_target_pools_set_security_policy_sync.py" }, + { + "canonical": true, + "clientMethod": { + "client": { + "fullName": "google.cloud.compute_v1.TargetPoolsClient", + "shortName": "TargetPoolsClient" + }, + "fullName": "google.cloud.compute_v1.TargetPoolsClient.test_iam_permissions", + "method": { + "fullName": "google.cloud.compute.v1.TargetPools.TestIamPermissions", + "service": { + "fullName": "google.cloud.compute.v1.TargetPools", + "shortName": "TargetPools" + }, + "shortName": "TestIamPermissions" + }, + "parameters": [ + { + "name": "request", + "type": "google.cloud.compute_v1.types.TestIamPermissionsTargetPoolRequest" + }, + { + "name": "project", + "type": "str" + }, + { + "name": "region", + "type": "str" + }, + { + "name": "resource", + "type": "str" + }, + { + "name": "test_permissions_request_resource", + "type": "google.cloud.compute_v1.types.TestPermissionsRequest" + }, + { + "name": "retry", + "type": "google.api_core.retry.Retry" + }, + { + "name": "timeout", + "type": "float" + }, + { + "name": "metadata", + "type": "Sequence[Tuple[str, Union[str, bytes]]]" + } + ], + "resultType": "google.cloud.compute_v1.types.TestPermissionsResponse", + "shortName": "test_iam_permissions" + }, + "description": "Sample for TestIamPermissions", + "file": "compute_v1_generated_target_pools_test_iam_permissions_sync.py", + "language": "PYTHON", + "origin": "API_DEFINITION", + "regionTag": "compute_v1_generated_TargetPools_TestIamPermissions_sync", + "segments": [ + { + "end": 53, + "start": 27, + "type": "FULL" + }, + { + "end": 53, + "start": 27, + "type": "SHORT" + }, + { + "end": 40, + "start": 38, + "type": "CLIENT_INITIALIZATION" + }, + { + "end": 47, + "start": 41, + "type": "REQUEST_INITIALIZATION" + }, + { + "end": 50, + "start": 48, + "type": "REQUEST_EXECUTION" + }, + { + "end": 54, + "start": 51, + "type": "RESPONSE_HANDLING" + } + ], + "title": "compute_v1_generated_target_pools_test_iam_permissions_sync.py" + }, { "canonical": true, "clientMethod": { diff --git a/packages/google-cloud-compute/scripts/fixup_compute_v1_keywords.py b/packages/google-cloud-compute/scripts/fixup_compute_v1_keywords.py index d753144b2526..8c5880c362fc 100644 --- a/packages/google-cloud-compute/scripts/fixup_compute_v1_keywords.py +++ b/packages/google-cloud-compute/scripts/fixup_compute_v1_keywords.py @@ -45,6 +45,7 @@ class computeCallTransformer(cst.CSTTransformer): 'add_health_check': ('project', 'region', 'target_pool', 'target_pools_add_health_check_request_resource', 'request_id', ), 'add_instance': ('project', 'region', 'target_pool', 'target_pools_add_instance_request_resource', 'request_id', ), 'add_instances': ('instance_group', 'instance_groups_add_instances_request_resource', 'project', 'zone', 'request_id', ), + 'add_network_interface': ('instance', 'network_interface_resource', 'project', 'zone', 'request_id', ), 'add_nodes': ('node_group', 'node_groups_add_nodes_request_resource', 'project', 'zone', 'request_id', ), 'add_packet_mirroring_rule': ('firewall_policy', 'firewall_policy_rule_resource', 'project', 'max_priority', 'min_priority', 'request_id', ), 'add_peering': ('network', 'networks_add_peering_request_resource', 'project', 'request_id', ), @@ -66,6 +67,7 @@ class computeCallTransformer(cst.CSTTransformer): 'delete': ('address', 'project', 'region', 'request_id', ), 'delete_access_config': ('access_config', 'instance', 'network_interface', 'project', 'zone', 'request_id', ), 'delete_instances': ('instance_group_manager', 'instance_group_managers_delete_instances_request_resource', 'project', 'zone', 'request_id', ), + 'delete_network_interface': ('instance', 'network_interface_name', 'project', 'zone', 'request_id', ), 'delete_nodes': ('node_group', 'node_groups_delete_nodes_request_resource', 'project', 'zone', 'request_id', ), 'delete_per_instance_configs': ('instance_group_manager', 'instance_group_managers_delete_per_instance_configs_req_resource', 'project', 'zone', ), 'delete_route_policy': ('project', 'region', 'router', 'policy', 'request_id', ), @@ -190,7 +192,7 @@ class computeCallTransformer(cst.CSTTransformer): 'suspend': ('instance', 'project', 'zone', 'discard_local_ssd', 'request_id', ), 'suspend_instances': ('instance_group_manager', 'instance_group_managers_suspend_instances_request_resource', 'project', 'zone', 'request_id', ), 'switch_to_custom_mode': ('network', 'project', 'request_id', ), - 'test_iam_permissions': ('project', 'resource', 'test_permissions_request_resource', ), + 'test_iam_permissions': ('project', 'region', 'resource', 'test_permissions_request_resource', ), 'update': ('autoscaler_resource', 'project', 'zone', 'autoscaler', 'request_id', ), 'update_access_config': ('access_config_resource', 'instance', 'network_interface', 'project', 'zone', 'request_id', ), 'update_display_device': ('display_device_resource', 'instance', 'project', 'zone', 'request_id', ), diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_addresses.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_addresses.py index 3abf0d1dcd43..7fe576238867 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_addresses.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_addresses.py @@ -3342,6 +3342,221 @@ def test_set_labels_unary_rest_flattened_error(transport: str = "rest"): ) +def test_test_iam_permissions_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = AddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.test_iam_permissions in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.test_iam_permissions + ] = mock_rpc + + request = {} + client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_test_iam_permissions_rest_required_fields( + request_type=compute.TestIamPermissionsAddressRequest, +): + transport_class = transports.AddressesRestTransport + + request_init = {} + request_init["project"] = "" + request_init["region"] = "" + request_init["resource"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + jsonified_request["region"] = "region_value" + jsonified_request["resource"] = "resource_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "region" in jsonified_request + assert jsonified_request["region"] == "region_value" + assert "resource" in jsonified_request + assert jsonified_request["resource"] == "resource_value" + + client = AddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.test_iam_permissions(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_test_iam_permissions_rest_unset_required_fields(): + transport = transports.AddressesRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.test_iam_permissions._get_unset_required_fields({}) + assert set(unset_fields) == ( + set(()) + & set( + ( + "project", + "region", + "resource", + "testPermissionsRequestResource", + ) + ) + ) + + +def test_test_iam_permissions_rest_flattened(): + client = AddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "region": "sample2", + "resource": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + region="region_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.test_iam_permissions(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/regions/{region}/addresses/{resource}/testIamPermissions" + % client.transport._host, + args[1], + ) + + +def test_test_iam_permissions_rest_flattened_error(transport: str = "rest"): + client = AddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.test_iam_permissions( + compute.TestIamPermissionsAddressRequest(), + project="project_value", + region="region_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + + def test_credentials_transport_error(): # It is an error to provide credentials and a transport instance. transport = transports.AddressesRestTransport( @@ -4747,6 +4962,211 @@ def test_set_labels_rest_interceptors(null_interceptor): post_with_metadata.assert_called_once() +def test_test_iam_permissions_rest_bad_request( + request_type=compute.TestIamPermissionsAddressRequest, +): + client = AddressesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "region": "sample2", "resource": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.test_iam_permissions(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.TestIamPermissionsAddressRequest, + dict, + ], +) +def test_test_iam_permissions_rest_call_success(request_type): + client = AddressesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "region": "sample2", "resource": "sample3"} + request_init["test_permissions_request_resource"] = { + "permissions": ["permissions_value1", "permissions_value2"] + } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = compute.TestIamPermissionsAddressRequest.meta.fields[ + "test_permissions_request_resource" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init[ + "test_permissions_request_resource" + ].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range( + 0, len(request_init["test_permissions_request_resource"][field]) + ): + del request_init["test_permissions_request_resource"][field][i][ + subfield + ] + else: + del request_init["test_permissions_request_resource"][field][subfield] + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse( + permissions=["permissions_value"], + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.test_iam_permissions(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, compute.TestPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_test_iam_permissions_rest_interceptors(null_interceptor): + transport = transports.AddressesRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.AddressesRestInterceptor(), + ) + client = AddressesClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.AddressesRestInterceptor, "post_test_iam_permissions" + ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( + transports.AddressesRestInterceptor, "pre_test_iam_permissions" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.TestIamPermissionsAddressRequest.pb( + compute.TestIamPermissionsAddressRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.TestPermissionsResponse.to_json( + compute.TestPermissionsResponse() + ) + req.return_value.content = return_value + + request = compute.TestIamPermissionsAddressRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata + + client.test_iam_permissions( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + def test_initialize_client_w_rest(): client = AddressesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest" @@ -4894,6 +5314,28 @@ def test_set_labels_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_test_iam_permissions_empty_call_rest(): + client = AddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.TestIamPermissionsAddressRequest() + + assert args[0] == request_msg + + def test_addresses_base_transport_error(): # Passing both a credentials object and credentials_file should raise an error with pytest.raises(core_exceptions.DuplicateCredentialArgs): @@ -4923,6 +5365,7 @@ def test_addresses_base_transport(): "list", "move", "set_labels", + "test_iam_permissions", ) for method in methods: with pytest.raises(NotImplementedError): @@ -5081,6 +5524,9 @@ def test_addresses_client_transport_session_collision(transport_name): session1 = client1.transport.set_labels._session session2 = client2.transport.set_labels._session assert session1 != session2 + session1 = client1.transport.test_iam_permissions._session + session2 = client2.transport.test_iam_permissions._session + assert session1 != session2 def test_common_billing_account_path(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_addresses.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_addresses.py index 6d95c2f74299..1ab3a8273e8e 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_addresses.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_addresses.py @@ -3012,6 +3012,210 @@ def test_set_labels_unary_rest_flattened_error(transport: str = "rest"): ) +def test_test_iam_permissions_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = GlobalAddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.test_iam_permissions in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.test_iam_permissions + ] = mock_rpc + + request = {} + client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_test_iam_permissions_rest_required_fields( + request_type=compute.TestIamPermissionsGlobalAddressRequest, +): + transport_class = transports.GlobalAddressesRestTransport + + request_init = {} + request_init["project"] = "" + request_init["resource"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + jsonified_request["resource"] = "resource_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "resource" in jsonified_request + assert jsonified_request["resource"] == "resource_value" + + client = GlobalAddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.test_iam_permissions(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_test_iam_permissions_rest_unset_required_fields(): + transport = transports.GlobalAddressesRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.test_iam_permissions._get_unset_required_fields({}) + assert set(unset_fields) == ( + set(()) + & set( + ( + "project", + "resource", + "testPermissionsRequestResource", + ) + ) + ) + + +def test_test_iam_permissions_rest_flattened(): + client = GlobalAddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + + # get arguments that satisfy an http rule for this method + sample_request = {"project": "sample1", "resource": "sample2"} + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.test_iam_permissions(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/global/addresses/{resource}/testIamPermissions" + % client.transport._host, + args[1], + ) + + +def test_test_iam_permissions_rest_flattened_error(transport: str = "rest"): + client = GlobalAddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.test_iam_permissions( + compute.TestIamPermissionsGlobalAddressRequest(), + project="project_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + + def test_credentials_transport_error(): # It is an error to provide credentials and a transport instance. transport = transports.GlobalAddressesRestTransport( @@ -4306,6 +4510,214 @@ def test_set_labels_rest_interceptors(null_interceptor): post_with_metadata.assert_called_once() +def test_test_iam_permissions_rest_bad_request( + request_type=compute.TestIamPermissionsGlobalAddressRequest, +): + client = GlobalAddressesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "resource": "sample2"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.test_iam_permissions(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.TestIamPermissionsGlobalAddressRequest, + dict, + ], +) +def test_test_iam_permissions_rest_call_success(request_type): + client = GlobalAddressesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "resource": "sample2"} + request_init["test_permissions_request_resource"] = { + "permissions": ["permissions_value1", "permissions_value2"] + } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = compute.TestIamPermissionsGlobalAddressRequest.meta.fields[ + "test_permissions_request_resource" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init[ + "test_permissions_request_resource" + ].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range( + 0, len(request_init["test_permissions_request_resource"][field]) + ): + del request_init["test_permissions_request_resource"][field][i][ + subfield + ] + else: + del request_init["test_permissions_request_resource"][field][subfield] + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse( + permissions=["permissions_value"], + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.test_iam_permissions(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, compute.TestPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_test_iam_permissions_rest_interceptors(null_interceptor): + transport = transports.GlobalAddressesRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None + if null_interceptor + else transports.GlobalAddressesRestInterceptor(), + ) + client = GlobalAddressesClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "post_test_iam_permissions" + ) as post, mock.patch.object( + transports.GlobalAddressesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "pre_test_iam_permissions" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.TestIamPermissionsGlobalAddressRequest.pb( + compute.TestIamPermissionsGlobalAddressRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.TestPermissionsResponse.to_json( + compute.TestPermissionsResponse() + ) + req.return_value.content = return_value + + request = compute.TestIamPermissionsGlobalAddressRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata + + client.test_iam_permissions( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + def test_initialize_client_w_rest(): client = GlobalAddressesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest" @@ -4433,6 +4845,28 @@ def test_set_labels_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_test_iam_permissions_empty_call_rest(): + client = GlobalAddressesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.TestIamPermissionsGlobalAddressRequest() + + assert args[0] == request_msg + + def test_global_addresses_base_transport_error(): # Passing both a credentials object and credentials_file should raise an error with pytest.raises(core_exceptions.DuplicateCredentialArgs): @@ -4461,6 +4895,7 @@ def test_global_addresses_base_transport(): "list", "move", "set_labels", + "test_iam_permissions", ) for method in methods: with pytest.raises(NotImplementedError): @@ -4616,6 +5051,9 @@ def test_global_addresses_client_transport_session_collision(transport_name): session1 = client1.transport.set_labels._session session2 = client2.transport.set_labels._session assert session1 != session2 + session1 = client1.transport.test_iam_permissions._session + session2 = client2.transport.test_iam_permissions._session + assert session1 != session2 def test_common_billing_account_path(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_groups.py index 33aa08f9a257..f49b7be39a3a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_groups.py @@ -4133,6 +4133,221 @@ def test_set_named_ports_unary_rest_flattened_error(transport: str = "rest"): ) +def test_test_iam_permissions_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = InstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.test_iam_permissions in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.test_iam_permissions + ] = mock_rpc + + request = {} + client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_test_iam_permissions_rest_required_fields( + request_type=compute.TestIamPermissionsInstanceGroupRequest, +): + transport_class = transports.InstanceGroupsRestTransport + + request_init = {} + request_init["project"] = "" + request_init["resource"] = "" + request_init["zone"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + jsonified_request["resource"] = "resource_value" + jsonified_request["zone"] = "zone_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "resource" in jsonified_request + assert jsonified_request["resource"] == "resource_value" + assert "zone" in jsonified_request + assert jsonified_request["zone"] == "zone_value" + + client = InstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.test_iam_permissions(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_test_iam_permissions_rest_unset_required_fields(): + transport = transports.InstanceGroupsRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.test_iam_permissions._get_unset_required_fields({}) + assert set(unset_fields) == ( + set(()) + & set( + ( + "project", + "resource", + "testPermissionsRequestResource", + "zone", + ) + ) + ) + + +def test_test_iam_permissions_rest_flattened(): + client = InstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "zone": "sample2", + "resource": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + zone="zone_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.test_iam_permissions(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{resource}/testIamPermissions" + % client.transport._host, + args[1], + ) + + +def test_test_iam_permissions_rest_flattened_error(transport: str = "rest"): + client = InstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.test_iam_permissions( + compute.TestIamPermissionsInstanceGroupRequest(), + project="project_value", + zone="zone_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + + def test_credentials_transport_error(): # It is an error to provide credentials and a transport instance. transport = transports.InstanceGroupsRestTransport( @@ -6087,6 +6302,214 @@ def test_set_named_ports_rest_interceptors(null_interceptor): post_with_metadata.assert_called_once() +def test_test_iam_permissions_rest_bad_request( + request_type=compute.TestIamPermissionsInstanceGroupRequest, +): + client = InstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "resource": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.test_iam_permissions(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.TestIamPermissionsInstanceGroupRequest, + dict, + ], +) +def test_test_iam_permissions_rest_call_success(request_type): + client = InstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "resource": "sample3"} + request_init["test_permissions_request_resource"] = { + "permissions": ["permissions_value1", "permissions_value2"] + } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = compute.TestIamPermissionsInstanceGroupRequest.meta.fields[ + "test_permissions_request_resource" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init[ + "test_permissions_request_resource" + ].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range( + 0, len(request_init["test_permissions_request_resource"][field]) + ): + del request_init["test_permissions_request_resource"][field][i][ + subfield + ] + else: + del request_init["test_permissions_request_resource"][field][subfield] + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse( + permissions=["permissions_value"], + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.test_iam_permissions(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, compute.TestPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_test_iam_permissions_rest_interceptors(null_interceptor): + transport = transports.InstanceGroupsRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None + if null_interceptor + else transports.InstanceGroupsRestInterceptor(), + ) + client = InstanceGroupsClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_test_iam_permissions" + ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "pre_test_iam_permissions" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.TestIamPermissionsInstanceGroupRequest.pb( + compute.TestIamPermissionsInstanceGroupRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.TestPermissionsResponse.to_json( + compute.TestPermissionsResponse() + ) + req.return_value.content = return_value + + request = compute.TestIamPermissionsInstanceGroupRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata + + client.test_iam_permissions( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + def test_initialize_client_w_rest(): client = InstanceGroupsClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest" @@ -6274,6 +6697,28 @@ def test_set_named_ports_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_test_iam_permissions_empty_call_rest(): + client = InstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.TestIamPermissionsInstanceGroupRequest() + + assert args[0] == request_msg + + def test_instance_groups_base_transport_error(): # Passing both a credentials object and credentials_file should raise an error with pytest.raises(core_exceptions.DuplicateCredentialArgs): @@ -6305,6 +6750,7 @@ def test_instance_groups_base_transport(): "list_instances", "remove_instances", "set_named_ports", + "test_iam_permissions", ) for method in methods: with pytest.raises(NotImplementedError): @@ -6469,6 +6915,9 @@ def test_instance_groups_client_transport_session_collision(transport_name): session1 = client1.transport.set_named_ports._session session2 = client2.transport.set_named_ports._session assert session1 != session2 + session1 = client1.transport.test_iam_permissions._session + session2 = client2.transport.test_iam_permissions._session + assert session1 != session2 def test_common_billing_account_path(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_templates.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_templates.py index 3a0f5d929b54..9f52a0042828 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_templates.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_templates.py @@ -3923,9 +3923,11 @@ def test_insert_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } ], "network_performance_config": { @@ -3962,6 +3964,7 @@ def test_insert_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", }, "service_accounts": [ diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py index 3dc20cb84e8d..562e523a2b33 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py @@ -1411,7 +1411,7 @@ def test_add_access_config_unary_rest_flattened_error(transport: str = "rest"): ) -def test_add_resource_policies_rest_use_cached_wrapped_rpc(): +def test_add_network_interface_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -1426,7 +1426,7 @@ def test_add_resource_policies_rest_use_cached_wrapped_rpc(): # Ensure method has been cached assert ( - client._transport.add_resource_policies + client._transport.add_network_interface in client._transport._wrapped_methods ) @@ -1436,11 +1436,11 @@ def test_add_resource_policies_rest_use_cached_wrapped_rpc(): "foo" # operation_request.operation in compute client(s) expect a string. ) client._transport._wrapped_methods[ - client._transport.add_resource_policies + client._transport.add_network_interface ] = mock_rpc request = {} - client.add_resource_policies(request) + client.add_network_interface(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -1449,15 +1449,15 @@ def test_add_resource_policies_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.add_resource_policies(request) + client.add_network_interface(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_add_resource_policies_rest_required_fields( - request_type=compute.AddResourcePoliciesInstanceRequest, +def test_add_network_interface_rest_required_fields( + request_type=compute.AddNetworkInterfaceInstanceRequest, ): transport_class = transports.InstancesRestTransport @@ -1475,7 +1475,7 @@ def test_add_resource_policies_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).add_resource_policies._get_unset_required_fields(jsonified_request) + ).add_network_interface._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present @@ -1486,7 +1486,7 @@ def test_add_resource_policies_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).add_resource_policies._get_unset_required_fields(jsonified_request) + ).add_network_interface._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. assert not set(unset_fields) - set(("request_id",)) jsonified_request.update(unset_fields) @@ -1535,25 +1535,25 @@ def test_add_resource_policies_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.add_resource_policies(request) + response = client.add_network_interface(request) expected_params = [] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_add_resource_policies_rest_unset_required_fields(): +def test_add_network_interface_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.add_resource_policies._get_unset_required_fields({}) + unset_fields = transport.add_network_interface._get_unset_required_fields({}) assert set(unset_fields) == ( set(("requestId",)) & set( ( "instance", - "instancesAddResourcePoliciesRequestResource", + "networkInterfaceResource", "project", "zone", ) @@ -1561,7 +1561,7 @@ def test_add_resource_policies_rest_unset_required_fields(): ) -def test_add_resource_policies_rest_flattened(): +def test_add_network_interface_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -1584,8 +1584,10 @@ def test_add_resource_policies_rest_flattened(): project="project_value", zone="zone_value", instance="instance_value", - instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( - resource_policies=["resource_policies_value"] + network_interface_resource=compute.NetworkInterface( + access_configs=[ + compute.AccessConfig(external_ipv6="external_ipv6_value") + ] ), ) mock_args.update(sample_request) @@ -1600,20 +1602,20 @@ def test_add_resource_policies_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.add_resource_policies(**mock_args) + client.add_network_interface(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addNetworkInterface" % client.transport._host, args[1], ) -def test_add_resource_policies_rest_flattened_error(transport: str = "rest"): +def test_add_network_interface_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -1622,18 +1624,20 @@ def test_add_resource_policies_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.add_resource_policies( - compute.AddResourcePoliciesInstanceRequest(), + client.add_network_interface( + compute.AddNetworkInterfaceInstanceRequest(), project="project_value", zone="zone_value", instance="instance_value", - instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( - resource_policies=["resource_policies_value"] + network_interface_resource=compute.NetworkInterface( + access_configs=[ + compute.AccessConfig(external_ipv6="external_ipv6_value") + ] ), ) -def test_add_resource_policies_unary_rest_use_cached_wrapped_rpc(): +def test_add_network_interface_unary_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -1648,7 +1652,7 @@ def test_add_resource_policies_unary_rest_use_cached_wrapped_rpc(): # Ensure method has been cached assert ( - client._transport.add_resource_policies + client._transport.add_network_interface in client._transport._wrapped_methods ) @@ -1658,11 +1662,11 @@ def test_add_resource_policies_unary_rest_use_cached_wrapped_rpc(): "foo" # operation_request.operation in compute client(s) expect a string. ) client._transport._wrapped_methods[ - client._transport.add_resource_policies + client._transport.add_network_interface ] = mock_rpc request = {} - client.add_resource_policies_unary(request) + client.add_network_interface_unary(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -1671,15 +1675,15 @@ def test_add_resource_policies_unary_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.add_resource_policies_unary(request) + client.add_network_interface_unary(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_add_resource_policies_unary_rest_required_fields( - request_type=compute.AddResourcePoliciesInstanceRequest, +def test_add_network_interface_unary_rest_required_fields( + request_type=compute.AddNetworkInterfaceInstanceRequest, ): transport_class = transports.InstancesRestTransport @@ -1697,7 +1701,7 @@ def test_add_resource_policies_unary_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).add_resource_policies._get_unset_required_fields(jsonified_request) + ).add_network_interface._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present @@ -1708,7 +1712,7 @@ def test_add_resource_policies_unary_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).add_resource_policies._get_unset_required_fields(jsonified_request) + ).add_network_interface._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. assert not set(unset_fields) - set(("request_id",)) jsonified_request.update(unset_fields) @@ -1757,25 +1761,25 @@ def test_add_resource_policies_unary_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.add_resource_policies_unary(request) + response = client.add_network_interface_unary(request) expected_params = [] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_add_resource_policies_unary_rest_unset_required_fields(): +def test_add_network_interface_unary_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.add_resource_policies._get_unset_required_fields({}) + unset_fields = transport.add_network_interface._get_unset_required_fields({}) assert set(unset_fields) == ( set(("requestId",)) & set( ( "instance", - "instancesAddResourcePoliciesRequestResource", + "networkInterfaceResource", "project", "zone", ) @@ -1783,7 +1787,7 @@ def test_add_resource_policies_unary_rest_unset_required_fields(): ) -def test_add_resource_policies_unary_rest_flattened(): +def test_add_network_interface_unary_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -1806,8 +1810,10 @@ def test_add_resource_policies_unary_rest_flattened(): project="project_value", zone="zone_value", instance="instance_value", - instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( - resource_policies=["resource_policies_value"] + network_interface_resource=compute.NetworkInterface( + access_configs=[ + compute.AccessConfig(external_ipv6="external_ipv6_value") + ] ), ) mock_args.update(sample_request) @@ -1822,20 +1828,20 @@ def test_add_resource_policies_unary_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.add_resource_policies_unary(**mock_args) + client.add_network_interface_unary(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addNetworkInterface" % client.transport._host, args[1], ) -def test_add_resource_policies_unary_rest_flattened_error(transport: str = "rest"): +def test_add_network_interface_unary_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -1844,18 +1850,20 @@ def test_add_resource_policies_unary_rest_flattened_error(transport: str = "rest # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.add_resource_policies_unary( - compute.AddResourcePoliciesInstanceRequest(), + client.add_network_interface_unary( + compute.AddNetworkInterfaceInstanceRequest(), project="project_value", zone="zone_value", instance="instance_value", - instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( - resource_policies=["resource_policies_value"] + network_interface_resource=compute.NetworkInterface( + access_configs=[ + compute.AccessConfig(external_ipv6="external_ipv6_value") + ] ), ) -def test_aggregated_list_rest_use_cached_wrapped_rpc(): +def test_add_resource_policies_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -1869,35 +1877,46 @@ def test_aggregated_list_rest_use_cached_wrapped_rpc(): wrapper_fn.reset_mock() # Ensure method has been cached - assert client._transport.aggregated_list in client._transport._wrapped_methods + assert ( + client._transport.add_resource_policies + in client._transport._wrapped_methods + ) # Replace cached wrapped function with mock mock_rpc = mock.Mock() mock_rpc.return_value.name = ( "foo" # operation_request.operation in compute client(s) expect a string. ) - client._transport._wrapped_methods[client._transport.aggregated_list] = mock_rpc + client._transport._wrapped_methods[ + client._transport.add_resource_policies + ] = mock_rpc request = {} - client.aggregated_list(request) + client.add_resource_policies(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 - client.aggregated_list(request) + # Operation methods build a cached wrapper on first rpc call + # subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.add_resource_policies(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_aggregated_list_rest_required_fields( - request_type=compute.AggregatedListInstancesRequest, +def test_add_resource_policies_rest_required_fields( + request_type=compute.AddResourcePoliciesInstanceRequest, ): transport_class = transports.InstancesRestTransport request_init = {} + request_init["instance"] = "" request_init["project"] = "" + request_init["zone"] = "" request = request_type(**request_init) pb_request = request_type.pb(request) jsonified_request = json.loads( @@ -1908,33 +1927,29 @@ def test_aggregated_list_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).aggregated_list._get_unset_required_fields(jsonified_request) + ).add_resource_policies._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present + jsonified_request["instance"] = "instance_value" jsonified_request["project"] = "project_value" + jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).aggregated_list._get_unset_required_fields(jsonified_request) + ).add_resource_policies._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. - assert not set(unset_fields) - set( - ( - "filter", - "include_all_scopes", - "max_results", - "order_by", - "page_token", - "return_partial_success", - "service_project_number", - ) - ) + assert not set(unset_fields) - set(("request_id",)) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone + assert "instance" in jsonified_request + assert jsonified_request["instance"] == "instance_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" + assert "zone" in jsonified_request + assert jsonified_request["zone"] == "zone_value" client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), @@ -1943,7 +1958,7 @@ def test_aggregated_list_rest_required_fields( request = request_type(**request_init) # Designate an appropriate value for the returned response. - return_value = compute.InstanceAggregatedList() + return_value = compute.Operation() # Mock the http request call within the method and fake a response. with mock.patch.object(Session, "request") as req: # We need to mock transcode() because providing default values @@ -1955,52 +1970,50 @@ def test_aggregated_list_rest_required_fields( pb_request = request_type.pb(request) transcode_result = { "uri": "v1/sample_method", - "method": "get", + "method": "post", "query_params": pb_request, } + transcode_result["body"] = pb_request transcode.return_value = transcode_result response_value = Response() response_value.status_code = 200 # Convert return value to protobuf type - return_value = compute.InstanceAggregatedList.pb(return_value) + return_value = compute.Operation.pb(return_value) json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.aggregated_list(request) + response = client.add_resource_policies(request) expected_params = [] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_aggregated_list_rest_unset_required_fields(): +def test_add_resource_policies_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.aggregated_list._get_unset_required_fields({}) + unset_fields = transport.add_resource_policies._get_unset_required_fields({}) assert set(unset_fields) == ( - set( + set(("requestId",)) + & set( ( - "filter", - "includeAllScopes", - "maxResults", - "orderBy", - "pageToken", - "returnPartialSuccess", - "serviceProjectNumber", + "instance", + "instancesAddResourcePoliciesRequestResource", + "project", + "zone", ) ) - & set(("project",)) ) -def test_aggregated_list_rest_flattened(): +def test_add_resource_policies_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -2009,14 +2022,23 @@ def test_aggregated_list_rest_flattened(): # Mock the http request call within the method and fake a response. with mock.patch.object(type(client.transport._session), "request") as req: # Designate an appropriate value for the returned response. - return_value = compute.InstanceAggregatedList() + return_value = compute.Operation() # get arguments that satisfy an http rule for this method - sample_request = {"project": "sample1"} + sample_request = { + "project": "sample1", + "zone": "sample2", + "instance": "sample3", + } # get truthy value for each flattened field mock_args = dict( project="project_value", + zone="zone_value", + instance="instance_value", + instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( + resource_policies=["resource_policies_value"] + ), ) mock_args.update(sample_request) @@ -2024,26 +2046,26 @@ def test_aggregated_list_rest_flattened(): response_value = Response() response_value.status_code = 200 # Convert return value to protobuf type - return_value = compute.InstanceAggregatedList.pb(return_value) + return_value = compute.Operation.pb(return_value) json_return_value = json_format.MessageToJson(return_value) response_value._content = json_return_value.encode("UTF-8") req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.aggregated_list(**mock_args) + client.add_resource_policies(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/aggregated/instances" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies" % client.transport._host, args[1], ) -def test_aggregated_list_rest_flattened_error(transport: str = "rest"): +def test_add_resource_policies_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -2052,83 +2074,18 @@ def test_aggregated_list_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.aggregated_list( - compute.AggregatedListInstancesRequest(), + client.add_resource_policies( + compute.AddResourcePoliciesInstanceRequest(), project="project_value", - ) - - -def test_aggregated_list_rest_pager(transport: str = "rest"): - client = InstancesClient( - credentials=ga_credentials.AnonymousCredentials(), - transport=transport, - ) - - # Mock the http request call within the method and fake a response. - with mock.patch.object(Session, "request") as req: - # TODO(kbandes): remove this mock unless there's a good reason for it. - # with mock.patch.object(path_template, 'transcode') as transcode: - # Set the response as a series of pages - response = ( - compute.InstanceAggregatedList( - items={ - "a": compute.InstancesScopedList(), - "b": compute.InstancesScopedList(), - "c": compute.InstancesScopedList(), - }, - next_page_token="abc", - ), - compute.InstanceAggregatedList( - items={}, - next_page_token="def", - ), - compute.InstanceAggregatedList( - items={ - "g": compute.InstancesScopedList(), - }, - next_page_token="ghi", - ), - compute.InstanceAggregatedList( - items={ - "h": compute.InstancesScopedList(), - "i": compute.InstancesScopedList(), - }, + zone="zone_value", + instance="instance_value", + instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( + resource_policies=["resource_policies_value"] ), ) - # Two responses for two calls - response = response + response - - # Wrap the values into proper Response objs - response = tuple(compute.InstanceAggregatedList.to_json(x) for x in response) - return_values = tuple(Response() for i in response) - for return_val, response_val in zip(return_values, response): - return_val._content = response_val.encode("UTF-8") - return_val.status_code = 200 - req.side_effect = return_values - - sample_request = {"project": "sample1"} - - pager = client.aggregated_list(request=sample_request) - - assert isinstance(pager.get("a"), compute.InstancesScopedList) - assert pager.get("h") is None - - results = list(pager) - assert len(results) == 6 - assert all(isinstance(i, tuple) for i in results) - for result in results: - assert isinstance(result, tuple) - assert tuple(type(t) for t in result) == (str, compute.InstancesScopedList) - assert pager.get("a") is None - assert isinstance(pager.get("h"), compute.InstancesScopedList) - - pages = list(client.aggregated_list(request=sample_request).pages) - for page_, token in zip(pages, ["abc", "def", "ghi", ""]): - assert page_.raw_page.next_page_token == token - -def test_attach_disk_rest_use_cached_wrapped_rpc(): +def test_add_resource_policies_unary_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -2142,17 +2099,22 @@ def test_attach_disk_rest_use_cached_wrapped_rpc(): wrapper_fn.reset_mock() # Ensure method has been cached - assert client._transport.attach_disk in client._transport._wrapped_methods + assert ( + client._transport.add_resource_policies + in client._transport._wrapped_methods + ) # Replace cached wrapped function with mock mock_rpc = mock.Mock() mock_rpc.return_value.name = ( "foo" # operation_request.operation in compute client(s) expect a string. ) - client._transport._wrapped_methods[client._transport.attach_disk] = mock_rpc + client._transport._wrapped_methods[ + client._transport.add_resource_policies + ] = mock_rpc request = {} - client.attach_disk(request) + client.add_resource_policies_unary(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -2161,15 +2123,732 @@ def test_attach_disk_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.attach_disk(request) + client.add_resource_policies_unary(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_attach_disk_rest_required_fields( - request_type=compute.AttachDiskInstanceRequest, +def test_add_resource_policies_unary_rest_required_fields( + request_type=compute.AddResourcePoliciesInstanceRequest, +): + transport_class = transports.InstancesRestTransport + + request_init = {} + request_init["instance"] = "" + request_init["project"] = "" + request_init["zone"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).add_resource_policies._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["instance"] = "instance_value" + jsonified_request["project"] = "project_value" + jsonified_request["zone"] = "zone_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).add_resource_policies._get_unset_required_fields(jsonified_request) + # Check that path parameters and body parameters are not mixing in. + assert not set(unset_fields) - set(("request_id",)) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "instance" in jsonified_request + assert jsonified_request["instance"] == "instance_value" + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "zone" in jsonified_request + assert jsonified_request["zone"] == "zone_value" + + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.Operation() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.add_resource_policies_unary(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_add_resource_policies_unary_rest_unset_required_fields(): + transport = transports.InstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.add_resource_policies._get_unset_required_fields({}) + assert set(unset_fields) == ( + set(("requestId",)) + & set( + ( + "instance", + "instancesAddResourcePoliciesRequestResource", + "project", + "zone", + ) + ) + ) + + +def test_add_resource_policies_unary_rest_flattened(): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.Operation() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "zone": "sample2", + "instance": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + zone="zone_value", + instance="instance_value", + instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( + resource_policies=["resource_policies_value"] + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.add_resource_policies_unary(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies" + % client.transport._host, + args[1], + ) + + +def test_add_resource_policies_unary_rest_flattened_error(transport: str = "rest"): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.add_resource_policies_unary( + compute.AddResourcePoliciesInstanceRequest(), + project="project_value", + zone="zone_value", + instance="instance_value", + instances_add_resource_policies_request_resource=compute.InstancesAddResourcePoliciesRequest( + resource_policies=["resource_policies_value"] + ), + ) + + +def test_aggregated_list_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.aggregated_list in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.aggregated_list] = mock_rpc + + request = {} + client.aggregated_list(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.aggregated_list(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_aggregated_list_rest_required_fields( + request_type=compute.AggregatedListInstancesRequest, +): + transport_class = transports.InstancesRestTransport + + request_init = {} + request_init["project"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).aggregated_list._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).aggregated_list._get_unset_required_fields(jsonified_request) + # Check that path parameters and body parameters are not mixing in. + assert not set(unset_fields) - set( + ( + "filter", + "include_all_scopes", + "max_results", + "order_by", + "page_token", + "return_partial_success", + "service_project_number", + ) + ) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.InstanceAggregatedList() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "get", + "query_params": pb_request, + } + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.InstanceAggregatedList.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.aggregated_list(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_aggregated_list_rest_unset_required_fields(): + transport = transports.InstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.aggregated_list._get_unset_required_fields({}) + assert set(unset_fields) == ( + set( + ( + "filter", + "includeAllScopes", + "maxResults", + "orderBy", + "pageToken", + "returnPartialSuccess", + "serviceProjectNumber", + ) + ) + & set(("project",)) + ) + + +def test_aggregated_list_rest_flattened(): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.InstanceAggregatedList() + + # get arguments that satisfy an http rule for this method + sample_request = {"project": "sample1"} + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.InstanceAggregatedList.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.aggregated_list(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/aggregated/instances" + % client.transport._host, + args[1], + ) + + +def test_aggregated_list_rest_flattened_error(transport: str = "rest"): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.aggregated_list( + compute.AggregatedListInstancesRequest(), + project="project_value", + ) + + +def test_aggregated_list_rest_pager(transport: str = "rest"): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # TODO(kbandes): remove this mock unless there's a good reason for it. + # with mock.patch.object(path_template, 'transcode') as transcode: + # Set the response as a series of pages + response = ( + compute.InstanceAggregatedList( + items={ + "a": compute.InstancesScopedList(), + "b": compute.InstancesScopedList(), + "c": compute.InstancesScopedList(), + }, + next_page_token="abc", + ), + compute.InstanceAggregatedList( + items={}, + next_page_token="def", + ), + compute.InstanceAggregatedList( + items={ + "g": compute.InstancesScopedList(), + }, + next_page_token="ghi", + ), + compute.InstanceAggregatedList( + items={ + "h": compute.InstancesScopedList(), + "i": compute.InstancesScopedList(), + }, + ), + ) + # Two responses for two calls + response = response + response + + # Wrap the values into proper Response objs + response = tuple(compute.InstanceAggregatedList.to_json(x) for x in response) + return_values = tuple(Response() for i in response) + for return_val, response_val in zip(return_values, response): + return_val._content = response_val.encode("UTF-8") + return_val.status_code = 200 + req.side_effect = return_values + + sample_request = {"project": "sample1"} + + pager = client.aggregated_list(request=sample_request) + + assert isinstance(pager.get("a"), compute.InstancesScopedList) + assert pager.get("h") is None + + results = list(pager) + assert len(results) == 6 + assert all(isinstance(i, tuple) for i in results) + for result in results: + assert isinstance(result, tuple) + assert tuple(type(t) for t in result) == (str, compute.InstancesScopedList) + + assert pager.get("a") is None + assert isinstance(pager.get("h"), compute.InstancesScopedList) + + pages = list(client.aggregated_list(request=sample_request).pages) + for page_, token in zip(pages, ["abc", "def", "ghi", ""]): + assert page_.raw_page.next_page_token == token + + +def test_attach_disk_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.attach_disk in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.attach_disk] = mock_rpc + + request = {} + client.attach_disk(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods build a cached wrapper on first rpc call + # subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.attach_disk(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_attach_disk_rest_required_fields( + request_type=compute.AttachDiskInstanceRequest, +): + transport_class = transports.InstancesRestTransport + + request_init = {} + request_init["instance"] = "" + request_init["project"] = "" + request_init["zone"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).attach_disk._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["instance"] = "instance_value" + jsonified_request["project"] = "project_value" + jsonified_request["zone"] = "zone_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).attach_disk._get_unset_required_fields(jsonified_request) + # Check that path parameters and body parameters are not mixing in. + assert not set(unset_fields) - set( + ( + "force_attach", + "request_id", + ) + ) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "instance" in jsonified_request + assert jsonified_request["instance"] == "instance_value" + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "zone" in jsonified_request + assert jsonified_request["zone"] == "zone_value" + + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.Operation() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.attach_disk(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_attach_disk_rest_unset_required_fields(): + transport = transports.InstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.attach_disk._get_unset_required_fields({}) + assert set(unset_fields) == ( + set( + ( + "forceAttach", + "requestId", + ) + ) + & set( + ( + "attachedDiskResource", + "instance", + "project", + "zone", + ) + ) + ) + + +def test_attach_disk_rest_flattened(): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.Operation() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "zone": "sample2", + "instance": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + zone="zone_value", + instance="instance_value", + attached_disk_resource=compute.AttachedDisk( + architecture="architecture_value" + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.attach_disk(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/attachDisk" + % client.transport._host, + args[1], + ) + + +def test_attach_disk_rest_flattened_error(transport: str = "rest"): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.attach_disk( + compute.AttachDiskInstanceRequest(), + project="project_value", + zone="zone_value", + instance="instance_value", + attached_disk_resource=compute.AttachedDisk( + architecture="architecture_value" + ), + ) + + +def test_attach_disk_unary_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.attach_disk in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.attach_disk] = mock_rpc + + request = {} + client.attach_disk_unary(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods build a cached wrapper on first rpc call + # subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.attach_disk_unary(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_attach_disk_unary_rest_required_fields( + request_type=compute.AttachDiskInstanceRequest, ): transport_class = transports.InstancesRestTransport @@ -2200,17 +2879,235 @@ def test_attach_disk_rest_required_fields( credentials=ga_credentials.AnonymousCredentials() ).attach_disk._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. - assert not set(unset_fields) - set( - ( - "force_attach", - "request_id", - ) - ) + assert not set(unset_fields) - set( + ( + "force_attach", + "request_id", + ) + ) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "instance" in jsonified_request + assert jsonified_request["instance"] == "instance_value" + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "zone" in jsonified_request + assert jsonified_request["zone"] == "zone_value" + + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.Operation() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.attach_disk_unary(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_attach_disk_unary_rest_unset_required_fields(): + transport = transports.InstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.attach_disk._get_unset_required_fields({}) + assert set(unset_fields) == ( + set( + ( + "forceAttach", + "requestId", + ) + ) + & set( + ( + "attachedDiskResource", + "instance", + "project", + "zone", + ) + ) + ) + + +def test_attach_disk_unary_rest_flattened(): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.Operation() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "zone": "sample2", + "instance": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + zone="zone_value", + instance="instance_value", + attached_disk_resource=compute.AttachedDisk( + architecture="architecture_value" + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.attach_disk_unary(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/attachDisk" + % client.transport._host, + args[1], + ) + + +def test_attach_disk_unary_rest_flattened_error(transport: str = "rest"): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.attach_disk_unary( + compute.AttachDiskInstanceRequest(), + project="project_value", + zone="zone_value", + instance="instance_value", + attached_disk_resource=compute.AttachedDisk( + architecture="architecture_value" + ), + ) + + +def test_bulk_insert_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert client._transport.bulk_insert in client._transport._wrapped_methods + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[client._transport.bulk_insert] = mock_rpc + + request = {} + client.bulk_insert(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + # Operation methods build a cached wrapper on first rpc call + # subsequent calls should use the cached wrapper + wrapper_fn.reset_mock() + + client.bulk_insert(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_bulk_insert_rest_required_fields( + request_type=compute.BulkInsertInstanceRequest, +): + transport_class = transports.InstancesRestTransport + + request_init = {} + request_init["project"] = "" + request_init["zone"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).bulk_insert._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + jsonified_request["zone"] = "zone_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).bulk_insert._get_unset_required_fields(jsonified_request) + # Check that path parameters and body parameters are not mixing in. + assert not set(unset_fields) - set(("request_id",)) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone - assert "instance" in jsonified_request - assert jsonified_request["instance"] == "instance_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -2252,30 +3149,24 @@ def test_attach_disk_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.attach_disk(request) + response = client.bulk_insert(request) expected_params = [] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_attach_disk_rest_unset_required_fields(): +def test_bulk_insert_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.attach_disk._get_unset_required_fields({}) + unset_fields = transport.bulk_insert._get_unset_required_fields({}) assert set(unset_fields) == ( - set( - ( - "forceAttach", - "requestId", - ) - ) + set(("requestId",)) & set( ( - "attachedDiskResource", - "instance", + "bulkInsertInstanceResourceResource", "project", "zone", ) @@ -2283,7 +3174,7 @@ def test_attach_disk_rest_unset_required_fields(): ) -def test_attach_disk_rest_flattened(): +def test_bulk_insert_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -2295,19 +3186,14 @@ def test_attach_disk_rest_flattened(): return_value = compute.Operation() # get arguments that satisfy an http rule for this method - sample_request = { - "project": "sample1", - "zone": "sample2", - "instance": "sample3", - } + sample_request = {"project": "sample1", "zone": "sample2"} # get truthy value for each flattened field mock_args = dict( project="project_value", zone="zone_value", - instance="instance_value", - attached_disk_resource=compute.AttachedDisk( - architecture="architecture_value" + bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( + count=553 ), ) mock_args.update(sample_request) @@ -2322,20 +3208,20 @@ def test_attach_disk_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.attach_disk(**mock_args) + client.bulk_insert(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/attachDisk" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/bulkInsert" % client.transport._host, args[1], ) -def test_attach_disk_rest_flattened_error(transport: str = "rest"): +def test_bulk_insert_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -2344,18 +3230,17 @@ def test_attach_disk_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.attach_disk( - compute.AttachDiskInstanceRequest(), + client.bulk_insert( + compute.BulkInsertInstanceRequest(), project="project_value", zone="zone_value", - instance="instance_value", - attached_disk_resource=compute.AttachedDisk( - architecture="architecture_value" + bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( + count=553 ), ) -def test_attach_disk_unary_rest_use_cached_wrapped_rpc(): +def test_bulk_insert_unary_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -2369,17 +3254,17 @@ def test_attach_disk_unary_rest_use_cached_wrapped_rpc(): wrapper_fn.reset_mock() # Ensure method has been cached - assert client._transport.attach_disk in client._transport._wrapped_methods + assert client._transport.bulk_insert in client._transport._wrapped_methods # Replace cached wrapped function with mock mock_rpc = mock.Mock() mock_rpc.return_value.name = ( "foo" # operation_request.operation in compute client(s) expect a string. ) - client._transport._wrapped_methods[client._transport.attach_disk] = mock_rpc + client._transport._wrapped_methods[client._transport.bulk_insert] = mock_rpc request = {} - client.attach_disk_unary(request) + client.bulk_insert_unary(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -2388,20 +3273,19 @@ def test_attach_disk_unary_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.attach_disk_unary(request) + client.bulk_insert_unary(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_attach_disk_unary_rest_required_fields( - request_type=compute.AttachDiskInstanceRequest, +def test_bulk_insert_unary_rest_required_fields( + request_type=compute.BulkInsertInstanceRequest, ): transport_class = transports.InstancesRestTransport request_init = {} - request_init["instance"] = "" request_init["project"] = "" request_init["zone"] = "" request = request_type(**request_init) @@ -2414,30 +3298,22 @@ def test_attach_disk_unary_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).attach_disk._get_unset_required_fields(jsonified_request) + ).bulk_insert._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present - jsonified_request["instance"] = "instance_value" jsonified_request["project"] = "project_value" jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).attach_disk._get_unset_required_fields(jsonified_request) + ).bulk_insert._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. - assert not set(unset_fields) - set( - ( - "force_attach", - "request_id", - ) - ) + assert not set(unset_fields) - set(("request_id",)) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone - assert "instance" in jsonified_request - assert jsonified_request["instance"] == "instance_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -2479,30 +3355,24 @@ def test_attach_disk_unary_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.attach_disk_unary(request) + response = client.bulk_insert_unary(request) expected_params = [] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_attach_disk_unary_rest_unset_required_fields(): +def test_bulk_insert_unary_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.attach_disk._get_unset_required_fields({}) + unset_fields = transport.bulk_insert._get_unset_required_fields({}) assert set(unset_fields) == ( - set( - ( - "forceAttach", - "requestId", - ) - ) + set(("requestId",)) & set( ( - "attachedDiskResource", - "instance", + "bulkInsertInstanceResourceResource", "project", "zone", ) @@ -2510,7 +3380,7 @@ def test_attach_disk_unary_rest_unset_required_fields(): ) -def test_attach_disk_unary_rest_flattened(): +def test_bulk_insert_unary_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -2522,19 +3392,14 @@ def test_attach_disk_unary_rest_flattened(): return_value = compute.Operation() # get arguments that satisfy an http rule for this method - sample_request = { - "project": "sample1", - "zone": "sample2", - "instance": "sample3", - } + sample_request = {"project": "sample1", "zone": "sample2"} # get truthy value for each flattened field mock_args = dict( project="project_value", zone="zone_value", - instance="instance_value", - attached_disk_resource=compute.AttachedDisk( - architecture="architecture_value" + bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( + count=553 ), ) mock_args.update(sample_request) @@ -2549,20 +3414,20 @@ def test_attach_disk_unary_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.attach_disk_unary(**mock_args) + client.bulk_insert_unary(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/attachDisk" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/bulkInsert" % client.transport._host, args[1], ) -def test_attach_disk_unary_rest_flattened_error(transport: str = "rest"): +def test_bulk_insert_unary_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -2571,18 +3436,17 @@ def test_attach_disk_unary_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.attach_disk_unary( - compute.AttachDiskInstanceRequest(), + client.bulk_insert_unary( + compute.BulkInsertInstanceRequest(), project="project_value", zone="zone_value", - instance="instance_value", - attached_disk_resource=compute.AttachedDisk( - architecture="architecture_value" + bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( + count=553 ), ) -def test_bulk_insert_rest_use_cached_wrapped_rpc(): +def test_delete_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -2596,17 +3460,17 @@ def test_bulk_insert_rest_use_cached_wrapped_rpc(): wrapper_fn.reset_mock() # Ensure method has been cached - assert client._transport.bulk_insert in client._transport._wrapped_methods + assert client._transport.delete in client._transport._wrapped_methods # Replace cached wrapped function with mock mock_rpc = mock.Mock() mock_rpc.return_value.name = ( "foo" # operation_request.operation in compute client(s) expect a string. ) - client._transport._wrapped_methods[client._transport.bulk_insert] = mock_rpc + client._transport._wrapped_methods[client._transport.delete] = mock_rpc request = {} - client.bulk_insert(request) + client.delete(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -2615,19 +3479,18 @@ def test_bulk_insert_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.bulk_insert(request) + client.delete(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_bulk_insert_rest_required_fields( - request_type=compute.BulkInsertInstanceRequest, -): +def test_delete_rest_required_fields(request_type=compute.DeleteInstanceRequest): transport_class = transports.InstancesRestTransport request_init = {} + request_init["instance"] = "" request_init["project"] = "" request_init["zone"] = "" request = request_type(**request_init) @@ -2640,22 +3503,25 @@ def test_bulk_insert_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).bulk_insert._get_unset_required_fields(jsonified_request) + ).delete._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present + jsonified_request["instance"] = "instance_value" jsonified_request["project"] = "project_value" jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).bulk_insert._get_unset_required_fields(jsonified_request) + ).delete._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. assert not set(unset_fields) - set(("request_id",)) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone + assert "instance" in jsonified_request + assert jsonified_request["instance"] == "instance_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -2680,10 +3546,9 @@ def test_bulk_insert_rest_required_fields( pb_request = request_type.pb(request) transcode_result = { "uri": "v1/sample_method", - "method": "post", + "method": "delete", "query_params": pb_request, } - transcode_result["body"] = pb_request transcode.return_value = transcode_result response_value = Response() @@ -2697,24 +3562,24 @@ def test_bulk_insert_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.bulk_insert(request) + response = client.delete(request) expected_params = [] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_bulk_insert_rest_unset_required_fields(): +def test_delete_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.bulk_insert._get_unset_required_fields({}) + unset_fields = transport.delete._get_unset_required_fields({}) assert set(unset_fields) == ( set(("requestId",)) & set( ( - "bulkInsertInstanceResourceResource", + "instance", "project", "zone", ) @@ -2722,7 +3587,7 @@ def test_bulk_insert_rest_unset_required_fields(): ) -def test_bulk_insert_rest_flattened(): +def test_delete_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -2734,15 +3599,17 @@ def test_bulk_insert_rest_flattened(): return_value = compute.Operation() # get arguments that satisfy an http rule for this method - sample_request = {"project": "sample1", "zone": "sample2"} + sample_request = { + "project": "sample1", + "zone": "sample2", + "instance": "sample3", + } # get truthy value for each flattened field mock_args = dict( project="project_value", zone="zone_value", - bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( - count=553 - ), + instance="instance_value", ) mock_args.update(sample_request) @@ -2756,20 +3623,20 @@ def test_bulk_insert_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.bulk_insert(**mock_args) + client.delete(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/bulkInsert" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}" % client.transport._host, args[1], ) -def test_bulk_insert_rest_flattened_error(transport: str = "rest"): +def test_delete_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -2778,17 +3645,15 @@ def test_bulk_insert_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.bulk_insert( - compute.BulkInsertInstanceRequest(), + client.delete( + compute.DeleteInstanceRequest(), project="project_value", zone="zone_value", - bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( - count=553 - ), + instance="instance_value", ) -def test_bulk_insert_unary_rest_use_cached_wrapped_rpc(): +def test_delete_unary_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -2802,17 +3667,17 @@ def test_bulk_insert_unary_rest_use_cached_wrapped_rpc(): wrapper_fn.reset_mock() # Ensure method has been cached - assert client._transport.bulk_insert in client._transport._wrapped_methods + assert client._transport.delete in client._transport._wrapped_methods # Replace cached wrapped function with mock mock_rpc = mock.Mock() mock_rpc.return_value.name = ( "foo" # operation_request.operation in compute client(s) expect a string. ) - client._transport._wrapped_methods[client._transport.bulk_insert] = mock_rpc + client._transport._wrapped_methods[client._transport.delete] = mock_rpc request = {} - client.bulk_insert_unary(request) + client.delete_unary(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -2821,19 +3686,18 @@ def test_bulk_insert_unary_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.bulk_insert_unary(request) + client.delete_unary(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_bulk_insert_unary_rest_required_fields( - request_type=compute.BulkInsertInstanceRequest, -): +def test_delete_unary_rest_required_fields(request_type=compute.DeleteInstanceRequest): transport_class = transports.InstancesRestTransport request_init = {} + request_init["instance"] = "" request_init["project"] = "" request_init["zone"] = "" request = request_type(**request_init) @@ -2846,22 +3710,25 @@ def test_bulk_insert_unary_rest_required_fields( unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).bulk_insert._get_unset_required_fields(jsonified_request) + ).delete._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present + jsonified_request["instance"] = "instance_value" jsonified_request["project"] = "project_value" jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).bulk_insert._get_unset_required_fields(jsonified_request) + ).delete._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. assert not set(unset_fields) - set(("request_id",)) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone + assert "instance" in jsonified_request + assert jsonified_request["instance"] == "instance_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -2886,10 +3753,9 @@ def test_bulk_insert_unary_rest_required_fields( pb_request = request_type.pb(request) transcode_result = { "uri": "v1/sample_method", - "method": "post", + "method": "delete", "query_params": pb_request, } - transcode_result["body"] = pb_request transcode.return_value = transcode_result response_value = Response() @@ -2903,24 +3769,24 @@ def test_bulk_insert_unary_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.bulk_insert_unary(request) + response = client.delete_unary(request) expected_params = [] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_bulk_insert_unary_rest_unset_required_fields(): +def test_delete_unary_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.bulk_insert._get_unset_required_fields({}) + unset_fields = transport.delete._get_unset_required_fields({}) assert set(unset_fields) == ( set(("requestId",)) & set( ( - "bulkInsertInstanceResourceResource", + "instance", "project", "zone", ) @@ -2928,7 +3794,7 @@ def test_bulk_insert_unary_rest_unset_required_fields(): ) -def test_bulk_insert_unary_rest_flattened(): +def test_delete_unary_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -2940,15 +3806,17 @@ def test_bulk_insert_unary_rest_flattened(): return_value = compute.Operation() # get arguments that satisfy an http rule for this method - sample_request = {"project": "sample1", "zone": "sample2"} + sample_request = { + "project": "sample1", + "zone": "sample2", + "instance": "sample3", + } # get truthy value for each flattened field mock_args = dict( project="project_value", zone="zone_value", - bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( - count=553 - ), + instance="instance_value", ) mock_args.update(sample_request) @@ -2962,20 +3830,20 @@ def test_bulk_insert_unary_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.bulk_insert_unary(**mock_args) + client.delete_unary(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/bulkInsert" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}" % client.transport._host, args[1], ) -def test_bulk_insert_unary_rest_flattened_error(transport: str = "rest"): +def test_delete_unary_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -2984,17 +3852,15 @@ def test_bulk_insert_unary_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.bulk_insert_unary( - compute.BulkInsertInstanceRequest(), + client.delete_unary( + compute.DeleteInstanceRequest(), project="project_value", zone="zone_value", - bulk_insert_instance_resource_resource=compute.BulkInsertInstanceResource( - count=553 - ), + instance="instance_value", ) -def test_delete_rest_use_cached_wrapped_rpc(): +def test_delete_access_config_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -3008,17 +3874,21 @@ def test_delete_rest_use_cached_wrapped_rpc(): wrapper_fn.reset_mock() # Ensure method has been cached - assert client._transport.delete in client._transport._wrapped_methods + assert ( + client._transport.delete_access_config in client._transport._wrapped_methods + ) # Replace cached wrapped function with mock mock_rpc = mock.Mock() mock_rpc.return_value.name = ( "foo" # operation_request.operation in compute client(s) expect a string. ) - client._transport._wrapped_methods[client._transport.delete] = mock_rpc + client._transport._wrapped_methods[ + client._transport.delete_access_config + ] = mock_rpc request = {} - client.delete(request) + client.delete_access_config(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -3027,18 +3897,22 @@ def test_delete_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.delete(request) + client.delete_access_config(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_delete_rest_required_fields(request_type=compute.DeleteInstanceRequest): +def test_delete_access_config_rest_required_fields( + request_type=compute.DeleteAccessConfigInstanceRequest, +): transport_class = transports.InstancesRestTransport request_init = {} + request_init["access_config"] = "" request_init["instance"] = "" + request_init["network_interface"] = "" request_init["project"] = "" request_init["zone"] = "" request = request_type(**request_init) @@ -3048,28 +3922,46 @@ def test_delete_rest_required_fields(request_type=compute.DeleteInstanceRequest) ) # verify fields with default values are dropped + assert "accessConfig" not in jsonified_request + assert "networkInterface" not in jsonified_request unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete._get_unset_required_fields(jsonified_request) + ).delete_access_config._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present + assert "accessConfig" in jsonified_request + assert jsonified_request["accessConfig"] == request_init["access_config"] + assert "networkInterface" in jsonified_request + assert jsonified_request["networkInterface"] == request_init["network_interface"] + jsonified_request["accessConfig"] = "access_config_value" jsonified_request["instance"] = "instance_value" + jsonified_request["networkInterface"] = "network_interface_value" jsonified_request["project"] = "project_value" jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete._get_unset_required_fields(jsonified_request) + ).delete_access_config._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. - assert not set(unset_fields) - set(("request_id",)) + assert not set(unset_fields) - set( + ( + "access_config", + "network_interface", + "request_id", + ) + ) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone + assert "accessConfig" in jsonified_request + assert jsonified_request["accessConfig"] == "access_config_value" assert "instance" in jsonified_request assert jsonified_request["instance"] == "instance_value" + assert "networkInterface" in jsonified_request + assert jsonified_request["networkInterface"] == "network_interface_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -3094,7 +3986,7 @@ def test_delete_rest_required_fields(request_type=compute.DeleteInstanceRequest) pb_request = request_type.pb(request) transcode_result = { "uri": "v1/sample_method", - "method": "delete", + "method": "post", "query_params": pb_request, } transcode.return_value = transcode_result @@ -3110,24 +4002,41 @@ def test_delete_rest_required_fields(request_type=compute.DeleteInstanceRequest) req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.delete(request) + response = client.delete_access_config(request) - expected_params = [] + expected_params = [ + ( + "accessConfig", + "", + ), + ( + "networkInterface", + "", + ), + ] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_delete_rest_unset_required_fields(): +def test_delete_access_config_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.delete._get_unset_required_fields({}) + unset_fields = transport.delete_access_config._get_unset_required_fields({}) assert set(unset_fields) == ( - set(("requestId",)) + set( + ( + "accessConfig", + "networkInterface", + "requestId", + ) + ) & set( ( + "accessConfig", "instance", + "networkInterface", "project", "zone", ) @@ -3135,7 +4044,7 @@ def test_delete_rest_unset_required_fields(): ) -def test_delete_rest_flattened(): +def test_delete_access_config_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -3158,6 +4067,8 @@ def test_delete_rest_flattened(): project="project_value", zone="zone_value", instance="instance_value", + access_config="access_config_value", + network_interface="network_interface_value", ) mock_args.update(sample_request) @@ -3171,20 +4082,20 @@ def test_delete_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.delete(**mock_args) + client.delete_access_config(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig" % client.transport._host, args[1], ) -def test_delete_rest_flattened_error(transport: str = "rest"): +def test_delete_access_config_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -3193,15 +4104,17 @@ def test_delete_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.delete( - compute.DeleteInstanceRequest(), + client.delete_access_config( + compute.DeleteAccessConfigInstanceRequest(), project="project_value", zone="zone_value", instance="instance_value", + access_config="access_config_value", + network_interface="network_interface_value", ) -def test_delete_unary_rest_use_cached_wrapped_rpc(): +def test_delete_access_config_unary_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -3215,17 +4128,21 @@ def test_delete_unary_rest_use_cached_wrapped_rpc(): wrapper_fn.reset_mock() # Ensure method has been cached - assert client._transport.delete in client._transport._wrapped_methods + assert ( + client._transport.delete_access_config in client._transport._wrapped_methods + ) # Replace cached wrapped function with mock mock_rpc = mock.Mock() mock_rpc.return_value.name = ( "foo" # operation_request.operation in compute client(s) expect a string. ) - client._transport._wrapped_methods[client._transport.delete] = mock_rpc + client._transport._wrapped_methods[ + client._transport.delete_access_config + ] = mock_rpc request = {} - client.delete_unary(request) + client.delete_access_config_unary(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -3234,18 +4151,22 @@ def test_delete_unary_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.delete_unary(request) + client.delete_access_config_unary(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_delete_unary_rest_required_fields(request_type=compute.DeleteInstanceRequest): +def test_delete_access_config_unary_rest_required_fields( + request_type=compute.DeleteAccessConfigInstanceRequest, +): transport_class = transports.InstancesRestTransport request_init = {} + request_init["access_config"] = "" request_init["instance"] = "" + request_init["network_interface"] = "" request_init["project"] = "" request_init["zone"] = "" request = request_type(**request_init) @@ -3255,28 +4176,46 @@ def test_delete_unary_rest_required_fields(request_type=compute.DeleteInstanceRe ) # verify fields with default values are dropped + assert "accessConfig" not in jsonified_request + assert "networkInterface" not in jsonified_request unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete._get_unset_required_fields(jsonified_request) + ).delete_access_config._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present + assert "accessConfig" in jsonified_request + assert jsonified_request["accessConfig"] == request_init["access_config"] + assert "networkInterface" in jsonified_request + assert jsonified_request["networkInterface"] == request_init["network_interface"] + jsonified_request["accessConfig"] = "access_config_value" jsonified_request["instance"] = "instance_value" + jsonified_request["networkInterface"] = "network_interface_value" jsonified_request["project"] = "project_value" jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete._get_unset_required_fields(jsonified_request) + ).delete_access_config._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. - assert not set(unset_fields) - set(("request_id",)) + assert not set(unset_fields) - set( + ( + "access_config", + "network_interface", + "request_id", + ) + ) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone + assert "accessConfig" in jsonified_request + assert jsonified_request["accessConfig"] == "access_config_value" assert "instance" in jsonified_request assert jsonified_request["instance"] == "instance_value" + assert "networkInterface" in jsonified_request + assert jsonified_request["networkInterface"] == "network_interface_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -3301,7 +4240,7 @@ def test_delete_unary_rest_required_fields(request_type=compute.DeleteInstanceRe pb_request = request_type.pb(request) transcode_result = { "uri": "v1/sample_method", - "method": "delete", + "method": "post", "query_params": pb_request, } transcode.return_value = transcode_result @@ -3317,24 +4256,41 @@ def test_delete_unary_rest_required_fields(request_type=compute.DeleteInstanceRe req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.delete_unary(request) + response = client.delete_access_config_unary(request) - expected_params = [] + expected_params = [ + ( + "accessConfig", + "", + ), + ( + "networkInterface", + "", + ), + ] actual_params = req.call_args.kwargs["params"] assert expected_params == actual_params -def test_delete_unary_rest_unset_required_fields(): +def test_delete_access_config_unary_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.delete._get_unset_required_fields({}) + unset_fields = transport.delete_access_config._get_unset_required_fields({}) assert set(unset_fields) == ( - set(("requestId",)) + set( + ( + "accessConfig", + "networkInterface", + "requestId", + ) + ) & set( ( + "accessConfig", "instance", + "networkInterface", "project", "zone", ) @@ -3342,7 +4298,7 @@ def test_delete_unary_rest_unset_required_fields(): ) -def test_delete_unary_rest_flattened(): +def test_delete_access_config_unary_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -3365,6 +4321,8 @@ def test_delete_unary_rest_flattened(): project="project_value", zone="zone_value", instance="instance_value", + access_config="access_config_value", + network_interface="network_interface_value", ) mock_args.update(sample_request) @@ -3378,20 +4336,20 @@ def test_delete_unary_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.delete_unary(**mock_args) + client.delete_access_config_unary(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig" % client.transport._host, args[1], ) -def test_delete_unary_rest_flattened_error(transport: str = "rest"): +def test_delete_access_config_unary_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -3400,15 +4358,17 @@ def test_delete_unary_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.delete_unary( - compute.DeleteInstanceRequest(), + client.delete_access_config_unary( + compute.DeleteAccessConfigInstanceRequest(), project="project_value", zone="zone_value", instance="instance_value", + access_config="access_config_value", + network_interface="network_interface_value", ) -def test_delete_access_config_rest_use_cached_wrapped_rpc(): +def test_delete_network_interface_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -3423,7 +4383,8 @@ def test_delete_access_config_rest_use_cached_wrapped_rpc(): # Ensure method has been cached assert ( - client._transport.delete_access_config in client._transport._wrapped_methods + client._transport.delete_network_interface + in client._transport._wrapped_methods ) # Replace cached wrapped function with mock @@ -3432,11 +4393,11 @@ def test_delete_access_config_rest_use_cached_wrapped_rpc(): "foo" # operation_request.operation in compute client(s) expect a string. ) client._transport._wrapped_methods[ - client._transport.delete_access_config + client._transport.delete_network_interface ] = mock_rpc request = {} - client.delete_access_config(request) + client.delete_network_interface(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -3445,22 +4406,21 @@ def test_delete_access_config_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.delete_access_config(request) + client.delete_network_interface(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_delete_access_config_rest_required_fields( - request_type=compute.DeleteAccessConfigInstanceRequest, +def test_delete_network_interface_rest_required_fields( + request_type=compute.DeleteNetworkInterfaceInstanceRequest, ): transport_class = transports.InstancesRestTransport request_init = {} - request_init["access_config"] = "" request_init["instance"] = "" - request_init["network_interface"] = "" + request_init["network_interface_name"] = "" request_init["project"] = "" request_init["zone"] = "" request = request_type(**request_init) @@ -3470,46 +4430,42 @@ def test_delete_access_config_rest_required_fields( ) # verify fields with default values are dropped - assert "accessConfig" not in jsonified_request - assert "networkInterface" not in jsonified_request + assert "networkInterfaceName" not in jsonified_request unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete_access_config._get_unset_required_fields(jsonified_request) + ).delete_network_interface._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present - assert "accessConfig" in jsonified_request - assert jsonified_request["accessConfig"] == request_init["access_config"] - assert "networkInterface" in jsonified_request - assert jsonified_request["networkInterface"] == request_init["network_interface"] + assert "networkInterfaceName" in jsonified_request + assert ( + jsonified_request["networkInterfaceName"] + == request_init["network_interface_name"] + ) - jsonified_request["accessConfig"] = "access_config_value" jsonified_request["instance"] = "instance_value" - jsonified_request["networkInterface"] = "network_interface_value" + jsonified_request["networkInterfaceName"] = "network_interface_name_value" jsonified_request["project"] = "project_value" jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete_access_config._get_unset_required_fields(jsonified_request) + ).delete_network_interface._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. assert not set(unset_fields) - set( ( - "access_config", - "network_interface", + "network_interface_name", "request_id", ) ) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone - assert "accessConfig" in jsonified_request - assert jsonified_request["accessConfig"] == "access_config_value" assert "instance" in jsonified_request assert jsonified_request["instance"] == "instance_value" - assert "networkInterface" in jsonified_request - assert jsonified_request["networkInterface"] == "network_interface_value" + assert "networkInterfaceName" in jsonified_request + assert jsonified_request["networkInterfaceName"] == "network_interface_name_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -3550,15 +4506,11 @@ def test_delete_access_config_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.delete_access_config(request) + response = client.delete_network_interface(request) expected_params = [ ( - "accessConfig", - "", - ), - ( - "networkInterface", + "networkInterfaceName", "", ), ] @@ -3566,25 +4518,23 @@ def test_delete_access_config_rest_required_fields( assert expected_params == actual_params -def test_delete_access_config_rest_unset_required_fields(): +def test_delete_network_interface_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.delete_access_config._get_unset_required_fields({}) + unset_fields = transport.delete_network_interface._get_unset_required_fields({}) assert set(unset_fields) == ( set( ( - "accessConfig", - "networkInterface", + "networkInterfaceName", "requestId", ) ) & set( ( - "accessConfig", "instance", - "networkInterface", + "networkInterfaceName", "project", "zone", ) @@ -3592,7 +4542,7 @@ def test_delete_access_config_rest_unset_required_fields(): ) -def test_delete_access_config_rest_flattened(): +def test_delete_network_interface_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -3615,8 +4565,7 @@ def test_delete_access_config_rest_flattened(): project="project_value", zone="zone_value", instance="instance_value", - access_config="access_config_value", - network_interface="network_interface_value", + network_interface_name="network_interface_name_value", ) mock_args.update(sample_request) @@ -3630,20 +4579,20 @@ def test_delete_access_config_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.delete_access_config(**mock_args) + client.delete_network_interface(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteNetworkInterface" % client.transport._host, args[1], ) -def test_delete_access_config_rest_flattened_error(transport: str = "rest"): +def test_delete_network_interface_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -3652,17 +4601,16 @@ def test_delete_access_config_rest_flattened_error(transport: str = "rest"): # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.delete_access_config( - compute.DeleteAccessConfigInstanceRequest(), + client.delete_network_interface( + compute.DeleteNetworkInterfaceInstanceRequest(), project="project_value", zone="zone_value", instance="instance_value", - access_config="access_config_value", - network_interface="network_interface_value", + network_interface_name="network_interface_name_value", ) -def test_delete_access_config_unary_rest_use_cached_wrapped_rpc(): +def test_delete_network_interface_unary_rest_use_cached_wrapped_rpc(): # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, # instead of constructing them on each call with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: @@ -3677,7 +4625,8 @@ def test_delete_access_config_unary_rest_use_cached_wrapped_rpc(): # Ensure method has been cached assert ( - client._transport.delete_access_config in client._transport._wrapped_methods + client._transport.delete_network_interface + in client._transport._wrapped_methods ) # Replace cached wrapped function with mock @@ -3686,11 +4635,11 @@ def test_delete_access_config_unary_rest_use_cached_wrapped_rpc(): "foo" # operation_request.operation in compute client(s) expect a string. ) client._transport._wrapped_methods[ - client._transport.delete_access_config + client._transport.delete_network_interface ] = mock_rpc request = {} - client.delete_access_config_unary(request) + client.delete_network_interface_unary(request) # Establish that the underlying gRPC stub method was called. assert mock_rpc.call_count == 1 @@ -3699,22 +4648,21 @@ def test_delete_access_config_unary_rest_use_cached_wrapped_rpc(): # subsequent calls should use the cached wrapper wrapper_fn.reset_mock() - client.delete_access_config_unary(request) + client.delete_network_interface_unary(request) # Establish that a new wrapper was not created for this call assert wrapper_fn.call_count == 0 assert mock_rpc.call_count == 2 -def test_delete_access_config_unary_rest_required_fields( - request_type=compute.DeleteAccessConfigInstanceRequest, +def test_delete_network_interface_unary_rest_required_fields( + request_type=compute.DeleteNetworkInterfaceInstanceRequest, ): transport_class = transports.InstancesRestTransport request_init = {} - request_init["access_config"] = "" request_init["instance"] = "" - request_init["network_interface"] = "" + request_init["network_interface_name"] = "" request_init["project"] = "" request_init["zone"] = "" request = request_type(**request_init) @@ -3724,46 +4672,42 @@ def test_delete_access_config_unary_rest_required_fields( ) # verify fields with default values are dropped - assert "accessConfig" not in jsonified_request - assert "networkInterface" not in jsonified_request + assert "networkInterfaceName" not in jsonified_request unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete_access_config._get_unset_required_fields(jsonified_request) + ).delete_network_interface._get_unset_required_fields(jsonified_request) jsonified_request.update(unset_fields) # verify required fields with default values are now present - assert "accessConfig" in jsonified_request - assert jsonified_request["accessConfig"] == request_init["access_config"] - assert "networkInterface" in jsonified_request - assert jsonified_request["networkInterface"] == request_init["network_interface"] + assert "networkInterfaceName" in jsonified_request + assert ( + jsonified_request["networkInterfaceName"] + == request_init["network_interface_name"] + ) - jsonified_request["accessConfig"] = "access_config_value" jsonified_request["instance"] = "instance_value" - jsonified_request["networkInterface"] = "network_interface_value" + jsonified_request["networkInterfaceName"] = "network_interface_name_value" jsonified_request["project"] = "project_value" jsonified_request["zone"] = "zone_value" unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() - ).delete_access_config._get_unset_required_fields(jsonified_request) + ).delete_network_interface._get_unset_required_fields(jsonified_request) # Check that path parameters and body parameters are not mixing in. assert not set(unset_fields) - set( ( - "access_config", - "network_interface", + "network_interface_name", "request_id", ) ) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone - assert "accessConfig" in jsonified_request - assert jsonified_request["accessConfig"] == "access_config_value" assert "instance" in jsonified_request assert jsonified_request["instance"] == "instance_value" - assert "networkInterface" in jsonified_request - assert jsonified_request["networkInterface"] == "network_interface_value" + assert "networkInterfaceName" in jsonified_request + assert jsonified_request["networkInterfaceName"] == "network_interface_name_value" assert "project" in jsonified_request assert jsonified_request["project"] == "project_value" assert "zone" in jsonified_request @@ -3804,15 +4748,11 @@ def test_delete_access_config_unary_rest_required_fields( req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.delete_access_config_unary(request) + response = client.delete_network_interface_unary(request) expected_params = [ ( - "accessConfig", - "", - ), - ( - "networkInterface", + "networkInterfaceName", "", ), ] @@ -3820,25 +4760,23 @@ def test_delete_access_config_unary_rest_required_fields( assert expected_params == actual_params -def test_delete_access_config_unary_rest_unset_required_fields(): +def test_delete_network_interface_unary_rest_unset_required_fields(): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials ) - unset_fields = transport.delete_access_config._get_unset_required_fields({}) + unset_fields = transport.delete_network_interface._get_unset_required_fields({}) assert set(unset_fields) == ( set( - ( - "accessConfig", - "networkInterface", + ( + "networkInterfaceName", "requestId", ) ) & set( ( - "accessConfig", "instance", - "networkInterface", + "networkInterfaceName", "project", "zone", ) @@ -3846,7 +4784,7 @@ def test_delete_access_config_unary_rest_unset_required_fields(): ) -def test_delete_access_config_unary_rest_flattened(): +def test_delete_network_interface_unary_rest_flattened(): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest", @@ -3869,8 +4807,7 @@ def test_delete_access_config_unary_rest_flattened(): project="project_value", zone="zone_value", instance="instance_value", - access_config="access_config_value", - network_interface="network_interface_value", + network_interface_name="network_interface_name_value", ) mock_args.update(sample_request) @@ -3884,20 +4821,20 @@ def test_delete_access_config_unary_rest_flattened(): req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - client.delete_access_config_unary(**mock_args) + client.delete_network_interface_unary(**mock_args) # Establish that the underlying call was made with the expected # request object values. assert len(req.mock_calls) == 1 _, args, _ = req.mock_calls[0] assert path_template.validate( - "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig" + "%s/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteNetworkInterface" % client.transport._host, args[1], ) -def test_delete_access_config_unary_rest_flattened_error(transport: str = "rest"): +def test_delete_network_interface_unary_rest_flattened_error(transport: str = "rest"): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport=transport, @@ -3906,13 +4843,12 @@ def test_delete_access_config_unary_rest_flattened_error(transport: str = "rest" # Attempting to call a method with both a request object and flattened # fields is an error. with pytest.raises(ValueError): - client.delete_access_config_unary( - compute.DeleteAccessConfigInstanceRequest(), + client.delete_network_interface_unary( + compute.DeleteNetworkInterfaceInstanceRequest(), project="project_value", zone="zone_value", instance="instance_value", - access_config="access_config_value", - network_interface="network_interface_value", + network_interface_name="network_interface_name_value", ) @@ -20074,20 +21010,296 @@ def test_add_access_config_rest_call_success(request_type): "external_ipv6_prefix_length": 2837, "kind": "kind_value", "name": "name_value", - "nat_i_p": "nat_i_p_value", - "network_tier": "network_tier_value", - "public_ptr_domain_name": "public_ptr_domain_name_value", - "security_policy": "security_policy_value", - "set_public_ptr": True, - "type_": "type__value", + "nat_i_p": "nat_i_p_value", + "network_tier": "network_tier_value", + "public_ptr_domain_name": "public_ptr_domain_name_value", + "security_policy": "security_policy_value", + "set_public_ptr": True, + "type_": "type__value", + } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = compute.AddAccessConfigInstanceRequest.meta.fields[ + "access_config_resource" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init[ + "access_config_resource" + ].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range(0, len(request_init["access_config_resource"][field])): + del request_init["access_config_resource"][field][i][subfield] + else: + del request_init["access_config_resource"][field][subfield] + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.Operation( + client_operation_id="client_operation_id_value", + creation_timestamp="creation_timestamp_value", + description="description_value", + end_time="end_time_value", + http_error_message="http_error_message_value", + http_error_status_code=2374, + id=205, + insert_time="insert_time_value", + kind="kind_value", + name="name_value", + operation_group_id="operation_group_id_value", + operation_type="operation_type_value", + progress=885, + region="region_value", + self_link="self_link_value", + start_time="start_time_value", + status=compute.Operation.Status.DONE, + status_message="status_message_value", + target_id=947, + target_link="target_link_value", + user="user_value", + zone="zone_value", + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.add_access_config(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, extended_operation.ExtendedOperation) + assert response.client_operation_id == "client_operation_id_value" + assert response.creation_timestamp == "creation_timestamp_value" + assert response.description == "description_value" + assert response.end_time == "end_time_value" + assert response.http_error_message == "http_error_message_value" + assert response.http_error_status_code == 2374 + assert response.id == 205 + assert response.insert_time == "insert_time_value" + assert response.kind == "kind_value" + assert response.name == "name_value" + assert response.operation_group_id == "operation_group_id_value" + assert response.operation_type == "operation_type_value" + assert response.progress == 885 + assert response.region == "region_value" + assert response.self_link == "self_link_value" + assert response.start_time == "start_time_value" + assert response.status == compute.Operation.Status.DONE + assert response.status_message == "status_message_value" + assert response.target_id == 947 + assert response.target_link == "target_link_value" + assert response.user == "user_value" + assert response.zone == "zone_value" + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_add_access_config_rest_interceptors(null_interceptor): + transport = transports.InstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.InstancesRestInterceptor(), + ) + client = InstancesClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.InstancesRestInterceptor, "post_add_access_config" + ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_add_access_config_with_metadata" + ) as post_with_metadata, mock.patch.object( + transports.InstancesRestInterceptor, "pre_add_access_config" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.AddAccessConfigInstanceRequest.pb( + compute.AddAccessConfigInstanceRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.Operation.to_json(compute.Operation()) + req.return_value.content = return_value + + request = compute.AddAccessConfigInstanceRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata + + client.add_access_config( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + +def test_add_network_interface_rest_bad_request( + request_type=compute.AddNetworkInterfaceInstanceRequest, +): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "instance": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.add_network_interface(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.AddNetworkInterfaceInstanceRequest, + dict, + ], +) +def test_add_network_interface_rest_call_success(request_type): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "instance": "sample3"} + request_init["network_interface_resource"] = { + "access_configs": [ + { + "external_ipv6": "external_ipv6_value", + "external_ipv6_prefix_length": 2837, + "kind": "kind_value", + "name": "name_value", + "nat_i_p": "nat_i_p_value", + "network_tier": "network_tier_value", + "public_ptr_domain_name": "public_ptr_domain_name_value", + "security_policy": "security_policy_value", + "set_public_ptr": True, + "type_": "type__value", + } + ], + "alias_ip_ranges": [ + { + "ip_cidr_range": "ip_cidr_range_value", + "subnetwork_range_name": "subnetwork_range_name_value", + } + ], + "fingerprint": "fingerprint_value", + "internal_ipv6_prefix_length": 2831, + "ipv6_access_configs": {}, + "ipv6_access_type": "ipv6_access_type_value", + "ipv6_address": "ipv6_address_value", + "kind": "kind_value", + "name": "name_value", + "network": "network_value", + "network_attachment": "network_attachment_value", + "network_i_p": "network_i_p_value", + "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", + "queue_count": 1197, + "stack_type": "stack_type_value", + "subnetwork": "subnetwork_value", + "vlan": 433, } # The version of a generated dependency at test runtime may differ from the version used during generation. # Delete any fields which are not present in the current runtime dependency # See https://github.com/googleapis/gapic-generator-python/issues/1748 # Determine if the message type is proto-plus or protobuf - test_field = compute.AddAccessConfigInstanceRequest.meta.fields[ - "access_config_resource" + test_field = compute.AddNetworkInterfaceInstanceRequest.meta.fields[ + "network_interface_resource" ] def get_message_fields(field): @@ -20117,7 +21329,7 @@ def get_message_fields(field): # For each item in the sample request, create a list of sub fields which are not present at runtime # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime for field, value in request_init[ - "access_config_resource" + "network_interface_resource" ].items(): # pragma: NO COVER result = None is_repeated = False @@ -20148,10 +21360,12 @@ def get_message_fields(field): subfield = subfield_to_delete.get("subfield") if subfield: if field_repeated: - for i in range(0, len(request_init["access_config_resource"][field])): - del request_init["access_config_resource"][field][i][subfield] + for i in range( + 0, len(request_init["network_interface_resource"][field]) + ): + del request_init["network_interface_resource"][field][i][subfield] else: - del request_init["access_config_resource"][field][subfield] + del request_init["network_interface_resource"][field][subfield] request = request_type(**request_init) # Mock the http request call within the method and fake a response. @@ -20192,7 +21406,7 @@ def get_message_fields(field): response_value.content = json_return_value.encode("UTF-8") req.return_value = response_value req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} - response = client.add_access_config(request) + response = client.add_network_interface(request) # Establish that the response is the type that we expect. assert isinstance(response, extended_operation.ExtendedOperation) @@ -20221,7 +21435,7 @@ def get_message_fields(field): @pytest.mark.parametrize("null_interceptor", [True, False]) -def test_add_access_config_rest_interceptors(null_interceptor): +def test_add_network_interface_rest_interceptors(null_interceptor): transport = transports.InstancesRestTransport( credentials=ga_credentials.AnonymousCredentials(), interceptor=None if null_interceptor else transports.InstancesRestInterceptor(), @@ -20233,17 +21447,17 @@ def test_add_access_config_rest_interceptors(null_interceptor): ) as req, mock.patch.object( path_template, "transcode" ) as transcode, mock.patch.object( - transports.InstancesRestInterceptor, "post_add_access_config" + transports.InstancesRestInterceptor, "post_add_network_interface" ) as post, mock.patch.object( - transports.InstancesRestInterceptor, "post_add_access_config_with_metadata" + transports.InstancesRestInterceptor, "post_add_network_interface_with_metadata" ) as post_with_metadata, mock.patch.object( - transports.InstancesRestInterceptor, "pre_add_access_config" + transports.InstancesRestInterceptor, "pre_add_network_interface" ) as pre: pre.assert_not_called() post.assert_not_called() post_with_metadata.assert_not_called() - pb_message = compute.AddAccessConfigInstanceRequest.pb( - compute.AddAccessConfigInstanceRequest() + pb_message = compute.AddNetworkInterfaceInstanceRequest.pb( + compute.AddNetworkInterfaceInstanceRequest() ) transcode.return_value = { "method": "post", @@ -20258,7 +21472,7 @@ def test_add_access_config_rest_interceptors(null_interceptor): return_value = compute.Operation.to_json(compute.Operation()) req.return_value.content = return_value - request = compute.AddAccessConfigInstanceRequest() + request = compute.AddNetworkInterfaceInstanceRequest() metadata = [ ("key", "val"), ("cephalopod", "squid"), @@ -20267,7 +21481,7 @@ def test_add_access_config_rest_interceptors(null_interceptor): post.return_value = compute.Operation() post_with_metadata.return_value = compute.Operation(), metadata - client.add_access_config( + client.add_network_interface( request, metadata=[ ("key", "val"), @@ -21118,9 +22332,11 @@ def test_bulk_insert_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } ], "network_performance_config": { @@ -21157,6 +22373,7 @@ def test_bulk_insert_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", }, "service_accounts": [ @@ -21714,6 +22931,174 @@ def test_delete_access_config_rest_interceptors(null_interceptor): post_with_metadata.assert_called_once() +def test_delete_network_interface_rest_bad_request( + request_type=compute.DeleteNetworkInterfaceInstanceRequest, +): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "instance": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.delete_network_interface(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.DeleteNetworkInterfaceInstanceRequest, + dict, + ], +) +def test_delete_network_interface_rest_call_success(request_type): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "instance": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.Operation( + client_operation_id="client_operation_id_value", + creation_timestamp="creation_timestamp_value", + description="description_value", + end_time="end_time_value", + http_error_message="http_error_message_value", + http_error_status_code=2374, + id=205, + insert_time="insert_time_value", + kind="kind_value", + name="name_value", + operation_group_id="operation_group_id_value", + operation_type="operation_type_value", + progress=885, + region="region_value", + self_link="self_link_value", + start_time="start_time_value", + status=compute.Operation.Status.DONE, + status_message="status_message_value", + target_id=947, + target_link="target_link_value", + user="user_value", + zone="zone_value", + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.Operation.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.delete_network_interface(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, extended_operation.ExtendedOperation) + assert response.client_operation_id == "client_operation_id_value" + assert response.creation_timestamp == "creation_timestamp_value" + assert response.description == "description_value" + assert response.end_time == "end_time_value" + assert response.http_error_message == "http_error_message_value" + assert response.http_error_status_code == 2374 + assert response.id == 205 + assert response.insert_time == "insert_time_value" + assert response.kind == "kind_value" + assert response.name == "name_value" + assert response.operation_group_id == "operation_group_id_value" + assert response.operation_type == "operation_type_value" + assert response.progress == 885 + assert response.region == "region_value" + assert response.self_link == "self_link_value" + assert response.start_time == "start_time_value" + assert response.status == compute.Operation.Status.DONE + assert response.status_message == "status_message_value" + assert response.target_id == 947 + assert response.target_link == "target_link_value" + assert response.user == "user_value" + assert response.zone == "zone_value" + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_delete_network_interface_rest_interceptors(null_interceptor): + transport = transports.InstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None if null_interceptor else transports.InstancesRestInterceptor(), + ) + client = InstancesClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.InstancesRestInterceptor, "post_delete_network_interface" + ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_delete_network_interface_with_metadata", + ) as post_with_metadata, mock.patch.object( + transports.InstancesRestInterceptor, "pre_delete_network_interface" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.DeleteNetworkInterfaceInstanceRequest.pb( + compute.DeleteNetworkInterfaceInstanceRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.Operation.to_json(compute.Operation()) + req.return_value.content = return_value + + request = compute.DeleteNetworkInterfaceInstanceRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata + + client.delete_network_interface( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + def test_detach_disk_rest_bad_request(request_type=compute.DetachDiskInstanceRequest): client = InstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest" @@ -22999,15 +24384,20 @@ def test_insert_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } ], "network_performance_config": { "total_egress_bandwidth_tier": "total_egress_bandwidth_tier_value" }, - "params": {"resource_manager_tags": {}}, + "params": { + "request_valid_for_duration": {"nanos": 543, "seconds": 751}, + "resource_manager_tags": {}, + }, "private_ipv6_google_access": "private_ipv6_google_access_value", "reservation_affinity": { "consume_reservation_type": "consume_reservation_type_value", @@ -23055,7 +24445,7 @@ def test_insert_rest_call_success(request_type): "availability_domain": 2002, "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", - "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, + "local_ssd_recovery_timeout": {}, "location_hint": "location_hint_value", "max_run_duration": {}, "min_node_cpus": 1379, @@ -23070,6 +24460,7 @@ def test_insert_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", }, "self_link": "self_link_value", @@ -26797,6 +28188,7 @@ def test_set_scheduling_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", } # The version of a generated dependency at test runtime may differ from the version used during generation. @@ -29287,15 +30679,20 @@ def test_update_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } ], "network_performance_config": { "total_egress_bandwidth_tier": "total_egress_bandwidth_tier_value" }, - "params": {"resource_manager_tags": {}}, + "params": { + "request_valid_for_duration": {"nanos": 543, "seconds": 751}, + "resource_manager_tags": {}, + }, "private_ipv6_google_access": "private_ipv6_google_access_value", "reservation_affinity": { "consume_reservation_type": "consume_reservation_type_value", @@ -29343,7 +30740,7 @@ def test_update_rest_call_success(request_type): "availability_domain": 2002, "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", - "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, + "local_ssd_recovery_timeout": {}, "location_hint": "location_hint_value", "max_run_duration": {}, "min_node_cpus": 1379, @@ -29358,6 +30755,7 @@ def test_update_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", }, "self_link": "self_link_value", @@ -30134,9 +31532,11 @@ def test_update_network_interface_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } # The version of a generated dependency at test runtime may differ from the version used during generation. # Delete any fields which are not present in the current runtime dependency @@ -30617,6 +32017,28 @@ def test_add_access_config_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_add_network_interface_unary_empty_call_rest(): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.add_network_interface), "__call__" + ) as call: + client.add_network_interface_unary(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.AddNetworkInterfaceInstanceRequest() + + assert args[0] == request_msg + + # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. def test_add_resource_policies_unary_empty_call_rest(): @@ -30741,6 +32163,28 @@ def test_delete_access_config_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_delete_network_interface_unary_empty_call_rest(): + client = InstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.delete_network_interface), "__call__" + ) as call: + client.delete_network_interface_unary(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.DeleteNetworkInterfaceInstanceRequest() + + assert args[0] == request_msg + + # This test is a coverage failsafe to make sure that totally empty calls, # i.e. request == None and no flattened fields passed, work. def test_detach_disk_unary_empty_call_rest(): @@ -31648,12 +33092,14 @@ def test_instances_base_transport(): # raise NotImplementedError. methods = ( "add_access_config", + "add_network_interface", "add_resource_policies", "aggregated_list", "attach_disk", "bulk_insert", "delete", "delete_access_config", + "delete_network_interface", "detach_disk", "get", "get_effective_firewalls", @@ -31836,6 +33282,9 @@ def test_instances_client_transport_session_collision(transport_name): session1 = client1.transport.add_access_config._session session2 = client2.transport.add_access_config._session assert session1 != session2 + session1 = client1.transport.add_network_interface._session + session2 = client2.transport.add_network_interface._session + assert session1 != session2 session1 = client1.transport.add_resource_policies._session session2 = client2.transport.add_resource_policies._session assert session1 != session2 @@ -31854,6 +33303,9 @@ def test_instances_client_transport_session_collision(transport_name): session1 = client1.transport.delete_access_config._session session2 = client2.transport.delete_access_config._session assert session1 != session2 + session1 = client1.transport.delete_network_interface._session + session2 = client2.transport.delete_network_interface._session + assert session1 != session2 session1 = client1.transport.detach_disk._session session2 = client2.transport.detach_disk._session assert session1 != session2 diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py index e82785e825ef..13382cc56cf6 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py @@ -3907,9 +3907,11 @@ def test_insert_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } ], "network_performance_config": { @@ -3946,6 +3948,7 @@ def test_insert_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", }, "service_accounts": [ diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py index 332242129c23..53ed5d4d2e57 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py @@ -2201,6 +2201,221 @@ def test_set_named_ports_unary_rest_flattened_error(transport: str = "rest"): ) +def test_test_iam_permissions_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = RegionInstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.test_iam_permissions in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.test_iam_permissions + ] = mock_rpc + + request = {} + client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_test_iam_permissions_rest_required_fields( + request_type=compute.TestIamPermissionsRegionInstanceGroupRequest, +): + transport_class = transports.RegionInstanceGroupsRestTransport + + request_init = {} + request_init["project"] = "" + request_init["region"] = "" + request_init["resource"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + jsonified_request["region"] = "region_value" + jsonified_request["resource"] = "resource_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "region" in jsonified_request + assert jsonified_request["region"] == "region_value" + assert "resource" in jsonified_request + assert jsonified_request["resource"] == "resource_value" + + client = RegionInstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.test_iam_permissions(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_test_iam_permissions_rest_unset_required_fields(): + transport = transports.RegionInstanceGroupsRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.test_iam_permissions._get_unset_required_fields({}) + assert set(unset_fields) == ( + set(()) + & set( + ( + "project", + "region", + "resource", + "testPermissionsRequestResource", + ) + ) + ) + + +def test_test_iam_permissions_rest_flattened(): + client = RegionInstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "region": "sample2", + "resource": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + region="region_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.test_iam_permissions(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/regions/{region}/instanceGroups/{resource}/testIamPermissions" + % client.transport._host, + args[1], + ) + + +def test_test_iam_permissions_rest_flattened_error(transport: str = "rest"): + client = RegionInstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.test_iam_permissions( + compute.TestIamPermissionsRegionInstanceGroupRequest(), + project="project_value", + region="region_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + + def test_credentials_transport_error(): # It is an error to provide credentials and a transport instance. transport = transports.RegionInstanceGroupsRestTransport( @@ -3068,6 +3283,214 @@ def test_set_named_ports_rest_interceptors(null_interceptor): post_with_metadata.assert_called_once() +def test_test_iam_permissions_rest_bad_request( + request_type=compute.TestIamPermissionsRegionInstanceGroupRequest, +): + client = RegionInstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "region": "sample2", "resource": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.test_iam_permissions(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.TestIamPermissionsRegionInstanceGroupRequest, + dict, + ], +) +def test_test_iam_permissions_rest_call_success(request_type): + client = RegionInstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "region": "sample2", "resource": "sample3"} + request_init["test_permissions_request_resource"] = { + "permissions": ["permissions_value1", "permissions_value2"] + } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = compute.TestIamPermissionsRegionInstanceGroupRequest.meta.fields[ + "test_permissions_request_resource" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init[ + "test_permissions_request_resource" + ].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range( + 0, len(request_init["test_permissions_request_resource"][field]) + ): + del request_init["test_permissions_request_resource"][field][i][ + subfield + ] + else: + del request_init["test_permissions_request_resource"][field][subfield] + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse( + permissions=["permissions_value"], + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.test_iam_permissions(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, compute.TestPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_test_iam_permissions_rest_interceptors(null_interceptor): + transport = transports.RegionInstanceGroupsRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None + if null_interceptor + else transports.RegionInstanceGroupsRestInterceptor(), + ) + client = RegionInstanceGroupsClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.RegionInstanceGroupsRestInterceptor, "post_test_iam_permissions" + ) as post, mock.patch.object( + transports.RegionInstanceGroupsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( + transports.RegionInstanceGroupsRestInterceptor, "pre_test_iam_permissions" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.TestIamPermissionsRegionInstanceGroupRequest.pb( + compute.TestIamPermissionsRegionInstanceGroupRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.TestPermissionsResponse.to_json( + compute.TestPermissionsResponse() + ) + req.return_value.content = return_value + + request = compute.TestIamPermissionsRegionInstanceGroupRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata + + client.test_iam_permissions( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + def test_initialize_client_w_rest(): client = RegionInstanceGroupsClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest" @@ -3155,6 +3578,28 @@ def test_set_named_ports_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_test_iam_permissions_empty_call_rest(): + client = RegionInstanceGroupsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.TestIamPermissionsRegionInstanceGroupRequest() + + assert args[0] == request_msg + + def test_region_instance_groups_base_transport_error(): # Passing both a credentials object and credentials_file should raise an error with pytest.raises(core_exceptions.DuplicateCredentialArgs): @@ -3181,6 +3626,7 @@ def test_region_instance_groups_base_transport(): "list", "list_instances", "set_named_ports", + "test_iam_permissions", ) for method in methods: with pytest.raises(NotImplementedError): @@ -3330,6 +3776,9 @@ def test_region_instance_groups_client_transport_session_collision(transport_nam session1 = client1.transport.set_named_ports._session session2 = client2.transport.set_named_ports._session assert session1 != session2 + session1 = client1.transport.test_iam_permissions._session + session2 = client2.transport.test_iam_permissions._session + assert session1 != session2 def test_common_billing_account_path(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py index 7b25086ff1e8..0239c9188c95 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py @@ -2877,9 +2877,11 @@ def test_insert_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } ], "network_performance_config": { @@ -2916,6 +2918,7 @@ def test_insert_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", }, "service_accounts": [ diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instances.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instances.py index c6bcd53df1c4..993a6fb87598 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instances.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instances.py @@ -1624,9 +1624,11 @@ def test_bulk_insert_rest_call_success(request_type): "network_attachment": "network_attachment_value", "network_i_p": "network_i_p_value", "nic_type": "nic_type_value", + "parent_nic_name": "parent_nic_name_value", "queue_count": 1197, "stack_type": "stack_type_value", "subnetwork": "subnetwork_value", + "vlan": 433, } ], "network_performance_config": { @@ -1663,6 +1665,7 @@ def test_bulk_insert_rest_call_success(request_type): "on_instance_stop_action": {"discard_local_ssd": True}, "preemptible": True, "provisioning_model": "provisioning_model_value", + "skip_guest_os_shutdown": True, "termination_time": "termination_time_value", }, "service_accounts": [ diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py index 6cf78e05bd87..5417f75137e0 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py @@ -7713,6 +7713,7 @@ def test_insert_rest_call_success(request_type): } ], "network": "network_value", + "params": {"resource_manager_tags": {}}, "region": "region_value", "self_link": "self_link_value", } @@ -8480,6 +8481,7 @@ def test_patch_rest_call_success(request_type): } ], "network": "network_value", + "params": {"resource_manager_tags": {}}, "region": "region_value", "self_link": "self_link_value", } @@ -9104,6 +9106,7 @@ def test_preview_rest_call_success(request_type): } ], "network": "network_value", + "params": {"resource_manager_tags": {}}, "region": "region_value", "self_link": "self_link_value", } @@ -9427,6 +9430,7 @@ def test_update_rest_call_success(request_type): } ], "network": "network_value", + "params": {"resource_manager_tags": {}}, "region": "region_value", "self_link": "self_link_value", } diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py index 58cbc9580547..c270eeebc6c2 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py @@ -1745,6 +1745,8 @@ def test_get_rest_required_fields(request_type=compute.GetServiceAttachmentReque unset_fields = transport_class( credentials=ga_credentials.AnonymousCredentials() ).get._get_unset_required_fields(jsonified_request) + # Check that path parameters and body parameters are not mixing in. + assert not set(unset_fields) - set(("show_nat_ips",)) jsonified_request.update(unset_fields) # verify required fields with non-default values are left alone @@ -1804,7 +1806,7 @@ def test_get_rest_unset_required_fields(): unset_fields = transport.get._get_unset_required_fields({}) assert set(unset_fields) == ( - set(()) + set(("showNatIps",)) & set( ( "project", @@ -4394,6 +4396,7 @@ def test_insert_rest_call_success(request_type): { "consumer_network": "consumer_network_value", "endpoint": "endpoint_value", + "nat_ips": ["nat_ips_value1", "nat_ips_value2"], "propagated_connection_count": 2878, "psc_connection_id": 1793, "status": "status_value", @@ -4815,6 +4818,7 @@ def test_patch_rest_call_success(request_type): { "consumer_network": "consumer_network_value", "endpoint": "endpoint_value", + "nat_ips": ["nat_ips_value1", "nat_ips_value2"], "propagated_connection_count": 2878, "psc_connection_id": 1793, "status": "status_value", diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_instances.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_instances.py index 4abfd3cd89f4..35c78d3114ac 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_instances.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_instances.py @@ -2982,6 +2982,221 @@ def test_set_security_policy_unary_rest_flattened_error(transport: str = "rest") ) +def test_test_iam_permissions_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TargetInstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.test_iam_permissions in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.test_iam_permissions + ] = mock_rpc + + request = {} + client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_test_iam_permissions_rest_required_fields( + request_type=compute.TestIamPermissionsTargetInstanceRequest, +): + transport_class = transports.TargetInstancesRestTransport + + request_init = {} + request_init["project"] = "" + request_init["resource"] = "" + request_init["zone"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + jsonified_request["resource"] = "resource_value" + jsonified_request["zone"] = "zone_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "resource" in jsonified_request + assert jsonified_request["resource"] == "resource_value" + assert "zone" in jsonified_request + assert jsonified_request["zone"] == "zone_value" + + client = TargetInstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.test_iam_permissions(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_test_iam_permissions_rest_unset_required_fields(): + transport = transports.TargetInstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.test_iam_permissions._get_unset_required_fields({}) + assert set(unset_fields) == ( + set(()) + & set( + ( + "project", + "resource", + "testPermissionsRequestResource", + "zone", + ) + ) + ) + + +def test_test_iam_permissions_rest_flattened(): + client = TargetInstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "zone": "sample2", + "resource": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + zone="zone_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.test_iam_permissions(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/zones/{zone}/targetInstances/{resource}/testIamPermissions" + % client.transport._host, + args[1], + ) + + +def test_test_iam_permissions_rest_flattened_error(transport: str = "rest"): + client = TargetInstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.test_iam_permissions( + compute.TestIamPermissionsTargetInstanceRequest(), + project="project_value", + zone="zone_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + + def test_credentials_transport_error(): # It is an error to provide credentials and a transport instance. transport = transports.TargetInstancesRestTransport( @@ -4170,6 +4385,214 @@ def test_set_security_policy_rest_interceptors(null_interceptor): post_with_metadata.assert_called_once() +def test_test_iam_permissions_rest_bad_request( + request_type=compute.TestIamPermissionsTargetInstanceRequest, +): + client = TargetInstancesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "resource": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.test_iam_permissions(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.TestIamPermissionsTargetInstanceRequest, + dict, + ], +) +def test_test_iam_permissions_rest_call_success(request_type): + client = TargetInstancesClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "zone": "sample2", "resource": "sample3"} + request_init["test_permissions_request_resource"] = { + "permissions": ["permissions_value1", "permissions_value2"] + } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = compute.TestIamPermissionsTargetInstanceRequest.meta.fields[ + "test_permissions_request_resource" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init[ + "test_permissions_request_resource" + ].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range( + 0, len(request_init["test_permissions_request_resource"][field]) + ): + del request_init["test_permissions_request_resource"][field][i][ + subfield + ] + else: + del request_init["test_permissions_request_resource"][field][subfield] + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse( + permissions=["permissions_value"], + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.test_iam_permissions(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, compute.TestPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_test_iam_permissions_rest_interceptors(null_interceptor): + transport = transports.TargetInstancesRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None + if null_interceptor + else transports.TargetInstancesRestInterceptor(), + ) + client = TargetInstancesClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.TargetInstancesRestInterceptor, "post_test_iam_permissions" + ) as post, mock.patch.object( + transports.TargetInstancesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( + transports.TargetInstancesRestInterceptor, "pre_test_iam_permissions" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.TestIamPermissionsTargetInstanceRequest.pb( + compute.TestIamPermissionsTargetInstanceRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.TestPermissionsResponse.to_json( + compute.TestPermissionsResponse() + ) + req.return_value.content = return_value + + request = compute.TestIamPermissionsTargetInstanceRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata + + client.test_iam_permissions( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + def test_initialize_client_w_rest(): client = TargetInstancesClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest" @@ -4299,6 +4722,28 @@ def test_set_security_policy_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_test_iam_permissions_empty_call_rest(): + client = TargetInstancesClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.TestIamPermissionsTargetInstanceRequest() + + assert args[0] == request_msg + + def test_target_instances_base_transport_error(): # Passing both a credentials object and credentials_file should raise an error with pytest.raises(core_exceptions.DuplicateCredentialArgs): @@ -4327,6 +4772,7 @@ def test_target_instances_base_transport(): "insert", "list", "set_security_policy", + "test_iam_permissions", ) for method in methods: with pytest.raises(NotImplementedError): @@ -4482,6 +4928,9 @@ def test_target_instances_client_transport_session_collision(transport_name): session1 = client1.transport.set_security_policy._session session2 = client2.transport.set_security_policy._session assert session1 != session2 + session1 = client1.transport.test_iam_permissions._session + session2 = client2.transport.test_iam_permissions._session + assert session1 != session2 def test_common_billing_account_path(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_pools.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_pools.py index aa29800e1611..879a779776cd 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_pools.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_pools.py @@ -5358,6 +5358,221 @@ def test_set_security_policy_unary_rest_flattened_error(transport: str = "rest") ) +def test_test_iam_permissions_rest_use_cached_wrapped_rpc(): + # Clients should use _prep_wrapped_messages to create cached wrapped rpcs, + # instead of constructing them on each call + with mock.patch("google.api_core.gapic_v1.method.wrap_method") as wrapper_fn: + client = TargetPoolsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Should wrap all calls on client creation + assert wrapper_fn.call_count > 0 + wrapper_fn.reset_mock() + + # Ensure method has been cached + assert ( + client._transport.test_iam_permissions in client._transport._wrapped_methods + ) + + # Replace cached wrapped function with mock + mock_rpc = mock.Mock() + mock_rpc.return_value.name = ( + "foo" # operation_request.operation in compute client(s) expect a string. + ) + client._transport._wrapped_methods[ + client._transport.test_iam_permissions + ] = mock_rpc + + request = {} + client.test_iam_permissions(request) + + # Establish that the underlying gRPC stub method was called. + assert mock_rpc.call_count == 1 + + client.test_iam_permissions(request) + + # Establish that a new wrapper was not created for this call + assert wrapper_fn.call_count == 0 + assert mock_rpc.call_count == 2 + + +def test_test_iam_permissions_rest_required_fields( + request_type=compute.TestIamPermissionsTargetPoolRequest, +): + transport_class = transports.TargetPoolsRestTransport + + request_init = {} + request_init["project"] = "" + request_init["region"] = "" + request_init["resource"] = "" + request = request_type(**request_init) + pb_request = request_type.pb(request) + jsonified_request = json.loads( + json_format.MessageToJson(pb_request, use_integers_for_enums=False) + ) + + # verify fields with default values are dropped + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with default values are now present + + jsonified_request["project"] = "project_value" + jsonified_request["region"] = "region_value" + jsonified_request["resource"] = "resource_value" + + unset_fields = transport_class( + credentials=ga_credentials.AnonymousCredentials() + ).test_iam_permissions._get_unset_required_fields(jsonified_request) + jsonified_request.update(unset_fields) + + # verify required fields with non-default values are left alone + assert "project" in jsonified_request + assert jsonified_request["project"] == "project_value" + assert "region" in jsonified_request + assert jsonified_request["region"] == "region_value" + assert "resource" in jsonified_request + assert jsonified_request["resource"] == "resource_value" + + client = TargetPoolsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + request = request_type(**request_init) + + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + # Mock the http request call within the method and fake a response. + with mock.patch.object(Session, "request") as req: + # We need to mock transcode() because providing default values + # for required fields will fail the real version if the http_options + # expect actual values for those fields. + with mock.patch.object(path_template, "transcode") as transcode: + # A uri without fields and an empty body will force all the + # request fields to show up in the query_params. + pb_request = request_type.pb(request) + transcode_result = { + "uri": "v1/sample_method", + "method": "post", + "query_params": pb_request, + } + transcode_result["body"] = pb_request + transcode.return_value = transcode_result + + response_value = Response() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + response = client.test_iam_permissions(request) + + expected_params = [] + actual_params = req.call_args.kwargs["params"] + assert expected_params == actual_params + + +def test_test_iam_permissions_rest_unset_required_fields(): + transport = transports.TargetPoolsRestTransport( + credentials=ga_credentials.AnonymousCredentials + ) + + unset_fields = transport.test_iam_permissions._get_unset_required_fields({}) + assert set(unset_fields) == ( + set(()) + & set( + ( + "project", + "region", + "resource", + "testPermissionsRequestResource", + ) + ) + ) + + +def test_test_iam_permissions_rest_flattened(): + client = TargetPoolsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse() + + # get arguments that satisfy an http rule for this method + sample_request = { + "project": "sample1", + "region": "sample2", + "resource": "sample3", + } + + # get truthy value for each flattened field + mock_args = dict( + project="project_value", + region="region_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + mock_args.update(sample_request) + + # Wrap the value into a proper Response obj + response_value = Response() + response_value.status_code = 200 + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value._content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + + client.test_iam_permissions(**mock_args) + + # Establish that the underlying call was made with the expected + # request object values. + assert len(req.mock_calls) == 1 + _, args, _ = req.mock_calls[0] + assert path_template.validate( + "%s/compute/v1/projects/{project}/regions/{region}/targetPools/{resource}/testIamPermissions" + % client.transport._host, + args[1], + ) + + +def test_test_iam_permissions_rest_flattened_error(transport: str = "rest"): + client = TargetPoolsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport=transport, + ) + + # Attempting to call a method with both a request object and flattened + # fields is an error. + with pytest.raises(ValueError): + client.test_iam_permissions( + compute.TestIamPermissionsTargetPoolRequest(), + project="project_value", + region="region_value", + resource="resource_value", + test_permissions_request_resource=compute.TestPermissionsRequest( + permissions=["permissions_value"] + ), + ) + + def test_credentials_transport_error(): # It is an error to provide credentials and a transport instance. transport = transports.TargetPoolsRestTransport( @@ -7976,6 +8191,213 @@ def test_set_security_policy_rest_interceptors(null_interceptor): post_with_metadata.assert_called_once() +def test_test_iam_permissions_rest_bad_request( + request_type=compute.TestIamPermissionsTargetPoolRequest, +): + client = TargetPoolsClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "region": "sample2", "resource": "sample3"} + request = request_type(**request_init) + + # Mock the http request call within the method and fake a BadRequest error. + with mock.patch.object(Session, "request") as req, pytest.raises( + core_exceptions.BadRequest + ): + # Wrap the value into a proper Response obj + response_value = mock.Mock() + json_return_value = "" + response_value.json = mock.Mock(return_value={}) + response_value.status_code = 400 + response_value.request = mock.Mock() + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + client.test_iam_permissions(request) + + +@pytest.mark.parametrize( + "request_type", + [ + compute.TestIamPermissionsTargetPoolRequest, + dict, + ], +) +def test_test_iam_permissions_rest_call_success(request_type): + client = TargetPoolsClient( + credentials=ga_credentials.AnonymousCredentials(), transport="rest" + ) + + # send a request that will satisfy transcoding + request_init = {"project": "sample1", "region": "sample2", "resource": "sample3"} + request_init["test_permissions_request_resource"] = { + "permissions": ["permissions_value1", "permissions_value2"] + } + # The version of a generated dependency at test runtime may differ from the version used during generation. + # Delete any fields which are not present in the current runtime dependency + # See https://github.com/googleapis/gapic-generator-python/issues/1748 + + # Determine if the message type is proto-plus or protobuf + test_field = compute.TestIamPermissionsTargetPoolRequest.meta.fields[ + "test_permissions_request_resource" + ] + + def get_message_fields(field): + # Given a field which is a message (composite type), return a list with + # all the fields of the message. + # If the field is not a composite type, return an empty list. + message_fields = [] + + if hasattr(field, "message") and field.message: + is_field_type_proto_plus_type = not hasattr(field.message, "DESCRIPTOR") + + if is_field_type_proto_plus_type: + message_fields = field.message.meta.fields.values() + # Add `# pragma: NO COVER` because there may not be any `*_pb2` field types + else: # pragma: NO COVER + message_fields = field.message.DESCRIPTOR.fields + return message_fields + + runtime_nested_fields = [ + (field.name, nested_field.name) + for field in get_message_fields(test_field) + for nested_field in get_message_fields(field) + ] + + subfields_not_in_runtime = [] + + # For each item in the sample request, create a list of sub fields which are not present at runtime + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for field, value in request_init[ + "test_permissions_request_resource" + ].items(): # pragma: NO COVER + result = None + is_repeated = False + # For repeated fields + if isinstance(value, list) and len(value): + is_repeated = True + result = value[0] + # For fields where the type is another message + if isinstance(value, dict): + result = value + + if result and hasattr(result, "keys"): + for subfield in result.keys(): + if (field, subfield) not in runtime_nested_fields: + subfields_not_in_runtime.append( + { + "field": field, + "subfield": subfield, + "is_repeated": is_repeated, + } + ) + + # Remove fields from the sample request which are not present in the runtime version of the dependency + # Add `# pragma: NO COVER` because this test code will not run if all subfields are present at runtime + for subfield_to_delete in subfields_not_in_runtime: # pragma: NO COVER + field = subfield_to_delete.get("field") + field_repeated = subfield_to_delete.get("is_repeated") + subfield = subfield_to_delete.get("subfield") + if subfield: + if field_repeated: + for i in range( + 0, len(request_init["test_permissions_request_resource"][field]) + ): + del request_init["test_permissions_request_resource"][field][i][ + subfield + ] + else: + del request_init["test_permissions_request_resource"][field][subfield] + request = request_type(**request_init) + + # Mock the http request call within the method and fake a response. + with mock.patch.object(type(client.transport._session), "request") as req: + # Designate an appropriate value for the returned response. + return_value = compute.TestPermissionsResponse( + permissions=["permissions_value"], + ) + + # Wrap the value into a proper Response obj + response_value = mock.Mock() + response_value.status_code = 200 + + # Convert return value to protobuf type + return_value = compute.TestPermissionsResponse.pb(return_value) + json_return_value = json_format.MessageToJson(return_value) + response_value.content = json_return_value.encode("UTF-8") + req.return_value = response_value + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + response = client.test_iam_permissions(request) + + # Establish that the response is the type that we expect. + assert isinstance(response, compute.TestPermissionsResponse) + assert response.permissions == ["permissions_value"] + + +@pytest.mark.parametrize("null_interceptor", [True, False]) +def test_test_iam_permissions_rest_interceptors(null_interceptor): + transport = transports.TargetPoolsRestTransport( + credentials=ga_credentials.AnonymousCredentials(), + interceptor=None + if null_interceptor + else transports.TargetPoolsRestInterceptor(), + ) + client = TargetPoolsClient(transport=transport) + + with mock.patch.object( + type(client.transport._session), "request" + ) as req, mock.patch.object( + path_template, "transcode" + ) as transcode, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_test_iam_permissions" + ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( + transports.TargetPoolsRestInterceptor, "pre_test_iam_permissions" + ) as pre: + pre.assert_not_called() + post.assert_not_called() + post_with_metadata.assert_not_called() + pb_message = compute.TestIamPermissionsTargetPoolRequest.pb( + compute.TestIamPermissionsTargetPoolRequest() + ) + transcode.return_value = { + "method": "post", + "uri": "my_uri", + "body": pb_message, + "query_params": pb_message, + } + + req.return_value = mock.Mock() + req.return_value.status_code = 200 + req.return_value.headers = {"header-1": "value-1", "header-2": "value-2"} + return_value = compute.TestPermissionsResponse.to_json( + compute.TestPermissionsResponse() + ) + req.return_value.content = return_value + + request = compute.TestIamPermissionsTargetPoolRequest() + metadata = [ + ("key", "val"), + ("cephalopod", "squid"), + ] + pre.return_value = request, metadata + post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata + + client.test_iam_permissions( + request, + metadata=[ + ("key", "val"), + ("cephalopod", "squid"), + ], + ) + + pre.assert_called_once() + post.assert_called_once() + post_with_metadata.assert_called_once() + + def test_initialize_client_w_rest(): client = TargetPoolsClient( credentials=ga_credentials.AnonymousCredentials(), transport="rest" @@ -8227,6 +8649,28 @@ def test_set_security_policy_unary_empty_call_rest(): assert args[0] == request_msg +# This test is a coverage failsafe to make sure that totally empty calls, +# i.e. request == None and no flattened fields passed, work. +def test_test_iam_permissions_empty_call_rest(): + client = TargetPoolsClient( + credentials=ga_credentials.AnonymousCredentials(), + transport="rest", + ) + + # Mock the actual call, and fake the request. + with mock.patch.object( + type(client.transport.test_iam_permissions), "__call__" + ) as call: + client.test_iam_permissions(request=None) + + # Establish that the underlying stub method was called. + call.assert_called() + _, args, _ = call.mock_calls[0] + request_msg = compute.TestIamPermissionsTargetPoolRequest() + + assert args[0] == request_msg + + def test_target_pools_base_transport_error(): # Passing both a credentials object and credentials_file should raise an error with pytest.raises(core_exceptions.DuplicateCredentialArgs): @@ -8261,6 +8705,7 @@ def test_target_pools_base_transport(): "remove_instance", "set_backup", "set_security_policy", + "test_iam_permissions", ) for method in methods: with pytest.raises(NotImplementedError): @@ -8434,6 +8879,9 @@ def test_target_pools_client_transport_session_collision(transport_name): session1 = client1.transport.set_security_policy._session session2 = client2.transport.set_security_policy._session assert session1 != session2 + session1 = client1.transport.test_iam_permissions._session + session2 = client2.transport.test_iam_permissions._session + assert session1 != session2 def test_common_billing_account_path(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py index b0dbe9aa4343..8f9b4bd9f9a9 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py @@ -1972,7 +1972,9 @@ def test_insert_rest_flattened(): project="project_value", region="region_value", vpn_tunnel_resource=compute.VpnTunnel( - creation_timestamp="creation_timestamp_value" + cipher_suite=compute.VpnTunnelCipherSuite( + phase1=compute.VpnTunnelPhase1Algorithms(dh=["dh_value"]) + ) ), ) mock_args.update(sample_request) @@ -2014,7 +2016,9 @@ def test_insert_rest_flattened_error(transport: str = "rest"): project="project_value", region="region_value", vpn_tunnel_resource=compute.VpnTunnel( - creation_timestamp="creation_timestamp_value" + cipher_suite=compute.VpnTunnelCipherSuite( + phase1=compute.VpnTunnelPhase1Algorithms(dh=["dh_value"]) + ) ), ) @@ -2176,7 +2180,9 @@ def test_insert_unary_rest_flattened(): project="project_value", region="region_value", vpn_tunnel_resource=compute.VpnTunnel( - creation_timestamp="creation_timestamp_value" + cipher_suite=compute.VpnTunnelCipherSuite( + phase1=compute.VpnTunnelPhase1Algorithms(dh=["dh_value"]) + ) ), ) mock_args.update(sample_request) @@ -2218,7 +2224,9 @@ def test_insert_unary_rest_flattened_error(transport: str = "rest"): project="project_value", region="region_value", vpn_tunnel_resource=compute.VpnTunnel( - creation_timestamp="creation_timestamp_value" + cipher_suite=compute.VpnTunnelCipherSuite( + phase1=compute.VpnTunnelPhase1Algorithms(dh=["dh_value"]) + ) ), ) @@ -3515,6 +3523,19 @@ def test_insert_rest_call_success(request_type): # send a request that will satisfy transcoding request_init = {"project": "sample1", "region": "sample2"} request_init["vpn_tunnel_resource"] = { + "cipher_suite": { + "phase1": { + "dh": ["dh_value1", "dh_value2"], + "encryption": ["encryption_value1", "encryption_value2"], + "integrity": ["integrity_value1", "integrity_value2"], + "prf": ["prf_value1", "prf_value2"], + }, + "phase2": { + "encryption": ["encryption_value1", "encryption_value2"], + "integrity": ["integrity_value1", "integrity_value2"], + "pfs": ["pfs_value1", "pfs_value2"], + }, + }, "creation_timestamp": "creation_timestamp_value", "description": "description_value", "detailed_status": "detailed_status_value",